我正在尝试使用以下功能从合同工厂创建合同:
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
。我已经读到我应该将功能等分开等待,但是显然,这不是这里的选择。有没有办法使此工作?
因此,最初,我尝试通过类型将变量分组到以下:
: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;
}