Gas
如何組合整數,以節省交易數據和儲存的 gas?
例如,我有兩個整數:一個是 uint128,另一個是 uint64。我想通過將它們轉換為 bytes24 來儲存這兩個整數。當我使用它們時,將 bytes24 解析為 uint128 和 uint64。
我該怎麼做呢?
儲存成本
在儲存之前組合來自小於 32 字節的變數的數據是個好主意!
SSTORE
每個 EVM 字(32 字節)需要 20 公斤,這是非常昂貴的。幸運的是,如果您使用solc --optimize
. 請參閱本文關於 EVM的“更多優化”部分,了解其工作原理。不妨讓編譯器為您完成工作。交易數據成本
單獨發送參數有其自身的 gas 成本。但是,這不應該是您最關心的問題:每個非零字節僅花費 68 gas。對於一個完整的 32 字節 uint 來說,這聽起來很多,但如果您傳遞較小的值,它們將有很多零(僅以每字節 4 個 gas 的價格計價)。
事實證明,通過組合欄位,您只會在交易數據成本中節省 128 gas,因為您只是減少了發送的零的數量,這很便宜。節省的氣體甚至不包括在 Solidity 中再次拆分數據的額外成本。這顯然不值得付出努力,並且可能對天然氣成本產生淨負面影響。
不合併欄位:
fieldA = 0x00000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF fieldB = 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF transaction non-zero bytes = (128 + 64) / 8 = 24 transaction zero bytes = (128 + 192) / 8 = 40 gas cost for parameters = 68 * 24 + 4 * 40 = 1792
結合欄位:
fieldC = 0x0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF transaction non-zero bytes = (128 + 64) / 8 = 24 transaction zero bytes = 64 / 8 = 8 gas cost for parameters = 68 * 24 + 4 * 8 = 1664