在我的合约中运行 new() 会增加合约大小 20K 吗?

use*_*110 2 solidity hardhat

我创建了一个函数,其中一个合约实例化另一个合约,它突然使整个合约超出了大小限制。这是函数:

function createContract(E.BKLiteMeta memory meta)         
          public 
          payable
          returns(address) 
    {
        require(meta.publisherAddress == msg.sender, "only pub");
        return(address(new BKopyLite(meta)));
    }
Run Code Online (Sandbox Code Playgroud)

Hardhatsize-contracts报告合约大小为 24.02。当我将函数更改为:

function createContract(E.BKLiteMeta memory meta)         
          public 
          payable
          returns(address) 
    {
        require(meta.publisherAddress == msg.sender, "only pub");
        return(address(0);
    }
Run Code Online (Sandbox Code Playgroud)

“size-contracts”报告的大小为 4.68。那么通过调用 new 大约会增加 20K 的大小?有人可以解释一下并建议解决方法吗?(BKopyLite合约的合约规模约为17k)

cam*_*eel 5

new关键字会导致部署新合约,这需要访问其字节码。为此,编译器BKopyLite将 的字节码嵌入到父合约中。如果要部署的合约相当大,它可能会增加父合约的大小。

有一些方法可以避免这种情况:

  • 例如,您可以拥有一个特殊的工厂合同,其唯一的工作是部署BKopyLite. 父合约将对其进行外部调用以触发部署BKopyLite并接收新实例的地址作为回报。
  • 您可以部署合约的单个实例并使用 OpenZeppelin 的克隆来创建轻量级“副本”。这些副本实际上是代理合约,拥有自己的存储空间,并让单个实例通过 DELEGATECALL 对其进行操作。