Solidity

什麼是擴張成本?

  • September 12, 2021

我想了解什麼是擴張成本。

我們可以看到有這個公式來計算記憶體成本 -

在此處輸入圖像描述

現在,據說這個公式不包括擴張成本。

誰能簡單地解釋一下擴張成本是什麼意思?

您問題中的公式描述了合約呼叫中分配的總記憶體量的氣體成本(即包含非零值的最大記憶體位置。使用它後清零記憶體不會減少分配的記憶體總量)。請注意,這是對mstore操作碼的 base 3 gas 的補充。

在上面的公式中,a是合約呼叫中寫入的最大記憶體位置。請注意,a它以32 字節字為單位。

例如,如果您的合約使用 1,024 字節的記憶體,a = 32.

來自乙太坊黃皮書(https://ethereum.github.io/yellowpaper/paper.pdfG_memory = 3,.

總而言之,合約記憶體消耗所需的額外 gas 為:

3 * (max_memory / 32) + floor(max_memory^2 / 524,288)

如果您使用 <=724 字節的記憶體,則此等式的第二部分為 0。第一項是記憶體擴展成本的線性部分(使用的 32 字節字數的 3 倍)。

您必須使用非常大量的記憶體(數十千字節)才能使記憶體擴展成本顯著偏離線性。這是一個包含一些範例的表格:

大多數合約呼叫最多使用幾 kb,使得記憶體擴展成本與修改儲存變數的成本相比較小。

注意 由於 Solidity 編譯器正在處理記憶體管理,因此很難看出 Solidity 合約將消耗多少記憶體。作為一般的經驗法則,使用結構和數組會增加記憶體消耗,但基本變數bytes32, uint256不會。上次我檢查了 Solidity 編譯器沒有重用分配的記憶體;每次memory創建新變數時,都會分配額外的記憶體。

誰能簡單的解釋一下擴容成本是什麼意思?

當您的合約寫入記憶體時,您需要支付與寫入字節數相關的成本。

但是,如果您正在寫入之前未寫入的記憶體區域,則第一次使用它會產生相關的額外成本。可以將其視為對使用原始記憶體徵收的額外稅款。

來自 Solidity 文件的“儲存、記憶體和堆棧”部分:

當訪問(讀取或寫入)以前未觸及的記憶體字(即字內的任何偏移量)時,記憶體會擴展一個字(256 位)。擴張時,必須支付gas費用。記憶體越大,它的成本就越高(它以二次方縮放)。

(補充一點:它對前 724 個字節進行線性縮放

$$ Appendix H, Yellow Paper $$之後是二次方。)

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