В чем разница между стоимостью транзакции и стоимостью выполнения , как видно после создания контракта в ремиксе ?
Я не думаю, что это имеет значение, но вот мой контракт:
contract DepositCounter {
uint deposits = 0;
function() {
deposits++;
}
}
Транзакционные издержки — это затраты на отправку кода контракта в блокчейн эфириума, они зависят от размера контракта.
var getGasUsedOutput = function (result, vmResult) {
var $gasUsed = $('<div class="gasUsed">');
var caveat = lookupOnly ? '<em>(<span class="caveat" title="Cost only applies when called by a contract">caveat</span>)</em>' : '';
if (result.gasUsed) {
var gas = result.gasUsed.toString(10);
$gasUsed.html('<strong>Transaction cost:</strong> ' + gas + ' gas. ' + caveat);
}
if (vmResult.gasUsed) {
var $callGasUsed = $('<div class="gasUsed">');
var gas = vmResult.gasUsed.toString(10);
$callGasUsed.append('<strong>Execution cost:</strong> ' + gas + ' gas.');
$gasUsed.append($callGasUsed);
}
return $gasUsed;
};
Затраты на выполнениеvmResult
должны быть действительно затратами на выполнение виртуальной машины, если я правильно интерпретирую параметр . Возможно, это потому, что конструктор по умолчанию будет вызываться в любом случае?
Я надеюсь, что этот ответ поможет предоставить более полную картину наряду с принятым ответом.
Затраты на транзакции основаны на стоимости отправки данных в блокчейн. Есть 4 статьи, которые составляют полную стоимость сделки:
Затраты на выполнение основаны на стоимости вычислительных операций, которые выполняются в результате транзакции.
Вы можете увидеть разбивку в желтой бумаге, Приложение G.
Этот пост является дополнением к предыдущему ответу Роланда Кофлера в июне 2016 года.
Затраты на выполнение должны быть действительно затратами на выполнение виртуальной машины, если я правильно интерпретирую параметр vmResult. Возможно, это потому, что конструктор по умолчанию будет вызываться в любом случае? Кроме Роланда:
Стоимость выполнения полностью связана с затратами на хранение глобальных переменных и временем выполнения вызовов методов.
Хранение глобальных переменных кажется мне довольно дорогим. В приведенном ниже коде вы видите, как я проверяю математическую эффективность возведения в степень. Все вычисления вместе стоят примерно 500. Добавление строки "result = res;" меняет это с 500 до примерно 20 000 затрат на выполнение.
uint256 result;
function modPow2() returns (uint res){
res = 2341**4 % 3456;
res = res**8 % 3456;
res = res**2 % 3456;
res = res**2 % 3456;
res = res**2 % 3456;
res = res**4 % 3456;
result = res;
}
Если запустить этот метод два раза подряд, он будет стоить соответственно 20 000, а затем 5 000. В третий раз запускаю, опять стоит 5000. Я предполагаю, что изменение битового размера результата глобальной переменной обходится дорого. Я проверил это, сбросив значение с результатом = 0; или сделать результат=результат+1; между пробегами.
Тогда стоимость транзакции полностью зависит от размера скомпилированного контракта ПЛЮС стоимость исполнения. Комментарии не меняют транзакционные издержки, как и имена переменных. Но добавление (не вызываемого) метода делает. Вы можете вызывать некоторые методы в своем контракте, и оказывается, что стоимость транзакции - стоимость выполнения = константа для скомпилированного контракта, с которым вы сейчас работаете.
Рейн Ревир
Рейн Ревир
Рейн Ревир