Mapping

映射:作為字元串的密鑰長度是否會影響 gas 使用量?

  • January 29, 2022

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;
}

感謝您寶貴的時間和幫助。

將更長的字元串傳遞給您的函式將使用更多的氣體,原因有很多:

  1. 交易的 CALLDATA 包含傳遞給合約函式的參數,按每個非零字節 16 gas 收費(黃皮書中的 G_txdatanonzero
  2. EVM 傳遞給 KECCAK256 的每個數據字都需要額外消耗 6 個氣體(G_sha3word)。因此,如果您的字元串長度超過 32 個字節,則每增加 32 個字節就會增加 6 個氣體。KECCAK256 用於將字元串轉換為映射查找的鍵。
  3. 編譯後的程式碼使用 CALLDATACOPY 將字元串複製到記憶體中。每個 32 字節字 (G_copy) 需要 3 個 gas,因此會隨著字元串長度的增加而增加。
  4. EVM 使用的每個額外的記憶體字都會消耗氣體——更長的字元串將導致使用更多的記憶體。記憶體分配的邊際成本隨記憶體大小呈二次方增加,因此這取決於您已經使用了多少記憶體。見 YP 中的方程 (222)。

這就是我現在能想到的,但可能還有更多。

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