Contract-Design

記憶體和儲存之間的區別?

  • September 10, 2021

記憶體和儲存有什麼區別?

從 EVM 和合約設計的角度來看。

謝謝!

它們類似於電腦中的記憶體和硬碟儲存。合約在執行程式碼期間可以使用任意數量的記憶體(當然只要它可以支付),但是當執行停止時,記憶體的全部內容都會被擦除,下一次執行將重新開始。另一方面,儲存被持久化到區塊鏈本身中,因此下次合約執行某些程式碼時,它可以訪問之前儲存在其儲存區域中的所有數據。

記憶是暫時的。儲存是永久性的。例如,您將使用 memory 執行中間計算,然後將結果保存到 storage

從 EVM 的角度來看的詳細資訊,它們的結構和 gas 成本。

儲存是鍵/值儲存,其中鍵和值都是 32 字節。它是稀疏的(就像一個雜湊表),並且兩個 32 字節的值彼此相鄰並沒有固有的 gas 節省。將其中一個值儲存在鍵 1 並將另一個值儲存在鍵 1000,與將它們儲存在鍵 1 和鍵 2 中的氣體量相同。(仍然可以通過打包儲存節省氣體,例如uint128在單個鍵中擬合 2 個值,而不是使用 2 個鍵。)

記憶體是一個字節數組。記憶體從零大小開始,但可以通過簡單地訪問或儲存大於其目前大小的索引處的記憶體來擴展為 32 字節塊。由於記憶體是連續的,它確實可以節省氣體來保持它的打包並縮小它的大小,而不是有大片的零。長度為 2 的數組儲存 2 個值比長度為 1000 的數組便宜,其中值位於數組的末端,中間全為零。

微妙之處 wiki進一步解釋了使用記憶體的 gas 成本:

擴展記憶體的費用是通過減法確定的。具體來說,TOTALFEE(SZ) = SZ * 3 + floor(SZ**2 / 512)是將記憶體擴展到 32 字節塊的總費用SZ(注意:部分填充的塊被計算在內,因此 33 字節 = 2 個塊),如果特定操作將記憶體從 size 擴展xy,則額外的 gas 成本為TOTALFEE(y) - TOTALFEE(x)

儲存 gas 成本主要是: 20,000 gas,當一個值從零設置為非零時;寫入現有儲存或將值設置為零時需要 5,000 個 gas;當非零值設置為零時,返還15,000 的 gas 。

編輯: 2018 年最終確定的EIP-2200對儲存成本有進一步的解釋,例如“儲存”相同價值的 800 氣體

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