Mapping
映射:作為字元串的密鑰長度是否會影響 gas 使用量?
我
string
用作mapping
資料結構的關鍵。**$$ Q $$**在我們使用
mapping
的時候,當key string的長度增加時,是否也增加了gas使用量?mapping(string => int) map; contract.array("mykey"); //short key length. contract.array("mykey_mykey_mykey_mykey_mykey_mykey"); //longer key length is used. function array(string key){ map[key] = 10; }
感謝您寶貴的時間和幫助。
將更長的字元串傳遞給您的函式將使用更多的氣體,原因有很多:
- 交易的 CALLDATA 包含傳遞給合約函式的參數,按每個非零字節 16 gas 收費(黃皮書中的 G_txdatanonzero )。
- EVM 傳遞給 KECCAK256 的每個數據字都需要額外消耗 6 個氣體(G_sha3word)。因此,如果您的字元串長度超過 32 個字節,則每增加 32 個字節就會增加 6 個氣體。KECCAK256 用於將字元串轉換為映射查找的鍵。
- 編譯後的程式碼使用 CALLDATACOPY 將字元串複製到記憶體中。每個 32 字節字 (G_copy) 需要 3 個 gas,因此會隨著字元串長度的增加而增加。
- EVM 使用的每個額外的記憶體字都會消耗氣體——更長的字元串將導致使用更多的記憶體。記憶體分配的邊際成本隨記憶體大小呈二次方增加,因此這取決於您已經使用了多少記憶體。見 YP 中的方程 (222)。
這就是我現在能想到的,但可能還有更多。