首页 > 区块问答

通缩合约如何分发代币部署,通缩钱会贬值吗

发布时间:2024-06-11 02:14:23
OK欧意app

OK欧意app

欧意交易app是全球排名第一的虚拟货币交易所。

APP下载  官网地址

近日,Beosin安全团队发现,通货紧缩代币引发的安全事件依然频发,导致多个项目方资金损失。因此,Beosin安全团队准备了这篇文章与您分享。

本文将介绍放气令牌与pair结合过程中容易出现的问题以及历史上真实的放气令牌安全事件。通过本文,我们将深入了解紧缩令牌的含义以及紧缩令牌的安全问题所涉及的原理,以便在以后的项目中避免入坑。

1通货紧缩代币是一种什么货币?

通缩代币是一种在交易过程中会被销毁的代币,是激励用户持有代币的好方法。

在代币交易过程中,会扣除部分代币的手续费、奖励和销毁费用,而随着代币的销毁,总供应量会继续减少,这将增加用户持有代币的比例,从而使用户更愿意持有代币被动获取更高的收益。

看似完美的财务方案,代码实现却没有预想的那么完美。代码中有一个销毁过程,会绕过交换过程直接修改地址平衡。这种情况和pair结合起来,就会出现一些意想不到的问题。

2通货紧缩的代币有什么问题?

(1)增加流动性问题

紧缩令牌在转账时会向当前合约收取一定比例的手续费,当手续费达到一定阈值(当前令牌数大于等于合约中设置的一个变量)时,会调用pair合约执行swap、addLiquidity或sync等操作。

如果不排除在通缩令牌交易过程中,to地址等于pair合约地址,且通缩令牌为pair中的TokenB,则可能导致TokenA和TokenB添加流动性的操作失败。

为什么交易失败?添加流动性是将TokenA和TokenB令牌放入pair合约中,然后调用pair合约的mint函数(详见下文),该函数会根据合约当前余额与准备金的差额判断用户传入了多少令牌。

用户将令牌a的令牌发送给pair后,令牌b令牌将被传输。当手续费刚好达到上述阈值时,token契约调用pair的swap、mint或sync函数,这些函数都调用pair的_update函数,从而更新用户原来发送给reserve的TokenA。

最后,如果用户再次调用mint函数,TokenA的余额和预留量将相等,交易将因此失败。

薄荷功能代码如下:

整个调用过程如下:

流程细节图

(2)略读问题

pair contract有一个skim函数(细节如下),它将把pair contract中超出预留的令牌发送到调用者的指定地址。数量计算方法基于成对契约所拥有的代币数量与储备之间的差异,这是平衡成对本身供应的函数。然而,当其中一个标志是通货紧缩标志时,可能会出现问题。

通货紧缩的代币在交易过程中会扣除一部分费用,那么如果在skim功能中代币转账过程中扣除的费用由from“支付”会怎么样?

此时扣除的费用将是对的供给,这样就可以提前将代币转移到对中,通过不断的撇取功能和同步功能消耗对的供给,使这种对中代币的价格不断飙升,最后可以用少量的通缩代币换取大量的其他代币(一般是usdt、eth等价值币)。

Skim函数的代码如下:

functions kip(address to)external lock { address _ token 0 = token 0;address _ token1 = token1_safeTransfer(_token0,to,ierc0(_ token 0)。balanceOf(地址(this))。sub(保留0));_safeTransfer(_token1,to,ierc0(_ token 1)。balanceOf(地址(this))。sub(保留1));}整个调用过程如下:

流程细节图

(3)破坏

这个问题主要发生在使用“映射”机制的通缩令牌中。这个token的机制是tOwned和Owned两种token余额存储变量,tOwned存储的是token的实际数量,row存储的是currentRate变量放大的值。

rOwned的作用是什么?文章开头说通缩代币可以激励用户持有代币。这种激励的目的是从交易者那里扣除拥有价值,同时扣除总额,使其他用户拥有总额的比例被动增加,实现被动收益。(rOwned和total可以理解为用户份额和总份额)

