Checkpointed local log and MMR
Each node keeps its own append-only Merkle Mountain Range, signs small checkpoints over it, and registers those checkpoints with a transparency service, while the entries never leave the node.
1What it is
A checkpointed local log is an append-only log that a producer keeps for itself, structured as a Merkle Mountain Range exactly as the MMR receipt profile defines it.
From time to time the producer signs a checkpoint, a SCITT Signed Statement that commits to the whole log at one size and links to the previous checkpoint with a consistency proof.
Only the checkpoint leaves the producer, and registering it with transparency services that check it against the previous one is what turns "trust the producer" into something others can check.
2Design choices
SHA-256(0x00 || entry) over a 32-byte entry.commitment is the peaks' node values concatenated tallest first, the same bytes as a Receipt of consistency payload.log_size is the MMR tree size, a node count (7 entries → 11); the entry count goes in the optional leaf_count.log_size as the number of entries, as an earlier revision described it; the commitment length check then fails. (CLL §4, §4.3)prev_size, prev_commitment) and carries the consistency proof inside the signed payload.sub per log; the pair (iss, sub) is the log identity every continuity check keys on.sub that changes per checkpoint; each one then looks first-seen and continuity is silently never enforced. (CLL §4.5)The CLL draft cites draft-bryce-cose-receipts-mmr-profile-03 and states that, where the profile's editors' copy differs from -03 (the commitment encoding, a protected tree-size header on the Receipt of consistency, and the exact shape of consistent_roots), it follows the editors' copy (CLL §5.6).
3What it shows / what it does not
Shows
- To the extent the verifier trusts the producer, who signed every checkpoint and chose what to present (CLL §5.3), the next four points hold:
- The producer's key committed to this exact sequence at
log_sizeN (signature over the commitment). - An entry is in the log at a position: an MMR inclusion proof reaches one of the committed peaks.
- A later checkpoint extends an earlier one without modification: the consistency proof from
prev_sizerebuildscommitment. - A presented range of entries is complete within the committed history.
- Once registered under a Consistency Registration Policy at a service independent of the producer: each entry existed no later than the first registered checkpoint covering it, and the registered history was not rewritten.
Does not show
- That any entry's content is true.
- That the producer appended everything it did, or that this is its only log.
- Wall-clock time:
issued_atis the producer's own claim; the upper bound comes from registration, so the backdating window is the cadence plus registration latency. - That the producer did not show a different fork to someone else; two checkpoints only check each other, and forks are caught by comparing or registering checkpoints with services that hold state.
- Anything about entries appended after the last registered checkpoint, and no per-record lookup: the service never holds the entries.
4Example
The second checkpoint of the published test log: seven entries, log size 11, continuing from an earlier checkpoint at size 4. Its commitment is three 32-byte peaks.
{
"id": "cp2",
"leaves": 7,
"claims": {
"kind": "cll-checkpoint",
"log_size": 11,
"commitment": "046b6c15dfa5998f23e49ba135f22ba0fe3ebc25078f5d087b78ed18106ba1bda0b64392f61d15267e0355dcc1907d30d55ebb895c425d944e9a0ae26170aea3bd0ce39b0f88ee1ff3b35c8ecf7a7eaf6041459d49c22b459c5a69d6d2ca6c61",
"prev_size": 4,
"prev_commitment": "643e9cb5b896b008a16c1333fecce044e510a94de8124c3798d3488277263324857277deb54352114b86f34f5ede1c50a8ab7de359acc5e362efc3c0a46ded4b",
"issued_at": "2026-10-13T01:00:00Z",
"cadence": 3600,
"leaf_count": 7,
"consistency_proof": "84040b82815820fa93abf7e2abc3635a3420f20d11a2de3e3842131027381ca5caa3af2afea186…"
},
…
"consistency_proof": {
"tree_size_1": 4,
"tree_size_2": 11,
…
"right_peaks": [
"a0b64392f61d15267e0355dcc1907d30d55ebb895c425d944e9a0ae26170aea3",
"bd0ce39b0f88ee1ff3b35c8ecf7a7eaf6041459d49c22b459c5a69d6d2ca6c61"
]
},
…
"continuity": "continuous"
}
| Field | Type | Meaning |
|---|---|---|
| kind | tstr | Always cll-checkpoint. |
| log_size | uint | MMR tree size (node count) committed to: 11. |
| commitment | bstr | Peaks at size 11 (heights 2, 1, 0), concatenated tallest first: 96 bytes. |
| prev_size | uint | The previous checkpoint's log_size: 4 (three entries). |
| prev_commitment | bstr | The previous checkpoint's commitment: two peaks, 64 bytes. |
| issued_at | tstr | Issuance time as a date-time string, as the producer states it. |
| cadence | uint | Declared maximum seconds between checkpoints. |
| leaf_count | uint | Entry count; must equal leaf_count(log_size - 1). |
| consistency_proof | bstr | CBOR [4, 11, consistency-paths, right-peaks] per the MMR profile. |
| right_peaks | hash[] | New peaks no path reaches: nodes 9 and 10, the last two peaks of the commitment. |
| continuity | tstr | What a Consistency Registration Policy concludes for this checkpoint. |
In the same file the checkpoint's protected header carries alg -19 (Ed25519), a kid, and CWT claims iss https://producer.example and sub https://producer.example/logs/1, identical for every checkpoint of the log.
Source: action-state-group/checkpointed-local-log:cll-02-vectors/vectors.json @ 40dabd74508d0f8649c8754873e316badef1057d
5Specs
- Internet-Draft draft-mih-scitt-checkpointed-local-log-02 — the log discipline, the checkpoint, registration under a Consistency Registration Policy.
- Internet-Draft draft-bryce-cose-receipts-mmr-profile-03 — the MMR structure, accumulator, and inclusion and consistency receipts.
- RFC RFC 9943 — SCITT architecture: the checkpoint is a Signed Statement registered like any other.
- RFC RFC 9942 — COSE Receipts: what the service returns for a registered checkpoint.
- RFC RFC 9052 — COSE: the checkpoint is a COSE_Sign1 with an attached payload.
- Code action-state-group/checkpointed-local-log — Python, Go, TypeScript and Rust implementations and the vectors above; per the draft's Implementation Status (§8) all four match the log and accumulators but still emit the previous revision's checkpoint wire form.