В чем разница между стоимостью транзакции и стоимостью исполнения в ремиксе?

В чем разница между стоимостью транзакции и стоимостью выполнения , как видно после создания контракта в ремиксе ?

Ремикс

Я не думаю, что это имеет значение, но вот мой контракт:

contract DepositCounter {
    uint deposits = 0;
    function() {
        deposits++;
    }
}
Некоторые связанные комментарии из беседы с Gitter, которые я нашел полезными: «Разница между стоимостью выполнения и стоимостью транзакции заключается в накладных расходах на создание транзакции, которая включает в себя стоимость полезной нагрузки, AFAIK. Один из них полезен, если вы хотите знать, сколько это будет стоить кому-то позвонить вам из другого контракта, другому, если вы хотите знать, сколько будет стоить отправка транзакции на этот метод».
«Транзакционная стоимость не зависит от развертывания. Каждая транзакция имеет транзакционную стоимость, развертывание просто включает стоимость полного байт-кода контракта».
Транзакции стоят «68 газа за ненулевой байт и 4 газа за нулевой байт в полезной нагрузке транзакции. ... [Сравнение транзакций, которые развертывают контракты с обычными контрактами,] есть дополнительная плата в размере 32 000 газа для контрактов, которые создают транзакции, плюс плата за хранение данных контракта в состоянии. В остальном они одинаковы».

Ответы (3)

Транзакционные издержки — это затраты на отправку кода контракта в блокчейн эфириума, они зависят от размера контракта.

Проверьте исходный код:

 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 статьи, которые составляют полную стоимость сделки:

  1. базовая стоимость сделки (21000 газа)
  2. стоимость контрактного развертывания (32000 газа)
  3. стоимость каждого нулевого байта данных или кода для транзакции.
  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; между пробегами.

Тогда стоимость транзакции полностью зависит от размера скомпилированного контракта ПЛЮС стоимость исполнения. Комментарии не меняют транзакционные издержки, как и имена переменных. Но добавление (не вызываемого) метода делает. Вы можете вызывать некоторые методы в своем контракте, и оказывается, что стоимость транзакции - стоимость выполнения = константа для скомпилированного контракта, с которым вы сейчас работаете.

Должен ли я платить (стоимость транзакции + стоимость исполнения) или только сверх стоимости транзакции
Вы должны оплатить стоимость транзакции, которая включает стоимость исполнения.
На самом деле я считаю, что это лучший ответ, а не тот, за который проголосовало больше всего и который был принят как правильный ответ.