作者: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;
}
然后我們討論這種情況下可能存在的風險。
如果單看代幣合約,我們會發現這種寫法其實沒有什么問題,但是區塊鏈中有很多復雜的情況,需要我們考慮很多方面。
工信部電子五所相里朋:從技術角度看 區塊鏈監管需從三個方面實現:工信部電子第五研究所區塊鏈創新團隊負責人、高級工程師相里朋表示,關于區塊鏈的有效監管,應形成區塊鏈系統柔性監管平臺,實現對各類區塊鏈系統的實時態勢感知,監控非法交易、欺詐行為、非法信息發布等各類非法行為。從技術角度看,區塊鏈監管需從以下三個方面實現:一是整合鏈上鏈下數據,以及不同區塊鏈系統的數據,形成統一的綜合性區塊鏈信息庫,并實現高效智能的信息檢索查詢管理;二是實現對區塊鏈系統中各種交易模式的識別,進一步分析識別出非法的交易行為;三是分析區塊鏈鏈上數據中的非法輿情信息,以及鏈下的互聯網和現實中的區塊鏈相關輿情信息,實現全面的區塊鏈輿情感知。(證券日報)[2021/3/26 19:19:11]
通常,為了讓代幣有價格,項目方會在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時,流動性池中的代幣將被部分銷毀,導致代幣價格部分上漲。
IBM區塊鏈總經理:區塊鏈正在從技術演變為真正的業務工具:10月3日消息,IBM區塊鏈總經理Alistair Lenny在接受采訪時表示,區塊鏈越來越適合企業架構,因為它允許公司與其他公司數字化其業務流程。這意味著區塊鏈正在從技術演變為真正的業務工具,這表明采用可能將會非常迅速。(JP.Cointelegraph)[2020/10/3]
攻擊者利用此特性將代幣直接轉入流動性池中,然后調用skim函數轉出,然后多次重復此操作,導致流動性池中大量代幣被燃燒,價格也隨之飆升,最后賣出代幣獲利。
一個真實的攻擊案例,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)
{
_balances.amount-=amount;
_balances.amount+=amount;
emitTransfer(sender,recipient,amount);
李貝寧:從技術角度看Filecoin還處于成長期:金色財經現場報道,7月6日,由杭州市余杭區政府指導,杭州未來科技城管委會、巴比特主辦的2020杭州區塊鏈國際周在杭州舉辦。在主題為《顛覆云存儲,IPFS引領新一輪數字革命?》的圓桌上,江西正舵者網絡科技有限公司CTO李貝寧表示,從技術角度看,Filecoin還處于成長期,很多方面還有待發展。我的觀點是,大家短期高估了它的能力,長期低估了它的潛力,Filecoin要建立的是全球性的分布式存儲網絡,所以不要過度關注短期FIL的價格。[2020/7/6]
}
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;
_balances.amount+=todev;
if(!_balances.exists){
_balanceOwners.push(recipient);
掌柜調查署|節點資本創始合伙人杜均:單純從技術角度來看,并沒有看到IPFS技術的突破:在今日舉行的掌柜調查署中,針對“IPFS和Filecoin有哪些重大創新,為什么大家如此關注“的問題,節點資本創始合伙人杜均表示,個人認為,無論是比特幣為代表的區塊鏈1.0,還是以太坊為代表的區塊鏈2.0,以及現在我們大熱的IPFS(激勵層Filecoin),都是一群“技術中立”信仰者構建的理想國,希望通過“CODE IS LAW”促進社會變得更公平更美好。單純從技術角度來看,我并沒有看到技術的突破,我更多看到的是利用區塊鏈思維對傳統互聯網訪問協議以及分布式存儲的升級。大家關注的點不一樣,只有極少數人關注到IPFS的技術創新,更多的人關注的是如何賺錢。更多詳情見原文鏈接。[2020/7/4]
_balances.exists=true;
}
redistribute(sender,tokensToRedistribute);
_burn(sender,tokensToBurn);
emitTransfer(sender,recipient,tokensToTransfer);
}
returntrue;
}
在WDOGE合約的_transfer函數中,當block.timestamp>closingTime時,進入else循環。在代碼第21行中,轉賬金額從發送方的余額中扣除,在代碼第31行中,發送方又被燃燒了tokensToBurn數量的代幣。攻擊者利用這種手續費的機制,通過上述的攻擊方式竊取流動性池中的所有價值代幣(WBNB)。
聲音 | 李曉楓:建議從技術方面推進區塊鏈標準化評測:新華財經消息,4月10日,“2019中國國際區塊鏈技術與應用大會”在深圳會展中心召開,中國人民銀行科技司原副司長李曉楓在本次活動上表示,金融和區塊鏈有著天然的聯系,目前區塊鏈領域一鏈一應用、一鏈一聯盟現象愈發明顯,信息孤島將成為區塊鏈治理的重大挑戰。因此,建議從技術方面推進區塊鏈標準化評測,強化監管、完善法律法規,逐步建立適應區塊鏈金融產業發展的長效機制。[2019/4/10]
反射機制
在反射機制中,用戶每次交易都會收取手續費,用于獎勵持有代幣的用戶,但不會觸發轉賬,只是單純修改一個系數。
在這個機制中,用戶有兩種類型的代幣數量,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:RESTOKTOKENKENPresident DogeQMG Tokenimtoken錢包怎么提現imtoken怎么轉出來錢
原文標題:TheCurrentStateofLayer2Bridges作者:AndreasFreund原文編譯:Kyle,DeFi之道我們生活在一個多鏈的世界.
1900/1/1 0:00:00撰文:ThorHartvigsen編譯:深潮TechFlow從VC錢包中發現獲利的機會,排名前20的加密貨幣基金總共有1200多個錢包。整個一月/二月我一直在密切關注它們.
1900/1/1 0:00:00據STEPN發推稱,將立即向符合條件的創世鞋持有者空投GMT。由于STEPN利用生態系統基金進行此次空投,所有GMT將被發送到SOL/BNB/ETH用戶的SOLSpending賬戶.
1900/1/1 0:00:00作者:西柚,ChainCatcher自2月初,以太坊基金會核心開發人員在會議中表示即將在3月份計劃完成上海升級后,LSD賽道就開始熱鬧了起來.
1900/1/1 0:00:00撰文:VitalikButerin編譯:Katie辜,Odaily星球日報2013?年,我去了舊金山互聯網檔案館旁邊的一家壽司店,因為我聽說那里接受比特幣支付,就想試一下.
1900/1/1 0:00:00撰文:MaryLiu,比推BitpushNews加密社區最期待的大事之一--Arbitrum空投--終于來了.
1900/1/1 0:00:00