我正在使用Clone Factory模式来创建更便宜的新实例。我意识到,每个字段,在构造函数中预置或设置,都有默认值。假设我有这样的合同:
contract MyToken is ERC20, Ownable {
uint256 public presetValue = 1;
uint256 public constructorValue;
constructor() ERC20("MyToken", "MTKN") {
constructorValue = 2;
}
}这个合同是我的,让我们称之为“主合同”或“基本合同”。然后,我与createClone函数有一个合同:
function createClone(address target) internal returns (address result) {
bytes20 targetBytes = bytes20(target);
assembly {
let clone := mload(0x40)
mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
mstore(add(clone, 0x14), targetBytes)
mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
result := create(0, clone, 0x37)
}
}MyToken的新实例将使name()等于空字符串,symbol()也等于空字符串(ERC20字段)。这是一个必须解决的问题。由于OpenZeppelin的ERC20 20/721有私有字段,我假设我需要使用setName()和setSymbol()函数来实现自己的ERC20 20/721令牌,然后使用某种名为initialize()的聚合来调用这两个函数并设置这些值和其他值?另外,presetValue和constructorValue在克隆合同中哪一个明显是空的?还是有别的办法?
发布于 2022-09-06 00:46:21
听起来你把它弄下来了。克隆的一个很大的缺点,但“克隆然后init”是标准的。许多项目都没有在系统中插入并留下漏洞,所以最好的做法之一是编写保护措施,要求init在运行之前运行。
https://ethereum.stackexchange.com/questions/135058
复制相似问题