Evm

為什麼 return ((2**256-1)+5)%15 不會溢出?

  • July 10, 2021

我正在編寫一個智能合約,它必須能夠計算兩個數字的總和,以另一個數字為模,總和可能會溢出2**256-1。我將其寫為 (a%c+b)%c,以防止溢出。我在 Remix 中測試了 (a+b)%c 只是為了看看會發生什麼,並且它在進行僅返回值的純計算時有效。它不適用於寫入變數或使用值作為映射中的鍵。為什麼它適用於 return (a+b)%c?為了避免溢出,EVM 計算的步驟是什麼?

solidity 編譯器具有 整數文字表達式,該表達式在編譯時使用任意長度的算術進行評估,支持精度高於 EVM 256 位的中間值。如果最終結果符合正確的類型,它將起作用。

連結文件中的一個範例,中間結果不適合 uint256,但最終結果為 1 並且適合 uint8

uint8 public y = 2**800 + 1 - 2**800;

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