Затраты газа на хранение в картографии, первоначальная и последующая

У меня есть следующий простой код хранения:

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];
  }
}

Теперь я создаю тестовый оракул и выполняю следующие транзакции:

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 низкого уровня знает ответ. Спасибо за любую помощь заранее!

Ответы (1)

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 газа, если вы храните ненулевое значение. значение там, где уже было ненулевое значение.