Gaskosten für die Speicherung in der Kartierung, anfänglich vs. nachfolgend

Ich habe den folgenden einfachen Speichercode:

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

Jetzt erstelle ich das Test-Orakel und führe die folgenden Transaktionen aus:

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

Folgende Transaktions- und Ausführungskosten werden erfasst:

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

Einige Fragen... Warum sind a und b unterschiedlich? Warum unterscheiden sich a und d bei den Transaktionskosten, aber nicht bei den Ausführungskosten?

Vielleicht weiß jemand, der sich mit dem Low-Level-EVM etwas besser auskennt, eine Antwort. Danke für jede Hilfe im Voraus!

Antworten (1)

https://github.com/djrtwo/evm-opcode-gas-costs/blob/master/opcode-gas-costs_EIP-150_revision-1e18248_2017-04-12.csv ist hilfreich.

Kurz gesagt, SSTORE (Speichern eines Werts) kostet 20.000 Gas, wenn Sie einen Wert ungleich Null speichern, wo zuvor eine Null war (wie in Ihrem ersten Beispiel), und es kostet 5.000 Gas, wenn Sie einen Wert ungleich Null speichern Wert, bei dem bereits ein Wert ungleich Null vorhanden war.