Solana is the canonical chain. Jobs, staking, deposits, rewards, and the authoritative node registry live on Solana. The Starknet deployment carries only a mirror of the node public-key set (versioned snapshots) plus this lightweight verifier. It stores no job, round, or feed state — everything it needs arrives in calldata and is checked cryptographically.
One signature, every chain
The Molpha signed message deliberately omitschainId. The node network signs (job_id, value, timestamp, …) once, and the Starknet verifier checks that exact same message — no re-signing, no chain-specific payload. This is what lets a single signed result be consumed on Starknet alongside any other supported chain.
What the Verifier does
Node registry
Mirrors up to 256 oracle nodes and their secp256k1 public keys. Every add/remove creates a new immutable registry version.
Deterministic selection
Derives the per-round signer group from a seed bound to the data payload, so callers cannot grind which nodes are eligible to sign.
Plain-sum aggregation
Reconstructs the coalition public key by summing the keys of the actual signers, then verifies one Schnorr signature against it.
Stateless verification
verify is self-contained: the signed payload carries everything needed, and the result is permissionlessly verifiable.s·G − e·P directly and compares its Ethereum-style address to the commitment.
Core concepts
Registry versions
The node set is append-only and versioned. Everyadd_node / remove_node creates a new immutable registry version, copying the prior node set forward. Historical snapshots are never mutated, so a payload signed against an older registry version stays permanently verifiable.
- Index
0of each version is the plain-sum aggregate key of all nodes in that version. - Indices
1 .. node_counthold the individual node keys. - A
DataUpdateis always verified against the exactregistry_versionit was signed for, even when newer versions exist.
MAX_NODES) — exactly what a single 256-bit signers_bitmap can address.
Redundancy buffer and group size
For each round the contract selects a signer group slightly larger than the strict threshold, so a few nodes can drop out without failing the round:redundancy_buffer is a protocol-admin parameter. The actual signers must be a subset of this selected group, and there must be at least signatures_required of them.
Signers bitmap
Participation is encoded as au256 bitmap: bit i-1 is set iff the 1-based node index i signed. With at most 256 nodes, a single u256 is always sufficient.
Data structures
DataUpdate — the signed result payload
SchnorrSignature — the aggregate signature
Verifying a data update
verify returns true for a valid signature and false for a cryptographically invalid one. Structural / policy violations revert (bad registry version, empty registry, zeroed inputs, too few signers, or a signer outside the selection set). Integrators should treat a revert and a false return as equivalent “not verified” outcomes.
The checks run in order:
- The
registry_versionexists and has at least one node. - Structural guards: non-zero
signatures_required,signers_bitmap,signature,commitment. popcount(signers_bitmap) ≥ signatures_required.- Signers ⊆ the deterministically derived selection set.
- The aggregate Schnorr signature over the canonical message.
Consumer integration
See Verify on Starknet for the consumer-contract walkthrough and integration checklist. Because the Verifier is stateless with respect to feeds, your contract owns any freshness, replay, or value-bounds policy —verify only attests that the node network signed (job_id, value, timestamp, …) against a given registry version.
A successful verify proves at least signatures_required keys from the mirrored registry_version signed the exact DataUpdate, and that every signer is inside the deterministic selection set. It does not prove freshness, prevent replay, or independently prove that the payload corresponds to genuine Solana job state. Those guarantees — and the protocol’s admin powers — are covered in the Security Model.