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.quantity
andrcv
are scalarsr.kind()
andblindBase
are EC pointsrcv
is random,blindBase
is 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
rcv
from all compliance units in the transaction: \(bsk = \sum{rcv}\). Note thatrcv
are 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
bvk
andbsk
,bvk = bsk * blindBase
since individual balances add to 0, which proves that:- the signer knows
rcv
used to compute compliance deltas - the transaction balances to 0 - otherwise,
bvk = bsk * blindBase
wouldn’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) |