0

我创建了一个函数,其中我的一个合约实例化了另一个合约,它突然将整个合约推到了大小限制之上。这是功能:

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

Hardhatsize-contracts报告合约的大小为 24.02。当我将功能更改为:

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

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

4

1 回答 1

1

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

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

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