Surfil

Keys & epochs

Every paid operation ends in an Ed25519-signed output. Those signatures have to stay verifiable for years - across key rotations, incident response, and audits. Epochs are how Surfil rotates signing keys without invalidating a single receipt you already hold.

Signing keys

The edge holds a private signing key and publishes the matching public key. A receipt is signed with the private key; anyone can check it with the public key, offline, with no account. The private key never leaves the edge, and it never signs anything derived from your source - only measured facts and metadata. See Signed outputs.

Epochs

Each key has an epoch number. When a key is rotated - on a schedule, or in response to a suspected compromise - the epoch increments and a new public key is published for it. Receipts record the epoch they were signed under:

alg:       Ed25519
key epoch: 7
sig:       <signature over the measured facts>

To verify an old receipt, surfil verifyselects the public key for the receipt's epoch. Rotating to epoch 8 does not break a receipt signed under epoch 7 - the epoch-7 public key stays published and valid for verification.

What rotation protects

  • Forward safety - a key compromised today can be retired immediately; new receipts move to the next epoch.
  • Historical integrity - receipts already issued remain verifiable under their original epoch key.
  • Auditability - the epoch on a receipt tells an auditor exactly which key attested it, and when that key was active.
Key rotation is recorded on the audit chain (key.rotate epoch→8) so the history of which key was active when is itself tamper-evident. See the audit chain runbook.