在部署 RSK 之前,如何在 RSK 上选择自己的智能合约地址?

Ire*_*ios 5 solidity rsk

我注意到一些智能合约\n的地址以 、 或 - 开头,0x00000x1234不确定0x1337部署者是如何做到这一点的。\n\xe2\x80\x8b\n是否可以在 RSK 上执行此操作?

\n

Ale*_*hin 4

在前面的答案的基础上,\n使用CREATE2操作码 -\n不仅可以预测\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  }\n
Run Code Online (Sandbox Code Playgroud)\n

下一个辅助函数使用反复试验,\n因为keccak256与其他哈希一样,都是单向函数,\n以确定哪个盐参数将导致\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  }\n
Run Code Online (Sandbox Code Playgroud)\n

通过结合以上内容,您可以使用\n factory.deployCreate2(salt);\n部署所需地址的智能合约。\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\n
Run Code Online (Sandbox Code Playgroud)\n
Found 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)\n
Run Code Online (Sandbox Code Playgroud)\n