作者:EoceneResearch
概述
在區塊鏈上具有通縮機制的代幣最近經常受到攻擊。本文將討論并分析代幣令牌受到攻擊的原因,并給出相應的防御方案。
在代幣中實現通縮機制通常有兩種方式,一種是燃燒機制,另一種是反射機制。下面我們將分析這兩種實現方式可能存在的問題。
燃燒機制
通常,具有燃燒機制的代幣將在其_transfer函數中實現燃燒的邏輯。有時候會存在發送者承擔手續費的情況。在這種情況下,接收方收到的代幣數量不會發生變化,但發送方需要支付更多代幣,因為其需要承擔手續費。下面是一個簡單的例子:
function_transfer(addresssender,addressrecipient,uint256amount)internalvirtualreturns(bool){
require(_balances>=amount,"ERC20:transferamountexceedsbalance");
require(sender!=address(0),"ERC20:transferfromthezeroaddress");
require(recipient!=address(0),"ERC20:transfertothezeroaddress");
burnFee=amount*burnFeeRate;
_balances-=amount;
_burn(sender,burnFee);
_balances+=amount;
}
然后我們討論這種情況下可能存在的風險。
如果單看代幣合約,我們會發現這種寫法其實沒有什么問題,但是區塊鏈中有很多復雜的情況,需要我們考慮很多方面。
分析:從技術層面來說,Celsius可能已經資不抵債:6月6日消息,據推特用戶yieldchad分析,從技術層面來說,Celsius可能已經資不抵債。該項目一共有100萬枚ETH,但只有26.8萬枚(近27%)是有充足流動性的;另外44.5萬枚拿的是Lido的stETH,按當前Curve的匯率只能換出28.7萬枚ETH;最后28.8萬枚直接質押進了以太坊2.0合約,一時半會(至少1年內)拿不出來。按照每周5萬枚ETH的速度,Celsius在五周內就會耗盡具有流動性的ETH。[2022/6/6 4:05:49]
通常,為了讓代幣有價格,項目方會在Uniswap、Pancakeswap等去中心化交易所為代幣添加流動性。
其中,在Uniswap中,有一個函數skim,它會將流動性池中兩種代幣的余額和儲備金的差值轉移給調用方,以平衡余額和儲備金:
functionskim(addressto)externallock{
address_token0=token0;//gassavings
address_token1=token1;//gassavings
_safeTransfer(_token0,to,IERC20(_token0).balanceOf(address(this)).sub(reserve0));
_safeTransfer(_token1,to,IERC20(_token1).balanceOf(address(this)).sub(reserve1));
}
此時發送方變成了流動性池,當調用_transfer時,流動性池中的代幣將被部分銷毀,導致代幣價格部分上漲。
攻擊者利用此特性將代幣直接轉入流動性池中,然后調用skim函數轉出,然后多次重復此操作,導致流動性池中大量代幣被燃燒,價格也隨之飆升,最后賣出代幣獲利。
北京理工大學蓋珂珂:區塊鏈加入黃金供應鏈后從技術和多角度解決了信任的問題:12月18日,“首屆中國(莆田)國際黃金珠寶文化論壇”在福建省莆田市會展中心舉辦。北京理工大學東南信息技術研究院特別研究員、博士生導師蓋珂珂出席論壇并發表主旨演講。他認為,區塊鏈加入黃金供應鏈后從技術和多角度解決了信任的問題,對已有黃金供應鏈模型進行了優化,為黃金珠寶行業進行賦能,主要表現為以下幾方面,第一,所有的信息流、商流寫入區塊鏈,信息統一集中、公開透明、不可篡改;第二,所有節點可以審視,實時掌握業務物流資金過程;第三,對于投資者得到一定的提升;第四,企業征信數據積累;第五,可以實現資產的跨域流通。
在黃金NFT分享方面,他作出總結:黃金藝術產品認知是在不斷進步;黃金產品的用戶量特別大,資金儲備比較足,這也就決定了黃金作為NFT進行對標是具有先天性的優勢;黃金產品特性是具有流通性,與NFT特性比較吻合;黃金產業可能會存在瓶頸,比如渠道商和黃金商的壟斷,依賴中心化系統。(中國財富網)[2021/12/19 7:49:02]
一個真實的攻擊案例,winnerdoge(WDOGE)?:
function_transfer(addresssender,addressrecipient,uint256amount)internalvirtualreturns(bool){
require(_balances.amount>=amount,"ERC20:transferamountexceedsbalance");
require(sender!=address(0),"ERC20:transferfromthezeroaddress");
require(recipient!=address(0),"ERC20:transfertothezeroaddress");
if(block.timestamp>=openingTime&&block.timestamp<=closingTime)
V神:從技術角度來看 ETH 2.0的實施比預期困難得多:8月17日消息,以太坊聯合創始人Vitalik Buterin最近在播客節目中表示,他承認從技術角度來看,Ethereum 2.0的實施“比他預期的要困難得多”。他稱,“我絕不認為我們有任何根本的缺陷,我認為它會完成,只是時間問題,實際上最近進展很快。”在談到他對項目發展的預期時,Buterin指出,有些以太坊應用程序會失敗,而有些則會成功。(Cointelegraph)[2020/8/17]
{
_balances.amount-=amount;
_balances.amount+=amount;
emitTransfer(sender,recipient,amount);
}
else
{
uint256onePercent=findOnePercent(amount);
uint256tokensToBurn=onePercent*4;
uint256tokensToRedistribute=onePercent*4;
uint256toFeeWallet=onePercent*1;
uint256todev=onePercent*1;
uint256tokensToTransfer=amount-tokensToBurn-tokensToRedistribute-toFeeWallet-todev;
?
_balances.amount-=amount;
_balances.amount+=tokensToTransfer;
_balances.amount+=toFeeWallet;
聲音 | 王春蕊:區塊鏈已從技術構想走入現實 在智慧城市建設中將大有作為:新京報智慧城市研究院研究員王春蕊今日發表題為“智慧城市和區塊鏈能擦出怎樣的火花?”評論文章。文章中提到,區塊鏈在智慧城市建設中將大有作為。區塊鏈實現信息共享,保障數據安全;“區塊鏈+政務”,為數字社會增信;“區塊鏈+民生”,能夠提供更智能的公共服務。區塊鏈作為核心技術,已經從技術構想走入現實,在智慧城市領域特別是信息共享方面彰顯出了巨大應用潛力。(新京報)[2019/11/5]
_balances.amount+=todev;
if(!_balances.exists){
_balanceOwners.push(recipient);
_balances.exists=true;
}
redistribute(sender,tokensToRedistribute);
_burn(sender,tokensToBurn);
emitTransfer(sender,recipient,tokensToTransfer);
}
returntrue;
}
在WDOGE合約的_transfer函數中,當block.timestamp>closingTime時,進入else循環。在代碼第21行中,轉賬金額從發送方的余額中扣除,在代碼第31行中,發送方又被燃燒了tokensToBurn數量的代幣。攻擊者利用這種手續費的機制,通過上述的攻擊方式竊取流動性池中的所有價值代幣(WBNB)。
反射機制
騰訊研究院金融科技研究中心杜曉宇:應從技術、應用、市場等維度來展開區塊鏈與法律的研究 :在第一期“法律人的互聯網思維”系列研修會上,騰訊研究院金融科技研究中心副主任杜曉宇進行了“區塊鏈技術對法律的影響和挑戰”的主題發言。他認為,區塊鏈鏈對法律的影響與挑戰不宜從單一角度籠統去概括,可以考慮從“區塊鏈技術與法律”、“區塊鏈應用與法律”、“區塊鏈市場與法律”、“區塊鏈騙子與法律”四個維度來展開分析。[2018/4/19]
在反射機制中,用戶每次交易都會收取手續費,用于獎勵持有代幣的用戶,但不會觸發轉賬,只是單純修改一個系數。
在這個機制中,用戶有兩種類型的代幣數量,tAmount和rAmount。tAmount為實際代幣數量,rAmount為反映后的代幣數量,比率為tTotal/rTotal,一般的代碼實現如下:
functionbalanceOf(addressaccount)publicviewoverridereturns(uint256){
if(_isExcluded)return_tOwned;
returntokenFromReflection(_rOwned);
}
functiontokenFromReflection(uint256rAmount)publicviewreturns(uint256){
require(rAmount<=_rTotal,"Amountmustbelessthantotalreflections");
uint256currentRate=_getRate();
returnrAmount.div(currentRate);
}
function_getRate()privateviewreturns(uint256){
(uint256rSupply,uint256tSupply)=_getCurrentSupply();
returnrSupply.div(tSupply);
}
反射機制的代幣中一般有一個叫做deliver的函數,會銷毀調用者的代幣,降低rTotal的值,所以比率會增加,其他用戶反射后的代幣數量也會增加:
functiondeliver(uint256tAmount)public{
addresssender=_msgSender();
require(!_isExcluded,"Excludedaddressescannotcallthisfunction");
(uint256rAmount,,,,,)=_getValues(tAmount);
_rOwned=_rOwned.sub(rAmount);
_rTotal=_rTotal.sub(rAmount);
_tFeeTotal=_tFeeTotal.add(tAmount);
}
攻擊者注意到這個函數,并用它來攻擊相應的Uniswap?的流動性池。
那他該如何進行利用呢?同樣從Uniswap的skim?函數開始:
functionskim(addressto)externallock{
address_token0=token0;//gassavings
address_token1=token1;//gassavings
_safeTransfer(_token0,to,IERC20(_token0).balanceOf(address(this)).sub(reserve0));
_safeTransfer(_token1,to,IERC20(_token1).balanceOf(address(this)).sub(reserve1));
}
Uniswap中reserve是儲備金,與token.balanceOf(address(this))不同。
攻擊者先調用deliver函數銷毀自己的代幣,導致rTotal的值減少,比率隨之增加,所以反射后的代幣的值也會增加,token.balanceOf(address(this))也會相應變大,與reserve?的值出現了差距。
因此,攻擊者可以通過調用skim函數轉出數量為兩者之間差值的代幣從而進行獲利。
Attacker:token.deliver
rtotal:decrease
rate:increase
tokenFromReflection:increase
balanceOf:increase->token.balanceOf(address(this))>reserve
Attacker:pair.skim
token.balanceOf(address(this))>reserve
token.transfer
一個真實的攻擊案例,BEVONFTArtToken(BEVO):
而當代幣合約中存在burn函數時,存在了另外一種相似的攻擊手法:
functionburn(uint256_value)public{
_burn(msg.sender,_value);
}
function_burn(address_who,uint256_value)internal{
require(_value<=_rOwned);
_rOwned=_rOwned.sub(_value);
_tTotal=_tTotal.sub(_value);
emitTransfer(_who,address(0),_value);
}
當用戶調用burn函數時,自己的代幣會被銷毀,同時tTotal的值會減少,所以比率會降低,對應的反射后的代幣數量也會減少,所以在此時流動性池的代幣的數量也會減少,從而代幣的價格會上漲。
攻擊者利用這個特性通過多次調用burn函數來減少tTotal的值,然后調用流動性池的sync函數同步reserve和balances。最后,流動性池中的代幣大幅減少,價格飆升。然后攻擊者出售代幣以獲取利潤。
Attacker:token.burn
tTotal:decrease
rate:decrease
tokenFromReflection:decrease
balanceOf:decrease
Attacker:pair.sync
token.balanceOf(address(this))>reserve
token.transfer
一個真實的攻擊案例,SheepToken(SHEEP):
防御方案
通過解讀針對燃燒機制和反射機制代幣的攻擊手法,不難發現攻擊者攻擊的核心點是操縱流動性池的價格,因此將流動性池的地址加入白名單,不涉及代幣的銷毀,不參與代幣的反射機制,可以避免此類攻擊。
總結
本文分析了通縮機制代幣的兩種實現機制以及針對這兩種機制的攻擊手段,最后給出了相應的解決方案。在編寫合約時,項目方必須考慮代幣與去中心化交易所結合的情況,以避免此類攻擊。
Tags:RESTOKTOKEKENCoreStartertok幣價格LeagueDAO Governance Token3X Long Stellar Token
比特幣礦商Luxor收購了比特幣NFT開發平臺OrdinalHub。Luxor表示希望成為“新興運動”中的“核心參與者”,并指出新興市場仍然缺乏“用于索引收藏、托管交易和促進價格發現的強大的企業.
1900/1/1 0:00:00作者:Kaiko 編譯:PengSUN,ForesightNews3月11日,在硅谷銀行倒閉后的幾個小時內,穩定幣USDC發行方Circle宣稱33億美元的儲備存放在硅谷銀行,引發市場恐慌.
1900/1/1 0:00:00作者:JONRICE&DANSMITH譯者:Odaily星球日報譯者|念銀思唐在?JumpCrypto?和?Oasis?之間的協同努力下.
1900/1/1 0:00:00據路透社報道,美國破產法官MichaelWiles在紐約舉行的聽證會上批準了Voyager的重組計劃,可出售其資產并將其客戶轉移到Binance.US.
1900/1/1 0:00:00原文作者:MattLevine,Bloomberg原文標題:SilvergateHadaCryptoBankRun原文編譯:Leo,BlockBeats近日.
1900/1/1 0:00:00作者:Tiga,W3.HitchhikerTheBeacon游戲簡介 燈塔游戲玩法簡介 燈塔游戲是一款PVE游戲,玩家可以使用上下左右四個按鍵對角色進行異動,使用鼠標左右鍵進行普通攻擊和重擊.
1900/1/1 0:00:00