ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

WTF-Solidity 合约安全实战:貔貅合约(Honeypot Token)的原理、复现与防骗指南

WTF-Solidity 合约安全实战:貔貅合约(Honeypot Token)的原理、复现与防骗指南 WTF-Solidity 合约安全实战貔貅合约Honeypot Token的原理、复现与防骗指南【免费下载链接】WTF-SolidityWTF Solidity 极简入门教程供小白们使用。Now supports English! 官网: https://wtf.academy项目地址: https://gitcode.com/GitHub_Trending/wt/WTF-Solidity在加密货币世界中貔貅Pixiu英文圈习惯称为 Honeypot Token / 蜜罐代币是最臭名昭著的骗局之一投资者只能买入、永远无法卖出只有项目方地址才能套现离场。本文基于 WTF-Solidity 合约安全专题第 10 讲的 葡语版文档 及其配套源码从骗局生命周期、ERC20 合约级实现原理、Goerli 测试网全流程复现、常见伪装手法到六大防御策略层层拆解貔貅合约的完整攻防图谱帮助你练就识别与规避链上陷阱的能力。貔貅骗局入门只能吃不能拉貔貅是中国神话中的神兽传说因在天庭犯戒被玉帝惩罚只进不出因而被商家视为招财进宝的祥瑞。但在 Web3 世界里貔貅却成了不祥之兽、散户投资者的天敌貔貅盘的核心特征就是投资人只能买不能卖仅有项目方地址能卖出项目方借此把整个盘面变成只属于自己的提款机。通常一个貔貅盘会经历如下的生命周期部署恶意项目方部署貔貅代币合约拉盘对外宣传貔貅代币吸引散户 FOMO 追高买入。由于只能买不能卖卖压消失代币价格会一路走高跑路项目方在合适的时机执行 rug pull拉地毯式跑路卷走全部资金留下一地鸡毛。整个骗局循环可以通过下图直观理解来自本讲文档的配图理解貔貅合约的底层原理是识别它、避开它的前提。下面我们从一份极简的源码入手。貔貅合约源码解析HoneyPot的实现与三个关键函数本讲提供了一份极简的 ERC20 貔貅代币合约HoneyPot完整源码见 Languages/pt-br/S10_Honeypot/Honeypot.sol中文版见 S10_Honeypot/Honeypot.sol它基于 OpenZeppelin 的ERC20与Ownable合约构建// SPDX-License-Identifier: MIT pragma solidity ^0.8.34; import openzeppelin/contracts/token/ERC20/ERC20.sol; import openzeppelin/contracts/access/Ownable.sol; // Token ERC20 de Pixiu extremamente simples, apenas para compra, não é possível vender. contract HoneyPot is ERC20, Ownable { address public pair; // Construtor: inicializa o nome e o código do token constructor() ERC20(HoneyPot, Pi Xiu) Ownable(msg.sender){ // goerli uniswap v2 factory // Endereço do token Pixiu // goerli WETH //Ordenar tokenA e tokenB em ordem crescente bytes32 salt keccak256(abi.encodePacked(token0, token1)); // calcular endereço do par pair address(uint160(uint(keccak256(abi.encodePacked( hexff, factory, salt, hex96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f ))))); } /** * Função de construção, apenas o proprietário do contrato pode chamar */ function mint(address to, uint amount) public onlyOwner { _mint(to, amount); } /** * dev Veja {ERC20-_update}. * Função Pixiu: apenas o proprietário do contrato pode vender */ function _update( address from, address to, uint256 amount ) internal virtual override { if(to pair){ require(from owner(), Can not Transfer); } super._update(from, to, amount); } }合约包含一个状态变量和三个核心组成部分1. 状态变量pair记录 LP 币对地址pair用于记录 Uniswap 中Pixiu-ETH交易对的 LP 合约地址它是整个骗局的检查点所有以 LP 合约作为接收方的转账即卖出行为都会被拦截。2. 构造函数用 Uniswap Create2 预计算 LP 地址构造函数初始化代币名称HoneyPot与代号Pi Xiu并根据 Uniswap V2 与 Create2 的原理直接计算出 LP 合约地址而无需真正部署后再查询。其计算逻辑为取factoryGoerli 测试网的 Uniswap V2 Factory0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f、tokenA当前貔貅代币地址address(this)与tokenBGoerli 测试网的 WETH0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6将两个代币地址按大小排序得到token0/token1再计算salt keccak256(abi.encodePacked(token0, token1))通过keccak256(abi.encodePacked(hexff, factory, salt, init_code_hash))得到 LP 合约的确定性地址其中init_code_hash为 Uniswap V2 Pair 合约的创建代码哈希0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f。这套地址推导正是 第 25 讲 Create2 预计算合约地址 的实战应用——项目方借此在构造函数里就锁死了 LP 地址为后续拦截卖出做好准备。3.mint()仅项目方可控的铸币入口mint(address to, uint amount)带有onlyOwner修饰器只有合约 owner 可以调用用于给自己铸造貔貅代币为后续拉盘、撤池准备筹码。onlyOwner与Ownable(msg.sender)的用法对应 第 11 讲构造函数与修饰器 的内容。4._update()貔貅合约的灵魂_update()是 OpenZeppelin ERC20 在每一次代币转移转账、铸造、销毁前都会调用的钩子函数。在 lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol 中_transfer()、_mint()、_burn()最终都会汇聚到_update()完成余额变动与Transfer事件的发射因此重写它是拦截任意转账的最佳切入点。貔貅合约正是重写了这个钩子function _update(address from, address to, uint256 amount) internal virtual override { if (to pair) { require(from owner(), Can not Transfer); } super._update(from, to, amount); }逻辑非常精炼当转账的目标地址to是 LP 合约即投资者把貔貅代币卖给 DEX、兑换成 ETH 的卖出路径时检查转账发起者from是否为owner()若不是 owner普通散户卖出require条件失败整笔交易revert卖出永远不可能成功若from是 owner项目方卖出则放行。而买入方向不受影响当散户用 ETH 从 LP 中买入貔貅代币时代币的转移方向是from LP, to 投资者接收方不是 LP检查自然跳过买入畅通无阻。一进一出之间貔貅只进不出的特性在 ERC20 底层钩子上被精确实现。版本说明文档与源码使用的 OpenZeppelin 版本中转移钩子为_update()早期版本如 v4.x对应的是_beforeTokenTransfer()函数名不同但拦截思路完全一致。Remix 全流程复现在 Goerli 上亲眼看貔貅纸上得来终觉浅文档给出了在 Goerli 测试网 Uniswap 上的完整复现步骤可以在 Remix 中按以下 6 步操作部署貔貅合约在 Remix 中编译部署HoneyPot合约部署完成后即可通过pair读取到计算出的 LP 地址铸造代币调用mint()函数给自己铸造100000枚貔貅币注意 ERC20 默认 18 位小数添加流动性进入 Uniswap V2ETH 路径为貔貅币创建交易对提供10000枚貔貅币和0.1ETH 作为初始流动性项目方卖出用部署者账户出售100枚貔貅币操作成功——因为此时from是 owner放行散户买入切换到另一个账户用0.01ETH 购买貔貅币操作成功——买入方向不受拦截散户卖出再用这个非 owner 账户出售貔貅币交易无法弹出、必然失败——_update()中的require直接回滚。复现过程清晰地展示了貔貅合约别人卖不掉、自己随便卖的完整行为如果你希望在生产级环境中验证还可以用 Foundry 对本仓库的 Solidity 文件进行本地编译与测试仓库已配置 foundry.toml在 fork 主网或测试网的环境下模拟完整的买卖流程观察 revert 行为。貔貅的常见伪装绕过检查的两大伎俩为了规避链上安全工具的检测部分貔貅合约还会进行刻意伪装让买卖检查更难被一眼看穿静默失败不 revert只保持状态不变对于非特权用户的转账合约并不回滚交易而是直接返回成功、余额纹丝不动。链上显示交易成功钱包里也显示卖出完成但实际上用户的真实交易意图根本没有达成资金依旧被锁死伪造错误事件emit 虚假事件通过emit并不真实存在或语义错误的事件误导正在监听事件的钱包、浏览器和区块浏览器使其渲染出错误的转账结果让用户产生已经卖出/已经收到的错觉从而放松警惕。这两种伪装比直接 revert 更难察觉因为它们绕开了交易失败这一最显眼的信号转而攻击前端展示层的信息可信度。预防方法六招避开貔貅盘貔貅币是链上散户最常遇到的骗局类型且形式多变、难以预防。综合文档与项目实践可以采取以下措施降低踩雷风险检查合约是否开源并审计代码在区块链浏览器如 Etherscan上查看合约是否开源若开源重点分析是否存在对_update()/_beforeTokenTransfer()的异常重写、白名单/黑名单地址逻辑、以及转账钩子中的require限制对照本讲的貔貅模式即可快速发现漏洞使用貔貅识别工具没有编程能力的投资者可以借助 Token Sniffer、Ave Check 等代币检测工具评分越低是貔貅盘的概率越高查看审计报告确认项目是否委托第三方安全团队做过审计以及审计是否覆盖转账逻辑这类关键路径审查官网与社媒仔细核查项目的官网、社交媒体账号的运营历史与可信度警惕信息突然消失、匿名运营的项目只投资你真正了解的项目DYOR不懂不碰做好自己的尽职调查Do Your Own Research远离一夜暴富心态驱动的盲目 FOMOFork 模拟卖出使用 Tenderly、Phalcon 等工具在测试网上分叉模拟卖出该代币如果模拟卖出失败基本可以断定是貔貅代币——这是技术上最直接、最有效的验证手段直接把本讲的_update()检查在真实链上状态中复现一遍。总结本讲围绕貔貅合约Honeypot Token完整覆盖了四大板块骗局生命周期部署→拉盘→rug pull、合约级实现原理用 OpenZeppelin_update()钩子拦截卖出到 LP方向的转账、Goerli 测试网上的六步复现以及伪装手法与防御策略。貔貅盘几乎是每个链上投资者都会遭遇的必修课而最近还出现了貔貅 NFT 的变种——恶意项目方通过修改 ERC721 的转账或授权函数让普通投资者无法出售持有的 NFT。理解貔貅合约的原理并掌握预防手段能显著降低你买到貔貅盘的概率让你的资金更安全。面对任何只进不出的异常代币行为保持警惕、用代码和模拟工具验证永远是最可靠的防线。【免费下载链接】WTF-SolidityWTF Solidity 极简入门教程供小白们使用。Now supports English! 官网: https://wtf.academy项目地址: https://gitcode.com/GitHub_Trending/wt/WTF-Solidity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表