Contract-Development

複製工廠和建構子參數

  • September 7, 2021

在我的項目中,我使用的是啟用 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)

我怎樣才能做到這一點?

我也很好奇這些地址是什麼以及它們代表什麼,為什麼它們看起來像這樣:

  • 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000
  • 0x5af43d82803e903d91​​602b57fd5bf300000000000000000000000000000000000

我們通過一次性init功能解決了這個問題。有關完整原始碼,請參閱ThingFactory.solThing.sol。基本上,您所做的就是在您的合約上擁有這個一次性init函式target(在範例中,它將是Thing。)然後您的工廠合約init在創建複製後直接呼叫該函式。

0x3d602d80600a3d3981f3363d3d373d3d3d363d730000000000000000000000000x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000EIP-1167的標準化字節碼模板。第一0x3d602d80600a3d3981f3部分的第一部分是複製合約的建構子,它是靜態的,只返回來自所述 EIP 的字節碼。

來源:我是 clone-factory 和 EIP-1167 的開發者之一

引用自:https://ethereum.stackexchange.com/questions/78900