Я рассмотрел несколько связанных вопросов 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 |
Почему транзакционные издержки различаются, когда контракты практически одинаковы? Сначала я заподозрил, что в контракте есть дополнительное место или что-то еще. Однако я убедился, что это не так. Почему транзакционные издержки в этих двух контрактах разные?
Я могу воспроизвести это с компилятором версии 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.
Исмаэль
Бадр Беллай
Какой-то пользователь