Если мы возьмем алгоритм проверки блока, описанный в официальном документе (раздел «Блокчейн и майнинг»), он гласит в пункте 6:
Пусть
TX
будет списком транзакций блока сn
транзакциями. Для всехi
в0...n-1
, установитеS[i+1] = APPLY(S[i],TX[i])
. Если какие-либо приложения возвращают ошибку или если общее количество газа, потребленного в блоке до этого момента, превышает GASLIMIT, возвращается ошибка .
Верно ли смелое утверждение? Я имею в виду, что если выделенная жирным шрифтом часть будет правдой, будет ли это означать, что допустимые блоки не могут содержать транзакции с ошибками? Или это просто общий алгоритм проверки, который не соответствует реальному?
(Я точно знаю, что есть действительные блоки с неудачными транзакциями, например, исключение газа, переполнение стека вызовов и т. д., например, https://etherscan.io/tx/0x3967f859c56c61f3365f6873ea001985e4e694952a9c22b68be731132c8e3e77 )
Важно понимать, что это алгоритм проверки блока . Когда в этом разделе технического описания говорится о возврате ошибки, это происходит на уровне блоков, а не на уровне транзакций. Ошибка на уровне проверки блока не позволит распространить блок в сеть, в отличие от ошибки на уровне транзакции, которая будет транслироваться в сеть, как вы показали в своем примере ссылки.
если общий газ, потребленный в блоке до этой точки, превышает GASLIMIT, вернуть ошибку
Если подумать об этом с точки зрения проверки блоков, это имеет смысл. Если майнер попытается включить в свой блок транзакции, общая сумма gas
которых превышает GASLIMIT
, блок будет недействительным и, следовательно, никогда не увидит сеть. Если бы это было не так, майнеры включали бы каждую транзакцию в свой блок, чтобы получать все комиссии за транзакцию.
Если какие-либо приложения возвращают ошибку... возвращают ошибку.
Ключом к этому является понимание того, что речь идет о приложении, а не о конкретной транзакции. В этом утверждении приложение относится к клиенту майнинга или к тому, кто проверяет блоки. При таком понимании становится более ясно, что это утверждение верно — если приложение, проверяющее блок, возвращает ошибку, возвращает ошибку.
исправление ошибки:
или если общий расход газа в блоке
=> или если общий расход газа в транзакции
В случае блока gasLimit заголовка блока должен быть больше, чем сумма gasLimit транзакций.
Бриомкез
APPLY
. То есть вы имеете в виду буквально Exception в работающей программе (а не на уровне EVM) или я не так понял? (Извините, но для меня все еще немного запутанно)Шейн Фонтейн
Бриомкез
Шейн Фонтейн
timestamp
в блок, но на самом деле вы не включаете его в блок при отправке в сеть, он будет отклонен на уровне приложения. Для общего потребленного газа это просто, если вы (майнер) пытаетесь включить транзакции, общая сумма которыхgas
превышаетgasLimit
.Бриомкез
Шейн Фонтейн