Revert-Opcode

為什麼在 Solidity ^0.8.0 中溢出時移位操作不恢復?

  • March 23, 2021

採取以下功能:

solidity ^0.8.0;

function foo(uint256 x) external pure returns (uint256) {
   uint256 y = x << 255;
   return y;
}

如果設置 x = 2,則結果為 2**256,高於 uint256 允許的最大值。然而,合約呼叫並沒有恢復。為什麼?

根據文件

對於正值和負值xx << y等價於x * 2**y

如果我將上面的函式重寫為y = x * 2*255,則合約呼叫會恢復。

它就是這樣設計的。

移位運算不屬於算術運算。根據我在 Solidity gitter 頻道中與@chriseth 的討論:

Solidity Gitter 討論

引用自:https://ethereum.stackexchange.com/questions/95102