PoV Core: Attestors, One-Claim & Claim IDs
Summary: Proof of Verification (PoV) is an application-layer standard on Ethereum/Base. It gates mints/settlements by requiring a governed attestor quorum on the same evidence and enforcing route-agnostic One-Claim exclusivity. It is not base-layer consensus.
What this page covers
Roles & quorum policy (attestors and the default QuorumSpec)
Canonical evidence → evidenceHash (why and how to hash)
EAS schemas you reference in proofs: MeterReadingBatch.v1, Verification.v1
Route-agnostic claimId and the One-Claim exclusivity rule
The invariants PoV requires on every mint/settle
Roles & quorum policy
Base roles (v0.1):
1 = METER_OP (or Source Operator)
2 = AUDITOR (independent verifier — mandatory)
3 = OEM (device maker / device attestation)
4 = GRID (TSO/DSO/market operator)
5 = CUSTODIAN (asset/collateral)
6 = INSPECTOR (lab/QA/assay)
7 = PROGRAM (grant/issuer/authority)
Default QuorumSpec (v0.1): minTotal = 2, auditorRequired = true, minDistinctRoles = 2
Governance MAY tighten by product line (for example, require AUDITOR + GRID for compliance REC).
Canonical evidence → evidenceHash
Why canonicalize: the same reality must hash to the same bytes. Pretty-print tricks or field re-ordering must not change the digest you verify on-chain.
Canonical JSON rules (normative):
Sorted keys (ASCII ascending)
UTF-8 encoded
Minified (, : separators only)
Numeric fields are integers unless explicitly declared decimal strings
Minimal energy example:
Hash: evidenceHash = SHA-256(utf8(canonical_json))
EAS schemas (attestations you reference)
MeterReadingBatch.v1
Fields (revocable):
Verification.v1 (PoV unit attestation)
Fields (revocable):
Rule: counted verifications MUST reference the same evidenceHash and batch/window as the meter attestation.
Route-agnostic claimId
Purpose: prevent the same evidence from being consumed across routes/registries. If you need splits, create smaller batches and attest them independently
Definition:
Solidity
TypeScript
One-Claim exclusivity
Contract: One-Claim Ledger records the first (and only) successful consumer of a claimId.
API (conceptual):
reserve(claimId)→ succeeds only if unclaimed; locks to msg.senderfinalize(claimId)→ only reserver can finalize; emits Finalizedrelease(claimId)→ only reserver can release before finalization
Atomicity: reserve → checks → finalize MUST occur inside the Gate in a single transaction; any revert rolls back the reservation
PoV invariants (MUST hold)
Equality of evidence — all counted verifications reference the same evidenceHash and batch/window
Quorum — at least minTotal, with ≥ 1 AUDITOR, and ≥ minDistinctRoles
Exclusivity — a claimId can be finalized exactly once network-wide
Revocability — if a counted verification is revoked/expired and quorum drops, dependent assets MUST be flagged/frozen/burned per policy until rectified
Fail-safe — uncertainty means no mint/settle/access (revert
Conformance checklist (integrators)
Produce canonical JSON and compute evidenceHash
Publish MeterReadingBatch.v1 for the batch
Obtain ≥ minTotal Verification.v1 attestations (same evidenceHash; includes AUDITOR)
Compute route-agnostic claimId
Call the PoV Gate in the same transaction that mints/settles/accesses; Gate will reserve → validate → finalize in One-Claim
Store attestation UIDs and emitted events for audit (subgraph/indexer)
Subscribe to the PoV Feed and implement flag/rectify handlers in your asset contracts
Last updated
