堆叠太深,尝试使用更少的变量来创建合同

  • 本文关键字:变量 合同 创建 solidity
  • 更新时间 :
  • 英文 :


我正在尝试使用以下功能从合同工厂创建合同:

function createContract(string _var1, string _var2,
        uint32 _var3, string _var4, string _var5,
        string _var6, uint32 _var7, uint32 _var8, uint32 _var9,
        uint32 _var10, uint32 _var11)
public returns (address contractAddress) {
    return new Contract(_var1, random1, random2, _var2,
        _var3, _var4, _var5, _var6, _var7, _var8,
        _var9, _var10, _var11);
}

n.b。random1random2是合同工厂中的字段。

此功能抛出Stack too deep, try using less variables。我已经读到我应该将功能等分开等待,但是显然,这不是这里的选择。有没有办法使此工作?

因此,最初,我尝试通过类型将变量分组到以下:

function createContract(string[] _var1, uint32[] _var2)
public returns (address contractAddress) {
    return new Contract(_var1, random1, random2, _var2);
}

但是,目前不支持嵌套的动态阵列。由于string在EVM中表示为byte[],因此string[]实际上是作为byte[][]传递的。

我最终将uint32分组并离开字符串:

function createContract(string _var1, string _var2, uint32[] _var3,
        string _var4, string _var5, string _var6)
public returns (address contractAddress) {
    return new Contract(_var1, random1, random2, _var2,
        _var3, _var4, _var5, _var6);
}

编辑:即使此方法有效,它也是不良设计的。为此,请参阅我的其他答案。

我对此更进一步,因为在特定参数的位置上,有一个 unit32的数组是模棱两可的,而且令人困惑。

我的最终尝试利用struct类型提供了不太模棱两可的实现。此struct在单独的文件Library.sol中的library中:

struct ContractArgs {
    uint32 var1;
    string var2;
    uint32 var3;
    ....
}

工厂方法看起来像这样:

function createContract(Library.ContractArgs _contractArgs)
public returns (address contractAddress) {
    return new Contract(_contractArgs, random1, random2);
}

我的构造函数看起来像这样:

function Contract(Library.ContructorArgs _contractorArgs, 
        uint32 _supplierId, string _supplierName) {
    contractArgs = _contractArgs;
    random1 = _random1;
    random2 = _random2;
}

最新更新