首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用工厂模式克隆契约时用Create2计算确定性地址

用工厂模式克隆契约时用Create2计算确定性地址
EN

Ethereum用户
提问于 2021-05-31 14:08:51
回答 1查看 1.5K关注 0票数 1

有一个来自另一个作者的未回答的问题存在着同样的问题,我正在创建一个更详细的,希望两者都能被关闭。

根据这个职位的想法,我有一份坚实的合同。从根本上说,是工厂合同允许货运代理合同的部署。为了将天然气成本降到最低,在创建一个转发器之后,您可以创建一个它的克隆体。

我希望计算将使用create2生成的地址,该地址与createForwarder函数工作得很好:

ForwarderFactory.sol

代码语言:javascript
复制
    function createForwarder(address forwardAddress, uint256 salt)
        public
        onlyOwner
        returns (Forwarder forwarder)
    {
        bytes memory bytecode =
            abi.encodePacked(
                type(Forwarder).creationCode,
                uint256(uint160(address(forwardAddress)))
            );

        assembly {
            forwarder := create2(0, add(bytecode, 0x20), mload(bytecode), salt)
        }

        emit Deployed(address(forwarder), salt);
    }

CalculateAddress.js

代码语言:javascript
复制
let bytecode = `${forwarderBytecode}${encodeParam(
  "address",
  forwardAddress
).slice(2)}`;

function buildCreate2Address(creatorAddress, saltHex, byteCode) {
  return `0x${web3.utils
    .sha3(
      `0x${["ff", creatorAddress, saltHex, web3.utils.sha3(byteCode)]
        .map((x) => x.replace(/0x/, ""))
        .join("")}`
    )
    .slice(-40)}`.toLowerCase();
}

效果很好。但是,当生成新的克隆地址时,以前的buildCreate2Address函数不再工作,因为create2函数中的第二个和第三个参数是不同的。

ForwarderFactory.sol

代码语言:javascript
复制
    function generateCloneAddress(address target, uint256 salt)
        private
        returns (address cloneAddress)
    {
        bytes20 targetBytes = bytes20(target);
        assembly {
            let clone := mload(0x40)
            mstore(
                clone,
                0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000
            )
            mstore(add(clone, 0x14), targetBytes)
            mstore(
                add(clone, 0x28),
                0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000
            )
            cloneAddress := create2(0, clone, 0x37, salt)
        }
    }

我不太确定是字节码正在改变,还是需要更新的是buildCreate2Address

EN

回答 1

Ethereum用户

回答已采纳

发布于 2021-06-03 21:31:01

事实证明,克隆是使用标准的EIP 1167创建的,因此它具有与原始转发器不同的创建字节码。因此,要计算克隆的确定性地址,可以修改buildCreate2Address函数的字节码参数,也可以在契约中实现以下函数:

代码语言:javascript
复制
    function predictCloneAddress(address forwarderAddress_, uint256 salt_)
        public
        view
        returns (address)
    {
        address predictedAddress =
            Clones.predictDeterministicAddress(
                forwarderAddress_,
                bytes32(salt_)
            );

        return predictedAddress;
    }
票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/100025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档