白皮書驗證算法可能出現錯誤?
如果我們採用 白皮書(區塊鍊和採礦部分)中描述的區塊驗證算法,它在第 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之和。