作者: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;
}
然后我们讨论这种情况下可能存在的风险。
如果单看代币合约,我们会发现这种写法其实没有什么问题,但是区块链中有很多复杂的情况,需要我们考虑很多方面。
北京理工大学盖珂珂:区块链加入黄金供应链后从技术和多角度解决了信任的问题:12月18日,“首届中国(莆田)国际黄金珠宝文化论坛”在福建省莆田市会展中心举办。北京理工大学东南信息技术研究院特别研究员、博士生导师盖珂珂出席论坛并发表主旨演讲。他认为,区块链加入黄金供应链后从技术和多角度解决了信任的问题,对已有黄金供应链模型进行了优化,为黄金珠宝行业进行赋能,主要表现为以下几方面,第一,所有的信息流、商流写入区块链,信息统一集中、公开透明、不可篡改;第二,所有节点可以审视,实时掌握业务物流资金过程;第三,对于投资者得到一定的提升;第四,企业征信数据积累;第五,可以实现资产的跨域流通。
在黄金NFT分享方面,他作出总结:黄金艺术产品认知是在不断进步;黄金产品的用户量特别大,资金储备比较足,这也就决定了黄金作为NFT进行对标是具有先天性的优势;黄金产品特性是具有流通性,与NFT特性比较吻合;黄金产业可能会存在瓶颈,比如渠道商和黄金商的垄断,依赖中心化系统。(中国财富网)[2021/12/19 7:49:02]
通常,为了让代币有价格,项目方会在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));
IBM区块链总经理:区块链正在从技术演变为真正的业务工具:10月3日消息,IBM区块链总经理Alistair Lenny在接受采访时表示,区块链越来越适合企业架构,因为它允许公司与其他公司数字化其业务流程。这意味着区块链正在从技术演变为真正的业务工具,这表明采用可能将会非常迅速。(JP.Cointelegraph)[2020/10/3]
}
此时发送方变成了流动性池,当调用_transfer时,流动性池中的代币将被部分销毁,导致代币价格部分上涨。
攻击者利用此特性将代币直接转入流动性池中,然后调用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;
声音 | 王和:未来区块链将从技术的范畴走向社会的范畴:12月5日,第四届智能金融国际论坛暨2019金融界“领航中国”年度盛典在北京盛大召开,逾千位精英学者、数百家金融机构共同聚首,探讨中国和世界的“大变局、大视野、大未来”。在圆桌讨论“新技术 新革”上,中国人民财产保险公司原监事长王和参与讨论。当前区块链具有战略性的机遇,同样重要的是具备更多应用场景的就是5G技术,对此,王和表示,区块链技术到已经走过了十年。在中国基本上经历了三个阶段,首先是是2009年、2010年以比特币为代表的周期。第二个阶段是2016年至2018年,区块链迅速的走进大众视野,多种类数字货币出现。第三个阶段是从今年下半年,到2020年将开启的全新时代。关于区块链的未来,王和认为,未来区块链对于人类社会的影响,要比现在想象的更为广泛和深刻,未来也将迎来新一轮的区块链发展的新历史时期。 尽管区块链技术现在还面临的很多的瓶颈,但要有足够的信心、想象力和技术跨越这些困难。 最后,未来区块链和5G的结合,可能将给我们带来全新的概念:速度等于可能。数字经济时代,速度将成为一个国家的核心竞争力,5G无疑是速度的代表。[2019/12/5]
_balances.amount+=amount;
emitTransfer(sender,recipient,amount);
}
else
{
uint256onePercent=findOnePercent(amount);
uint256tokensToBurn=onePercent*4;
uint256tokensToRedistribute=onePercent*4;
uint256toFeeWallet=onePercent*1;
uint256todev=onePercent*1;
原中央国家机关工委信息中心主任徐成涛:区块链的核心意义在于第一次能够从技术层面建立信任关系:中新网北京4月27日电 区块链与产业互联网融合应用60人论坛26日晚在北京落幕。原中央国家机关工委信息中心主任徐成涛认为,区块链的核心意义在于,人类有史以来第一次能够从技术层面建立信任关系。“相信区块链能推动我国的电子政务事业更上一层楼,期待越来越多的政务区块链应用案例在我国落地生根,为数字中国、智慧社会建设做出积极的贡献。”[2018/4/27]
uint256tokensToTransfer=amount-tokensToBurn-tokensToRedistribute-toFeeWallet-todev;
?
_balances.amount-=amount;
_balances.amount+=tokensToTransfer;
_balances.amount+=toFeeWallet;
_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):
防御方案
通过解读针对燃烧机制和反射机制代币的攻击手法,不难发现攻击者攻击的核心点是操纵流动性池的价格,因此将流动性池的地址加入白名单,不涉及代币的销毁,不参与代币的反射机制,可以避免此类攻击。
总结
本文分析了通缩机制代币的两种实现机制以及针对这两种机制的攻击手段,最后给出了相应的解决方案。在编写合约时,项目方必须考虑代币与去中心化交易所结合的情况,以避免此类攻击。
标签:RESTOKETOKENTOKRestoreimtoken钱包app下载网址安卓Maps.me TokenTOKC币
整理:西昻翔,ChainCatcher“过去24小时都发生了哪些重要事件”?1、美国破产法官同意Binance.US以13亿美元收购Voyager据路透社报道.
1900/1/1 0:00:00作者:Jerry、Cherry、BeeGee出品:TheprimediaDAO如果把Builder经济放在人类文明演进的高度.
1900/1/1 0:00:003D虚拟形象NFT项目HALOOFFICIAL发文公布空投细节,空投代币总量为1000万枚。其中:HALONFT持有者获得25%;HALOAvatarNFT持有者获得25%;LifeAvatar.
1900/1/1 0:00:00作者:BMANNFEx是一个NFT永续合约交易和清算平台。通过为NFT市场提供衍生品交易工具,NFEx将为NFT行业提供对冲、清算和风控能力,并致力于成为最大的NFT流动性平台.
1900/1/1 0:00:00撰文:MilesJennings和BrianQuintenz编译:DeFi之道本文是“监管Web3应用程序,而不是协议”系列的第四部分,该系列建立了一个Web3监管框架.
1900/1/1 0:00:00一、前言|活动亮点继链捕手ChainCatcher去年年底推出“大航海时代”线下精品活动在亚太五个国家地区成功举办后.
1900/1/1 0:00:00