Что определяет транзакционные издержки (ремикс)?

Я рассмотрел несколько связанных вопросов SE по этой теме и не нашел ответа. В Remix я создал два отдельных файла .sol. Файлы имеют имена file1.sol и file2.sol. Код для двух файлов выглядит так:

файл1.sol

pragma solidity ^0.4.0;

contract MyFirstContract {

}

файл2.sol

pragma solidity ^0.4.0;

contract MyOtherContract {

}

Когда я просматриваю затраты на транзакцию и выполнение, я немного сбит с толку. Часть, которая против

          | transaction cost | execution cost |
file1.sol | 68926 gas        | 10862 gas      |
file2.sol | 68990 gas        | 10862 gas      |

Почему транзакционные издержки различаются, когда контракты практически одинаковы? Сначала я заподозрил, что в контракте есть дополнительное место или что-то еще. Однако я убедился, что это не так. Почему транзакционные издержки в этих двух контрактах разные?

Я не смог воспроизвести такое поведение. Текущая версия на remix.ethereum.org всегда указывает стоимость передачи: 68990 газа, стоимость исполнения: 10862 газа. Независимо от имени файла или имени контракта.
как и @Ismael, я также не могу воспроизвести ваши результаты для первого файла, я получаю 68990 для обоих. Проверьте, не изменили ли вы компилятор во время попытки. я предлагаю вам пройти инструкции по кодам операций, сгенерированные компилятором (режим отладки).
Я только что попробовал еще раз и смог подтвердить введенные значения. Я все еще вижу разницу в стоимости газа.

Ответы (1)

Я могу воспроизвести это с компилятором версии 0.4.12+commit.194ff033.Emscripten.clang (но в моем случае наоборот - стоимость развертывания file1.sol 68990, стоимость развертывания file2.sol 68926. )

Разница в стоимости между двумя развертываниями составляет 64 газа. Причина этого в том, что, хотя код развертывания имеет точно такую ​​же длину (82 байта), один из наборов байт-кодов имеет нулевой байт в том месте, где другой имеет ненулевой байт.

При передаче транзакции в блокчейн стоимость газа за байт calldata составляет 68 для ненулевых байтов и 4 для нулевых байтов (Приложение G Желтой книги , G_txdatanonzero vs. G_txdatazero ). Отсюда и разница между вашими кодами 68 - 4 = 64 газа.

Другой байт фактически встречается в разделе метаданных добавленного контракта , а не в коде развертывания или самом развернутом коде, которые идентичны для обоих ваших примеров, как вы ожидаете. Ниже приведены разделы метаданных для контрактов — метаданные автоматически генерируются компилятором и содержат хэш Swarm содержимого исходного файла, а также некоторые другие фрагменты:

a165627a7a72305820176535c2c0a4a3ac4a26111bf3f9aa4ab0fa5db14d592f8574bf15f1f42f46420029
a165627a7a723058204e0a27613ab151031db65041c0e2ff84bf88842fd7b2cc00163bc9af9acd05230029
                          zero/non-zero byte difference is here ^^

Таким образом, с двумя почти идентичными исходными файлами у вас есть некоторая вероятность того, что из-за этого будет разница в стоимости развертывания, и это зависит от версии компилятора, поскольку версия компилятора встроена в данные, используемые для создания хэша Swarm.

Благодарю за ваш ответ. Не могли бы вы сказать мне, связана ли стоимость транзакции с размером текста контракта (т.е. кода)? Или стоимость сделки определяется размером составленного контракта? Я предполагаю последнее. Однако я не уверен на 100%.
В данном случае размер скомпилированного контракта (байт-код). Вышеприведенные выводы касаются развертывания контракта, то есть транзакции, которая отправляет байт-код контракта в блокчейн и сохраняет его там. Последующие транзакции, вызывающие методы контракта, не связаны с размером контракта.