Какова реальная цена развертывания контракта в основной сети?

Я пытаюсь развернуть контракт в основной сети, но у меня возникают проблемы с развертыванием с помощью Truffle.

➜  ballot git:(master) ✗ truffle migrate --network mainnet --dry-run
Using network 'mainnet' (dry run).

Running migration: 1_initial_migration.js
  Deploying Migrations...
Error encountered, bailing. Network state unknown. Review successful transactions manually.
sender doesn't have enough funds to send tx. The upfront cost is: 670197500000000000 and the sender's account only has: 120000000000000000

Согласно этой ошибке, развертывание контракта будет стоить 0,67 ETH (~ 750 долларов США). Мне очень трудно в это поверить.

Влияет ли сложность кода на стоимость развертывания? Не уверен, что еще это было бы.

Похоже, что Truffle запрашивает смешную цену на газ, чтобы заплатить за развертывание контракта. Я попытался настроить параметр gasPrice в truffle.js на что-то более низкое (21 Gwei), но ничего не изменилось. Все еще не уверен, почему это происходит.
Вы можете использовать ремикс для оценки стоимости транзакции для вашего контракта. И даже развернуть контракт из ремикса.
Если узел Ethereum оценивает стоимость газа как максимальную стоимость газа за блок, это обычно означает, что ваш код каким-то образом ошибочен и может привести к недопустимому переходу (require(), throw или какой-либо другой форме исключения)

Ответы (5)

Стоимость вашего развертывания основана на 5 вещах, а 6 влияет на расчетную стоимость развертывания:

  1. Фиксированная плата 32k газа. Код операции CREATE, который вызывается при создании контракта, стоит фиксированных 32 тыс. газа. Это, конечно, сверх 21k газа обычного tx. Примечание. Во время создания контракта из EOA (неконтрактного адреса) код операции CREATE явно не вызывается. Возвращаемое значение tx фактически используется для создания контракта, но фиксированная комиссия в размере 32 000 остается той же.

  2. Количество байткода в скомпилированном контракте. Больше байт-кода означает больше места для хранения, а каждый байт стоит 200 единиц газа. Это складывается очень быстро. Обратите внимание, что унаследованные родительские контракты также включены в байт-код.

  3. Данные ТХ. Весь байт-код, который вы отправляете в качестве данных tx, стоит 68 для ненулевых байтов и 4 для нулевых байтов.

  4. Фактически код, который выполняется перед созданием контракта, например, конструктор контракта. Если конструктор требует много вычислений для генерации байт-кода, это будет очень дорого. Примечание. Вы будете платить за записи/чтения состояния, которые происходят в вашем конструкторе, и это может быть дорого.

  5. Цена на газ. Чем выше цена на газ, который вы используете, тем выше он будет стоить. Посетите ethgasstation.info, чтобы узнать о выгодных ценах на бензин, которые можно использовать прямо сейчас. На момент написания 2 gwei — это быстрая цена на газ.

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

В целом, если бы вы развертывали контракт с простым конструктором и 5 КБ скомпилированного байт-кода, вы бы заплатили примерно:

СОЗДАТЬ 32k

Техас 21k

КОД КОНТРАКТА 5k*200

РАСЧЕТНОЕ НЕНУЛЕВОЕ ПЕРЕДАЧА БАЙТОВ 5,5k*(0,95*68)

РАСЧЕТНОЕ НУЛЕВОЕ ПЕРЕДАЧА БАЙТОВ 5,5k*(0,05*4)

КОНСТРУКТОР 1k

Получается около 1,41 млн газа, что на данный момент составляет менее 5 долларов США. Цены на газ были в 20 раз выше, чем сейчас пару недель назад, так что вы могли бы заплатить 100 долларов за создание такого же контракта.

Вы можете прочитать больше о затратах на основе байт-кода в желтой книге .

Если вам нужна помощь в оптимизации контрактов, я готов помочь, но не бесплатно.

Изменить: добавлен № 3 между № 2 и № 4.

Редактировать 2: Фиксированные числа и последующая математика для ненулевой стоимости txdata (64 => 68)

Если ваш контракт стоит так дорого, то вы, должно быть, выполняете кучу инициализации хранилища. Хранение, безусловно, требует больше всего операций чтения/записи.

Ирония Solidity в том, что переделывать что-то в памяти дешевле, поэтому, если у вас есть какие-то переменные, вы можете повторно инициализировать и пересчитать. Вероятно, лучше делать это в памяти каждый раз, когда вызывается метод контракта.

Вы должны протестировать процесс развертывания в частной сети или полностью протестировать сеть, прежде чем пробовать основную сеть. Я тестирую свой на Ринкеби, потому что в Ропстене предел газа в блоках слишком низок.

По моему опыту, настройка gasPrice в truffle.js эффективна. Я успешно развернул свои контракты, используя следующий синтаксис:

    geth_mainnet: {
      host: "127.0.0.1",
      port: 8545, // geth-mainnet
      network_id: "1",
      gasPrice: 2000000000, // 2 GWei
      from: "0x...your-address-goes-here..."
    }

См . 2 505 437 газа * 2 Gwei = 6 долларов США и 5 435 035 газа * 2 Gwei = 13 долларов США .

Пара предостережений:

  • Убедитесь, что в вашей учетной записи достаточно средств не только для развертывания смарт-контракта, но и для развертывания контракта миграции truffle и вызовов этого контракта.
  • Если вы используете low gasPrice, вам лучше убедиться, что основная сеть не слишком загружена, проверьте https://ethgasstation.info/ . Если ваша транзакция не получает достаточного приоритета и не может быть добыта в 50 блоках, truffle/web3 истечет время ожидания. В зависимости от того, как далеко вы продвинулись в процессе миграции трюфелей, фактическое развертывание вашего контракта может все еще продолжаться и успешно завершаться, но адрес контракта не будет записан в файле build/.

Это не ответ на вопрос, но я хотел бы добавить это к предыдущим ответам.

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

Таким образом, если у вас установлен лимит 6,700,000газа и цена газа установлена ​​на 20 gwei, то клиент потребует, чтобы вы имели по крайней мере 0.134 ETHна своем кошельке. Я не уверен, можно ли отключить эту проверку.

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

Мой подход:

  1. Разверните в тестовой сети, такой как ropsten, и обратите внимание на использованный газ.
  2. Перейдите на https://web3-tools.com/ и введите газ, чтобы рассчитать требуемый газ в долларах США.

Как и в принятом ответе, мой базовый контракт составлял около 1 400 000 (по сравнению с 21 000) за трансфер.

Раскрытие информации: я написал web3-tools.com