⏱ Judges — verify it yourself in 60 seconds

  1. Open the live demo and click Verify ledger — the full hash chain, every CO2e figure and the credit invariants re-check in one pass.
  2. Run the tamper simulation — watch verification name the exact block that was altered.
  3. In Credits, try retiring more than a serial holds — the registry refuses. Then retire 100 t + 83.5 t and watch the dashboard flip to ✓ Neutral.
  4. In Claim checker, submit a "carbon neutral" claim — it fails with the exact shortfall (183.4 t) until the retirements cover it.
  5. Open the verified smart contract on Sepolia Etherscan (linked below) — the same double-counting rules enforced on-chain, with this ledger's head hash anchored in a public transaction.

CarbonProof AI is a tamper-evident CO2e ledger and carbon-credit registry for organizations that report emissions — and a claim checker for what they say about them. Emissions, credit issuances, and credit retirements are sealed into one SHA-256 hash chain, so any later edit is instantly detectable; verification also enforces the carbon market's core invariant — a credit can never be counted twice. The seeded ledger state is anchored to the Bitcoin blockchain via OpenTimestamps, and before a 'carbon neutral' press release ships, the claim checker cross-checks the words against the ledger's own numbers.

Inspiration

Emissions reporting runs on spreadsheets and trust. Records can be edited after the fact with no trace; totals are published as static PDFs; credits are claimed against serials nobody checks, so the same tonne can be counted twice; and marketing claims ('100% green', 'carbon neutral') are rarely backed by checkable evidence. The track's own problem statement names it: lack of transparency, double counting, and complex verification destroy credibility. Auditors, regulators, and buyers in carbon markets have no lightweight way to verify the data, the credits, or the claims.

What it does

Three tools, one hash chain: 1. A verifiable emissions ledger. Enter an activity (electricity, diesel, petrol, flight, waste) — or bulk-import a CSV — and it is converted to CO2e using a published, cited factor (India CEA grid factor; UK DESNZ 2024 for fuels, flights, waste), then sealed as a block: index, timestamp, previous hash, SHA-256 hash. Anyone can press Verify ledger and recompute the entire chain — a single edited digit anywhere in history is caught, with the exact block named. 2. A carbon-credit registry with a double-counting guard. Credits are issued under unique registry serials and retired against emissions, as blocks in the same chain. Verification enforces: a serial is issued only once; retirements must reference issued serials; cumulative retirements never exceed issuance. The dashboard shows the live net position — emissions minus retired credits. 3. An explainable claim checker. Paste a draft sustainability claim and get a 0–100 substantiation score from a transparent rule engine (quantities, Scope 1/2/3 boundary, baseline, methodology, checkable evidence; vague absolutes flagged with specific rewrites). For neutrality claims it cross-checks the ledger itself: if retired credits don't cover recorded emissions, the claim fails with the exact shortfall named. The seeded state — a full financial year for a mid-size retailer (65 emissions records, 483.4 t CO2e; 750 t of credits issued, 300 t retired) — is sealed in a public anchor record timestamped into the Bitcoin blockchain via OpenTimestamps. The proof file ships with the app and the repo; anyone can verify it independently at opentimestamps.org.

How we built it

Transparent CO2e math: factors live in one data file (src/data/emissionFactors.js), each labeled with its published source and scope; every ledger entry displays its own calculation: quantity × factor = kg CO2e. One chain, three block types: emissions, credit issuances, and credit retirements share a single hash chain, so one verification pass checks hashes, links, CO2e math, and credit invariants together. Tech: React, Vite, vanilla CSS, pure-JS SHA-256 implementation (FIPS 180-4, verified against known-answer test vectors), browser localStorage, OpenTimestamps protocol for Bitcoin anchoring. No backend, no login, no API keys — deployable as a static site anywhere (live demo on Vercel).

⛓ The registry, enforced by a smart contract

The credit registry is also enforced on-chain. CarbonRegistry is a Solidity smart contract deployed on the Ethereum Sepolia testnet, with its source verified (exact match) on Etherscan:

Contract: 0xEeDa0d764654798Fb25e3981Be236A75edCF0a8e https://sepolia.etherscan.io/address/0xEeDa0d764654798Fb25e3981Be236A75edCF0a8e

It enforces the carbon market's core anti-double-counting rules at network level, where no app operator can override them:

The contract is seeded with exactly the state in the demo — 750 t issued · 300 t retired · 450 t held — and is covered by a 13-test Hardhat suite, including the over-retirement refusal (retire 500 t against a 400 t batch and the contract says no). Source and tests are in the repo under contracts/, and the live app's Credits tab links straight to the verified contract.

Challenges we ran into

SHA-256 without dependencies: hashes had to work in any browser context, so SHA-256 is implemented in pure JS and validated against the standard test vectors (and sha256sum) before the ledger was built on it. Making 'blockchain' honest: a local hash chain alone can be rewritten by whoever holds the only copy — so the seeded state is anchored to Bitcoin via OpenTimestamps, and the docs state precisely what that does and doesn't prove; The smart-contract registry started as the next step on that roadmap — it has since shipped on Ethereum Sepolia (see the contract section above); what is still roadmap, like per-change anchoring, is labeled as roadmap, not features. Demoing tamper-evidence safely: the simulation had to be dramatic (fraud caught on screen) without ever corrupting the user's real records — solved by running it on a copy of the chain.

Accomplishments that we're proud of

A complete ledger + registry where verification is real cryptography and real market invariants, not a mock: edit anything, over-retire a credit, or invent a phantom serial, and verification fails with the exact block and reason. A seeded dataset at real organizational scale (483.4 t CO2e across a full year) whose head hash anyone can recompute from the public repo and check against a Bitcoin timestamp. A claim checker whose neutrality verdict is backed by arithmetic, not vibes: the stock '100% carbon neutral' claim fails the ledger cross-check by 183.4 t — until you retire the credits and watch it pass.

What's next for CarbonProof AI

  • Smart-contract registry: shipped — CarbonRegistry is live on Ethereum Sepolia with the double-counting guard enforced on-chain (see above). Next for the contract: anchor every state change (per-period Merkle roots), not only the genesis state, and a mainnet deployment.
  • Versioned, region-specific factor sets with the factor version sealed into each block; hash evidence documents (bills, meter photos) into blocks. Multi-user mode with entry/verifier roles; an optional LLM second pass on the claim checker, layered over the transparent rule score. Target users: SMEs and mid-size companies that must report emissions but can't afford enterprise carbon-accounting suites; sustainability consultants verifying client data; and buyers/verifiers in voluntary carbon markets who need cheap integrity checks. The hash-chain core is chain-agnostic and O(n) to verify; the same data model scales from a browser demo to a shared backend with on-chain issuance.

Track alignment

Track: Carbon Markets & Emissions Transparency. CarbonProof AI targets the Carbon Markets & Emissions Transparency track directly: it improves trust, transparency, and efficiency in carbon markets by (1) sealing emissions records in a tamper-evident hash chain anchored to Bitcoin via OpenTimestamps, (2) preventing double counting with a serial-based credit registry whose invariants are enforced by chain verification, and (3) cross-checking public carbon-neutrality claims against the ledger's own numbers before they ship.

Screenshots

The screenshots in the image gallery show: the registry refusing an over-retirement, verification catching a tampered block, and the claim checker passing after retirements.

Built With

Share this project:

Updates

Submission history