准备上线主网
在经过一段时间 在测试网上运行你的项目且没有问题后,你可能想将其部署到以太坊主网络(也称作 mainnet)。但是,上线主网的计划应该比你计划的发布日期更早开始。
在本指南中,我们将介绍以太坊特定的注意事项,以便将你的项目投入生产,例如:
请记住,虽然在技术上管理你在测试网和主网中的合约是相同的,但在主网上存在重要的差异,因为你的项目现在为你的用户管理着真正的价值。
审计和安全
虽然安全性会影响所有的软件开发,但智能合约中的安全性尤为重要。任何人都可以使用任何 payload 直接向你的合约发送交易,并且你所有的合约代码和状态都是公开可访问的。更糟糕的是,如果你被黑客攻击,则无法追回被盗资金 - 它们在去中心化网络中永远消失了。
考虑到这一点,安全应该是开发各个阶段的首要考虑因素。这意味着 安全不是你在发布前一周添加到项目中的东西,而是从项目的第一天开始的指导原则。
在开始编码时,请查看 智能合约安全最佳实践,加入 我们论坛中的安全讨论,并务必查看我们的 质量清单,以确保你的项目是健康的。
请记住,审计不能确保没有错误,但让几位经验丰富的安全研究人员检查你的代码肯定会有所帮助。
验证你的源代码
在将合约部署到主网后,你应该立即 验证他们的源代码。此过程涉及将 Solidity 代码提交给第三方,例如 Etherscan 或 Sourcify,他们将对其进行编译并_验证_它是否与已部署的汇编代码匹配。这允许任何用户查看你的合约代码(如在区块浏览器中),并知道它对应于在该地址实际运行的汇编代码。
你可以在 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。 |
此外,你可以定义某些帐户在你的系统中拥有特殊权限 - 你应该格外小心地保护它们。
管理员帐户
admin(administrator 的缩写)帐户是在你的系统中具有特殊权限的帐户。例如,管理员可能有权 暂停合约。如果这样的帐户落入恶意用户手中,他们可能会在你的系统中造成严重破坏。
保护管理员帐户的一个好选择是使用特殊的合约,例如 multisig,而不是常规的外部所有帐户。multisig 是一种可以执行任何操作的合约,只要预定义数量的受信任成员同意即可。https://safe.global/wallet[Safe] 是一个很好的 multisig。
升级管理员
在 OpenZeppelin Upgrades Plugins 项目中,一个特殊的管理员帐户是有权 升级 其他合约的帐户。默认情况下,这是用于部署合约的外部所有帐户:虽然这对于本地或测试网部署来说已经足够好,但在主网上,你需要更好地保护你的合约。如果攻击者获得了你的升级管理员帐户,他们可以更改你系统中的任何合约!
考虑到这一点,最好在部署后 更改 ProxyAdmin 的所有权 - 例如,更改为 multisig。为此,你可以使用 admin.transferProxyAdminOwnership
来转移我们的 ProxyAdmin
合约的所有权。
当你需要升级你的合约时,我们可以使用 prepareUpgrade
来验证和部署一个新的实现合约,该合约已准备好在我们的代理更新时使用。