Revert-Opcode
為什麼在 Solidity ^0.8.0 中溢出時移位操作不恢復?
採取以下功能:
solidity ^0.8.0; function foo(uint256 x) external pure returns (uint256) { uint256 y = x << 255; return y; }
如果設置 x = 2,則結果為 2**256,高於 uint256 允許的最大值。然而,合約呼叫並沒有恢復。為什麼?
根據文件:
對於正值和負值
x
,x << y
等價於x * 2**y
如果我將上面的函式重寫為
y = x * 2*255
,則合約呼叫會恢復。
它就是這樣設計的。
移位運算不屬於算術運算。根據我在 Solidity gitter 頻道中與@chriseth 的討論: