本文介绍了以太坊智能合约的安全最佳实践,包括进行智能合约审计、测试代码、同行代码审查、降低软件复杂性、实施故障保护以及设计安全访问控制机制。此外,还介绍了四种智能合约安全工具,帮助开发者保护智能合约免受漏洞利用。
由 Brady Werkheiser 审核
发布于 2022 年 4 月 7 日,阅读需 6 分钟
以太坊使用“智能合约”,或构建在区块链技术上的可编程软件程序,来驱动去中心化应用程序(dApps)、非同质化代币(NFTs)和去中心化自治组织(DAOs)。以太坊智能合约提供的丰富功能使 web3 开发者能够创建复杂的基于区块链的应用程序。
然而,智能合约的实验性增加了漏洞、错误和缺陷,并且随着加密货币市值达到数万亿美元,黑帽黑客正在寻找智能合约中的弱点,以便加以利用。
在本文中,我们将介绍智能合约安全最佳实践、故障保护措施和智能合约分析工具,以加强智能合约的安全性。
以太坊智能合约是用 Solidity 编写的,Solidity 是一种类似于 C++ 和 Javascript 的语言。以太坊智能合约在以太坊区块链上运行,它们的执行由以太坊虚拟机(EVM)管理——一个执行以太坊智能合约的虚拟超级计算机,并且分布在世界各地的多个节点上。
以太坊智能合约的架构可能与其他合约不同。智能合约可以很简单,功能有限,也可以很复杂,具有多层功能。
无论其预期设计如何,智能合约都提供相同的一组优势:
智能合约不容易被修改(除非预先编程好这样做),使其能够抵抗未经批准的更改。一旦合约经过验证并在区块链上生效,就需要付出很大的努力才能更改或升级智能合约代码。
通过设计,智能合约会在满足预定义条件时自动执行一组指令。这发生在没有外部控制的情况下,因此所涉及的用户可以信任代码在没有人为干预的情况下工作。两个人可以在不信任对方的情况下进行交易,因为他们知道智能合约将充当公正的仲裁者。
智能合约与法律文书(智能法律合约)的结合可以简化个人之间的交易,并消除对中间人的需求。由于没有中介机构需要补偿,各方可以在执行和实施协议上花费更少的钱。
每个智能合约都基于条件编程(即,如果这样,则那样)运行。当满足合约逻辑的规则时,这些编程操作会立即发生。因此,交易的发生速度比传统系统更快。
在区块链上运行的智能合约将改变全球用户的治理、金融、物联网和更多行业。然而,考虑到开发者必须考虑的所有安全挑战,智能合约安全漏洞必须认真对待。
以下是一些基本的智能合约安全最佳实践, web3 开发者在以太坊和 EVM 兼容的区块链上构建 dapps 时必须采用这些实践。
在 2022 年,部署未经安全审计的智能合约应该是一种犯罪行为。即便如此,许多开发者仍然在发布未经审计的智能合约。Certik 发布的DeFi 安全状况报告显示,大多数被利用的智能合约都没有经过安全审计。
可以理解的是,聘请智能合约审计员并不便宜。但正确的安全检查可以在未来为你节省更多资金。在 DeFi 中,数百万美元的损失来自利用编写不善的代码中的漏洞的黑客攻击。
一个好的区块链安全审计员遵循经过验证的审计流程,以发现智能合约代码中的缺陷,并发现开发过程中未被注意到的错误。此外,他们还可以提供关于在部署之前修复和优化智能合约的有用建议。
测试、测试和重新测试你的代码,以发现错误和其他漏洞。
严格的测试可能是确保智能合约在部署到主网后按预期运行的最简单和最有效的方法。
在测试网络上部署智能合约,并观察它是否有任何异常。这样,你就可以知道协议是否按预期运行。
用于测试以太坊智能合约的推荐测试网包括:
Rinkeby
Kovan
Ropsten
Truffle
需要测试网 ETH 吗?使用 Alchemy 的免费 Rinkeby ETH 水龙头开始测试你的合约。
单元测试也是提高合约安全性的一个好主意。单元测试会查看你代码的单个部分,因此如果发生故障,你可以知道哪里出了问题。
建议在将每个新功能集成到智能合约之前,先运行单元测试。请记住,智能合约本质上是不可变的,这使得在以后出现漏洞时无法修补代码。
如果你在一个团队中工作,请确保每个成员都进行独立的代码审计,并提供详细的反馈。单人开发者可能希望找到一个值得信赖的同事,在整个开发过程中对他们的智能合约代码进行同行评审,以提高安全性。
软件安全的最终规则是保持代码简单。代码中的复杂性越高,变量就越多,这会增加发生故障的机会。
正如荷兰计算机科学家 Edsger W. Dijkstra 所说:“简单是可靠性的先决条件。”
这并不意味着你应该避免构建功能丰富的智能合约,但是,你应该从一个简单的架构开始,然后随着时间的推移,使用简洁的代码和熟悉的模式慢慢扩展功能。
编写以太坊智能合约的一个经验法则是“为失败做好准备”。无论你测试多少次,你都不可能涵盖可能影响智能合约的每个可能的错误。因此,为你的以太坊智能合约设计一个故障保护机制是必要的。
故障保护模式可用于限制恶意攻击造成的损害。它们被设计为在检测到异常的智能合约活动时触发。
与 EVM 兼容的智能合约的故障保护示例包括:
当发现错误和漏洞时,“断路器”可用于防止函数的执行。使用断路器,你有两个选项来激活它们:
授予受信任的管理员触发断路器的权限
编程断路机制,使其在满足预设条件时运行。
由于智能合约是自动化的,因此断路器会在发生错误时限制操作。
减速带是一种减缓恶意行为的故障保护机制,虽然它不会阻止攻击,但减速带会给管理员足够的时间采取立即纠正措施。
减速带的一个主要例子来自 2016 年臭名昭著的 DAO 黑客攻击。该程序确保在 27 天后才能从 DAO 中提取资金,这会将资金保留在智能合约中,直到开发人员能够检索到它们。
速率限制可以在特定的时间段内控制调用函数的频率,从而提供了一种临时措施,以防止利用重复调用函数来耗尽锁定资金的漏洞(例如 重入攻击)、发行大量 ETH 代币或执行多次提款。
此外,合约级别的速率限制可用于限制在时间间隔内发行的代币数量。
鉴于有大量的漏洞,其中不良行为者在短时间内发行了大量的代币,速率限制是加强智能合约安全性的一个良好的预防措施。
余额限制通过限制可以锁定在单个智能合约中的 ETH 总量来降低智能合约的风险。
余额限制将监视智能合约中持有的资金余额。一旦达到阈值,该机制将触发自动拒绝后续付款。
如果你要启动一个新的智能合约,那么在使用余额限制之前,最好使用余额限制这种预防性安全措施,直到你对合约的安全性有信心为止。
访问控制机制决定了谁可以管理和更改合约的某些元素,这是你以太坊智能合约架构的关键路径。
如果错误的人获得了所有权或管理权限,他们可以重新编程合约以执行恶意交易。
为了防止错误的人获得管理权限,请确保敏感函数在可以访问之前需要多个级别的授权。
智能合约安全至关重要。以下是一些分析工具,可以帮助你保护你的智能合约免受漏洞、错误和缺陷的攻击:
Octopus 是一种高度功能化的用于分析智能合约字节码以深入了解内部行为的分析工具。它与构建在流行的区块链(如 NEO、比特币,当然还有以太坊)上的智能合约兼容。
Oyente 是一种自动化的智能合约审计工具,用于识别常见的智能合约安全漏洞。它包括一个验证器、浏览器、核心分析工具和 CGF 构建器。每个组件都执行一个关键功能;例如,浏览器运行智能合约,而核心分析会检测结果输出中的任何问题。
Mythril 是 ConSensys 构建的一种智能合约安全工具,可用于测试以太坊虚拟机(EVM)字节码。它结合使用污点分析、SMT 求解和符号执行来发现智能合约代码中的漏洞。
Securify 是一个由以太坊基金会支持的智能合约漏洞扫描器。这个流行的以太坊智能合约扫描器可以检测多达 37 种智能合约漏洞,并实施特定于上下文的静态分析,以获得更准确的安全报告。
如果实施得当,智能合约技术可以进行调整以支持各种用例。但是,智能合约是代码,由人编写,有时是不完善的。
作为一名智能合约开发者,你在编写代码时必须遵循安全性的最佳实践,包括运行详细的安全分析,利用多种安全分析工具和资源,进行同行评审,简化代码结构,以及实施故障保护机制。
获取免费的以太坊 RPC 和开发者工具 获取你的 API 密钥
Supercharged | Alchemy | Substack
📚 目录
分享:
- 原文链接: alchemy.com/blog/a-devel...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!