OpenZeppelin:保障以太坊智能合约安全的利器
核心要点
以太坊的计算需要在网络中的所有节点上复制,因此其计算成本高昂且效率低下(事实上,以太坊的GitHub开发者文档指出,我们不应该期望以太坊的计算能力超过1999年的手机)。
因此,以太坊虚拟机(EVM)的安全,即部署在以太坊区块链上的智能合约的安全,至关重要。所有错误都会造成实际的经济损失——无论是糟糕的合约代码造成的错误,还是黑客利用合约漏洞(例如臭名昭著的DAO黑客事件,导致社区分裂并催生了以太坊经典区块链)造成的损失。
图灵完备性以及其他一系列设计决策,使以太坊功能更强大、更复杂,但也付出了代价。以太坊的丰富性使其更容易受到错误和黑客攻击。
更糟糕的是,部署在以太坊上的智能合约无法修改。区块链是一种不可变的数据结构。
本文深入探讨了智能合约的安全性和帮助我们编写安全智能合约的工具和库生态系统。
让我们来看看一些令人惊叹的工具升级,我们可以立即使用它们来充分利用Solidity环境提供的最佳实践。
以太坊开发者最酷的工具之一是OpenZeppelin库。它是一个框架,包含许多安全可靠的Solidity代码模式和智能合约模块。其作者本身就是Solidity审计员和顾问,您可以在此处阅读对这些模块的第三方审计报告。Zeppelin Solutions(一家位于阿根廷的公司)的Manuel Araoz概述了主要的Solidity安全模式和注意事项。
OpenZeppelin已成为可重用且安全的开源(MIT)Solidity代码的行业标准,可轻松使用Truffle部署。它由智能合约组成,这些合约一旦通过npm安装,就可以轻松导入并用于我们的合约中。
Truffle框架发布了一个关于如何将OpenZeppelin与Truffle和Ganache一起使用的教程。
这些合约旨在导入,其方法也旨在根据需要进行覆盖。文件本身不应修改。
OpenZeppelin库包含一组用于在以太坊平台上发布代币的合约——用于ERC20代币,包括BasicToken合约、BurnableToken、CappedToken(具有固定上限的可铸造代币)、MintableToken、PausableToken(可以暂停代币转账)。还有TokenVesting(一个可以像典型的归属计划一样逐步释放其代币余额的合约,具有断崖期和归属期)等等。
还有一些用于ERC721代币(或CryptoKitties类型的不可替代的唯一代币)的合约。
还包括ERC827代币合约,该标准用于在交易代币时发送数据。
还有一些众筹合约——用于进行首次代币发行的合约。这些合约可以记录购买、向买家交付/发出代币、转发ETH资金。还有一些用于验证和处理代币购买的功能。
FinalizableCrowdsale合约允许在销售后执行某些逻辑。PostDeliveryCrowdsale允许冻结提款,直到众筹结束。RefundableCrowdsale是Crowdsale合约的扩展,它添加了融资目标,以及如果未达到目标,用户可以获得退款的可能性。
可销毁合约可以被所有者销毁,并将所有资金发送给所有者。还有一些合约用于实现对子合约的可暂停性。
OpenZeppelin提供了许多用于进行ICO的辅助工具和实用程序——例如,一个可以恢复错误发送到ICO地址而不是ETH的ERC20代币的合约。一个可继承的合约允许在特定情况下将所有权转移给另一个所有者。Ownable合约有一个所有者地址,并提供基本授权/权限和所有权转移。
RBAC合约提供基于角色的访问控制实用程序。我们可以为不同的地址分配不同的角色,角色数量不限。
Zeppelin还提供了一个尚未经过审计的示例众筹启动Truffle项目,因此最好将其用作使用OpenZeppelin的入门介绍。它使快速启动众筹和代币变得容易。
ZeppelinOs是一个开源的、去中心化的工具和服务平台,建立在EVM之上,用于安全地开发和管理智能合约应用程序。
实际上,这是EVM之上的中间件层,比目前的OpenZeppelin框架更进一步。Zeppelin Solutions在此承诺的是使开发人员能够通过升级模式选择其已部署代码的可变性。那些为EVM编写智能合约的人知道,一个问题/限制是已部署合约的不可变性:一旦进入区块链,合约就无法更改。这就是ZeppelinOs的承诺如此吸引人的原因之一。
到目前为止,为了“更新”合约,需要部署两个合约——一个作为具有接口的代理,另一个作为实现。将调用代理的功能,并将请求转发到实现。然后,如果需要更改,则在代理中切换实现(重新定位另一个实现,并可以选择使用自杀函数关闭原始实现),新的实现将无缝激活。
我们期待着ZeppelinOs未来被社区采纳的情况。Zeppelin Solutions已经提到了OpenBazaar、district0x、storj.io等一些非微不足道的参与者,他们正在使用ZeppelinOs。
Truffle框架是以太坊的开发环境、测试框架和资产管道。它是工具集最完整、在以太坊开发者中应用最广泛的工具集。Truffle的生态系统包括许多Truffle boxes——包含前端JavaScript代码、Solidity合约和工作流程实用程序(如带有其工具集的样板webpack项目)的样板,例如迁移、测试、构建管道等。Truffle Boxes可以包含完整的入门dapp。
一些官方支持的boxes包括:
社区创建的boxes还带来了与移动应用程序/Status IM集成合约的样板,或提供Angular和Vue.js样板等。
这些boxes与Truffle集成,因此我们可以通过运行诸如truffle unbox react之类的命令来启动它们——这将下载React box并在本地安装其依赖项。
TokenMarket是另一家发布了Solidity合约和用于管理代币销售/ICO的工具的企业。它是一家在直布罗陀注册的有限公司,从事ICO咨询业务。它在2018年柏林加密货币世界博览会峰会上荣获“最佳ICO顾问”奖。
Tokenmarket在GitHub上的ICO存储库表示,其设计目标/原则之一是使用或构建现有的OpenZeppelin合约,称其为Solidity合约的黄金标准。因此,TokenMarket的大部分ICO代码库都是基于OpenZeppelin的代码库,然后在其基础上进一步构建(通过以面向对象的方式继承)。
TokenMarket定期(尝试)与其上游代码库OpenZeppelin保持同步。但是,它还添加了更多内容,例如:
尽管我们在此讨论的存储库中有很多代码,但EVM是图灵完备的,因此所有这些不同的合约甚至都不能远程耗尽其全部功能。如果系统(以太坊)能够生存并继续保持竞争力,并且网络上有足够多的人,我们可以期待这些区块链合约试图解决的问题的更大通用性。
Consensys Ventures是一家瑞士风险投资公司,它将自己定位为去中心化领域的风险投资公司——尤其是在以太坊领域。除了他们为受保护公司提供的其他资源外,他们还整理了一份关于以太坊智能合约最佳实践的简短汇编。虽然严格来说这不是代码,但它仍然包含大量关于Solidity代码的优缺点示例。
它主要关注Solidity智能合约的最佳安全实践。
完整的主题列表超出了本文的范围,因为该资源非常全面,即使是提醒智能合约开发者在为EVM编写软件时需要牢记的所有内容,也值得一读。如果有人从头开始编写程序(不依赖于像OpenZeppelin这样的现成和经过验证的代码),则尤其如此。
一些文章涉及外部调用、避免外部调用后的状态更改、处理外部调用中的错误、优先使用拉取而不是推送进行外部调用、了解抽象合约和接口之间的权衡、不要假设合约是使用零余额创建的、区分函数和事件、多重继承注意事项、关于时间戳依赖性和此类结构的可玩性(例如,使用块)的警告——以及许多其他此类技巧,并附带大量代码示例。
然后是特定于代币的警告、与代币标准相关的警告、软件工程技术、安全工具——用于静态分析、测试、代码检查器等。
他们还列出了已知的攻击,包括那些调用外部代码和合约、在这种情况下可以重复调用的函数、重入问题、跨函数竞争条件,在这里他们分析了一系列问题,其中一些问题在DAO黑客事件中表现出来。
他们进一步提到了交易排序依赖性、时间戳依赖性、整数溢出和下溢、不同类型的DoS攻击可能性/点,例如使用区块燃气限制的DoS,然后强制将以太币发送到合约;他们还分析了历史上的和已弃用的攻击。一定要阅读他们的文档。
在本篇关于生态系统的介绍中,我们介绍了一些用于在以太坊虚拟机上编写良好、可用于生产的智能合约的可用资源。这包括重用经过审核和验证的代码(OpenZeppelin声称有超过40亿美元的加密货币在其合约上运行)以及学习编写自己的安全、可用于生产的软件的实用资源。
我们非常肯定这个列表还不完整。我们是否错过了任何值得一提的内容?请告诉我们!
OpenZeppelin是一个用于安全智能合约开发的库。它提供了像ERC20和ERC721这样的标准的实现,您可以按原样部署这些标准,也可以根据您的需求进行扩展,以及用于构建自定义合约和更复杂的去中心化系统的Solidity组件。OpenZeppelin通过提供经过测试和社区审核的代码来帮助保护区块链项目免受常见威胁。
OpenZeppelin通过提供经过测试、可重用且安全的代码库来确保智能合约的安全。OpenZeppelin Contracts库是以太坊智能合约开发中最广泛使用的解决方案。它旨在成为开发人员可重用的安全可靠代码资源,从而减少单个智能合约中潜在漏洞的范围。
OpenZeppelin提供升级插件,您可以使用这些插件来升级智能合约。这些插件提供了一种简单安全的方法来随着时间的推移升级智能合约,以添加新功能或修复错误。这些插件旨在与Truffle和Hardhat开发环境一起使用。
Truffle是以太坊的开发环境、测试框架和资产管道。它通过为智能合约提供测试环境在OpenZeppelin中发挥着至关重要的作用。Truffle的工具套件帮助开发人员在一个统一的环境中创建、编译、部署和测试智能合约。
要将OpenZeppelin与Truffle一起使用,您需要在项目中安装两者。安装完成后,您可以将OpenZeppelin合约导入到您自己的合约中,并根据您的需求进行扩展。Truffle将用于编译和部署您的合约。
OpenZeppelin为您的Solidity项目提供了稳定、安全的基石。它提供了一个经过测试、可重用且安全的代码库,可以帮助保护您的项目免受常见威胁。它还提供升级智能合约的工具,允许您随着时间的推移添加新功能或修复错误。
OpenZeppelin社区欢迎开发人员的贡献。您可以通过报告错误、建议新功能或编写代码来做出贡献。所有贡献都将由社区审核,并有助于提高OpenZeppelin的安全性和功能性。
虽然OpenZeppelin主要设计用于以太坊,但它的许多原则和库可以应用于其他区块链项目。但是,具体的实现细节可能会因您使用的区块链平台而异。
OpenZeppelin提供了ERC20和ERC721标准的实现,您可以按原样部署这些实现,也可以根据您的需求进行扩展。这些实现是安全可靠的,并且经过测试和社区审核。
虽然OpenZeppelin是Solidity开发的热门选择,但还有其他可用的库和框架。这些包括Truffle、Hardhat和Ether.js。每个都有其自身的优缺点,最佳选择取决于您的具体需求和偏好。
以上是与Openzeppelin和朋友的质量坚固代码的详细内容。更多信息请关注PHP中文网其他相关文章!