Prove a vehicle's history. Never show the record.
A Digital Circularity Vehicle Passport under Regulation (EU) 2026/1738, built on
Midnight's zero-knowledge blockchain.
github.com/VINPassport/VINPassport · passport.vin
The history a used-car buyer sees is whatever the seller chose to print. Write-offs re-registered as clean, accidents that vanish between listings, service stamps nobody earned: each is a field moving a way it should never move, and the buyer cannot tell.
Euro 7 puts an Environmental Vehicle Passport on every new M1/N1 type from 29 Nov 2026, all new M1/N1 a year later. It opens from a QR code on the car with no app and no login, and must stay reachable for twenty years (Reg (EU) 2025/1707 Art 17(4)). Art 4(7) separately obliges manufacturers to minimise tampering with the odometer and with the passport itself.
The fuller Digital Circularity Vehicle Passport follows in September 2032 (Reg (EU) 2026/1738 Art 13). 2032 is the roadmap. Six weeks away is the customer.
The regulation demands a passport that can be checked, not one that is public. A full history is commercially sensitive to the seller and personally identifying to the owner. Publish it and one problem is solved by creating the other.
Every field of the passport is a private commitment on Midnight. Questions are answered with zero-knowledge proofs (yes, verifiably) while the values stay where they belong.
| The question | What the chain learns |
|---|---|
| Has it ever been written off? | No, or the transaction fails |
| Has it had a reported accident? | No, or the transaction fails |
| Record a service, a reading | The field moved only the way that field may move |
| Is the mileage under 150 000 km? | Yes, and never the reading itself |
Each field carries an integrity rule fixed at creation: mileage, accidents, keepers, write-off status can never fall. The rule lives on the ledger, so nobody can pick the flattering rule at the moment they need it.
passport.vin: the full verification surface, reading the committed ledger export · npm run app runs the compiled circuits locally
The refusal is not form validation: it is the zero-knowledge circuit aborting the transaction, so nothing is written and no false claim can ever appear proven.
The buyer's page then shows not proven for exactly that question: an honest absence, never a quiet "no".
Anyone can reproduce this: clone, npm run app, pick the Audi from the demo fleet, submit.
An EV's battery is a separate regime with its own passport (Reg (EU)
2023/1542, from Feb 2027). We carry the reference: slot 29,
batteryPassportId: and never restate the battery's claims.
The Euro 7 EVP is also separate, and we read its parameter table rather than assume it. Appendix 1 to Annex V is about twenty type-approval and emissions values, fixed at approval. We hold two, and the odometer is not an EVP parameter at all: it reaches us through Art 4(7)(d) anti-tampering and the Art 4(10) lifetime-values regime.
Both boundaries get one answer: interoperate, do not absorb. Separate section roots under one top root, because they are different documents on different clocks.
Every declaration anchors under a salted content root: it commits to everything and reveals nothing, including which slots are filled.
128 contract tests against the compiled circuits, same assertions that reject a transaction on chain
+155 app tests · +24 SDK assumption assertions
A proof shows a value is the anchored one and satisfies a bound: not that it matched physical reality when written. The registrar is trusted for that, which is why every passport names one.
So VINPassport today makes fraud attributable and tamper-evident: never "impossible". Closing the last gap means the value is written by a party already accountable for it: work we have not done, and do not imply we have.
attestation-vault@odatano/dpp-sdk: key derivation, value scaling, Merkle construction@odatano/nightgate-tx: transaction building, batch ordering, in-process proving - against our own key2f66c442…e5d648f5, 16 OctNot used: CAP service, OData layer, attestation-vault, disclosure grants. Tiered disclosure was deferred on purpose: a passport that cannot tell one writer from another is not worth adding tiers to.
The near-term date is not 2032. From 29 November 2026 every new M1/N1 type needs an Environmental Vehicle Passport (Euro 7); the battery passport follows in February 2027, the full passport in September 2032. The cascade starts where the obligation starts: second-hand dealers are stage 3, inheriting passports rather than adopting a new system.
Unit cost is measured, not assumed. On chain it is negligible: NIGHT is never consumed, so about USD 331 of held NIGHT supports a thousand vehicles a day. The real cost is proving, and that is what Wave 3 goes after.
Two products, not one. The regulated EVP is twenty static values, priced at issue. Provenance is voluntary and is where lifetime cost lives. Conflating them was the mistake the measurement caught.
| Wave 2 shipped |
A second contract that closes the limits we named, live on preprod: register and initialise gated on a registrar identity derived in-circuit, an allowlist pinned at deploy, field commitments bound in-circuit to the content root, a third integrity rule with the field registry widened from 5 to 68, a circuit that compares two of a vehicle's own hidden fields and publishes neither, and every guard mutation-checked, 25 of 25. Deployed 16 Oct 2026, block 2999411. Cost measured with real proofs: 0.81 DUST at the protocol reference price to register a vehicle and initialise the five fields the demo writes, and 27.6s in wasm to issue a claim. A vehicle carrying the whole 68-field registry is a different and much larger number, which is the throughput work Wave 3 is about |
|---|---|
| Wave 2 deferred |
The NIGHTGATE integration: tiered disclosure, disclosure grants, live browser reads, the CAP service layer. Named for Wave 2 and held back on purpose, because a passport that cannot tell one writer from another is not worth adding tiers to. documentComparison waits on more than one anchored root per vehicle |
| Wave 3 | Composition & commerce: the battery passport link exercised against NIGHTPASS end to end, cross-root integrity in the product flow, the dealer workflow, fleet view, and one real pilot conversation |
| Horizon | Closing the trust gap: a proof inherits the trust of whoever wrote the value, so the open problem is provenance of the writer, not tamper resistance. Authoritative sources - registries, testers, insurers - writing under an accountable identity, and marking that lets a verifier tell an authoritative write from a self-declared one. That distinction becomes the product |
passport.vin: live demo · deploy/preprod.json: the preprod contract · docs/DEMO.md: the walkthrough · Apache-2.0, fully open source