什麼是擴張成本?
我想了解什麼是擴張成本。
我們可以看到有這個公式來計算記憶體成本 -
現在,據說這個公式不包括擴張成本。
誰能簡單地解釋一下擴張成本是什麼意思?
您問題中的公式描述了合約呼叫中分配的總記憶體量的氣體成本(即包含非零值的最大記憶體位置。使用它後清零記憶體不會減少分配的記憶體總量)。請注意,這是對
mstore
操作碼的 base 3 gas 的補充。在上面的公式中,
a
是合約呼叫中寫入的最大記憶體位置。請注意,a
它以32 字節字為單位。例如,如果您的合約使用 1,024 字節的記憶體,
a = 32
.來自乙太坊黃皮書(https://ethereum.github.io/yellowpaper/paper.pdf)
G_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 $$之後是二次方。)