用户有两种方式查询余额。一种是排除地址直接返回Townsend的值,另一种是对于未排除的地址返回tOwned/currentRate,当前速率计算为rTotal/tTotal。如果有办法减少rTotal,用户查询的实际余额会变大,而如果pair查询的余额变大,多余的令牌可以通过skim函数转出。

这种紧缩令牌中有一个deliver()函数,非异常地址可以调用。此函数将销毁调用者的rOwned和相同数量的_rTotal,这将增加所有非例外地址的余额查询。如果该对不例外,它可以使用上述套利攻击。

3通货紧缩令牌相关安全事件分析

(1)不良事件安全性事件

北京时间2023年1月30日,Beosin的Beosin EagleEye安全风险监测、预警和阻断平台检测到AES遭到黑客攻击,项目存在上述Skim问题。

AES-USDT pair契约具有skim功能,可以强制平衡pair的供应,并将多余的资金发送到指定的地址。

在这次攻击中,攻击者直接将一些AES令牌转移到对中,这导致了不平衡的供应。当攻击者调用skim函数时,多余的令牌会被转移到攻击者指定的地址,攻击者将pair contract指定为这里的接收地址,这样多余的AES又被发送到了pair contract。结果就是强制平衡后pair契约仍然处于不平衡状态,攻击者可以反复调用强制平衡函数,而AES发送过程会调用AES契约的传递函数,如下图所示。

另一方面,在调用AES token contract的transfer函数时,如果发送方为该契约设置了一个pair contract,就会在swapFeeTotal中记录一部分费用(如上图流程所示),最后可以统一调用distributeFee函数(如下图所示)将swapFeeTotal记录的费用从pair中转出。与上述过程相比,攻击者可以在费用最终转出后调用一次sync函数。

经过反复的强制平衡操作,攻击者的费用记录变得异常庞大,基本接近pair的总余额。最后,攻击者调用distributeFee函数成对传送AES,pair的AES余额变得很小,导致攻击者用少量的AES换取大量的USDT。

(2)BevoToken安全事件

北京时间2023年1月30日,BevoToken遭到闪电贷攻击,由Beosin的Beosin EagleEye安全风险监测、预警和阻断平台监测。这个项目就是上面提到的“映射”机制的放气令牌。

由于BevoToken contract的balance(如下图所示)不是ERC20标准的函数,该函数在经过一些计算处理后返回余额,计算前后返回的余额可能会因为转账或其他操作而不一致。当攻击者在交换操作前后操纵pair契约的平衡时,他可以利用这个问题从skim获得额外的令牌。

攻击者先在pancake中借出192.5个bnb,然后兑换出大约302877个BEVO令牌,然后调用被攻击契约的deliver函数(如下图所示)。此时_rTotal的值减小,会导致_getRate中计算的值变小,balanceOf返回的余额会变大,导致攻击者能够撇除多余的BEVO。

之后,攻击者将交付skim给出的令牌。此时_rTotal的值已经很小了。计算_getRate时,会减去异常地址的行地址(如下图)。这个值是固定的,之前被攻击者异常放大了。一开始,当_rTotal正常时,减去这个值对结果影响不大。但是现在_rTotal被攻击者操纵,减去这个异常放大的定值后,对结果的影响是巨大的。第一次投递导致pair的计算结果增加了3倍,第二次投递后pair的计算结果大了几百倍,这也是攻击者获得的令牌比他销毁的令牌多的原因。

4 Beosin总结了通缩项目。在设计业务时,一定要考虑与Pairs的交互,自身的通缩机制是否会对Pairs产生影响。我们也建议在相关项目上线前,找专业的安全审计机构进行全面的代码和业务安全审计。

温馨提示:注:内容来源均采集于互联网,不要轻信任何,后果自负,本站不承担任何责任。若本站收录的信息无意侵犯了贵司版权,请给我们来信,我们会及时处理和回复。

(责编: admin)

免责声明:本文为转载,非本网原创内容,不代表本网观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。

如有疑问请发送邮件至:goldenhorseconnect@gmail.com