以太坊开发者文档05 智能合约库
智能合约库
你不需要从头开始编写项目中的每个智能合约。有许多可用的开源智能合约库为项目提供可重用的构建块,可以让你不必重新发明轮子。
先决条件
在进入智能合约库之前,对智能合约的结构有一个很好的了解是个好主意。如果你还没有这样做,请前往智能合约剖析。
库中有什么
你通常可以在智能合约库中找到两种构建块(building blocks):可以添加到合约中的可重用行为(reusable behaviors),以及各种标准的实现。
Behaviors
在编写智能合约时,你很有可能会发现自己一遍又一遍地编写类似的模式,例如分配一个 admin
地址以在合约中执行受保护的操作,或者在出现意外问题时添加紧急 pause
按钮。
智能合约库通常提供这些行为的可重用实现作为库或通过 Solidity 中的继承。
例如,以下是 OpenZeppelin 合约库中 Ownable 合约的简化版本,它将地址指定为合约的所有者,并提供了一个修饰符,用于将方法的访问权限仅限于该所有者。
要在你的合约中使用这样的构建块,你需要先导入它,然后在你自己的合约中扩展它。这将允许你使用基本 Ownable 合约提供的修饰符来保护你自己的函数。
另一个流行的例子是 SafeMath 或 DsMath。这些库(与基本合约相反)提供带有溢出检查的算术函数,语言不提供这些函数。使用这些库中的任何一个而不是原生算术运算来保护您的合约免受溢出是一种很好的做法,合约溢出有可能会产生灾难性的后果!
标准
为了促进可组合性和互操作性,以太坊社区以 ERC 的形式定义了几个标准。你可以在标准部分阅读更多关于它们的信息。
将 ERC 作为合约的一部分时,寻找标准实现而不是尝试推出自己的实现是个好主意。许多智能合约库包括最流行的 ERC 的实现。例如,无处不在的ERC20 可替代代币标准可以在 HQ20、DappSys 和 OpenZeppelin 中找到。此外,一些 ERC 还提供规范实现作为 ERC 本身的一部分。
值得一提的是,一些 ERC 不是独立的,而是对其他 ERC 的补充。例如,ERC2612 为 ERC20 添加了扩展以提高其可用性。
如何添加一个库
请始终参考你所包含的库的文档,以获取有关如何将其包含在项目中的具体说明。npm
打包了几个 Solidity 合约库,因此你只需用 npm
安装它们。大多数编译合约的工具都会在你的 node_modules
中查找智能合约库,因此你可以执行以下操作:
无论你使用哪种方法,在包含库时,请始终关注语言版本。例如,如果你在 Solidity 0.5 中编写合约,则不能使用 Solidity 0.6 的库。
何时使用
为你的项目使用智能合约库有几个好处。首先,它通过为你提供可以包含在系统中的即用型构建块来节省你的时间,而不必自己编写代码。
安全性也是一大优势。开源智能合约库也经常受到严格审查。鉴于许多项目都依赖于它们,社区有强烈的动机不断对其进行审查。在应用程序代码中发现错误比在可重用合约库中更常见。一些库还接受外部审计以提高安全性。
然而,使用智能合约库存在将你不熟悉的代码包含到项目中的风险。导入合约并将其直接包含到你的项目中是很诱人的,但是如果没有很好地了解该合约的作用,你可能会由于意外行为而无意中在系统中引入问题。始终确保阅读你正在导入的代码的文档,然后在将其作为项目的一部分之前查看代码本身!
最后,在决定是否包含库时,请考虑其整体使用情况。一个被广泛采用的库其好处在于拥有更大的社区和更多的眼睛来寻找问题。使用智能合约构建时,安全性应该是您的主要关注点!
相关工具
OpenZeppelin Contracts - 最流行的安全智能合约开发库。
DappSys - 安全、简单、灵活的智能合约构建块。
HQ20 - 一个带有合约、库和示例的 Solidity 项目,可帮助您为现实世界构建功能齐全的分布式应用程序。
相关教程
- Security considerations for Ethereum developers - 关于构建智能合约时的安全注意事项的教程,包括库的使用
- Understand the ERC-20 token smart contract - ERC20 标准教程,由多个库提供