Private Proof-of-Reserve CLI

Status – prototype / PoC ⚠️ Not production-ready.

A single-binary command-line tool that lets any Bitcoin holder prove privately that they control at least X satoshis—without revealing their address, UTXOs, or exact balance. A verifier only needs a fully-synced Bitcoin Core node.


How it works (high level)

Step Role What happens
1 Prover Connects to their own Bitcoin Core node (RPC) and fetches the current UTXOs for the address.
2 Creates Pedersen commitments to each UTXO value plus a blinding factor.
3 Computes a simple SHA-256 Merkle root of those commitments. (Prototype skips real inclusion proofs.)
4 Builds a Bulletproof on (Σ value − min) to prove the total balance is ≥ min sats without revealing the extra amount.
5 (future) Adds ZK proofs that each commitment is in the UTXO set and that the prover controls the keys.
6 Serialises everything to a portable JSON file (proof.json).
7 Verifier Loads the JSON, recomputes the Merkle root, parses the Bulletproof, checks the snapshot height, and (future) checks membership/ownership proofs.

Security note – Items marked future are essential for real security. The current PoC hides values but still reveals the commitment list, and it trusts the prover’s word about set membership & ownership.


Build instructions

# Clone & build an optimised binary
cargo build --release
# (Optional) copy to PATH
sudo install -m755 target/release/private_proof_of_reserve_cli /usr/local/bin/por

Running tests

cargo test

Running a local Bitcoin node

Add this to your bitcoin.conf (mainnet) and restart bitcoind:

server=1
rpcuser=alice
rpcpassword=supersecret
txindex=1        # required so listunspent sees every tx

For quick testing, spin up regtest:

bitcoind -regtest -txindex -daemon -rpcuser=alice -rpcpassword=secret
bitcoin-cli -regtest -generate 150   # mature some coinbase blocks

Usage

1 Generate a proof

por generate \
  --rpc-url  http://127.0.0.1:8332 \
  --rpc-user alice \
  --rpc-pass supersecret \
  --address  bc1qexample... \
  --min      10000000        # 0.1 BTC
  --height   840000          # snapshot reference
  --out      my_proof.json

Outputs my_proof.json with:

{
  "block_height": 840000,
  "utxo_root": "...",
  "commitments": ["..."],
  "range_proof": "BASE64...",
  "ownership_proofs": [],
  "min_amount": 10000000
}

2 Verify a proof

por verify \
  --proof    my_proof.json \
  --rpc-url  http://127.0.0.1:8332 \
  --rpc-user bob \
  --rpc-pass secret

If all checks pass you’ll see ✅ proof verified.


Design notes & roadmap

  • Snapshot at height – PoC uses the current UTXO set; production must freeze or attest to a deterministic snapshot (e.g. assumeUTXO + block hash).
  • Merkle inclusion proofs – each commitment needs a path to the UTXO-set root so the verifier can rebuild the same Merkle root independently.
  • Ownership proofs – Schnorr signatures inside or alongside the ZK circuit to prove control of the pubkeys that guard the UTXOs.
  • Full Bulletproof verification – currently we only parse the bytes; enable full verification once the commitment-diff scheme is finalised.
  • Base-64 engine – now uses engine::general_purpose for encoding and decoding.
  • Optional Halo 2 backend – design allows dropping in a different ZKP backend with Cargo --features halo2-backend later.

For a more detailed plan of upcoming work, see ROADMAP.md.


Directory layout

.
├── Cargo.toml
└── src
    └── main.rs   # single-binary CLI

License

MIT


Contact / contributions

PRs, issues, and discussions are welcome. Feel free to fork, experiment, and extend – especially around snapshotting, membership circuits, and audits.

S
Description
Private Proof Of Reserve Cli
Readme
31 MiB
0 Stars 1 Watchers 0 Forks
Languages
Rust 100%