Track alignment

Track: Renewable Energy & Energy Trading — renewable certificate tracking. SunProof is a verification layer for Renewable Energy Certificates (RECs) from small rooftop solar. It audits the meter data, issues 1-MWh certificates only for energy that passes the audit, anchors every certificate on Solana, refuses a second certificate for the same meter and period, and lets anyone verify the data behind a certificate.

The result, on a real solar meter

Vadym ran SunProof on a public dataset of real household PV meters (Open Power System Data, Konstanz, Germany, CC BY 4.0).

Real meter-month Meter claims Not measured (publisher's own flag) SunProof held back, without using that flag Measured hours wrongly flagged
residential3, April 2017 885.2 kWh 631.1 kWh (71%) 603.1 kWh — 96% of the unmeasured energy 0
residential4, June 2017 (control) 1,570.9 kWh 0 0 0 → 1 REC issued

A registry that trusts the raw meter series would have certified 885.2 kWh for April. Only 254.1 kWh of it was actually measured hour by hour. SunProof certified 282.1 kWh and held the rest back for review.

Both months are anchored on Solana devnet and can be verified by anyone:

Inspiration

We are Solar DePIN Hub, a small team from Ukraine working on solar DePIN on Solana. Small rooftop producers cannot easily prove how much clean energy they made. Certificate registries are built for big power plants: slow, paperwork-heavy, and buyers must trust the numbers. Double counting and bad meter data hurt trust in green claims. We wanted a proof that anyone can check.

The problem

  • Small producers (homes, schools, small businesses, energy communities) are mostly locked out of REC markets because verification is expensive.
  • Buyers cannot see the data behind a certificate, so greenwashing and double counting are hard to detect.
  • Meter data is often wrong: logging gaps, catch-up readings, gap-filled or copied days, output at night or above capacity. The real dataset above shows it is not a theoretical problem.

What it does

  1. Ingest hourly meter readings: a real public dataset, your own CSV (timestamp,kWh, parsed in the browser), or a clearly labeled synthetic demo with fraud injection.
  2. Audit with transparent, explainable checks:
    • Physics: no output while the sun is below the horizon at the site (solar-position formula), no output above capacity.
    • Learned baseline: for each hour of day, median and MAD learned from the site's own data; robust z > 4 is flagged. It catches plausible numbers at impossible hours.
    • Replay check: a day that repeats an earlier day to within 5 Wh every hour. Real weather never does that; copied or gap-filled days do.
    • Satellite cross-check: daily totals vs. output expected from PVGIS-SARAH2 satellite irradiance for the location, scaled by a site factor learned from the previous 12 months.
  3. Commit: each reading becomes a SHA-256 leaf (meter|timestamp|kWh); all leaves form one Merkle root.
  4. Anchor on Solana: a ~270-byte memo (meter, period, root, claimed and eligible kWh, REC count) is sent as a Memo-program transaction on Solana devnet, signed by the issuer key.
  5. Issue 1-MWh RECs with serial numbers from eligible energy only; the remainder carries forward.
  6. No double counting: the registry is the set of memos on-chain. A second certificate for an overlapping meter and period is refused, and the app links to the existing transaction.
  7. Verify: the app reads the memo back from the chain and compares it with the root recomputed from the data. Changing one reading by 0.5 kWh breaks it. A buyer can check one reading with a 10-hash Merkle proof instead of 720 readings. node tools/verify.js <signature> does the same check without our server.

Target users

  • Rooftop and community solar owners who want to prove and sell clean energy.
  • REC buyers and companies reporting renewable energy use who need evidence, not a PDF.
  • Registries, auditors, energy cooperatives and policymakers who need transparent renewable data.

How we built it

Plain HTML + JavaScript, no build step. audit.js (solar position, baseline, replay and satellite checks, Merkle tree) is shared by the browser and Node. Three Vercel serverless functions build and sign a Solana legacy transaction with Node's built-in Ed25519 and no SDK, send it to devnet, read memos back and serve the on-chain registry. Every call checks the devnet genesis hash first and refuses any other cluster. The issuer key is only in a Vercel secret. Datasets are rebuilt from the public sources by tools/build_opsd.py, and node --test (6 tests, no network) re-audits both real months blind and checks every number in the table above plus both on-chain Merkle roots. The CLI verifier checks the devnet genesis hash and the issuer signature before it compares roots. MIT license.

Scalability and adoption

  • One memo transaction per meter per period, whatever the number of readings: the Merkle root is 32 bytes. Our devnet transactions cost 5,000 lamports (0.000005 SOL) each in fees.
  • Inclusion proofs grow with log2 of the data: 10 hashes for 720 readings, about 20 for a million.
  • Works with any meter that exports hourly kWh (CSV or inverter API). No special hardware. The checks need only location and capacity.
  • The certificate fields (meter, period, root, kWh, serials) map to existing REC / I-REC style registries, so SunProof can sit in front of them as a data-quality and transparency layer instead of replacing them.

Challenges we ran into

  • Our first night rule used fixed clock hours and would have flagged real early-morning output in Germany. We replaced it with a solar-position calculation for the site.
  • The gap-filled days in the real data are not exact copies; they match to ±1 Wh. The replay check uses a 5 Wh tolerance, which caught them while flagging no measured hours in either month.
  • The public devnet faucet was rate-limited from our servers, so the issuer key was funded with devnet test SOL from our own devnet wallet.

Accomplishments that we're proud of

On real data, without using the publisher's flags: 96% of unmeasured energy caught and 0 false flags over 1,440 hours. Real Solana devnet transactions that anyone can verify against the public dataset with one command, and a test suite that reproduces every headline number from the committed public data.

What we learned

Simple physics and a replay check catch most of the problem before any blockchain step. A Merkle root makes tampering visible cheaply. Double counting is a registry rule, and a public chain makes that registry shared and checkable.

Limits (honest)

Devnet only (test tokens). The double-counting rule is enforced by the issuer service reading the chain, not yet by an on-chain program. The anomaly checks are transparent statistics and physics, not a deep model. OPSD does not publish exact household locations or panel capacities, so we use Konstanz city coordinates and a capacity limit derived from the data. Two real months were tested so far.

What's next

A Solana program that stores (meter, period) → root and rejects overlaps on-chain; tokenized RECs that buyers retire; inverter APIs and signed meters; more real sites and months; mainnet after a security review.

Environmental impact

Certificates are only worth something if the energy behind them is real. SunProof lets small producers prove clean energy cheaply, so rooftop solar pays back faster and more of it gets built. It also stops unmeasured or double-counted energy from becoming green claims, so corporate renewable reporting reflects real generation. On one real meter-month that meant 603 kWh of unverifiable energy (68% of the claim) was not certified.

About the maker

Vadym is a Solana School (Solana Foundation) Fall 2026 student (Aug 31 – Oct 16, 2026).

Data credits

Open Power System Data. 2020. Data Package Household Data, version 2020-04-15 (CoSSMic project), CC BY 4.0. PVGIS © European Union, JRC (PVGIS-SARAH2).

Built With

Share this project:

Updates

Submission history