我有一个大合约,我设法使用库等将其大小减小到略低于大小限制,现在约为 21K。 现在我想为这个大合同做一个链上工厂
问题是,尽管工厂合约只包含一个“makeFoo()”函数和一个构造函数,但工厂合约大小超过 25K 并且无法部署。
工厂合同里都是这样的:
contract FooFactory {
address private _adminAddress;
function makeFoo(string memory name, string memory symbol) public returns(address) {
Foo newFoo = new Foo(name, symbol, msg.sender, _adminAddress);
return address(newFoo);
}
constructor(address adminAddress_) {
_adminAddress = adminAddress_;
}
}
除了“新”之外,是否还有其他方法可以“克隆”已经部署到区块链的合约,并且不会导致工厂合约的大小达到其称为“新”的任何合约大小的 115% “?
目前,我们受到尺寸限制。曾经有过关于删除它的讨论,但这些年来这些讨论已经逐渐平息。
您可以采取以下步骤来解决大小限制:
将合约拆分为更小的、按功能分组的合约。 (高影响力)。类似的功能被放入单个合约中。您可以拥有多套此类合同。
拆分存储和功能合约。
将逻辑代码分离并重构到库中。 (高影响力)
对结构字段使用较小的类型(MED IMPACT)
捆绑的 getter 可以一次返回多个值。而不是为单个变量提供 getter。 (医疗影响)
避免额外的变量。在函数中,直接获取值而不是先将其存储在变量中。 (医疗影响)
使用函数而不是修饰符。频繁使用修饰符会对代码大小产生很大影响。这是因为整个函数体在编译时被复制到修饰符中,从而增加了合约大小。 (高影响力)
您将整个 Foo 合约导入到 FactoryContract 中,这导致 FactoryContract 的大小超出了大小限制。只需导入接口 IFoo 就可以大大减少代码量。
// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;
import "./IFoo.sol"; // Import IFoo instead of Foo, this will reduce the code size.
import "@optionality.io/clone-factory/contracts/CloneFactory.sol";
import "openzeppelin-solidity/contracts/ownership/Ownable.sol";
contract FooFactory is Ownable, CloneFactory {
address public libraryAddress;
event FooCreated(address newFoundation);
constructor(address _libraryAddress) {
libraryAddress = _libraryAddress;// Address of already deployed Foo contract.
}
function updateLibraryAddress(address _libraryAddress) public onlyOwner {
libraryAddress = _libraryAddress;
}
function createFoo(string _name) public onlyOwner {
address clone = createClone(libraryAddress);
IFoo(clone).init(_name);
emit FooCreated(clone);
}
}