我正在尝试使用以下函数从合约工厂创建合约:
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。 random1
和random2
是合同工厂中的字段。
此函数抛出Stack too deep, try using less variables
。我已经读过我应该拆分功能等以解决这个问题,但显然,这不是一个选择。有没有办法让这个工作?
答案 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;
}