在我的项目中,我使用了启用EIP-1167的克隆工厂:
function createClone(address target) external 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)
}
addr = result;
}它适用于没有构造函数的合同或空构造函数的合同。
下面是我的大部分合同的构造函数:
constructor(
bytes32 pRegistryGroupName,
bytes32 pRegistryName
)
internal
{
m_RegistrableData.registryGroupName = pRegistryGroupName;
m_RegistrableData.registryName = pRegistryName;
}正如预期的那样,当我克隆我的合同时,新合同不包含组名或名称。
我希望这样做:
function createClone(address target, bytes32 groupName, bytes32 name)我怎么能这么做?
我也很好奇这些地址是什么,它们代表了什么,为什么它们看起来是这样的:
发布于 2020-01-14 14:24:28
我们通过一次init函数来解决这个问题。有关完整源代码,请参见ThingFactory.sol和Thing.sol。基本上,您所做的是在您的init契约上使用这个一次target函数(在示例中,它将是Thing)。然后,工厂契约在创建克隆后直接调用init函数。
0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000和0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000是EIP-1167的标准化字节码模板。第一节的第一个0x3d602d80600a3d3981f3是克隆契约的构造函数,它是静态的,只返回来自上述EIP的字节码。
资料来源:我是克隆工厂和EIP-1167的开发人员之一。
https://ethereum.stackexchange.com/questions/78900
复制相似问题