У меня есть следующий простой код хранения:
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 низкого уровня знает ответ. Спасибо за любую помощь заранее!
Короче говоря, SSTORE (хранение значения) стоит 20 000 газа, если вы храните ненулевое значение там, где ранее был ноль (как в вашем первом примере), и стоит 5 000 газа, если вы храните ненулевое значение. значение там, где уже было ненулевое значение.