Records only ever get added to the end. We sign the log's current state, the witnesses sign it too, and every hour that state is stamped into Bitcoin.
This short note gives the log's name, how many records it holds, and a fingerprint of all of them together, signed with our key. It's exactly what the witnesses sign and exactly what gets stamped into Bitcoin.
Seven of them, run by six operators, are on our signed list of trusted witnesses, and any four are enough. The eighth also signs, but it doesn't count until we add it to that list. Their signatures mean this log has only one history. They don't mean any record is true. Machine-readable policy: /policy (c2sp.org/tlog-policy).
The signed state above is stamped into Bitcoin every hour. A new stamp shows as pending until a Bitcoin block confirms it.
# every row, keyed on (issuer, subject), derived by a published function python3 reduce.py --export ./log-terminal-export # one row, with everything needed to check it elsewhere python3 reduce.py --export ./log-terminal-export --receipt ISSUER SUBJECT python3 verify_receipt.py receipt.json --trust-root trust-root.json
A log is a list, not a database. The code that turns it into a searchable table is published, and its hash is a record in this log, so you can check the table the same way you check the data. Every search result comes with its record, a proof it's in the log, and the signed state: everything a stranger needs to check it without us. Tools: tlog-search.
# the same commit, twice, as github.com reported it leaf 7942 git:github.com/MarkovianProtocol/tlog-search@2af8946c unknown_key leaf 7944 git:github.com/MarkovianProtocol/tlog-search@2af8946c valid
Same commit: same files, same history, same dates. In between, a signing key was added to the account, and GitHub's answer on whether the commit's signature checks out went from “unknown key” to “valid”. Ask GitHub today and you only get “valid”, with nothing showing it ever said otherwise. This log has both answers, signed and stamped, because we wrote each one down when GitHub gave it.
h=$(sha256sum yourfile | cut -c1-64) curl -X POST -d "sha256:$h" https://log.markovianprotocol.com/submit
We store only your file's fingerprint, 32 bytes, and you keep the file. You get a receipt with links to the proofs. The witnesses sign within the hour, and the Bitcoin stamp follows. Up to 10 an hour per address.
In a browser: verify.html?leaf=N fetches one leaf, recomputes its inclusion proof, checks the log’s and the witnesses’ signatures against pinned keys, and gives you the Bitcoin proof with the command to check it. What each layer proves and what none of it does: what a stamp proves. A frozen copy of every leaf, anchor and key, deposited where we cannot withdraw it: Zenodo 10.5281/zenodo.23304783. Or by hand:
# offline proof bundle (c2sp.org/tlog-proof) for any leaf curl -O https://log.markovianprotocol.com/proof/7271 # run the same monitor that watches this log hourly git clone https://github.com/MarkovianProtocol/log-monitor cd log-monitor && cp config.example.json config.json python3 monitor.py --once # search the export, or reduce it to a table (stdlib only, offline) git clone https://github.com/MarkovianProtocol/tlog-search python3 tlogsearch.py --export ./log-terminal-export --field kind=anchor python3 reduce.py --export ./log-terminal-export
Every endpoint: /checkpoint · /proof/<i> · /policy · /inclusion · /consistency · /leaves · /tile/… · /receipt/scitt/<i> · /badge.svg · POST /submit · /anchor — index at log.markovianprotocol.com. Run the same software yourself: log-server. Download everything for offline use: log-terminal-export. Search with proof that nothing was left out: Ask the log. Search it offline with tlog-search: when a search finds nothing, you get proof there's nothing to find.