Delta Proving System¶
Delta proving system is instantiated with a binding signature. The design of it is based on Zcash binding signature (Zcash Specification, section 4.13), but we extend it to support multiple resource kinds. In binding signature design, the correctness of the balance is proven by the ability to generate the correct signing and verifying keys, the signed message itself plays a secondary role.
Binding signature¶
Computing delta in compliance units¶
Each compliance unit takes one input and one output resource, the compliance unit delta is computed as: complianceDelta = inputResource.delta() - outputResource.delta(). Resource delta is computed as r.delta() = PedersenCommit(r.quantity, r.kind(), rcv) = r.quantity * r.kind() + rcv * blindBase
where:
*is a scalar multiplication EC operationr.quantityandrcvare scalarsr.kind()andblindBaseare EC pointsrcvis random,blindBaseis fixed
Computing compliance delta from resource deltas is equivalent to computing compliance delta from resource object components directly (i.e., skipping the individual resource delta computation). In practice, we do not compute individual resource deltas. Instead, we compute compliance delta as: complianceDelta = inputResource.quantity * inputResource.kind() - outputResource.quantity * outputResource.kind() + rcv * blindBase
The mechanism (single kind)¶
- Binding signature signing key is computed by adding commitment randomness
rcvfrom all compliance units in the transaction: \(bsk = \sum{rcv}\). Note thatrcvare secret values. - Verifying key is computed by adding compliance unit deltas together: \(bvk=\sum{\delta_{compliance}}\). Note that \(\delta_{compliance}\) are public values - anyone can compute binding signature verifying key. -
For correctly computed
bvkandbsk,bvk = bsk * blindBasesince individual balances add to 0, which proves that:- the signer knows
rcvused to compute compliance deltas - the transaction balances to 0 - otherwise,
bvk = bsk * blindBasewouldn’t be true and the signature wouldn’t verify
- the signer knows
Extending to multiple kinds¶
Because of how elliptic curves work (kind distinctness holds), having multiple kinds in the same binding signature is equivalent to having multiple binding signatures per each kind. Note that it is all possible because we expect everything balance to 0.
Instantiation¶
| Parameter | Instantiation |
|---|---|
| Signature scheme | ECDSA |
| Elliptic curve | k256 |
| Hash function | Keccak256 |
| Signed message | Tags of resources included in the transaction |
| Prove() | ECDSA.sign(pk, keccak256(message)) |
| Verify() | ECDSA.verify(vk, proof) |