广场
最新
热门
资讯
我的主页
发布
StakeWhisperer
2026-05-03 04:11:19
关注
我刚刚写完一篇关于重入攻击(reentrancy)的问题分析,这也是许多开发者在构建智能合约时仍然忽视的安全漏洞。
简单来说,重入攻击就是当一个智能合约在还未完成第一次调用时,被多次调用的情况。可以这样想象:ContractA 正在执行一个函数,它调用了 ContractB,而 ContractB 又在还未结束时反过来调用 ContractA。这就是攻击者可以利用的漏洞。
具体例子:EtherStore 有 10 Ether,ContractB 已经存入了 1 Ether。当 ContractB 调用提款函数时,它会检查余额是否大于 0,如果是,就将 Ether 发送回去。但这里存在危险——更新余额的操作是在转账之后进行的。因此,攻击者可以在收到 Ether 时,利用 fallback 函数再次调用提款函数。这个循环会持续进行,直到所有 Ether 被提取完毕。
我将介绍三种防止重入攻击的方法:
第一是使用 nonReentrant 修饰符。这种方法在函数执行时锁定合约,防止再次进入。简单但对单个函数有效。
第二是应用 Checks-Effects-Interactions 模式。即在转账之前先更新余额。这样即使发生重入,余额也已变为 0,检查就会失败。
第三是创建一个 GlobalReentrancyGuard 合约。这个方法用一个公共状态变量来控制多个合约的重入问题。特别适合你的项目中有多个合约相互交互的情况。不是在每个合约中单独检查,而是在一个集中位置统一控制。
重入攻击的问题并不新鲜,但它仍然是最常见的漏洞之一。我看到很多开发者还没有一致地应用这些防护措施。如果你在使用 Solidity,务必确保理解这个问题,并在你的项目中至少采用上述三种方法之一。智能合约的安全性不是可选的,而是必须的。
查看原文
此页面可能包含第三方内容,仅供参考(非陈述/保证),不应被视为 Gate 认可其观点表述,也不得被视为财务或专业建议。详见
声明
。
赞赏
点赞
评论
转发
分享
评论
请输入评论内容
请输入评论内容
评论
暂无评论
热门话题
查看更多
#
WCTC交易王PK
56.02万 热度
#
美国寻求战略比特币储备
5877.43万 热度
#
比特币ETF期权持仓限额增4倍
103.39万 热度
#
美联储利率不变但内部分歧加剧
4.4万 热度
#
DeFi4月安全事件损失超6亿美元
1016.88万 热度
置顶
网站地图
我刚刚写完一篇关于重入攻击(reentrancy)的问题分析,这也是许多开发者在构建智能合约时仍然忽视的安全漏洞。
简单来说,重入攻击就是当一个智能合约在还未完成第一次调用时,被多次调用的情况。可以这样想象:ContractA 正在执行一个函数,它调用了 ContractB,而 ContractB 又在还未结束时反过来调用 ContractA。这就是攻击者可以利用的漏洞。
具体例子:EtherStore 有 10 Ether,ContractB 已经存入了 1 Ether。当 ContractB 调用提款函数时,它会检查余额是否大于 0,如果是,就将 Ether 发送回去。但这里存在危险——更新余额的操作是在转账之后进行的。因此,攻击者可以在收到 Ether 时,利用 fallback 函数再次调用提款函数。这个循环会持续进行,直到所有 Ether 被提取完毕。
我将介绍三种防止重入攻击的方法:
第一是使用 nonReentrant 修饰符。这种方法在函数执行时锁定合约,防止再次进入。简单但对单个函数有效。
第二是应用 Checks-Effects-Interactions 模式。即在转账之前先更新余额。这样即使发生重入,余额也已变为 0,检查就会失败。
第三是创建一个 GlobalReentrancyGuard 合约。这个方法用一个公共状态变量来控制多个合约的重入问题。特别适合你的项目中有多个合约相互交互的情况。不是在每个合约中单独检查,而是在一个集中位置统一控制。
重入攻击的问题并不新鲜,但它仍然是最常见的漏洞之一。我看到很多开发者还没有一致地应用这些防护措施。如果你在使用 Solidity,务必确保理解这个问题,并在你的项目中至少采用上述三种方法之一。智能合约的安全性不是可选的,而是必须的。