S10. 貔貅
WTF Solidity 合约安全: S10. 貔貅
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity 合约安全”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们将介绍貔貅合约和预防方法(英文习惯叫蜜罐代币 honeypot token)。
貔貅学入门
貔貅是中国的一个神兽,因为在天庭犯了戒,被玉帝揍的肛门封闭了,只能吃不能拉,可以帮人们聚财。但在Web3中,貔貅变为了不详之兽,韭菜的天敌。貔貅盘的特点:投资人只能买不能卖,仅有项目方地址能卖出。
通常一个貔貅盘有如下的生命周期:
- 恶意项目方部署貔貅代币合约。
- 宣传貔貅代币让散户上车,由于只能买不能卖,代币价格会一路走高。
- 项目方
rug pull
卷走资金。
学会貔貅合约的原理,才能更好的识别并避免被割,才能做一个顽强的韭菜!
貔貅合约
这里我们介绍一个极简的ERC20代币貔貅合约Pixiu
。在该合约中,只有合约拥有者可以在uniswap
出售代币,其他地址不能。
Pixiu
有一个状态变量pair
,用于记录uniswap
中 Pixiu-ETH LP
的币对地址。它主要有三个函数:
- 构造函数:初始化代币的名称和代号,并根据
uniswap
和create2
的原理计算LP
合约地址,具体内容可以参考 WTF Solidity 第25讲: Create2。这个地址会在_update()
函数中用到。 mint()
:铸造函数,仅owner
地址可以调用,用于铸造Pixiu
代币。_update()
:ERC20
代币在被转账前会调用的函数。在其中,我们限制了当转账的目标地址to
为LP
的时候,也就是韭菜卖出的时候,交易会revert
;只有调用者为owner
的时候能够成功。这也是貔貅合约的核心。
1 | // 极简貔貅ERC20代币,只能买,不能卖 |
Remix
复现
我们会在 Goerli
测试网上部署 Pixiu
合约,并在 uniswap
交易所中演示。
-
部署
Pixiu
合约。
-
调用
mint()
函数,给自己铸造100000
枚貔貅币。
-
进入 uniswap 交易所,为貔貅币创造流动性(v2),提供
10000
貔貅币和0.1
ETH。
-
出售
100
貔貅币,能够操作成功。
-
切换到另一个账户,使用
0.01
ETH 购买貔貅币,能够操作成功。
-
出售貔貅币,无法弹出交易。
潜在伪装
为了绕过相关的貔貅检查,有些貔貅合约还进行了一系列的伪装:
-
譬如对于非特权用户的转账,不会进行回滚,而是保持状态不变,表面上显示交易成功,实际上依旧没有实现用户的真实交易意图。
-
伪造错误的事件,通过emit不存在的事件误导正在监听事件的钱包和浏览器,使其进行错误的显示,从而使用户产生错误的判断。
预防方法
貔貅币是韭菜在链上梭哈最容易遇到的骗局,并且形式多变,预防非常有难度。我们有以下几点建议,可以降低被貔貅盘割韭菜的风险:
-
在区块链浏览器上(比如etherscan)查看合约是否开源,如果开源,则分析它的代码,看是否有貔貅漏洞。
-
如果没有编程能力,可以使用貔貅识别工具,比如 Token Sniffer 和 Ave Check,分低的话大概率是貔貅。
-
看项目是否有审计报告。
-
仔细检查项目的官网和社交媒体。
-
只投资你了解的项目,做好研究(DYOR)。
-
使用tenderly、phalcon分叉模拟卖出貔貅,如果失败则确定是貔貅代币。
总结
这一讲,我们介绍了貔貅合约和预防貔貅盘的方法。貔貅盘是每个韭菜必经之路,大家也对它恨之入骨。另外,最近也出现貔貅 NFT
,恶意项目方通过修改 ERC721
的转账或授权函数,使得普通投资者不能出售它们。了解貔貅合约的原理和预防方法,可以显著减少你买到貔貅盘的概率,让你的资金更安全,大家要不断学习。