← Quickstarts
The Rolling Hash
PRE-MAINNET
STEP 1 OF 7
ALL EXAMPLES →
THE PROBLEM — ONE VALUE FOR A WHOLE EXECUTION TREE
An ExecutionEntry is written before your transaction runs: it states what the calls are and what each returns. Execution then has to be checked against it. Not call by call, with a list of comparisons — with one equality.
require(_rollingHash == entry.rollingHash); // RollingHashMismatch
WHAT THAT ONE COMPARISON CATCHES
Wrong return data for any call · wrong success/failure flag · missing or extra calls · a skipped or extra reentrant frame · reordered operations · a reentrant call the table did not expect.
Six distinct classes of divergence, and none of them needs its own check. That is the property worth understanding — the rest of this guide is how it is bought.
PROTOCOL RESEARCHERS · GUIDE

The rolling hash

An execution entry says what should happen. Something has to commit to what did — and it is one bytes32, folded as execution runs.

This is a guide, not a three-step walkthrough: seven steps, and the code is illustrative rather than copy-pasteable. What you take home is not an EEZ API. It is a design: a hash chain plus domain tags, which together make an explicit index redundant — and what dropping that index buys.

WHAT YOU'LL LEARN
  • 01 · ONE VALUE, WHOLE TREESix distinct classes of divergence, caught by a single equality check.
  • 02 · SEEDED WITH STATEIt starts from the entry's starting state and identity, not from its first result.
  • 03 · FIVE TAGGED EVENTSA domain byte per event type, so one input set cannot collide across two of them.
  • 04 · NO INDEX IS FOLDED INThe chain already binds order, count and nesting — and omitting the index is what makes a revert span reprocessable.
  • 05 · A NO-MATCH CANNOT BE FORGEDWhy CALL_NOT_FOUND is its own tag and not CALL_END(true, "").
  • 06 · A TRIPLE COLLAPSED TO ONEThe reentrant table's position key, and why isStatic did not need to be in it.
  • 07 · THE UNTAGGED EXCEPTIONStatic sub-hashes drop the tags entirely — with a stated reason, not an oversight.

Verified against eez-core-protocol @ 9735f53 — pre-mainnet; interfaces may move.