Solidity

bytes32 相同長度的十六進製字元串花費不同的氣體為什麼?

  • June 5, 2018

我無法理解以下問題的氣體差異。我生成了一個 sha256 雜湊值,並且我選擇了小寫十六進制的輸出。所以輸出值是 64 個字元的十六進製字元串。然後我將此值保存到智能合約內的 bytes32 變數中。智能合約的程式碼是:

pragma solidity ^0.4.23;

contract Project {
   bytes32 public value;

   function addValue(bytes32 val) public {
       value = val;
   }
}

使用 remix 時,我注意到為某些值添加值的操作花費 43629 和其他 43693。所以差異是 64 氣體。誰能幫我理解為什麼會這樣?我測試了很多值,差異是 64 氣體,是隨機的嗎?我還測試了將其儲存為字元串。然後所有輸入的成本都是恆定的,可能是因為這些值的長度與我所說的輸入值有 64 個字元的長度相同。

來自黃皮書

Gtxdatazero 4 為交易的每個零字節數據或程式碼付費。

Gtxdatanonzero 68 為交易的每個非零數據或程式碼字節付費

因此,如果您將交易數據中的非零替換為零,您將減少 64 (68-4) 的成本。

請注意,連續的0 不一定重要,只要它們代表一個完整的字節。更容易查看是否分隔字節:d5 bf 2c b4 91 dd 63 f8 00 37 3f 16 ab 0f c4 86 ff e0 40 92 35 87 c0 0a dc ea d3 dc 4a 45 44 b6. 因此,您在評論中提到的第二個值正好有一個零字節。

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