运行 我的合约中的 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 对其进行操作。
我创建了一个函数,我的一个合约实例化了另一个合约,它突然将整个合约推到了大小限制之上。这是函数:
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 对其进行操作。