在Web3领域,开发者面临的赌注是天文数字级别的。智能合约中的一个错误不仅仅会导致404错误;它可能导致用户资金数百万美元的不可逆转损失。区块链的不可变性意味着没有重来的机会。安全性不是一项功能;它是这个领域构建任何事物的绝对先决条件。
本指南概述了每个智能合约开发者必须了解的最关键的安全最佳实践。它涵盖了常见的攻击向量以及缓解这些攻击所需的防御性编程模式。
1. 检查-效果-交互模式
这可以说是Solidity中防止常见且破坏性漏洞:重入的最重要设计模式。
问题(重入攻击):
当恶意外部合约在第一次函数调用尚未执行完成时,回调到你的合约中,就会发生重入攻击。这允许攻击者在余额更新之前,通过重复调用提款函数来耗尽资金。
解决方案:
按照这个特定顺序构建你的函数:
- 检查:首先,执行所有验证检查(例如,
require(msg.sender == owner))。 - 效果:其次,更新你的合约状态(例如,
balances[msg.sender] = 0)。 - 交互:最后,与任何外部合约进行交互(例如,
(bool sent, ) = msg.sender.call{value: amount}(""))。
通过在发送资金之前更新状态,即使外部合约回调,你也能确保你的合约状态已经是正确的,攻击者无法多次提取资金。
2. 使用 call 进行外部调用,而非 transfer 或 send
当从合约发送以太币时,应始终优先使用 .call{value: amount}("") 而不是 .transfer() 或 .send()。
问题:
transfer() 和 send() 函数会转发固定的2300 gas津贴。这本来是一项安全措施,但在未来网络升级导致gas成本变化时,可能导致合约失败。如果一个接收合约的回退函数逻辑稍微复杂一些,可能会耗尽gas,导致交易回滚。
解决方案:
使用 .call{value: amount}("") 会转发所有剩余的gas,使你的合约更具未来适应性。然而,这使得检查-效果-交互模式变得更加关键,因为它增加了重入的风险。
3. 警惕整数溢出和下溢
在Solidity 0.8.0版本之前,算术运算在发生溢出或下溢时不会回滚。
问题:
如果一个 uint8(可容纳0-255的值)的值为255,你对其加1,它会回绕到0。攻击者可能利用这一点来操纵余额或其他关键值。
解决方案:
- 使用Solidity 0.8.0+:所有现代合约都应使用
pragma solidity ^0.8.0;。在此版本及更高版本中,算术运算在溢出/下溢时会自动回滚,从而有效解决了该问题。 - 使用SafeMath(传统方法):对于旧合约,使用OpenZeppelin的SafeMath库来执行所有算术运算。
4. 避免交易排序依赖(前置交易)
永远不要假设内存池中的交易顺序就是它们在区块中被执行的顺序。恶意行为者可以看到你的交易,并支付更高的gas费来让自己的交易先执行。这是MEV(最大可提取价值) 的一种形式。
问题:
如果你在智能合约中创建一个谜题,第一个提交正确答案的人将赢得奖品,那么前置交易机器人将在内存池中看到正确答案并复制它,从而窃取奖品。
解决方案:
使用承诺-揭示方案。在第一笔交易中,用户提交他们答案的哈希值。在承诺阶段结束后的第二笔交易中,他们揭示自己的答案。这可以防止机器人提前看到解决方案。
5. 使用已建立、经过审计的库
不要重复造轮子,尤其是对于代币这样的标准组件。
问题:
编写自己的ERC20或ERC721实现是高风险且容易出错的。
解决方案:
始终使用经过实战检验的库,如OpenZeppelin Contracts。它们的实现经过了细致的审计,并遵循社区接受的标准。
6. 拥有全面的测试套件并进行审计
测试:
你的测试套件应达到100%的代码行覆盖率和分支覆盖率。使用像Foundry或Hardhat这样的工具来编写测试,覆盖所有可能的场景,包括边缘情况和潜在的攻击向量。
审计:
对于任何将要处理大量价值的合约,来自信誉良好的公司的专业安全审计是必不可少的。审计提供了一个关键的第二视角,可以发现你可能遗漏的漏洞。
在Web3中构建需要一种偏执的心态。假设每个外部合约都是恶意的,并且老练的行为者会试图利用任何弱点。通过遵守这些安全最佳实践,你可以显著降低漏洞风险,并为用户构建安全的应用程序。
CSD0tFqvECLokhw9aBeRqjqYfDJdW3nZR2MolY56cOSJb+wEwzPnCsyAovIBj0UNlkr5z0IoywnTXzNNwl81Hks71zonRGQJnSGats1/ZZAlzoOenWPUVepQVT/mrpMqhVJCjrZmWeffUJ5yCLNCOQ==
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
公众号二维码

公众号二维码
