近期Beosin安全团队研究发现,通缩代币引起的安全事件依然频发,造成众多项目方资金的损失,因此,Beosin安全团队准备了这篇详解通缩代币的文章,与大家分享。
本文将对通缩代币与pair结合过程中容易出现的问题以及历史发生的真实通缩代币安全事件两个方面进行介绍,通过本文,我们将彻底搞清楚通缩代币是什么意思以及通缩代币发生安全问题所涉及的原理,使我们在之后的项目中避坑。
1 通缩代币是哪种类型的币?
通缩代币是一种在交易过程中会进行相关比例销毁的代币,这是一种很好的激励用户持有代币的方式。
在代币交易过程中,会扣除部分代币用于手续费、奖励以及销毁,而随着代币的销毁,总供应量便会不断减少,就能使得用户持有代币所占比例增加,从而使得用户更愿意持有代币来被动获取更高的收益。
看似完美的金融方案,但在代码实现上并不像预想的那么完美。代码中存在销毁过程,此过程将绕过swap过程直接修改地址余额,这种情况与pair相结合,便会出现一些意想不到的问题。
2 通缩代币存在哪些问题?
数据:以太坊供应量时隔47天再次进入通缩模式,目前年化通缩率约为0.09%:1月16日消息,Ultrasound.money数据显示,目前以太坊总供应量较去年11月7日合并时减少24.10枚,自去年12月2日以来首次出现负增长,即时隔47天再次进入通缩模式。目前ETH年化通缩率约为0.09%。[2023/1/16 11:14:34]
(1)添加流动性问题
通缩代币在转账时会收取一定比例的手续费给当前合约,并在手续费达到某个阈值(当前代币数量大于等于合约设置的某个变量)时会调用pair合约进行swap、addLiquidity或sync等操作。
如果在通缩代币交易过程中,没有排除to地址等于pair合约地址,并且该通缩代币在pair中为TokenB时,那么在进行TokenA与TokenB添加流动性的操作中可能导致失败。
为什么会出现交易失败的问题呢?添加流动性是将TokenA与TokenB两种代币打入pair合约,然后调用pair合约的mint函数(下方详情),该函数会根据本合约的当前余额与储备量的差值来判断用户传入了多少代币。
用户将TokenA的代币发送至pair后,进行TokenB代币转账,当收取的手续费正好达到上述的阈值时,代币合约调用pair的swap、mint或sync函数,这几个函数都会调用pair的_update函数,从而将用户最开始发送至pair的TokenA更新为reserve。
BitMEX创始人:ETH可能在合并前后略微下跌,而后因通缩趋势上涨:8月17日消息,BitMEX 创始人 Arthur Hayes 发布分析文章再次对以太坊价格做出预测,Arthur 认为在合并前市场会达到预期高点,一旦合并成功将出现价格调整,而后 ETH 将因为 PoS 的通缩而具备趋势上涨的动力。针对市场对能否合并成功的预判,Arthur 认为此轮反弹行情中 ETH/BTC 汇率的不断上升可以表明市场认为合并成功将是大概率的,我将在调整出现时加仓,因为好的标的无法估值。[2022/8/17 12:30:40]
最后,用户再调用mint函数,会导致TokenA的balance和reserve是相等的,结果将导致该笔交易失败。
Mint函数代码如下:
整个调用过程如下:
过程详情图
(2)Skim问题
Pair合约拥有一个skim函数(下方详情),该函数会将pair合约中超出储备量的代币发送到调用者指定地址,数量计算方式是根据pair合约所拥有的代币数量与储备量之间的差值来实现的,这本身是一个平衡pair供应量的功能,但遇到其中一个代币为通缩代币,便可能出现问题。
波场TRON主网代币TRX完成历史首次通缩:据官方消息,2021年3月30日到4月5日的一周时间内,波场TRON主网代币TRX完成历史首次通缩,根据波场区块链浏览器TRONSCAN数据显示,总流通量由101,678,790,175枚减少至101,673,029,723枚,累计通缩总量高达:576万TRX,价值78万美金(据 Binance 4月6日10:20 (UTC+8)最新价格),至此宣告TRX正式进入通缩时代,完成了由通胀到通缩历史进程。[2021/4/6 19:50:07]
通缩代币在交易过程中会扣取一部分的费用,那么如果在skim函数中代币转账过程扣取的费用是由from“买单”,会出现什么问题呢?
此时扣取的费用将会是pair的供应量,这样就能提前向pair中转入代币,通过不断的skim函数与sync函数消耗掉pair的供应量,使得该种代币在pair中的价格不断飙升,最终使用少部分该通缩代币就能兑换出大量的另一种代币(一般为usdt、eth等价值币)。
Skim函数代码如下:
function skim(address to) external lock {address _token0 = token0; address _token1 = token1; _safeTransfer(_token0,to,IERC20(_token0).balanceOf(address(this)).sub(reserve0)); _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)).sub(reserve1));}整个调用过程如下:
火币销毁1.5亿枚HT,HT正式进入“绝对通缩”:2月29日,火币全球站发布公告宣布,火币将再销毁1.5亿枚HT。本次永久销毁的1.5亿枚HT包括:(1)未发行部分中的HT运营部分9734.23万枚HT;(2)由2018年1、2季度二级市场回购、投票上币收入组成的投资者保护基金部分5007.56万枚HT。后续发生风险事故将由平台风险保证金承担,继续实现对火币用户权益的全面保护。在新的HT通证规则下,火币不再增发HT,员工激励部分不会流入二级市场,不再有解锁HT的新增流通,HT从此正式进入“绝对通缩”新阶段。本次销毁后,火币已累计销毁近2亿枚HT,流通盘仅剩约2.4亿枚HT。[2020/2/29]
(3)销毁问题
该问题主要出现在使用“映射”机制的通缩代币中,这种代币的机制是存在两种代币余额存储变量,分别为tOwned和rOwned,而tOwned存储的是实际代币数量,rOwned存储的是通过currentRate变量放大映射之后的值。
rOwned的作用是什么呢?在文章开始说过,通缩代币能激励用户持有代币,这种激励目的使用的方式便是对交易者扣除rOwned值,同时扣除rTotal,这样其他用户rOwned所占rTotal的比例就会被动增加,实现被动收益。(rOwned与rTotal可理解为用户的股份以及总股份)
动态 | 火币1月销毁405.68万HT HT流通盘通缩效率预计比2019年提升50%:2月15日,火币全球站发布了2020年1月份HT运营月报。月报显示,火币1月份共销毁HT 405.68万个。1月份HT实际流通盘通缩效率是1.31%,若以1月份HT通缩率为全年平均水平,预计2020年全年HT通缩率可达15.72%。市场分析人士认为,此前火币曾公布了2020年投资者保护基金和HT平台运营部分的使用限额,这意味着HT的锁仓解锁对冲销毁已在2019年全年基本释放完毕,目前锁仓中OTC商家和投资者保护基金占比达到98.8%,锁仓量比较稳定,员工激励增发部分跟随回购比例释放,HT实际流通盘通缩效率在2020年预计较2019年会提升50%。[2020/2/15]
用户查询余额的方式有两种情况,一种是除外地址,直接返回tOwned的值,另一种是非除外地址,返回rOwned/currentRate,而currentRate计算方式为rTotal/tTotal。如果有办法使得rTotal减小,那么用户查询出的实际余额将变大,而如果pair查询余额变大,则可以通过skim函数将多余的代币转移出去。
而该类通缩代币存在一个deliver()函数,非除外地址可调用,该函数会将调用者的rOwned销毁,并销毁相同数量的_rTotal,使得所有非除外地址的余额查询增加,pair如果非除外的话,便可使用上述方式套利攻击。
3 通缩代币相关安全事件剖析
(1)AES安全事件
北京时间2023年1月30日,Beosin旗下Beosin EagleEye安全风险监控、预警与阻断平台监测到,AES遭受到黑客攻击,该项目便存在上述的Skim问题。
AES-USDT pair合约有一个skim函数,该函数可以强制平衡pair的供应量,将多余资金发送给指定地址。
攻击者在本次攻击过程中,首先向pair里面直接转入了部分AES代币,导致供应量不平衡,从而攻击者调用skim函数时,会将多余的这部分代币转到攻击者指定地址,而攻击者在此处指定了pair合约为接收地址,使得多余的AES又发送到了pair合约,导致强制平衡之后pair合约依然处于不平衡状态,攻击者便可重复调用强制平衡函数,而AES发送过程会调用到AES合约的transfer函数,如下图。
另外一点,当调用AES代币合约的transfer函数时,若发送者为合约设置的pair合约时,会将一部分费用记录在swapFeeTotal之中(如上图过程),在最后的时候可以统一调用distributeFee函数(如下图)将swapFeeTotal记录的费用从pair中转出,这里相比上述的过程,攻击者可以不用做sync函数调用操作,而是在最后将费用转移出去之后调用一次sync函数即可。
攻击者经过反复的强制平衡操作,费用记录变得异常大,基本接近pair的总余额,最后攻击者调用distributeFee函数将pair里面的AES转出,pair的AES余额变得非常少,导致攻击者利用少量AES兑换了大量的USDT。
(2)BevoToken安全事件
北京时间2023年1月30日,Beosin旗下Beosin EagleEye安全风险监控、预警与阻断平台监测到,BevoToken遭受到闪电贷攻击,该项目便是上面所说的“映射”机制通缩代币。
由于BevoToken合约的balanceOf函数(如下图)并非ERC20标准的函数,该函数在经过一些计算处理后再返回余额,而转账或其他操作可能使前后计算返回的余额不一致,当攻击者在swap操作前后可凭借这个问题来操控pair合约的余额,从而skim出多余的代币。
攻击者首先在pancake贷出192.5个BNB,之后换成约302,877个BEVO代币,再调用被攻击合约的deliver函数(如下图),此时_rTotal的值减小,_rTotal的值减小会导致_getRate中计算的值偏小,此时balanceOf返回的余额则会偏大,导致攻击者能skim出多余的BEVO。
之后,攻击者再将skim出的代币进行deliver,此时_rTotal的值已经很小了,在进行_getRate计算时,会减去除外地址的rOwned(如下图),此值固定且被攻击者在之前通过burn异常放大的,在最开始_rTotal正常的时候,减去该值对结果的影响不大,但是现在_rTotal被攻击者操控得异常小,再减去这个异常放大的固定值后,对结果产生了巨大的影响,第一次deliver导致pair计算结果偏大3倍,而第二次deliver之后,pair计算结果则偏大了数百倍,这也是为什么攻击者获得的代币要比自己销毁的代币多得多的原因。
通缩项目在业务设计的时候一定要考虑到与pair交互的情况,自身的通缩机制是否会对pair产生影响。我们也建议相关项目上线前寻找专业的安全审计机构进行全面的代码以及业务的安全审计工作。
Beosin
企业专栏
阅读更多
金色财经 善欧巴
金色早8点
Odaily星球日报
欧科云链
Arcane Labs
深潮TechFlow
MarsBit
BTCStudy
澎湃新闻
标签:ILVGATESILVERERGilv币前景gate币币交易LSILVER价格preciouscleanenergy
原文来源:Decrypt创作者版税在 NFT 领域退居二线,因为 NFT 市场 OpenSea 最近放弃 NFT 版税以应对其新竞争对手 Blur,Blur 在 NFT 交易量方面大幅领先.
随着大规模采用和市场越来越成熟,加密货币指数将获得更多关注。上周,Alongside 指数协议宣布由 A16z 牵头、Coinbase 加入的 1100 万美元种子融资.
一方面,美国政府对其大力施压,进行了“提醒流动性风险+处罚”的双重施压;另一方面,曾经关系亲密的客户纷纷宣布停止合作。而这一切,都让 Silvergate 濒于破产的边缘.
除了常规审计,Euler还用了Certora做形式化验证,这个我们之前也用过,形式化验证能帮助穷尽“已知”路径的覆盖范围,但是无法穷尽“未知的未知”.
撰文:J.Hackworth 编译:十文 优化后的空投策略会使协议和用户长期利益更一致。数据分析师 J.Hackworth 深挖链上数据,研究对比了 LooksRare、X2Y2 和 Blur.
图片来源:由无界版图AI工具生成最近的谷歌像个大漏勺,这不,又有AIGC核心成员联手跑路咯!量子位独家获悉,这回跟谷歌say byebye的.