主网准备 - OpenZeppelin 文档

本文档介绍了将以太坊项目部署到主网时需要考虑的关键因素,包括审计和安全、验证源代码、安全地管理密钥以及处理项目治理。强调了安全在智能合约开发中的重要性,并提供了有关如何保护私钥和管理具有特殊权限的帐户的建议,同时还讨论了项目治理以及如何在受信任的开发者小团体和全体项目参与者公开投票之间做出选择。

准备上线主网

测试网上运行你的项目一段时间没有问题后,你可能希望将其部署到以太坊主网络(又称 mainnet)。但是,上线主网的规划应该比你计划的发布日期要早得多。

在本指南中,我们将介绍将你的项目投入生产环境的具体以太坊考虑因素,例如:

请记住,虽然在技术上,在测试网和在 mainnet 中管理你的合约是相同的,但在 mainnet 上有一些重要的区别,因为你的项目现在为你的用户管理着真正的价值。

审计与安全

虽然安全性影响到所有的软件开发,但智能合约中的安全性尤为重要。任何人都可以直接将交易发送到你的合约,并携带任何有效载荷,并且你所有的合约代码和状态都是公开可访问的。更糟糕的是,如果你被黑客攻击,没有追索权来追回被盗资金 - 它们在一个去中心化网络中永远消失了。

考虑到这一点,安全应该在开发的各个阶段都作为主要关注点。这意味着安全不是在你发布前一周才洒在你的项目上的东西,而是一个从你项目的第一天开始的指导原则。

在你开始编码时,请查看智能合约安全最佳实践,加入我们论坛中的安全讨论,并确保通过我们的质量检查表,以确保你的项目是健康的。

完成后,现在可以向一个或多个审计公司请求审计了。你可以从 OpenZeppelin 研究团队请求审计 - 我们是一个经验丰富的团队,拥有悠久的业绩记录

请记住,审计不能确保没有错误,但让几位经验丰富的安全研究人员检查你的代码肯定会有所帮助。

验证你的源代码

在你将合约部署到 mainnet 后,你应该立即验证他们的源代码。此过程涉及将 Solidity 代码提交给第三方,例如 EtherscanSourcify,他们将对其进行编译并验证它与已部署的汇编代码是否匹配。这允许任何用户查看你的合约代码,例如在区块浏览器中,并知道它对应于实际在该地址运行的汇编代码。

你可以在 Etherscan 网站上手动验证你的合约。

你也可以使用 hardhat-verify plugin

为此,请安装插件:

npm install --save-dev @nomicfoundation/hardhat-verify

更新你的 hardhat 配置:

// hardhat.config.js
const { etherscanApiKey, projectId, mnemonic } = require('./secrets.json');
require("@nomicfoundation/hardhat-verify");
...
module.exports = {
  networks: {
    mainnet: { ... }
  },
  etherscan: {
    apiKey: etherscanApiKey
  }
};

最后运行 verify 任务,传递合约的地址、它部署的网络以及用于部署它的构造函数参数(如果有):

npx hardhat verify --network mainnet DEPLOYED_CONTRACT_ADDRESS "Constructor argument 1"
你将需要一个 Etherscan API 密钥才能使用他们的服务。
当你部署一个可升级的合约时,用户与之交互的合约将只是一个代理,而实际的逻辑将在实现合约中。 Etherscan 确实支持正确显示 OpenZeppelin 代理及其实现,但其他浏览器可能不支持。

密钥管理

mainnet 上工作时,你需要特别小心以保护你的私钥。你用于部署和与你的合约交互的帐户将持有真正的以太币,它具有真正的价值,并且对于黑客来说是一个诱人的目标。采取一切预防措施来保护你的密钥,并在必要时考虑使用 硬件钱包

与测试网不同,你无法从水龙头获得 mainnet 以太币。你需要前往交易所交易其他代币或法定货币,以获得用于部署合约的真正的以太币。

此外,你可以定义某些帐户在你的系统中具有特殊权限 - 你应该格外小心以保护它们。

管理员帐户

管理员administrator 的缩写)帐户是在你的系统中具有特殊权限的帐户。例如,管理员可能具有暂停合约的权力。如果这样的帐户落入恶意用户手中,他们可能会在你的系统中造成严重破坏。

保护管理员帐户的一个好选择是使用特殊合约,例如多重签名,而不是常规的外部所有帐户。多重签名是一个可以执行任何操作的合约,只要预定义数量的受信任成员同意即可Safe 是一个很好的多重签名。

升级管理员

OpenZeppelin Upgrades Plugins 项目中的一个特殊管理员帐户是有权升级其他合约的帐户。这默认为用于部署合约的外部所有帐户:虽然这对于本地或测试网部署来说已经足够好,但在 mainnet 中,你需要更好地保护你的合约。获得你的升级管理员帐户的攻击者可以更改你系统中的任何合约!

考虑到这一点,最好在部署后更改 ProxyAdmin 的所有权 - 例如,更改为多重签名。为此,你可以使用 admin.transferProxyAdminOwnership 来转移我们的 ProxyAdmin 合约的所有权。

当你需要升级你的合约时,我们可以使用 prepareUpgrade 来验证和部署一个新的实现合约,该合约已准备好在我们的代理更新时使用。

项目治理

可以认为,管理员帐户反映了一个项目实际上并没有去中心化。毕竟,如果一个帐户可以单独更改系统中的任何合约,我们就不完全是在创建无信任环境。

这就是治理的用武之地。在许多情况下,你的项目中会有一些操作需要特殊权限,从微调系统参数到运行完整的合约升级。你需要选择如何决定这些操作:是由一小群组的受信任的开发人员决定,还是由所有项目利益相关者进行公开投票

这里没有正确答案。你为你的项目选择哪种治理方案将在很大程度上取决于你正在构建什么以及你的社区是谁。

下一步

恭喜!你已经到达了开发之旅的终点,从编写你的第一个合约到部署到生产环境。但是工作还远未结束。现在你必须开始收集实时用户反馈,向你的系统添加新功能(通过合约升级实现!),监控你的应用程序,并最终扩展你的项目。

在本网站上,你可以使用 OpenZeppelin 平台中所有项目的详细指南和参考资料,因此你可以选择你需要构建以太坊应用程序的任何内容。 祝你编码愉快!

← 升级智能合约

  • 原文链接: docs.openzeppelin.com/le...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
OpenZeppelin
OpenZeppelin
江湖只有他的大名,没有他的介绍。