// runs entirely in your browser

Verify a row

Paste any Groundtruth row. This machine recomputes the hash from the row's own fields and recovers the address that produced the signature. Both checks run locally with a vendored library. Nothing is sent anywhere — it works with the network off.

waiting for a row

The hash is the row

Strip hash, address and signature, serialise what is left with keys sorted and no whitespace, then SHA-256 it. The result must equal the row's own hash.

The signature is that address

Rebuild the signed message from the row, take the EIP-191 digest, recover the public key from the signature. The address it produces must equal the address on the row.

// the whole verification path

Two lines, if you would
rather run it yourself

the message that gets signed
GROUNDTRUTH-CHOICE-v1 task:<task> hash:<hash> ms:<ms> ts:<ts>

Nothing else is in it. No address, no site, no session — the message comes entirely from fields already public in the row.

the two checks, in any language
sha256(canonical(core)) == row.hash ecrecover( eip191(message), row.signature ) == row.address

Canonical means keys sorted alphabetically and no whitespace. That is the only convention you need.

what verification does not tell you

That the address belongs to a distinct person. A signature proves a key produced a row and nothing more — one person can hold a thousand keys. Sybil resistance is a property of how a dataset is weighted, not of a signature, and any project telling you otherwise is selling you something.