Ethereum智能契约函数仅限于大约16个局部变量。当它们超过该数时,将生成stack is too deep错误。
解决方案是将大型函数重构为较小的函数。例如:
Contract A{
function B(p1,p2,p3...pn){
}
}可发展为:
Contract A{
function B1(p1,p2){
}
function B2(p3,p4){
}
...
}现在假设一些函数依赖于其他函数的结果。换句话说,由一个函数引起的状态变化会影响另一个函数的工作方式。
我正在考虑的这个问题是在这个纸中讨论的不可预测的状态,它指出:
通常,当用户向网络发送事务以调用某个契约时,他无法确定事务将在发送该事务时处于与合同相同的状态。
我们如何确保希望使用函数B1进行事务的用户希望使用函数B2进行事务处理,而不需要其他人更改与B1进行事务所导致的状态?
发布于 2018-07-03 20:59:53
如果其中一些变量是临时的,并且可以包含在它们的函数中,那么您可以从B1()内部调用B2(),这可以绕过堆栈深度限制,同时仍然保证执行顺序。
如果您必须将其拆分为两个调用,并且调用它们的顺序很重要,那么您可能需要自己管理依赖关系。例如,在B1()中写入一个变量,并在B2()中检查它,如果还没有写入变量,则调用revert。
https://ethereum.stackexchange.com/questions/52608
复制相似问题