如何避免在solidity中出现过大的工厂合同

问题描述 投票:0回答:2

我有一个大合约,我设法使用库等将其大小减小到略低于大小限制,现在约为 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% “?

ethereum solidity
2个回答
1
投票

目前,我们受到尺寸限制。曾经有过关于删除它的讨论,但这些年来这些讨论已经逐渐平息。

您可以采取以下步骤来解决大小限制:

  • 将合约拆分为更小的、按功能分组的合约。 (高影响力)。类似的功能被放入单个合约中。您可以拥有多套此类合同。

  • 拆分存储和功能合约。

  • 将逻辑代码分离并重构到库中。 (高影响力)

  • 对结构字段使用较小的类型(MED IMPACT)

  • 捆绑的 getter 可以一次返回多个值。而不是为单个变量提供 getter。 (医疗影响)

  • 避免额外的变量。在函数中,直接获取值而不是先将其存储在变量中。 (医疗影响)

  • 使用函数而不是修饰符。频繁使用修饰符会对代码大小产生很大影响。这是因为整个函数体在编译时被复制到修饰符中,从而增加了合约大小。 (高影响力)


0
投票

您将整个 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);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.