运行 我的合约中的 new() 增加了 20K 到合约大小?

Running new() inside my contract adds 20K to contract size?

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

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

Hardhat size-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)

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

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

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