以太坊智能合约是极为灵活的。它能够存储超过非常大量的虚拟货币(超过十亿美元),并且根据先前部署的智能合约运行不可修改的代码。 虽然这创造了一个充满活力和创造性的生态系统,但其中包含的无信任、相互关联的智能合约,也吸引了攻击者利用智能合约中的漏洞和以太坊中的未知错误来赚取利润。 智能合约代码通常无法修改来修复安全漏洞,因此从智能合约中被盗窃的资产是无法收回的,且被盗资产极难追踪。 由于智能合约问题而被盗取或丢失的价值总额很容易超过 10 亿美元。
审核不是完美的解决方案
几年前,用于编写、编译、测试和部署智能合约的工具还非常不成熟,许多项目被随意地编写 Solidity 代码,并将其交给审查员,审查员将审查代码以确保其安全并按预期运行。 在 2020 年,编写 Solidity 代码的开发过程和工具得到了显著改善,不仅可以确保项目更易于管理,而且能够组成项目安全性的一部分。仅仅在项目结束时对您的智能合约进行审计已经不足以成为项目的唯一安全考虑。 安全性来源于适当的设计和开发过程,所以在您编写第一行智能合约代码之前,安全性就应该被考虑。
智能合约开发过程
最低安全限度:
- 所有代码应该被存在于一个版本控制系统当中,例如 git
- 所有的代码修改都应该通过拉取请求来进行
- 所有的拉取请求都应该有至少一个审核员。 如果这是一个个人项目,请考虑寻找另一位个人作者和一个交易代码审核员。
- 使用开发以太坊环境(请参阅:Truffle),只需一个命令就可以编译、部署和运行一套针对您的代码的测试
- 已经通过 Mythril 和 Sliter 等基本代码分析工具运行了代码,最好是在合并每个拉取请求之前,比较输出中的差异。
- Solidity 代码编辑器不会发出任何警告
- 您的代码有据可查
上面的这些条目是编写智能合约的一个良好的开始,但是在编写代码过程中还有很多要值得注意。 关于更多条目及其详细解释,请参阅DeFiSafety 提供的过程质量检查清单。 DeFiSafete 对项目的安全评级等级的一部分包括该项目是否遵守了质量检查表。 遵循这些审核过程:
- 通过可复现的自动化测试,产生更安全的代码
- 审查员将能够更有效地审查您的项目
- 对新开发者友好
- 允许开发者快速迭代、测试并在修改时获得反馈
- 回滚代码的可能性较低
漏洞攻击
既然您正在使用高效的开发过程编写 Solidity 代码,那么让我们看看一些常见的 Solidity 漏洞问题。
重入攻击
重入攻击时在编写智能合约代码时应该考虑的最大且最重要的安全问题。 虽然以太坊虚拟机不能同时运行多个合约,一个合约可以调用另一个合约来暂停一个合约的执行和内存状态,直到被重新调用。这时,代码将会继续被正常执行。 暂停和重新启动的过程可能会造成一种被称为“重入攻击”的漏洞。
其他攻击
除了上面的重入攻击,智能合约还会收到许多其他类型的攻击需要注意,例如:
- 溢出攻击
- 自毁攻击
- delegatecall数据篡改
- 随机数问题
安全工具
虽然了解以太坊安全基础知识和聘请专业审计公司审查您的代码是无可替代的,但在合约编写的过程中学会使用安全工具,能帮助你更有效率的发现和改正代码中出现的错误和漏洞。
Slither
Slither是分析代码和报告问题的实用工具。 每个人都有一个 [commercial] 托管版本,但也可以免费在本地运行。像所有自动化测试工具一样,Slither 并不完美,它在报告一侧出现了太多错误。 即使在不存在可开发的脆弱性的情况下,它也可以就潜在的重返提出警告。 在代码更改之间在 Slither 输出中查看 DIFERENER 常常非常有启发性,可以帮助发现比等待您的项目代码完成早得多的漏洞。
Mythril
Mythril 是 EVM 字节码的安全分析工具。它检测为以太坊、Hedera、Quorum、Vechain、Roostock、Tron 和其他与 EVM 兼容的区块链构建的智能合约中的安全漏洞。它使用符号执行、SMT 解决和污点分析来检测各种安全漏洞。它还在MythX安全分析平台中使用(与其他工具和技术结合使用)。
小结
随着区块链技术的不断发展,智能合约关于安全性的解决方案也越来越完善和多样,但我们也应该做好预防措施去避免漏洞: