Trust, but verify
Verify the chain
Every character's history is a signed hash chain. This page pulls that chain and checks it right here in your browser — recomputing every hash and verifying every signature against a public key baked into this page. Nothing below is taken on trust from a server; if any hash or signature were wrong, this page would say so. View source to read exactly what it does.
The key this page trusts
Verification is only meaningful against a key you can pin. This one is written into this page's source and published with the realm — compare it anywhere it appears; they must match.
Patches on this realm
D2F runs several versions of the game at once — one realm, one account, one chain, but a separate ladder and game list per patch. Every character is stamped on the chain with the patch it was made on, so a hero can only be played on the version it belongs to.
Population figures are reported by the realm. Everything in the panels above is recomputed in your browser and depends on no server's word.
Per-subject chains
Every subject on the chain — characters (account/name), accounts (@name), and on-chain records like the ladder season, world event and each character's patch — keeps its own hash chain, each save linking back to the one before from genesis. A broken link, a bad hash, or a bad signature fails the whole chain. That the rules themselves are signed here, not just characters, is the point.
How this works — and how to reproduce it
Each entry is signed over these exact bytes (\n is a newline), then SHA-256'd:
v1
{realm}
{account/charname}
{version}
{prevHash}
{blobHash}
{nodeId}
{unixTimestamp}
- Import the pinned SubjectPublicKeyInfo key (P-256).
- For each entry, rebuild those bytes, SHA-256 them, and confirm it equals the entry's stated hash.
- Verify the entry's ECDSA signature over those bytes with the pinned key.
- Confirm each entry's
prevHashequals the previous entry's hash for that character (first = genesis, or the hash a checkpoint attests to).
Checkpoints. A chain grows one entry per save, forever. To keep that bounded, a subject's
early entries can be collapsed into a single signed record: "this chain reached version V, and
the entry below it hashed to H." It is signed over its own bytes — prefixed cp1
rather than v1, so it can never be replayed as a save — and this page verifies each one
against the same pinned key before letting it root anything. Be clear on what that buys: it proves
the collapse was authorized by the key-holder, not that the collapsed history was honest. For
a checkpointed character the guarantee is "nothing has been rewritten since version V" rather than
"since genesis", and the verdict above says so whenever any chain starts from one.
The character saves themselves (the blobs) are encrypted and never leave the realm — this
page only ever sees hashes and signatures, which is all verification needs. Run the same checks from
any language against /chain.php and you'll get the same answer.
Diablo II Forever · community-run · not affiliated with Blizzard Entertainment.