第20次后位移失败(Solidity)

时间:2017-12-27 13:39:11

标签: ethereum solidity

我的目标是按位移动一个maxed uint256,以便将零迭代地添加到右侧:

...1111111111111... 

成为

...1111111111000...

我使用新移位的位置作为掩码。

经过大约20次迭代后,我的代码停止正常工作。

有没有人对此事有任何见解?

是否存在EVM溢出限制?

我很擅长......如果除了听取事件之外,任何人都有更好的方法来调试变量,请理解并解释这种方法。

uint256 public MAXUINT256 = 2*256 - 1;

for (uint256 i = 0; i < 255; i++) {
      var mask = MAXUINT256 * (2 ** i);
      var key = signature & bytes32(mask);

      if (Cell[key] != address(0)) {
        NEW_SIG = uint(sha256(signature,Cell[key]));
        Callback ctx = Callback(Cell[key]);
        ctx.ERNG_CALLBACK(NEW_SIG);

        if (i == bit) {
          Cell[key] = msg.sender;
        } else {
          Cell[key] = address(0);
        }
      } else {
        if (i == bit) {
          Cell[key] = msg.sender;
        }
      }
    }

1 个答案:

答案 0 :(得分:0)

mask计算i >= 248溢出。

这真的是你的意图吗?

顺便说一下,MAXUINT256 = 2*256 - 1字面上没有多大意义,因为实际的MAXUINT256实际上是2**256 - 1。当然,使用此值会使mask的每个值的i计算溢出,所以您可能需要澄清一般的意图。