Как оптимизировать параметры gasPrice и gas в функции send() контракта? [дубликат]

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

Какие значения мы на самом деле должны указать в параметрах gasи gasPriceв send()параметрах, чтобы убедиться, что транзакции проходят, но мы не будем платить слишком много:

myContract.methods.myMethod(123).send({
    from: myAddress,
    gas: myGasLimit,
    gasPrice: myGasPrice
    }, function(error, transactionHash){
    ...
});

Большинство людей, кажется, советуют установить gasпараметр на 10-20% выше estimatedGas(что можно получить через интерфейс web3).

Но как насчет случая, когда оценка неверна ? Поскольку неиспользованный газ возвращается, почему бы не установить максимум на что-то огромное? Как насчет gasPrice, должны ли мы оставить это на усмотрение майнера или установить значение?

До сих пор я не указал никаких значений для gasи gasPriceв параметрах отправки, и это привело к сильно различающимся суммам фактически оплаченного газа между кошельками. В браузере с MetaMask развертывание контракта стоит 0,000633134 эфира (на Rinkeby), а такое же развертывание в CoinbaseWallet стоит 0,01268828 эфира (также на Rinkeby). Очевидно, gasPriceтранзакция CoinbaseWallet составила 20 GWei по сравнению с 1 GWei для транзакции MetaMask.

Изменить: уточнение этого вопроса:

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

Имея оценку, какие значения я должен указать для полей gasи gasPrice, чтобы ограничить риск переплаты и получения в первом следующем блоке?

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

Из текущих ответов я могу сделать вывод: не устанавливайте слишком высокий лимит газа (так что правило на 10-20% выше оценки звучит хорошо?)

О gasPrice: я провел несколько экспериментов и увидел, что MetaMask использует значение, установленное децентрализованным приложением, а CoinBaseWallet игнорирует его. Так что, может быть, позволить кошельку (и, если возможно, конечному пользователю) решать, что делать?

Ответы (2)

Плюсы и минусы установки высокого лимита на gas:

  • pro : транзакция с меньшей вероятностью закончится газом.
  • pro : поскольку это показатель предполагаемого использования газа, майнер может быть убежден отдать приоритет этой транзакции, поскольку она намекает на высокое вознаграждение (особенно в сочетании с ценой на газ, см. ниже), в то время как неиспользованный газ будет возвращен в любом случае ( но см. ниже).
  • con : транзакция может фактически израсходовать больше, чем вы готовы потратить, например, из-за некоторого цикла или другого неожиданного количества выполненных операций.
  • con : при out of gasсобытии весь газ будет аннулирован: когда заканчивается газ, транзакция завершается неудачей, но эфир, потраченный на газ, не возвращается.
  • минус : теоретически я думаю, что вы можете столкнуться с майнером, который назначает более высокое использование газа для определенных операций EVM, таким образом, используя больше газа, чем стандартный майнер.

Плюсы и минусы установки (готовы платить) высокой цены gasPrice:

  • pro : ваша транзакция будет включена в следующий блок с большей вероятностью, поскольку майнеры обычно сначала выбирают транзакции с высокой ценой газа, особенно если лимит попутного газа (прокси для расчетного использования газа) значителен.
  • минус : вы фактически заплатите эту цену за газ, даже если не так много транзакций, конкурирующих за включение в следующий блок.

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

Что касается цены на газ, в идеале вы должны позволить конечному пользователю выбирать на основе текущих средних значений цены на газ для «быстрых» (следующий блок) транзакций, «средних» транзакций (за минуту?) и «дешевых» транзакций. транзакции. Для получения этих средних значений вы можете обратиться к заправочной станции ETH .

Coinbase Wallet, похоже, устанавливает цену на газ на уровне 20 GWei, что является довольно высоким показателем. Хорошо при передаче эфира или покупке токена, но при вызове некоторых функций контракта стоимость транзакции может быть непомерно высокой. Кошельки должны давать своим пользователям возможность устанавливать цену газа с хорошим связанным UX.

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

Я думаю, что это важная тема.

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

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

Надеюсь, это поможет

Спасибо, @Jaime! Все действительные точки и очень полезно. Не могли бы вы немного расширить то, что вы имеете в виду, когда говорите: «Если вы знаете функцию, которую выполняете, вы можете определить, удобно ли разрешить узлу решать, какой газ необходим».
Также: «Наконец, сравнение стоимости газа (в eth), используемого для транзакций в разных сетях, похоже на сложение яблок и апельсинов». Разве они не в одной сети? Ринкеби в этом случае? Только кошелек другой.
Если вы знаете функцию, вы можете увидеть, зависит ли выполнение от предыдущих значений некоторых переменных, например, функция, которая возвращает квадрат числа, является статической, а затем всегда будет стоить одинаково. Что касается вашего второго пункта, вы правы, я неправильно понял ваш вопрос. Разница в цене только потому, что если gasprice. Я удалил свое последнее предложение, так как это неправда, что вы сравниваете две разные сети.