市值: $2.812T -5.85%
成交额(24h): $186.0816B 66.46%
恐惧与贪婪指数:

38 - 恐惧

  • 市值: $2.812T -5.85%
  • 成交额(24h): $186.0816B 66.46%
  • 恐惧与贪婪指数:
  • 市值: $2.812T -5.85%
加密货币
话题
百科
资讯
加密话题
视频
热门加密百科

选择语种

选择语种

选择货币

加密货币
话题
百科
资讯
加密话题
视频

如何保护您的智能合约免受重入攻击?

Reentrancy vulnerabilities arise when external calls precede state updates, enabling malicious recursive calls—mitigated by Checks-Effects-Interactions, ReentrancyGuard, and cautious gas limits.

2026/01/23 10:39

了解重入漏洞

1. 重入攻击利用外部合约在初始函数执行完成之前回调到易受攻击的合约的能力。

2. 当状态更改在外部调用之前未最终确定时,就会发生这种情况,从而允许恶意代码重复操纵余额或标志。

3. 2016 年臭名昭著的 DAO 黑客事件展示了递归提款模式如何耗尽价值超过 6000 万美元的 ETH。

4. 此类漏洞在处理转账、提款或任何涉及外部调用和状态更新的逻辑的函数中大量出现。

5. 0.8.0 之前的 Solidity 版本缺乏内置的重入防护,这使得手动保护对于遗留部署至关重要。

检查-效果-交互模式的实现

1. 该架构规则要求所有内部状态修改发生在任何外部交互之前。

2. 例如,更新用户余额必须先于呼叫转移呼叫另一个地址。

3. 违反此命令将为攻击者劫持控制流并重新进入同一功能打开大门。

4. 即使排序正确,开发人员也必须验证没有中间函数(例如事件发射器或修饰符)触发意外的外部调用。

5. 像 Slither 和 MythX 这样的工具可以在字节码和源代码的静态分析过程中检测到与此模式的偏差。

使用 ReentrancyGuard 修饰符

1. OpenZeppelin 的ReentrancyGuard是一个经过广泛审核的实用程序,它使用布尔标志锁定函数。

2. 修饰符在执行前将_status设置为_ENTERED ,并在完成后将其重置为_NOT_ENTERED

3. 由于活动锁,任何尝试重新进入同一受保护函数的嵌套调用都将恢复。

4. 除非所有敏感入口点共享相同的防护实例,否则它不会阻止跨功能重入。

5. 开发人员必须确保继承层次结构正确初始化保护状态并避免隐藏内部变量。

Gas 限制作为缓解策略

1. 明确限制在call.gas(2300)等低级调用中转发的 Gas 可以防止接收者合约执行复杂的逻辑。

2. 该技术模仿了sendtransfer的 Gas 津贴,将执行限制为 2300 Gas。

3. 然而,仅仅依靠 Gas 限制是脆弱的——未来的 EVM 升级或自定义操作码可能会不可预测地改变 Gas 成本。

4. 它还破坏了与需要超过最少 Gas 来实现回退逻辑的合约的兼容性,例如执行日志记录或重新平衡的合约。

5. 基于气体的缓解措施应该补充而不是取代结构性保障措施,例如重入防护和国家命令。

常见问题解答

问:视图或纯函数中可以发生重入吗?答:不能。这些函数不能执行状态改变操作或外部调用,从而消除了递归干扰的可能性。

问:使用 delegatecall 是否可以防止重入?答:不是天生的。虽然delegatecall保留调用者的存储上下文,但如果目标逻辑包含不受保护的外部交互,它不会阻止可重入模式。

问:应付回退功能总是危险的吗?答:仅当它执行状态更新或外部调用而没有重入保护时。在没有副作用的情况下接受 ETH 的最小回退带来的风险可以忽略不计。

问:可升级的代理模式是否会增加重入风险?答:是的,如果实施合约缺乏适当的保护,并且代理在未经验证的情况下转发调用,攻击者可能会同时利用代理逻辑和业务逻辑。

免责声明:info@kdj.com

所提供的信息并非交易建议。根据本文提供的信息进行的任何投资,kdj.com不承担任何责任。加密货币具有高波动性,强烈建议您深入研究后,谨慎投资!

如您认为本网站上使用的内容侵犯了您的版权,请立即联系我们(info@kdj.com),我们将及时删除。

相关百科

如何使用LayerZero合约执行跨链消息?

如何使用LayerZero合约执行跨链消息?

2026-01-18 13:19:39

了解 LayerZero 架构1. LayerZero 作为一种轻量级、无需许可的互操作性协议运行,无需依赖可信中介或包装资产即可实现区块链之间的通信。 2. 它利用部署在每条链上的超轻节点(ULN)来验证消息的完整性和一致性,而无需存储完整的区块链状态。 3. 核心组件包括处理消息路由的 Endp...

如何实施EIP-712进行安全签名验证?

如何实施EIP-712进行安全签名验证?

2026-01-20 22:20:26

