計算儲存數據的交易成本
我試圖弄清楚如何計算在乙太坊區塊鏈上儲存數據的交易的交易成本。看來我總是閒著。這是我的計算方式(我使用的是 Kovan 測試網,但我想計算應該是相同的):
我上傳了以下智能合約
pragma solidity ^0.5.12; contract NewContract { struct Location { string JSON; } Location[] locations; function createLocation(string memory _json) public { locations.push(Location(_json)); } function viewLocation(uint _id) public view returns(string memory) { string memory result = locations[_id].JSON; return result; } }
當我保存字元串:“Test123”時,我假設價格將根據 yeelow 論文由以下統計數據組成:https ://ethereum.github.io/yellowpaper/paper.pdf附錄 G. 費用表
68:為交易的每個非零字節數據或程式碼付費。
21000:為每筆交易付費。
由於字元串“Test123”的大小是 7 字節,我的計算是:(21.000 + (7*68))*9(Gwei)= 21.476 gas * 9 Gwei = 193.284 Gwei(交易成本)
這將是 0.000193284 Ether 我的測試計算:https ://kovan.etherscan.io/tx/0x8098ddd06cefe06280a4a499c5ff04d9fa93af64a7b77d060173607c32b54c4c 說它使用了 64.244 Gas,它花費了 0.000578196 Ether
EVM 做了什麼我不知道的計算?
提前致謝 :)
首先,您不需要將 gas-price 添加到您的計算中。
這個因素是由你(交易發送者)選擇的,所以沒有任何問題。
唯一有問題的部分是
64244
交易中使用的氣體單位。根據白皮書,您已確定它應該是
21000 + 68 * 7 = 21476
:
- 21000:為每筆交易付費
- 68:為交易的每個非零字節數據或程式碼付費
但是你忘了考慮:
- 20000:儲存值從零設置為非零時為 SSTORE 操作付費
在您的程式碼中 -
locations.push(Location(_json))
其中有兩個:
- 將長度
locations
從 0 更改為 1- 將 的長度
locations[0]
從 0 更改為 7(的長度"Test123"
)這兩個產生額外數量的
20000 * 2 = 40000
氣體單位。所有這一切的底線是,如果您想測量保存特定字元串的 gas-cost,那麼請編寫一個函式來直接明確地保存它。
您的函式所做的不僅僅是保存特定的字元串,也就是說,它接收它作為輸入並將其推送到字元串數組中。