Solidity

字節記憶體作為函式參數會增加 gas 成本

  • November 22, 2019

我有一個用 pragma solidity ^0.4.0 編譯的智能合約;版本和一個函式接收一個字節參數,其中包含一個長字元串。在這些版本中,它不需要將參數設置為“記憶體”。

我創建了一個版本 pragma solidity >=0.4.25 <0.6.0; 的新契約;除非我將字節參數標記為記憶體,否則我無法創建。

bytes memory dBlock

這些使交易的天然氣成本增加了 3 倍以上。我已經用 bytes32 變數測試了 gas 成本幾乎為零。

然而,在這些特殊情況下,我經常收到一個長於 32 個字元的長字元串。如何將長字元串傳遞給智能合約並同時在交易中節省一些氣體?

將您的函式設置為外部(如果僅通過 txs 或其他外部智能合約呼叫)可以在某些情況下節省一些氣體。

function myExternalFunction(bytes calldata mydata) external {
   // do some stuff
}

bytes 將比 bytes32 花費更多,因為長度資訊本身儲存在 32 字節的記憶體槽中。所以無論如何最好使用bytes32,如果你能確保你永遠不必傳輸超過32個字節。還有一點需要注意的是,在以前的solidity 版本中,“memory”關鍵字被隱式包含(當用作函式參數時)。所以基本上當你寫function myfunc(bytes xyz)它時它等於function myfunc(bytes memory xyz)

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