智能合约库
你无需从头开始编写项目中的每一个智能合约 我们有许多开源代码的智能合约库可为您的项目提供可重复利用的构建块,从而使您不必重新开始。
前置要求
在我们跳转到智能合约库之前,清楚地了解一个智能合约的构成是一个不错的主意。 如果尚未进行智能合约的了解,请直接点击</智能合约。
资料库中的内容
你通常可以在智能合约库中找到两种构建模块:可以添加到合约中的可复用代码,与各种标准的实现。
行为
当编写智能合约时,你很可能会发现自己在写重复的代码。 比如说在智能合约中指派一个管理员地址执行受保护的操作,或添加一个紧急暂停按钮以应对预料不到的问题。
智能合约库通常提供这些行为的可复用实现方式为标准库或在 solidity 中通过继承的方式实现。
例如,以下是不可拥有的
合约的简化版本来自 OpenZepelin 合约库,它设计了一个作为合约所有者的地址,并且提供了一个修饰者来限制该所有者获得一种方法。
1contract Ownable {2 address public owner;34 constructor() internal {5 owner = msg.sender;6 }78 modifier onlyOwner() {9 require(owner == msg.sender, "Ownable: caller is not the owner");10 _;11 }12}13显示全部复制
在你的合约中使用这个构建模块,你需要先导入它,然后在你自己的合同中扩展它。 这个将会允许你使用 Ownable
合约提供的修饰符来保护你的函数。
1import ".../Ownable.sol"; // Path to the imported library23contract MyContract is Ownable {4 // The following function can only be called by the owner5 function secured() onlyOwner public {6 msg.sender.transfer(1 ether);7 }8}9复制
另一个比较受欢迎的例子是 SafeMath 或DsMath。 这些库(与基础合约不同)提供了语言本身不具有的带有溢出检查的算术函数。 使用这些库而不是本地的算术操作可以来防止你的合约出现溢出错误,这些错误可能会导致灾难性的后果!
标准
为了促进可组合性和互操作性,以太坊社区已经以 ERC 的形式定义了几个标准。 你可以在标准部分阅读更多关于他们的信息。
当将 ERC 作为你的合约的一部分时,更好的做法是寻找已有的标准去实现而不是试图推出你自己的方式。 许多智能合约库包含了最流行的 ERC 标准的实现。 例如,ERC20 可互换代币标准可在 HQ20 DappSys 和 OpenZepelin中找到。 此外,一些 ERC 还提供规范实现作为 ERC 本身的一部分。
值得一提的是,一些 ERC 不是独立的,而是对其他 ERC 的补充。 例如, ERC2612 为 ERC20 添加了一个扩展,以提高其可用性。
如何添加库
始终参考你所包含的库的文档,以获得关于如何将其包含在你的项目中的具体说明 一些 Solidity 合约库使用 npm
来打包,所以你可以直接 npm
安装它们。 大多数编译合约的工具会在你的 node_modules 中查找智能合约库,所以你可以做以下工作。
1// This will load the @openzeppelin/contracts library from your node_modules2import "@openzeppelin/contracts/token/ERC721/ERC721.sol";34contract MyNFT is ERC721 {5 constructor() ERC721("MyNFT", "MNFT") public { }6}7复制
无论你使用哪种方法,当包括一个库时,总是要注意语言的版本。 例如,如果你用 Solidity 0.5 编写你的合约,你就不能使用 Solidity 0.6 的库。
何时使用
为你的项目使用智能合约库有几个好处。 首先,它为你提供了现成的构建模块,你可以将其纳入你的系统,而不必自己编码,从而节省了你的时间。
安全性也是一个重要的优点。 开源智能合约库也经常受到严格审查。 鉴于许多项目都依赖于它们,社区有强烈的动机来对它们持续审计。 在应用程序代码中发现错误比在可重用的合约库中发现错误要常见得多。 一些库还接受了外部审计,以提高安全性。
然而,使用智能合约库有可能将你不熟悉的代码纳入你的项目。 导入一个合约并将其直接包含在你的项目中是很诱人的,但如果没有很好地理解该合约的作用,你可能会由于一个意外的行为而无意中在你的系统中引入一个问题。 一定要确保阅读你要导入的代码的文档,然后在使其成为你的项目的一部分之前审查代码本身。
最后,在决定是否包括一个库时,要考虑其总体使用情况。 一个被广泛采用的方案的好处是有一个更大的社区和更多的眼睛来关注它的问题。 在使用智能合约进行建设时,安全应该是你的首要关注点!
相关工具
OpenZeppelin 合约- 安全的智能合约开发库。
DappSys - 安全、简单、灵活的智能合约构建模块。
HQ20 - 一个带有合约、库和案例的 Solidity 项目,帮助你为现实世界建立功能齐全的分布式应用。
相关教程
- 以太坊开发者的安全考虑 - 构建智能合约时的安全考虑教程,包括库的使用。
- 了解 ERC-20 代币智能合约 - 关于 ERC20 标准的教程,由多个库提供。
延伸阅读
你知道有什么社区资源帮助过你吗? 编辑并添加本页面!