Как Ethereum оценивает газ для выполнения контракта?

Я новичок в Эфириуме. Я хорошо знаю лимит газа и цену на газ. но все равно запутался

  1. при отправке транзакции для запуска развернутого контракта предлагает ли Ethereum оценку того, сколько газа необходимо для завершения транзакции?

  2. если да , насколько точна эта оценка? Другими словами, всегда ли он будет завершен успешно, если оплачивается только расчетный газ?

  3. если нет , как я могу узнать/предсказать необходимый газ?

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

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

Я пытался понять это, но все еще не мог.

Спасибо

Ответы (1)

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

Что приводит ко второму пункту. geth получает свою оценку, моделируя саму транзакцию на основе последнего блока. Другого способа сделать это по сути нет. Это называется Проблемой Остановки, если хотите, и именно поэтому газ существует в первую очередь.

Однако в большинстве случаев достаточно отправить оценку. В большинстве случаев (ИМХО) даже возможно определить, сколько газа может потреблять транзакция, а затем использовать это.

Спасибо Мэтью за полезный ответ. У меня есть еще один вопрос, который я только что поднял. Я знаю, что каждая операция в EVM потребляет определенное количество газа. Как Ethereum предопределяет стоимость каждой операции (например, ADD стоит 3 газа)? это основано на времени, необходимом для обработки транзакции? или это просто предположение?
Возможно, вы захотите задать это как отдельный вопрос, поскольку комментарии на самом деле не предназначены для ответа на него.