zcash_proofs: `impl {SpendProver, OutputProver} for LocalTxProver`
This commit is contained in:
parent
296f75954b
commit
46903fabf5
|
@ -8,6 +8,8 @@ and this library adheres to Rust's notion of
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
### Added
|
### Added
|
||||||
- `zcash_proofs::{SpendParameters, OutputParameters}`
|
- `zcash_proofs::{SpendParameters, OutputParameters}`
|
||||||
|
- `impl zcash_primitives::sapling::prover::{SpendProver, OutputProver}` for
|
||||||
|
`zcash_proofs::prover::LocalTxProver`
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- The new `SpendParameters` and `OutputParameters` types are used in the
|
- The new `SpendParameters` and `OutputParameters` types are used in the
|
||||||
|
@ -110,7 +112,7 @@ and this library adheres to Rust's notion of
|
||||||
### Added
|
### Added
|
||||||
- `zcash_proofs::ZcashParameters`
|
- `zcash_proofs::ZcashParameters`
|
||||||
- `zcash_proofs::parse_parameters`
|
- `zcash_proofs::parse_parameters`
|
||||||
- `zcash_proofs::prover::LocalProver::from_bytes`
|
- `zcash_proofs::prover::LocalTxProver::from_bytes`
|
||||||
- The `zcash_proofs::constants` module, containing constants and helpers used by
|
- The `zcash_proofs::constants` module, containing constants and helpers used by
|
||||||
the `zcash_proofs::circuit::ecc::fixed_base_multiplication` gadget:
|
the `zcash_proofs::circuit::ecc::fixed_base_multiplication` gadget:
|
||||||
- The `FixedGeneratorOwned` type alias.
|
- The `FixedGeneratorOwned` type alias.
|
||||||
|
|
|
@ -1,16 +1,17 @@
|
||||||
//! Abstractions over the proving system and parameters for ease of use.
|
//! Abstractions over the proving system and parameters for ease of use.
|
||||||
|
|
||||||
use bellman::groth16::PreparedVerifyingKey;
|
use bellman::groth16::{PreparedVerifyingKey, Proof};
|
||||||
use bls12_381::Bls12;
|
use bls12_381::Bls12;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use zcash_primitives::{
|
use zcash_primitives::{
|
||||||
sapling::{
|
sapling::{
|
||||||
prover::TxProver,
|
self,
|
||||||
|
prover::{OutputProver, SpendProver, TxProver},
|
||||||
redjubjub::{PublicKey, Signature},
|
redjubjub::{PublicKey, Signature},
|
||||||
value::ValueCommitment,
|
value::{NoteValue, ValueCommitTrapdoor, ValueCommitment},
|
||||||
Diversifier, MerklePath, PaymentAddress, ProofGenerationKey, Rseed,
|
Diversifier, MerklePath, PaymentAddress, ProofGenerationKey, Rseed,
|
||||||
},
|
},
|
||||||
transaction::components::{Amount, GROTH_PROOF_SIZE},
|
transaction::components::{sapling::GrothProofBytes, Amount, GROTH_PROOF_SIZE},
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
@ -143,6 +144,78 @@ impl LocalTxProver {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl SpendProver for LocalTxProver {
|
||||||
|
type Proof = Proof<Bls12>;
|
||||||
|
|
||||||
|
fn prepare_circuit(
|
||||||
|
proof_generation_key: ProofGenerationKey,
|
||||||
|
diversifier: Diversifier,
|
||||||
|
rseed: Rseed,
|
||||||
|
value: NoteValue,
|
||||||
|
alpha: jubjub::Fr,
|
||||||
|
rcv: ValueCommitTrapdoor,
|
||||||
|
anchor: bls12_381::Scalar,
|
||||||
|
merkle_path: MerklePath,
|
||||||
|
) -> Option<sapling::circuit::Spend> {
|
||||||
|
SpendParameters::prepare_circuit(
|
||||||
|
proof_generation_key,
|
||||||
|
diversifier,
|
||||||
|
rseed,
|
||||||
|
value,
|
||||||
|
alpha,
|
||||||
|
rcv,
|
||||||
|
anchor,
|
||||||
|
merkle_path,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_proof<R: rand_core::RngCore>(
|
||||||
|
&self,
|
||||||
|
circuit: sapling::circuit::Spend,
|
||||||
|
rng: &mut R,
|
||||||
|
) -> Self::Proof {
|
||||||
|
self.spend_params.create_proof(circuit, rng)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn encode_proof(proof: Self::Proof) -> GrothProofBytes {
|
||||||
|
let mut zkproof = [0u8; GROTH_PROOF_SIZE];
|
||||||
|
proof
|
||||||
|
.write(&mut zkproof[..])
|
||||||
|
.expect("should be able to serialize a proof");
|
||||||
|
zkproof
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl OutputProver for LocalTxProver {
|
||||||
|
type Proof = Proof<Bls12>;
|
||||||
|
|
||||||
|
fn prepare_circuit(
|
||||||
|
esk: jubjub::Fr,
|
||||||
|
payment_address: PaymentAddress,
|
||||||
|
rcm: jubjub::Fr,
|
||||||
|
value: NoteValue,
|
||||||
|
rcv: ValueCommitTrapdoor,
|
||||||
|
) -> sapling::circuit::Output {
|
||||||
|
OutputParameters::prepare_circuit(esk, payment_address, rcm, value, rcv)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_proof<R: rand_core::RngCore>(
|
||||||
|
&self,
|
||||||
|
circuit: sapling::circuit::Output,
|
||||||
|
rng: &mut R,
|
||||||
|
) -> Self::Proof {
|
||||||
|
self.output_params.create_proof(circuit, rng)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn encode_proof(proof: Self::Proof) -> GrothProofBytes {
|
||||||
|
let mut zkproof = [0u8; GROTH_PROOF_SIZE];
|
||||||
|
proof
|
||||||
|
.write(&mut zkproof[..])
|
||||||
|
.expect("should be able to serialize a proof");
|
||||||
|
zkproof
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl TxProver for LocalTxProver {
|
impl TxProver for LocalTxProver {
|
||||||
type SaplingProvingContext = SaplingProvingContext;
|
type SaplingProvingContext = SaplingProvingContext;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue