准备上线主网

在经过一段时间 在测试网上运行你的项目且没有问题后,你可能想将其部署到以太坊主网络(也称作 mainnet)。但是,上线主网的计划应该比你计划的发布日期更早开始。

在本指南中,我们将介绍以太坊特定的注意事项,以便将你的项目投入生产,例如:

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

审计和安全

虽然安全性会影响所有的软件开发,但智能合约中的安全性尤为重要。任何人都可以使用任何 payload 直接向你的合约发送交易,并且你所有的合约代码和状态都是公开可访问的。更糟糕的是,如果你被黑客攻击,则无法追回被盗资金 - 它们在去中心化网络中永远消失了。

考虑到这一点,安全应该是开发各个阶段的首要考虑因素。这意味着 安全不是你在发布前一周添加到项目中的东西,而是从项目的第一天开始的指导原则。

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

完成后,现在是时候向一家或多家审计公司请求审计了。你可以从 OpenZeppelin Research Team 请求审计 - 我们是一支经验丰富的团队,拥有 悠久的记录

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

验证你的源代码

在将合约部署到主网后,你应该立即 验证他们的源代码。此过程涉及将 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 代理及其实现,但其他浏览器可能不支持。

密钥管理

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

与测试网不同,你无法从 faucet 获取主网 Ether。你需要前往交易所交易其他 coins 或 fiat,以获取用于部署合约的真实 Ether。

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

管理员帐户

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

保护管理员帐户的一个好选择是使用特殊的合约,例如 multisig,而不是常规的外部所有帐户。multisig 是一种可以执行任何操作的合约,只要预定义数量的受信任成员同意即可。https://safe.global/wallet[Safe] 是一个很好的 multisig。

升级管理员

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

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

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

项目管理

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

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

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

下一步

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

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