本文档描述了部署新代理和实现的过程,重点在于如何初始化合约。由于代理使用delegatecall
将调用转发给实现,因此合约的初始化需要特别处理。文档详细介绍了如何部署实现合约、初始化字段,以及如何部署代理并验证字段是否正确初始化。
这是部署新的代理和实现的过程(而不是 升级现有的代理)。
由于代理使用 delegatecall
将调用转发到实现,
合约的初始化变得有点棘手,因为我们无法
通过构造函数初始化实现合约中的字段。 相反,
在实现合约中有一个初始化方法,它是公开的,
但每个代理只能调用一次。
通过 initialize*
方法初始化 FiatTokenV2_2 中的字段。 这些
值并不重要,但是这将阻止其他人初始化
角色并尝试将其用作 token 或将其冒充为真正的 Circle token。
initialize(
"",
"",
"",
0,
THROWAWAY_ADDRESS,
THROWAWAY_ADDRESS,
THROWAWAY_ADDRESS,
THROWAWAY_ADDRESS
);
initializeV2("");
initializeV2_1(THROWAWAY_ADDRESS);
initializeV2_2([], "");
验证 FiatToken 中的所有字段是否已正确初始化,并且 具有期望的值。
获取以下合约角色的地址。 确保这些角色的 密钥已安全存储。
admin
masterMinter
pauser
blacklister
owner
有关这些角色可以执行的操作的详细信息,请参见 Token 设计文档
部署 FiatTokenProxy,将
已部署的实现合约的地址传递给构造函数,该构造函数
将初始化 _implementation
字段。
代理合约的 admin
默认为 msg.sender
。 你必须
立即更改 admin
,或从其他地址发送其余的交易。
admin
只能看到代理中的方法,来自 admin
的任何方法调用
都不会转发到实现合约。 可以通过调用 changeAdmin
来更改 admin
地址。 请注意,更改 admin 必须由当前的 admin 调用。
changeAdmin(adminAddress)
通过 initialize*
方法初始化代理。 此调用将
转发到实现合约,但由于它是通过 delegatecall
进行的,因此它将在代理合约的上下文中运行,因此它正在
初始化的字段将存储在代理的存储中。 此处传递的
值很重要,尤其是对于将控制合约的角色。
initialize(
tokenName,
tokenSymbol,
tokenCurrency,
tokenDecimals,
masterMinterAddress,
pauserAddress,
blacklisterAddress,
ownerAddress
);
initializeV2(newTokenName);
initializeV2_1(lostAndFoundAddress);
initializeV2_2(accountsToBlacklist, newTokenSymbol);
验证字段是否已正确初始化。 验证应该 由多人独立执行,以确保合约已 正确部署。 应验证以下字段:
admin
是期望的地址implementation
是实现合约的地址name
、symbol
、currency
和 decimals
与预期的一致version
是 2owner
、masterMinter
、pauser
、blacklister
是期望的地址totalSupply
是 0initialized
是 true
如果所有验证都成功,则合约已部署并可以使用。 如果任何验证步骤失败,请重新启动该过程。
- 原文链接: github.com/circlefin/sta...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!