Execution layer cross validation
Resilience without swapping clients
24 August 2024
ETHTokyo
Péter Szilágyi
Go Ethereum Lead
Péter Szilágyi
Go Ethereum Lead
Consensus mechanisms aim for two properties:
Reality has another annoying property... partitioning
Ethereum must stay alive ⇒ network needs self-heal
Consensus faults can be much more interesting:
Famous chart I grew to hate... 🫠
Run multiple clients vs. verify with multiple clients?
Observation: a block only touches ~4.5MB worth of state. What if we gut out clients? 🤔
EVM execution need a variety of data... we need verifiability:
witness = [headers, codes, state] headers = [header₁, header₂, ...] // Descending list of headers - Enforces parent linking codes = [binary₁, binary₂, ...] // Unordered soup of bytecodes - Enforces by-hash access state = [binary₁, binary₂, ...] // Unordered soup if trienodes - Enforces MPT structure
Relatively straightforward with a few gotchas:
CALL*
and EXTCODE*
opcodesBLOCKHASH
opcode needs all headers from current to the refed oneSLOAD
needs prefetching, siblings postfetchingVerify an EVM execution via another implementation
Must run production EVM
Engine API seems the tightest
Proposed API usage:
Go Ethereum Lead