Solidity
為什麼 1225312 是記憶體中的最後一個可定址位置?
我正在涉足內聯彙編,我想發現可定址記憶體的範圍。經過多次試驗,我發現唯一可以使用 OPCODE 訪問的可用記憶體位置在包含範圍內:十進制的 (0x0, 0x12B260) 或 (0, 1225312)
mload
。mstore
為什麼 1225312 是最後一個可定址的記憶體位置?它在文件中的什麼地方提到了記憶體的限制?
從乙太坊的黃紙第 9.4.1 節機器狀態中,記憶體被定義為一個 2^256 字節的數組,大約 1.15 * 10^77 字節。因此,合約可用的記憶體量是有限制的,但它確實很高。
訪問記憶體的成本定義了一個小得多的實際限制。根據附錄 H.1 Gas Cost,記憶體成本的公式為:
C_mem(a) ≡ G_memory · a + trunc(a^2 / 512)
其中a是四捨五入到 32 的最高地址,G_memory 是 3 gas。
如果合約訪問地址 p 的記憶體,那麼它將在整個區間內收費
[0, p)
。如果它只讀取一個字節,它就不會映射。同樣在第 9.1 節費用概述中,他們指出記憶體的實際限制是 2^32。
9.1:費用概覽
$$ .. $$由於此費用,地址極不可能超過 32 位界限。也就是說,實現必須能夠管理這種可能性。
幾個地方的Geth實現假設最大地址是 64 位。
應該考慮的另一個限制是塊氣體限制,因為訪問記憶體的成本必須適合 64 位,所以最大 a 是這樣的3 a + trunc(a^2 / 512) < 2^64。