Exhibit A · Cryptographic proof

The Dad Ledger

A tamper-evident, cryptographically signed, append-only record of whether Zack is a dad. Like a blockchain, but useful.

✅ Chain verified: 1 entry, all signatures valid.

Checked on the server for this page load: every hash recomputed, every link followed, every Ed25519 signature checked. Then, please, check it yourself.

1 entry
NO according to the ledger
Ed25519 signatures
e10825bf… head hash

Entries

Oldest first. Times are UK time. Hover a hash or signature for the full value, or get the lot from /api/ledger.
SeqTimeStatusNote HashSignature
0 NO Genesis. Zack is not a dad. e10825bfadc3… O8KVpii6nNBA…

The public key

Every entry is signed with this Ed25519 key. Write it down. Screenshot it. Have it engraved on something. If it ever changes, somebody has rewritten the whole ledger and you should ask pointed questions.

y0Lu3dFwgTMpw5MDpy_dPl8zPCP8fa178kdQnzunp7w

Raw 32-byte public key, unpadded base64url. As a JWK: {"kty":"OKP","crv":"Ed25519","x":"y0Lu3dFwgTMpw5MDpy_dPl8zPCP8fa178kdQnzunp7w"}. Machines and the suspicious can also fetch it from /.well-known/dad-ledger.json.

How it works

  1. Each entry is flattened into one canonical string: <seq>|<at>|<status>|<note>|<prevHash>.
  2. The hash is the SHA-256 of that string's UTF-8 bytes, in lowercase hex.
  3. The signature is Ed25519 over the UTF-8 bytes of the hash's hex string, in unpadded base64url.
  4. Each entry's prevHash is the previous entry's hash, so changing anything in the past breaks every link after it. The genesis entry points at 64 zeros, because something has to go first.

Here is the newest entry (seq 0), taken apart:

canonical  0|2026-11-07T09:05:11.975Z|no|Genesis. Zack is not a dad.|0000000000000000000000000000000000000000000000000000000000000000
sha-256    e10825bfadc3a651bd4daba9983498ca7a87278f65ac14c2e133edaa54e7ccde
signature  O8KVpii6nNBAw4KjoK_AAs5EOVVnJw2oZ_-onK174dPhPT8x8HdOprv9x_SXz-X2CeCyaC7AUYeCopmwYyvZDw

Verify it yourself

Don't trust this page; it would say that. Save this as verify-dad-ledger.mjs and run node verify-dad-ledger.mjs (Node 22 or newer, no dependencies). It also works pasted into a modern browser console.

// verify-dad-ledger.mjs: re-checks every hash, link and Ed25519 signature in the Dad Ledger.
// Node 22+, Deno, or a modern browser console. No dependencies. No trust required.
const ORIGIN = "https://iszacka.dad";
// The key you wrote down the first time. Set to null to accept whatever the server says.
const PINNED_KEY = "y0Lu3dFwgTMpw5MDpy_dPl8zPCP8fa178kdQnzunp7w";

const { publicKey, entries } = await (await fetch(`${ORIGIN}/api/ledger`)).json();
if (PINNED_KEY && publicKey !== PINNED_KEY) throw new Error('The public key has changed. Be suspicious.');

const bytes = (b64url) => Uint8Array.from(atob(b64url.replace(/-/g, '+').replace(/_/g, '/')), (ch) => ch.charCodeAt(0));
const utf8 = (text) => new TextEncoder().encode(text);
const hex = (buf) => [...new Uint8Array(buf)].map((b) => b.toString(16).padStart(2, '0')).join('');
const key = await crypto.subtle.importKey('raw', bytes(publicKey), { name: 'Ed25519' }, false, ['verify']);

let prevHash = '0'.repeat(64);
for (const [i, e] of entries.entries()) {
  const canonical = `${e.seq}|${e.at}|${e.status}|${e.note}|${e.prevHash}`;
  const hash = hex(await crypto.subtle.digest('SHA-256', utf8(canonical)));
  const signed = await crypto.subtle.verify('Ed25519', key, bytes(e.signature), utf8(hash));
  if (e.seq !== i || e.prevHash !== prevHash || e.hash !== hash || !signed) {
    throw new Error(`Chain broken at seq ${i}. Somebody has been editing history.`);
  }
  prevHash = hash;
}
const head = entries.at(-1);
console.log(`✅ ${entries.length} entries verified. Latest (seq ${head.seq}, ${head.status}): ${head.note}`);

Or, if you trust us to write the verifier for you (which rather defeats the point): curl -s https://iszacka.dad/ledger/verify.mjs | node --input-type=module

Questions nobody asked

Is this a blockchain?

No. It is one database, one signer, no mining, no tokens and no measurable carbon footprint. It is a hash chain with signatures, which is what a blockchain is once it has grown up and got a proper job.

What does "tamper-evident" mean?

It doesn't stop anybody editing the database. It makes it obvious: change one character of one old entry and its hash stops matching, the next entry's link breaks, and this page turns red.

Couldn't Zack just rewrite the whole thing?

With the private key, the chain could be rebuilt from scratch, yes. You would notice, because the history you saved earlier would no longer match and, if the key were replaced, so would the public key above. This is why you pinned it. You did pin it.

Why?

Because "trust me" is not a cryptographic primitive, and because a yes/no question deserves an audit trail.