Возможная ошибка в алгоритме проверки белой бумаги?

Если мы возьмем алгоритм проверки блока, описанный в официальном документе (раздел «Блокчейн и майнинг»), он гласит в пункте 6:

Пусть TXбудет списком транзакций блока с nтранзакциями. Для всех iв 0...n-1, установите S[i+1] = APPLY(S[i],TX[i]). Если какие-либо приложения возвращают ошибку или если общее количество газа, потребленного в блоке до этого момента, превышает GASLIMIT, возвращается ошибка .

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

(Я точно знаю, что есть действительные блоки с неудачными транзакциями, например, исключение газа, переполнение стека вызовов и т. д., например, https://etherscan.io/tx/0x3967f859c56c61f3365f6873ea001985e4e694952a9c22b68be731132c8e3e77 )

Ответы (2)

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

если общий газ, потребленный в блоке до этой точки, превышает GASLIMIT, вернуть ошибку

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

Если какие-либо приложения возвращают ошибку... возвращают ошибку.

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

Спасибо. Я думал, что «приложение» относится к APPLY. То есть вы имеете в виду буквально Exception в работающей программе (а не на уровне EVM) или я не так понял? (Извините, но для меня все еще немного запутанно)
Да, я интерпретирую это как уровень приложения/программы. Это сбивает с толку, но мое объяснение заключается в том, что этот технический документ представляет собой обзор верхнего уровня, в то время как желтая книга погружается в работу EVM.
Извините, но я все еще думаю об этом :). Можете привести конкретный пример? (я могу думать только о "неверных инструкциях в байт-коде для выполнения" или "у отправителя не хватает денег для отправки получателю"). Верны ли мои примеры или они все-таки в другой плоскости?
Для ошибки приложения это будет что-то вроде того, что клиент неправильно настраивает блок, поэтому он отклоняется от сети. Например, если вы (майнер) должны включить a timestampв блок, но на самом деле вы не включаете его в блок при отправке в сеть, он будет отклонен на уровне приложения. Для общего потребленного газа это просто, если вы (майнер) пытаетесь включить транзакции, общая сумма которых gasпревышает gasLimit.
Вот вы описали пункты 2 и и только ту часть пункта 6, которая мне была понятна. В пункте 6 Бутерин ссылается на единичные сделки. Приложение, кажется, относится к различным приложениям. Это сбивает с толку новичков.
Точка 2 ссылается на действительную метку времени, которая имеет определенные характеристики, например, она не может быть раньше предыдущей и не может быть X минут (я не могу вспомнить точное число) после предыдущей. Пример, который я привел, предназначался для объяснения недопустимого параметра блока в целом. Другим примером может быть передача временной метки в виде строки, а не целого числа. Еще одним может быть отправка недопустимого одноразового номера или высоты блока (два других параметра, включенных в блок).

исправление ошибки:

или если общий расход газа в блоке

=> или если общий расход газа в транзакции


В случае блока gasLimit заголовка блока должен быть больше, чем сумма gasLimit транзакций.