我注意到一些智能合约\n的地址以 、 或 - 开头,0x0000我0x1234不确定0x1337部署者是如何做到这一点的。\n\xe2\x80\x8b\n是否可以在 RSK 上执行此操作?
在前面的答案的基础上,\n使用CREATE2操作码 -\n不仅可以预测\n将部署智能合约的地址,\n还可以(部分)选择\n您希望其部署的地址\n 。
例如,如果您想要一个以 4 个前导零开头的个性地址,则可以使用以下辅助函数,该函数会检查所需个性地址的匹配情况:
\n function hasLeadingZeros(address = \'0x0000\', zeros = 4) {\n for (let i = 2; i <= zeros + 1; i += 1) {\n if (address.charAt(i) !== \'0\') return false;\n }\n return true;\n }\nRun Code Online (Sandbox Code Playgroud)\n下一个辅助函数使用反复试验,\n因为keccak256与其他哈希一样,都是单向函数,\n以确定哪个盐参数将导致\n获得所需的虚地址。
function getSaltForVanityAddress(deployerAddress, initCodeHash) {\n let salt = 0;\n let vanityAddress = \'\';\n let saltHash;\n while (!hasLeadingZeros(vanityAddress)) {\n salt += 1;\n saltHash = ethers.utils.keccak256(salt);\n vanityAddress = ethers.utils.getCreate2Address(\n deployerAddress,\n saltHash,\n initCodeHash,\n );\n }\n return saltHash;\n }\nRun Code Online (Sandbox Code Playgroud)\n通过结合以上内容,您可以使用\n factory.deployCreate2(salt);\n部署所需地址的智能合约。\n下面是一个测试用例来说明:
it(\'Should deploy Child to the address starting with four zeros\', async () => {\n const Child = await ethers.getContractFactory(\'Child\');\n const { data: initCode } =\n Child.getDeployTransaction(deployer.address);\n const initCodeHash = ethers.utils.keccak256(initCode);\n const salt = getSaltForVanityAddress(factory.address, initCodeHash);\n const deployTx = await factory.deployCreate2(salt);\n const txReceipt = await deployTx.wait();\n const deployEvent = txReceipt.events.find(\n (event) => event.event === \'ContractDeployed\',\n );\n expect(hasLeadingZeros(\n deployEvent.args.childContract)\n ).to.be.true;\n console.log(\n `Found salt \'${salt}\' such that the\\ndeployed s/c address is ${deployEvent.args.childContract}`,\n );\n });\n\nRun Code Online (Sandbox Code Playgroud)\nFound salt \'0xb20ba450430132a5f0191bd27fc7e8018b39435484af81bbdf289296ae61ea75\' such that the\ndeployed s/c address is 0x0000b36619Df7e2816577549b78CBB8b189e8d6B\n \xe2\x9c\x94 Should deploy Child to the address starting with four zeros (4973ms)\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
527 次 |
| 最近记录: |