Event参数有哪些限制?

时间:2018-03-21 14:37:44

标签: arguments ethereum solidity

对于可以在事件中发送的参数数量是否有任何限制?

我有一个函数,我想触发有12个参数的事件,其中6个参数是数组。我得到Stack太深,尝试使用更少的变量。没有事件,该功能正常工作。

我猜测事件参数有一些限制或计算在solidity函数中的最大参数但是我找不到任何关于它的文档。

任何人都可以澄清这个吗?

编辑:

合同看起来像这样: 我正在使用安全数学,而_getAddressSubArrayTo是一个内部纯函数,它从索引到索引获取一个子数组。

event LogTemp(address a,
             address b,
             address[] c,
             uint256[] d,
             address[] e,
             uint256[] f,
             address[] g,
             uint256[] h,
             uint256 i,
             uint256 j,
             uint256 k,
             bytes32 l);

function test(address[] _addresses,
           uint256[] _uints,
           uint8 _v,
           bytes32 _r,
           bytes32 _s,
           bool test)
  public
  returns (bool)
{

Temp memory temp = Temp({
  a: _addresses[0],
  b: _addresses[1],
  c: _getAddressSubArrayTo(_addresses, 2, _uints[3].add(2)),
  d: _getUintSubArrayTo(_uints, 5, _uints[3].add(5)),
  e: _getAddressSubArrayTo(_addresses, _uints[3].add(2), (_uints[3].add(2)).add(_uints[4])),
  f: _getUintSubArrayTo(_uints, _uints[3].add(5), (_uints[3].add(5)).add(_uints[4])),
  g: _getAddressSubArrayTo(_addresses, (_uints[3].add(2)).add(_uints[4]), _addresses.length),
  h: _getUintSubArrayTo(_uints,(_uints[3].add(5)).add(_uints[4]), _uints.length),
  i: _uints[0],
  j: _uints[1],
  k: _uints[2],
  l: hash(
    _addresses,
    _uints
  )
});


LogTemp(
  temp.a,
  temp.b,
  temp.c,
  temp.d,
  temp.e,
  temp.f,
  temp.g,
  temp.h,
  temp.i,
  temp.j,
  temp.k,
  temp.l
);
}

2 个答案:

答案 0 :(得分:1)

是的,有限制。您的活动中最多可以有三个索引参数。非索引参数的限制性较小,因为它不受事件数据结构本身的限制,但受到存储的块气体大小的限制(以每个字节存储在日志中的数据为8个气体)。

Solidity event documentation

答案 1 :(得分:1)

我能找到答案:

如果你看一下声明FunctionDefinition的ContractCompiler.cpp,你会看到堆栈上有17个元素的限制;

if (stackLayout.size() > 17)           
  BOOST_THROW_EXCEPTION(   
        CompilerError() <<     
    errinfo_sourceLocation(_function.location()) <<     
    errinfo_comment("Stack too deep, try removing local variables.")     
);      

事件被定义为函数,如ExpressionCompiler.cpp中所示。

简单地说将事件视为函数,因此它们具有17个参数的限制。数组计为2,所以在我的例子中,我有6个数组+ 6个普通参数,这等于18,我将堆栈打破1.