Contract-Development
複製工廠和建構子參數
在我的項目中,我使用的是啟用 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
- 0x5af43d82803e903d91602b57fd5bf300000000000000000000000000000000000
我們通過一次性
init
功能解決了這個問題。有關完整原始碼,請參閱ThingFactory.sol和Thing.sol。基本上,您所做的就是在您的合約上擁有這個一次性init
函式target
(在範例中,它將是Thing
。)然後您的工廠合約init
在創建複製後直接呼叫該函式。
0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000
和0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000
是EIP-1167的標準化字節碼模板。第一0x3d602d80600a3d3981f3
部分的第一部分是複製合約的建構子,它是靜態的,只返回來自所述 EIP 的字節碼。來源:我是 clone-factory 和 EIP-1167 的開發者之一