Solidity

儲存在映射中的氣體成本,初始與後續

  • January 27, 2018

我有以下簡單的儲存程式碼:

pragma solidity ^0.4.17;

//The Oracle contract provides the reference prices for the contracts.  Currently the Oracle is updated by an off chain calculation by DDA.  Methodology can be found at www.github.com/DecentralizedDerivatives/Oracles
contract Test_Oracle {

 /*Variables*/
 //Mapping of documents stored in the oracle
 mapping(uint => uint) oracle_values;

 //Allows the owner of the Oracle to store a document in the oracle_values mapping. Documents
 //represent underlying values at a specified date (key).
 function StoreDocument(uint _key, uint _value) public {
   oracle_values[_key] = _value;
 }

 //Allows for the viewing of oracle data
 function RetrieveData(uint _date) public constant returns (uint data) {
   return oracle_values[_date];
 }
}

現在我創建測試 Oracle 並執行以下事務:

a)StoreDocument(1,1000)
b)SotreDocument(1,1000)
c)StoreDocument(1,1000)
d)StoreDocument(2,999999999999)

記錄以下交易和執行成本:

a)42024,20304
b)27024,5034
c)27024,5034
d)42216,20304

一些問題… 為什麼 a 和 b 不同?為什麼 a 和 d 的交易成本不同,而執行成本卻不同?

也許對低級 EVM 更熟悉的人知道答案。提前感謝您的幫助!

https://github.com/djrtwo/evm-opcode-gas-costs/blob/master/opcode-gas-costs_EIP-150_revision-1e18248_2017-04-12.csv很有幫助。

簡而言之,如果您在以前為零的地方儲存非零值(如在第一個範例中),則 SSTORE(儲存值)需要 20,000 氣體,如果您要儲存非零值,則需要 5,000 氣體已經存在非零值的值。

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