EIP-712 概述和核心目的1. EIP-712 定义了以太坊应用程序中类型化结构化数据哈希和签名的标准。 2. 它使钱包能够在签名请求期间显示人类可读的域和消息字段,而不是原始的十六进制字符串。 3. 该规范通过域分隔符哈希引入域分离,防止跨不同 dApp 或链的签名重放。 4. 每个签名的有效...

如何通过新合约交互获得空投资格?

如何通过新合约交互获得空投资格?

2026-01-24 21:00:23

了解合约交互要求1. 大多数空投活动都要求与部署在受支持的区块链(例如以太坊、Arbitrum 或 Base)上的智能合约进行直接交互。 2. 交互通常涉及使用连接到 dApp 接口的钱包执行诸如approve() 、 stake()或mint()之类的函数。 3. 某些协议需要多种交易类型,例如将...

如何监控智能合约的安全警报?

如何监控智能合约的安全警报?

2026-01-21 07:59:57

链上监控工具1. Etherscan和Blockscout等区块链浏览器允许实时检查合约字节码、交易日志和内部调用。 2. 在信任任何链上数据之前必须确认合约验证状态——未经验证的合约存在高风险。 3. 事件日志解析可以检测异常状态变化,例如意外的代币转移或所有权修改。 4. 可以针对特定事件签名设...

如何建立自动支付合同并为其提供资金?

如何建立自动支付合同并为其提供资金?

2026-01-26 08:59:35

了解智能合约部署1. 开发者必须根据gas效率和安全性要求选择兼容的区块链平台,例如以太坊、Polygon或Arbitrum。 2. Solidity 仍然是编写支付自动化逻辑的主要语言,特别是对于定期或有条件的转账。 3. 在主网部署之前,使用 Hardhat 或 Foundry 等本地开发环境来...

如何使用 OpenZeppelin 合约构建安全的 dApp?

如何使用 OpenZeppelin 合约构建安全的 dApp?

2026-01-18 11:19:49

了解 OpenZeppelin 合约基础知识1. OpenZeppelin Contracts 是一个可重用、经过社区审核的智能合约组件库,专为以太坊和 EVM 兼容的区块链而构建。 2. 库中的每个合约都遵循严格的安全实践,包括遵守“检查-效果-交互”模式以及广泛使用访问控制修饰符。 3. 该库提...

如何使用LayerZero合约执行跨链消息?

如何使用LayerZero合约执行跨链消息?

2026-01-18 13:19:39

了解 LayerZero 架构1. LayerZero 作为一种轻量级、无需许可的互操作性协议运行,无需依赖可信中介或包装资产即可实现区块链之间的通信。 2. 它利用部署在每条链上的超轻节点(ULN)来验证消息的完整性和一致性,而无需存储完整的区块链状态。 3. 核心组件包括处理消息路由的 Endp...

如何实施EIP-712进行安全签名验证?

如何实施EIP-712进行安全签名验证?

2026-01-20 22:20:26

EIP-712 概述和核心目的1. EIP-712 定义了以太坊应用程序中类型化结构化数据哈希和签名的标准。 2. 它使钱包能够在签名请求期间显示人类可读的域和消息字段,而不是原始的十六进制字符串。 3. 该规范通过域分隔符哈希引入域分离,防止跨不同 dApp 或链的签名重放。 4. 每个签名的有效...

如何通过新合约交互获得空投资格?

如何通过新合约交互获得空投资格?

2026-01-24 21:00:23

了解合约交互要求1. 大多数空投活动都要求与部署在受支持的区块链(例如以太坊、Arbitrum 或 Base)上的智能合约进行直接交互。 2. 交互通常涉及使用连接到 dApp 接口的钱包执行诸如approve() 、 stake()或mint()之类的函数。 3. 某些协议需要多种交易类型,例如将...

如何监控智能合约的安全警报?

如何监控智能合约的安全警报?

2026-01-21 07:59:57

链上监控工具1. Etherscan和Blockscout等区块链浏览器允许实时检查合约字节码、交易日志和内部调用。 2. 在信任任何链上数据之前必须确认合约验证状态——未经验证的合约存在高风险。 3. 事件日志解析可以检测异常状态变化,例如意外的代币转移或所有权修改。 4. 可以针对特定事件签名设...

如何建立自动支付合同并为其提供资金?

如何建立自动支付合同并为其提供资金?

2026-01-26 08:59:35

了解智能合约部署1. 开发者必须根据gas效率和安全性要求选择兼容的区块链平台,例如以太坊、Polygon或Arbitrum。 2. Solidity 仍然是编写支付自动化逻辑的主要语言,特别是对于定期或有条件的转账。 3. 在主网部署之前,使用 Hardhat 或 Foundry 等本地开发环境来...

如何使用 OpenZeppelin 合约构建安全的 dApp?

如何使用 OpenZeppelin 合约构建安全的 dApp?

2026-01-18 11:19:49

了解 OpenZeppelin 合约基础知识1. OpenZeppelin Contracts 是一个可重用、经过社区审核的智能合约组件库,专为以太坊和 EVM 兼容的区块链而构建。 2. 库中的每个合约都遵循严格的安全实践,包括遵守“检查-效果-交互”模式以及广泛使用访问控制修饰符。 3. 该库提...

查看所有文章

User not found or password invalid

Your input is correct