Как работают «geth», «EstimateGas» и «Предлагаемая цена (газа)»?

#go-ethereum

#перейти на ethereum

Вопрос:

Мой друг спросил меня, как geth оценивает лимиты газа и цены на газ. Как это делается?

Комментарии:

1. Для меня это определенно вопрос программирования, поскольку мое приложение зависит от того, как geth оценивает газ, и мне нужно знать, учитывает ли это внезапные скачки стоимости газа

Ответ №1:

Если вы отправляете транзакции без ограничений на газ или цены на газ через RPC API, geth использует вместо этого Estimate() или SuggestPrice(). Remix также использует их. Это поведение относится к geth версии v1.8.23. Разные версии могут работать по-разному.

EstimateGas

ввод: номер блока (по умолчанию: «ожидающий»), «лимит газа» транзакции (по умолчанию: лимит газа для данного номера блока)

EstimateGas пытается найти минимальный gas для выполнения этой транзакции с заданным номером блока. Он выполняет бинарный поиск между 21000 и «пределом газа». Например, если «лимит газа» равен 79000, он пытается запустить эту транзакцию с лимитом газа, 50000 = (21000 79000) / 2. Если это не удалось, он пытается с 64500 = (50000 79000) / 2, и так далее. Если сбой произошел с «пределом газа», возвращается 0 и сообщение об ошибке, "gas required exceeds allowance or always failing transaction" .

ПРИМЕЧАНИЕ: Даже если транзакция завершается неудачей из-за проблем, не связанных с газом, она рассматривает сбой как недостаточный газ. Затем он вернет 0 с сообщением об ошибке в конце.

источник: geth /internal/ethapi/api.go

Предложитецену(газа)

ввод: количество блоков для поиска (по умолчанию: 20, --gpoblocks ), процентиль цены (по умолчанию: 60, --gpopercentile ), запасной результат (по умолчанию: 1 GWei, --gasprice )

SuggestPrice параллельно запрашивает цены на газ для «количества последних блоков» из «последнего» блока. Если по каким-либо причинам он не может получить ответы более чем на половину «количества блоков», он запросит больше блоков, в пять раз превышающих «количество блоков».

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

SuggestPrice сортирует цены на газ по блокам, затем подбирает заданный процентиль среди цен (0 для наименьшей цены и 100 для наибольшей цены). Он кэширует этот результат и немедленно возвращает кэшированный результат для того же «последнего» (добытого) блока.

Если все попытки завершились неудачей, возвращается последний результат. Если последних результатов нет, возвращается «запасной результат». И SuggestPrice не может вернуть более 500 GWei.

источник: geth /eth/gasprice/gasprice.go

Комментарии:

1. зачем нужен бинарный поиск? Я думал, что просто запустите tx с полным пределом газа x, и после выполнения мы сможем узнать, сколько газа будет использовано, затем создайте буфер и умножьте стоимость газа на два или три, это нормально?

2. @Jerrylk Я не уверен. ИМХО, если логика зависит от GAS (оставшегося газа) или GASLIMIT кодов операций, могут возникнуть разные результаты.