(jobId, registryVersion, canonicalTimestamp), reconstruct the coalition key as the plain EC sum of the actual signers, and check one Schnorr signature over the canonical message. No chainId is in the message — that is what makes a single signature valid on every chain.
The three implementations
| Solana | EVM | Starknet | |
|---|---|---|---|
| Role | Canonical chain + verifier | Stateless verifier | Stateless verifier |
| Entrypoint | verify_data_update (reverts; 72-byte return data) / submit_data_update (writes the Feed) | verify(dataUpdate, schnorrData) → bool (view) | verify(data_update, schnorr_data) → bool |
| Node-key storage | RegistryIndex PDAs | SSTORE2 snapshot per version | per-(version, index) coordinate maps |
| Schnorr final check | native verification over the args | ecrecover trick (recovers s·G − e·P) | native secp256k1 syscalls, computes s·G + (Q−e)·P |
What every verifier enforces
- The
registryVersionexists and has nodes. - Structural guards: non-zero
signaturesRequired,signersBitmap,signature,commitment. popcount(signersBitmap) >= signaturesRequired.- Signers ⊆ the deterministically derived selection set (
groupSize = min(signaturesRequired + redundancyBuffer, nodeCount)). - The aggregate Schnorr signature over the canonical message.