
技術的視点から解説:なぜ通貨緊縮メカニズムを持つトークンは攻撃されやすいのか
TechFlow厳選深潮セレクト

技術的視点から解説:なぜ通貨緊縮メカニズムを持つトークンは攻撃されやすいのか
本稿では、ディフレーショントークンが攻撃を受ける原因について議論・分析し、それに対する防御策を提示する。
概要
最近,具有通货紧缩机制的代币在区块链上频繁遭受攻击。本文将探讨并分析这些通缩机制代币受攻击的原因,并提出相应的防御方案。
在代币中实现通缩机制通常有两种方式:一种是燃烧机制,另一种是反射机制。接下来我们将分析这两种实现方式及其可能存在的问题。
燃烧机制
通常,具备燃烧机制的代币会在其 _transfer 函数中实现燃烧逻辑。有时会存在发送方承担手续费的情况。在这种情况下,接收方收到的代币数量不变,但发送方需要支付更多代币,因为需额外承担手续费。以下是一个简单的例子:

接下来我们讨论这种情形下可能存在的风险。
仅从代币合约本身来看,这种写法似乎没有问题,但在区块链环境中存在许多复杂情况,我们需要全面考虑。
通常为了使代币具有市场价格,项目方会在 Uniswap、Pancakeswap 等去中心化交易所为该代币添加流动性。
其中,Uniswap 中有一个名为 skim 的函数,它会将流动性池中两种代币的余额与储备金之间的差额转移给调用者,以平衡两者数值:

此时发送方变为流动性池,当调用 _transfer 时,流动性池中的部分代币将被销毁,导致代币价格部分上涨。
攻击者利用此特性,直接将代币转入流动性池,随后调用 skim 函数提取差额,并多次重复此操作,导致流动性池中大量代币被烧毁,价格急剧飙升,最终通过出售代币获利。
一个真实攻击案例:winner doge(WDOGE):

在 WDOGE 合约的 _transfer 函数中,当 block.timestamp > closingTime 时进入 else 分支。代码第 21 行中,转账金额从发送方余额扣除;而在第 31 行中,发送方又被额外燃烧了 tokensToBurn 数量的代币。攻击者利用这一手续费机制,通过上述攻击方式窃取了流动性池中全部的价值代币(WBNB)。

反射机制
在反射机制中,用户每次交易都会被收取手续费,用于奖励代币持有者,但不会触发实际转账,仅修改一个系数。
在此机制下,用户拥有两种类型的代币数量:tAmount 和 rAmount。tAmount 是实际代币数量,rAmount 是反映后的代币数量,比率由 tTotal / rTotal 决定,一般代码实现如下:

反射机制代币中通常包含一个称为 deliver 的函数,该函数会销毁调用者的代币,从而降低 rTotal 的值,使得整体比率上升,其他用户的反射后代币数量也随之增加:

攻击者注意到这个函数,并将其用于攻击对应的 Uniswap 流动性池。
那么他是如何加以利用的呢?同样从 Uniswap 的 skim 函数入手:

在 Uniswap 中,reserve 是指储备金,与 token.balanceOf(address(this)) 并不相同。
攻击者首先调用 deliver 函数销毁自己的代币,导致 rTotal 值减少,从而使比率上升,因此反射后的代币价值也增加,token.balanceOf(address(this)) 相应变大,与 reserve 之间出现差值。
因此,攻击者可通过调用 skim 函数提取两者差额部分的代币来获利。

一个真实攻击案例:BEVO NFT Art Token(BEVO):

而当代币合约中存在 burn 函数时,还会出现另一种类似的攻击手法:

当用户调用 burn 函数时,自己的代币被销毁,同时 tTotal 的值减少,导致比率下降,相应地反射后代币数量也会减少,因此此时流动性池中的代币数量也会减少,进而推动代币价格上涨。
攻击者利用这一特性,多次调用 burn 函数以持续减少 tTotal 的值,然后调用流动性池的 sync 函数同步 reserve 与 balances。最终,流动性池中的代币大幅减少,价格飙升,攻击者再卖出代币以获取利润。

一个真实攻击案例:Sheep Token(SHEEP):

防御方案
通过对燃烧机制和反射机制代币攻击手法的分析可以看出,攻击的核心在于操纵流动性池的价格。因此,将流动性池地址加入白名单,使其不参与代币销毁、也不参与反射机制,即可有效避免此类攻击。
まとめ
本文では、通貨緊縮メカニズムを持つトークンの二つの実装方式およびそれらに対する攻撃手法を分析し、最後に対策を提示した。スマートコントラクト作成時には、プロジェクト側がトークンと分散型取引所(DEX)との相互作用を十分に考慮することが不可欠であり、こうした攻撃を防ぐために重要である。
TechFlow公式コミュニティへようこそ
Telegram購読グループ:https://t.me/TechFlowDaily
Twitter公式アカウント:https://x.com/TechFlowPost
Twitter英語アカウント:https://x.com/BlockFlow_News














