堆栈太深,尝试在创建合同时使用较少的变量

时间:2018-02-18 23:26:59

标签: 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。我已经读过我应该拆分功能等以解决这个问题,但显然,这不是一个选择。有没有办法让这个工作?

2 个答案:

答案 0 :(得分:0)

所以,最初我尝试按类型将变量分组到:

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);

}

编辑:即使这种方法有效,但它设计得很糟糕。请参阅我的其他答案,以获得更好的解决方法。

答案 1 :(得分:0)

我更进了一步,因为unit32的数组在特定参数的位置方面含糊不清且令人困惑。

我的最后一次尝试使用了struct类型来提供不那么模糊的实现。此struct位于单独文件library中的Library.sol中:

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;

}