Value Commitments & Binding Signature
A private transaction must balance: total input value = total output value + net public flow. Platus proves this without revealing any amount, using Pedersen value commitments and one aggregate binding signature per bundle.
The value commitment
Each 2-in/2-out Action carries a single net value commitment over two independent BabyJubJub generators:
G = BASE8: the prime-order subgroup generator.H = VALUE_H: the value base, derived nothing-up-my-sleeve fromPoseidon2("platus.value_commit.h.v1").rcv: a fresh per-Action blinding scalar.
Only cv_net's (x, y) are public (in the ActionOp); they reveal nothing without v_old, v_new, and rcv.
The binding signature
The binding signature proves the whole bundle balances against its declared netPublicValue, without revealing any blinding factor. Define:
By linearity of Pedersen commitments:
If — and only if — the bundle balances does the H term vanish, leaving bvk = bsk·G. So bvk is a public key whose secret is bsk; a valid Schnorr signature over the bundle digest proves knowledge of that secret. An unbalanced bundle leaves a non-zero H component whose discrete log is unknown, and no signature can be forged.
Sign convention and the two forms
The Schnorr equation verified on-chain is s·G == R + e·bvk, with the challenge