跳转至主要内容
Change page

智能合约库

上次修改时间: @Eason_Wang(opens in a new tab), Invalid DateTime

你无需从头开始编写项目中的每一个智能合约 我们有许多开源代码的智能合约库可为你的项目提供可重复利用的构建块,从而使你不必重新开始。

前置要求

在我们跳转到智能合约库之前,清楚地了解一个智能合约的构成是一个不错的主意。 如果尚未进行智能合约的了解,请直接点击智能合约

资料库中的内容

你通常可以在智能合约库中找到两种构建模块:可以添加到合约中的可复用代码,与各种标准的实现。

行为

当编写智能合约时,你很可能会发现自己在写重复的代码。 比如说在智能合约中指派一个管理员地址执行受保护的操作,或添加一个紧急暂停按钮以应对预料不到的问题。

智能合约库通常提供这些行为的可复用实现方式为标准库(opens in a new tab)或在 solidity 中通过继承(opens in a new tab)的方式实现。

例如,以下是不可拥有的合约的简化版本(opens in a new tab)来自 OpenZeppelin 合约库(opens in a new tab),它设计了一个作为合约所有者的地址,并且提供了一个修饰者来限制该所有者获得一种方法。

1contract Ownable {
2 address public owner;
3
4 constructor() internal {
5 owner = msg.sender;
6 }
7
8 modifier onlyOwner() {
9 require(owner == msg.sender, "Ownable: caller is not the owner");
10 _;
11 }
12}
显示全部
📋 复制

在你的合约中使用这个构建模块,你需要先导入它,然后在你自己的合约中扩展它。 这个将会允许你使用 Ownable 合约提供的修改器来保护你的函数。

1import ".../Ownable.sol"; // Path to the imported library
2
3contract MyContract is Ownable {
4 // The following function can only be called by the owner
5 function secured() onlyOwner public {
6 msg.sender.transfer(1 ether);
7 }
8}
📋 复制

另一个比较受欢迎的例子是 SafeMath(opens in a new tab)DsMath(opens in a new tab)。 这些库(与基础合约不同)提供了语言本身不具有的带有溢出检查的算术函数。 使用这些库而不是本地的算术操作可以来防止你的合约出现溢出错误,这些错误可能会导致灾难性的后果!

标准

为了促进可组合性和互操作性,以太坊社区已经以以太坊意见征求的形式定义了几个标准。 你可以在标准部分阅读更多关于他们的信息。

当将以太坊意见征求作为你的合约的一部分时,更好的做法是寻找已有的标准去实现而不是试图推出你自己的方式。 许多智能合约库包含了最流行的以太坊意见征求标准的实现。 例如,普遍存在的 ERC20 同质化通证标准可在 HQ20(opens in a new tab) DappSys(opens in a new tab)OpenZeppelin(opens in a new tab) 中找到。 此外,一些以太坊意见征求还提供规范实现作为以太坊意见征求本身的一部分。

值得一提的是,一些以太坊意见征求不是独立的,而是对其他以太坊意见征求的补充。 例如, ERC2612(opens in a new tab) 为 ERC20 添加了一个扩展,以提高其可用性。

如何添加库

始终参考你所包含的库的文档,以获得关于如何将其包含在你的项目中的具体说明 一些 Solidity 合约库使用 npm 来打包,所以你可以直接 npm 安装它们。 大多数编译合约的工具会在你的 node_modules 中查找智能合约库,所以你可以做以下工作。

1// This will load the @openzeppelin/contracts library from your node_modules
2import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
3
4contract MyNFT is ERC721 {
5 constructor() ERC721("MyNFT", "MNFT") public { }
6}
📋 复制

无论你使用哪种方法,当包括一个库时,总是要注意语言的版本。 例如,如果你用 Solidity 0.5 编写你的合约,你就不能使用 Solidity 0.6 的库。

何时使用

为你的项目使用智能合约库有几个好处。 首先,它为你提供了现成的构建模块,你可以将其纳入你的系统,而不必自己编码,从而节省了你的时间。

安全性也是一个重要的优点。 开源智能合约库也经常受到严格审查。 鉴于许多项目都依赖于它们,社区有强烈的动机来对它们持续审计。 在应用程序代码中发现错误比在可重用的合约库中发现错误要常见得多。 一些库还接受了外部审计(opens in a new tab),以提高安全性。

然而,使用智能合约库有可能将你不熟悉的代码纳入你的项目。 导入一个合约并将其直接包含在你的项目中是很诱人的,但如果没有很好地理解该合约的作用,你可能会由于一个意外的行为而无意中在你的系统中引入一个问题。 一定要确保阅读你要导入的代码的文档,然后在使其成为你的项目的一部分之前审查代码本身。

最后,在决定是否包括一个库时,要考虑其总体使用情况。 一个被广泛采用的方案的好处是有一个更大的社区和更多的眼睛来关注它的问题。 在使用智能合约进行建设时,安全应该是你的首要关注点!

OpenZeppelin 合约- 安全的智能合约开发库。

DappSys - 安全、简单、灵活的智能合约构建模块。

HQ20 - 一个带有合约、库和案例的 Solidity 项目,帮助你为现实世界建立功能齐全的分布式应用。

thirdweb Solidity SDK - 提供了高效构建自定义智能合约所需的工具

延伸阅读

还有哪些社区资源对你有所帮助? 请编辑本页面并添加!

本文对你有帮助吗?