Solidity
bytes32 相同長度的十六進製字元串花費不同的氣體為什麼?
我無法理解以下問題的氣體差異。我生成了一個 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
. 因此,您在評論中提到的第二個值正好有一個零字節。