Automatically download and load sprout parameters (#3085)
* Download and load Sprout parameters using zcash_proofs Also update some librustzcash dependencies, to avoid duplicate dependencies. * Update upstream orchard to avoid a compilation error * Skip librustzcash batch refactor for now, to avoid compilation errors * Change the cache ID, so we actually cache Sprout * Move existing file checks into zcash_proofs * Add a 1 hour timeout to parameter file downloads * Give other tasks priority, before spawning the download task * Update to the latest version of our modified librustzcash fork * Change the cache key for Sprout * Add 40 minutes to CI timeouts for occasional sprout downloads * Update to zcash_proofs with split downloads * Check file sizes to help debug parameter load failures in zcash_proofs * Start the second download once the first has finished in zcash_proofs * Document the parameter download task * Stop hashing existing files twice
This commit is contained in:
parent
a61eae0065
commit
0ef4629232
|
|
@ -11,8 +11,10 @@ jobs:
|
||||||
|
|
||||||
test:
|
test:
|
||||||
name: Test (+${{ matrix.rust }}) on ${{ matrix.os }}
|
name: Test (+${{ matrix.rust }}) on ${{ matrix.os }}
|
||||||
# The large timeout is to accommodate Windows builds
|
# The large timeout is to accommodate:
|
||||||
timeout-minutes: 75
|
# - Windows builds (75 minutes, typically 30-50 minutes)
|
||||||
|
# - parameter downloads (40 minutes, but only when the cache expires)
|
||||||
|
timeout-minutes: 115
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
|
|
@ -87,7 +89,7 @@ jobs:
|
||||||
uses: actions/cache@v2
|
uses: actions/cache@v2
|
||||||
with:
|
with:
|
||||||
path: ${{ env.ZCASH_PARAMS }}
|
path: ${{ env.ZCASH_PARAMS }}
|
||||||
key: ${{ runner.os }}-params
|
key: ${{ runner.os }}-sprout-and-sapling-params
|
||||||
- name: Fetch Zcash parameters
|
- name: Fetch Zcash parameters
|
||||||
if: steps.cache-params.outputs.cache-hit != 'true'
|
if: steps.cache-params.outputs.cache-hit != 'true'
|
||||||
working-directory: ./zebra-consensus
|
working-directory: ./zebra-consensus
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,10 @@ jobs:
|
||||||
|
|
||||||
coverage:
|
coverage:
|
||||||
name: Coverage (+nightly)
|
name: Coverage (+nightly)
|
||||||
# The large timeout is to accommodate nightly builds
|
# The large timeout is to accommodate:
|
||||||
timeout-minutes: 60
|
# - nightly builds (75 minutes, typically 30-50 minutes)
|
||||||
|
# - parameter downloads (40 minutes, but only when the cache expires)
|
||||||
|
timeout-minutes: 115
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
env:
|
||||||
CARGO_INCREMENTAL: 0
|
CARGO_INCREMENTAL: 0
|
||||||
|
|
@ -62,7 +64,7 @@ jobs:
|
||||||
uses: actions/cache@v2
|
uses: actions/cache@v2
|
||||||
with:
|
with:
|
||||||
path: ${{ env.ZCASH_PARAMS }}
|
path: ${{ env.ZCASH_PARAMS }}
|
||||||
key: ${{ runner.os }}-params
|
key: ${{ runner.os }}-sprout-and-sapling-params
|
||||||
- name: Fetch Zcash parameters
|
- name: Fetch Zcash parameters
|
||||||
if: steps.cache-params.outputs.cache-hit != 'true'
|
if: steps.cache-params.outputs.cache-hit != 'true'
|
||||||
working-directory: ./zebra-consensus
|
working-directory: ./zebra-consensus
|
||||||
|
|
|
||||||
|
|
@ -1086,7 +1086,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "equihash"
|
name = "equihash"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/zcash/librustzcash.git?rev=53d0a51d33a421cb76d3e3124d1e4c1c9036068e#53d0a51d33a421cb76d3e3124d1e4c1c9036068e"
|
source = "git+https://github.com/ZcashFoundation/librustzcash.git?rev=dea8d97d5ed09bdb6673cb64d0a63706f71c2f61#dea8d97d5ed09bdb6673cb64d0a63706f71c2f61"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"blake2b_simd",
|
"blake2b_simd",
|
||||||
"byteorder",
|
"byteorder",
|
||||||
|
|
@ -4181,7 +4181,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zcash_encoding"
|
name = "zcash_encoding"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
source = "git+https://github.com/zcash/librustzcash.git?rev=53d0a51d33a421cb76d3e3124d1e4c1c9036068e#53d0a51d33a421cb76d3e3124d1e4c1c9036068e"
|
source = "git+https://github.com/ZcashFoundation/librustzcash.git?rev=dea8d97d5ed09bdb6673cb64d0a63706f71c2f61#dea8d97d5ed09bdb6673cb64d0a63706f71c2f61"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"byteorder",
|
"byteorder",
|
||||||
"nonempty",
|
"nonempty",
|
||||||
|
|
@ -4190,7 +4190,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zcash_history"
|
name = "zcash_history"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
source = "git+https://github.com/zcash/librustzcash.git?rev=53d0a51d33a421cb76d3e3124d1e4c1c9036068e#53d0a51d33a421cb76d3e3124d1e4c1c9036068e"
|
source = "git+https://github.com/ZcashFoundation/librustzcash.git?rev=dea8d97d5ed09bdb6673cb64d0a63706f71c2f61#dea8d97d5ed09bdb6673cb64d0a63706f71c2f61"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bigint",
|
"bigint",
|
||||||
"blake2b_simd",
|
"blake2b_simd",
|
||||||
|
|
@ -4200,7 +4200,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zcash_note_encryption"
|
name = "zcash_note_encryption"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
source = "git+https://github.com/zcash/librustzcash.git?rev=53d0a51d33a421cb76d3e3124d1e4c1c9036068e#53d0a51d33a421cb76d3e3124d1e4c1c9036068e"
|
source = "git+https://github.com/ZcashFoundation/librustzcash.git?rev=dea8d97d5ed09bdb6673cb64d0a63706f71c2f61#dea8d97d5ed09bdb6673cb64d0a63706f71c2f61"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"blake2b_simd",
|
"blake2b_simd",
|
||||||
"byteorder",
|
"byteorder",
|
||||||
|
|
@ -4215,7 +4215,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zcash_primitives"
|
name = "zcash_primitives"
|
||||||
version = "0.5.0"
|
version = "0.5.0"
|
||||||
source = "git+https://github.com/zcash/librustzcash.git?rev=53d0a51d33a421cb76d3e3124d1e4c1c9036068e#53d0a51d33a421cb76d3e3124d1e4c1c9036068e"
|
source = "git+https://github.com/ZcashFoundation/librustzcash.git?rev=dea8d97d5ed09bdb6673cb64d0a63706f71c2f61#dea8d97d5ed09bdb6673cb64d0a63706f71c2f61"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aes",
|
"aes",
|
||||||
"bip0039",
|
"bip0039",
|
||||||
|
|
@ -4249,7 +4249,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zcash_proofs"
|
name = "zcash_proofs"
|
||||||
version = "0.5.0"
|
version = "0.5.0"
|
||||||
source = "git+https://github.com/zcash/librustzcash.git?rev=53d0a51d33a421cb76d3e3124d1e4c1c9036068e#53d0a51d33a421cb76d3e3124d1e4c1c9036068e"
|
source = "git+https://github.com/ZcashFoundation/librustzcash.git?rev=dea8d97d5ed09bdb6673cb64d0a63706f71c2f61#dea8d97d5ed09bdb6673cb64d0a63706f71c2f61"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bellman",
|
"bellman",
|
||||||
"blake2b_simd",
|
"blake2b_simd",
|
||||||
|
|
|
||||||
28
Cargo.toml
28
Cargo.toml
|
|
@ -22,11 +22,21 @@ panic = "abort"
|
||||||
|
|
||||||
[patch.crates-io]
|
[patch.crates-io]
|
||||||
|
|
||||||
# TODO: replace with upstream orchard when these changes are merged
|
# TODO: replace with upstream orchard (#3056)
|
||||||
# https://github.com/ZcashFoundation/zebra/issues/3056
|
|
||||||
orchard = { git = "https://github.com/ZcashFoundation/orchard.git", rev = "568e24cd5f129158375d7ac7d98c89ebff4f982f" }
|
orchard = { git = "https://github.com/ZcashFoundation/orchard.git", rev = "568e24cd5f129158375d7ac7d98c89ebff4f982f" }
|
||||||
|
|
||||||
# TODO: remove these after a new librustzcash release.
|
# TODO: replace with upstream librustzcash when these changes are merged (#3037)
|
||||||
|
#
|
||||||
|
# This zcash_proofs patch doesn't work, maybe because of features?
|
||||||
|
#zcash_proofs = { git = "https://github.com/ZcashFoundation/librustzcash.git", rev = "dea8d97d5ed09bdb6673cb64d0a63706f71c2f61" }
|
||||||
|
|
||||||
|
# Use the ZcashFoundation fork where possible, to avoid duplicate dependencies
|
||||||
|
equihash = { git = "https://github.com/ZcashFoundation/librustzcash.git", rev = "dea8d97d5ed09bdb6673cb64d0a63706f71c2f61" }
|
||||||
|
zcash_note_encryption = { git = "https://github.com/ZcashFoundation/librustzcash.git", rev = "dea8d97d5ed09bdb6673cb64d0a63706f71c2f61" }
|
||||||
|
zcash_primitives = { git = "https://github.com/ZcashFoundation/librustzcash.git", rev = "dea8d97d5ed09bdb6673cb64d0a63706f71c2f61" }
|
||||||
|
zcash_history = { git = "https://github.com/ZcashFoundation/librustzcash.git", rev = "dea8d97d5ed09bdb6673cb64d0a63706f71c2f61" }
|
||||||
|
|
||||||
|
# TODO: remove these after a new librustzcash release (#2982)
|
||||||
|
|
||||||
# These are librustzcash git requirements specified in its workspace Cargo.toml,
|
# These are librustzcash git requirements specified in its workspace Cargo.toml,
|
||||||
# that we must replicate here
|
# that we must replicate here
|
||||||
|
|
@ -34,13 +44,15 @@ incrementalmerkletree = { git = "https://github.com/zcash/incrementalmerkletree.
|
||||||
# Replaced by the ZcashFoundation fork above
|
# Replaced by the ZcashFoundation fork above
|
||||||
#orchard = { git = "https://github.com/zcash/orchard.git", rev = "2c8241f25b943aa05203eacf9905db117c69bd29" }
|
#orchard = { git = "https://github.com/zcash/orchard.git", rev = "2c8241f25b943aa05203eacf9905db117c69bd29" }
|
||||||
|
|
||||||
|
# Replaced by the ZcashFoundation fork above
|
||||||
|
|
||||||
# These are librustzcash file requirements specified in its workspace Cargo.toml,
|
# These are librustzcash file requirements specified in its workspace Cargo.toml,
|
||||||
# that we must replace with git requirements
|
# that we must replace with git requirements
|
||||||
zcash_note_encryption = { git = "https://github.com/zcash/librustzcash.git", rev = "53d0a51d33a421cb76d3e3124d1e4c1c9036068e" }
|
#zcash_note_encryption = { git = "https://github.com/zcash/librustzcash.git", rev = "53d0a51d33a421cb76d3e3124d1e4c1c9036068e" }
|
||||||
|
|
||||||
# These patches are not strictly required,
|
# These patches are not strictly required,
|
||||||
# but they help avoid duplicate dependencies
|
# but they help avoid duplicate dependencies
|
||||||
equihash = { git = "https://github.com/zcash/librustzcash.git", rev = "53d0a51d33a421cb76d3e3124d1e4c1c9036068e" }
|
#equihash = { git = "https://github.com/zcash/librustzcash.git", rev = "53d0a51d33a421cb76d3e3124d1e4c1c9036068e" }
|
||||||
zcash_history = { git = "https://github.com/zcash/librustzcash.git", rev = "53d0a51d33a421cb76d3e3124d1e4c1c9036068e" }
|
#zcash_history = { git = "https://github.com/zcash/librustzcash.git", rev = "53d0a51d33a421cb76d3e3124d1e4c1c9036068e" }
|
||||||
zcash_primitives = { git = "https://github.com/zcash/librustzcash.git", rev = "53d0a51d33a421cb76d3e3124d1e4c1c9036068e" }
|
#zcash_primitives = { git = "https://github.com/zcash/librustzcash.git", rev = "53d0a51d33a421cb76d3e3124d1e4c1c9036068e" }
|
||||||
zcash_proofs = { git = "https://github.com/zcash/librustzcash.git", rev = "53d0a51d33a421cb76d3e3124d1e4c1c9036068e" }
|
#zcash_proofs = { git = "https://github.com/zcash/librustzcash.git", rev = "53d0a51d33a421cb76d3e3124d1e4c1c9036068e" }
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,6 @@ hex = "0.4"
|
||||||
incrementalmerkletree = "0.1.0"
|
incrementalmerkletree = "0.1.0"
|
||||||
jubjub = "0.8.0"
|
jubjub = "0.8.0"
|
||||||
lazy_static = "1.4.0"
|
lazy_static = "1.4.0"
|
||||||
orchard = "0.0"
|
|
||||||
rand_core = "0.6"
|
rand_core = "0.6"
|
||||||
ripemd160 = "0.9"
|
ripemd160 = "0.9"
|
||||||
secp256k1 = { version = "0.20.3", features = ["serde"] }
|
secp256k1 = { version = "0.20.3", features = ["serde"] }
|
||||||
|
|
@ -45,9 +44,15 @@ subtle = "2.4"
|
||||||
thiserror = "1"
|
thiserror = "1"
|
||||||
uint = "0.9.1"
|
uint = "0.9.1"
|
||||||
x25519-dalek = { version = "1.2.0", features = ["serde"] }
|
x25519-dalek = { version = "1.2.0", features = ["serde"] }
|
||||||
zcash_history = { git = "https://github.com/zcash/librustzcash.git", rev = "53d0a51d33a421cb76d3e3124d1e4c1c9036068e" }
|
|
||||||
zcash_primitives = { git = "https://github.com/zcash/librustzcash.git", rev = "53d0a51d33a421cb76d3e3124d1e4c1c9036068e" }
|
# TODO: replace with upstream orchard (#3056)
|
||||||
zcash_note_encryption = { git = "https://github.com/zcash/librustzcash.git", rev = "53d0a51d33a421cb76d3e3124d1e4c1c9036068e" }
|
orchard = { git = "https://github.com/ZcashFoundation/orchard.git", rev = "568e24cd5f129158375d7ac7d98c89ebff4f982f" }
|
||||||
|
|
||||||
|
# TODO: replace with upstream librustzcash when these changes are merged (#3037)
|
||||||
|
equihash = { git = "https://github.com/ZcashFoundation/librustzcash.git", rev = "dea8d97d5ed09bdb6673cb64d0a63706f71c2f61" }
|
||||||
|
zcash_note_encryption = { git = "https://github.com/ZcashFoundation/librustzcash.git", rev = "dea8d97d5ed09bdb6673cb64d0a63706f71c2f61" }
|
||||||
|
zcash_primitives = { git = "https://github.com/ZcashFoundation/librustzcash.git", rev = "dea8d97d5ed09bdb6673cb64d0a63706f71c2f61" }
|
||||||
|
zcash_history = { git = "https://github.com/ZcashFoundation/librustzcash.git", rev = "dea8d97d5ed09bdb6673cb64d0a63706f71c2f61" }
|
||||||
|
|
||||||
proptest = { version = "0.10", optional = true }
|
proptest = { version = "0.10", optional = true }
|
||||||
proptest-derive = { version = "0.3.0", optional = true }
|
proptest-derive = { version = "0.3.0", optional = true }
|
||||||
|
|
@ -57,7 +62,6 @@ rand_chacha = { version = "0.3", optional = true }
|
||||||
|
|
||||||
# ZF deps
|
# ZF deps
|
||||||
ed25519-zebra = "3.0.0"
|
ed25519-zebra = "3.0.0"
|
||||||
equihash = "0.1"
|
|
||||||
# TODO: Update to 0.5 release when published
|
# TODO: Update to 0.5 release when published
|
||||||
redjubjub = { git = "https://github.com/ZcashFoundation/redjubjub.git", rev = "f772176560b0b7daf25eff2460e08dc127ac8407" }
|
redjubjub = { git = "https://github.com/ZcashFoundation/redjubjub.git", rev = "f772176560b0b7daf25eff2460e08dc127ac8407" }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,9 +17,6 @@ jubjub = "0.8.0"
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
|
|
||||||
halo2 = "=0.1.0-beta.1"
|
halo2 = "=0.1.0-beta.1"
|
||||||
# TODO: replace with upstream orchard when these changes are merged
|
|
||||||
# https://github.com/ZcashFoundation/zebra/issues/3056
|
|
||||||
orchard = "0.0.0"
|
|
||||||
|
|
||||||
chrono = "0.4.19"
|
chrono = "0.4.19"
|
||||||
dirs = "4.0.0"
|
dirs = "4.0.0"
|
||||||
|
|
@ -37,7 +34,11 @@ tower = { version = "0.4.11", features = ["timeout", "util", "buffer"] }
|
||||||
tracing = "0.1.29"
|
tracing = "0.1.29"
|
||||||
tracing-futures = "0.2.5"
|
tracing-futures = "0.2.5"
|
||||||
|
|
||||||
zcash_proofs = { git = "https://github.com/zcash/librustzcash.git", rev = "53d0a51d33a421cb76d3e3124d1e4c1c9036068e", features = ["local-prover", "multicore", "download-params"] }
|
# TODO: replace with upstream orchard (#3056)
|
||||||
|
orchard = { git = "https://github.com/ZcashFoundation/orchard.git", rev = "568e24cd5f129158375d7ac7d98c89ebff4f982f" }
|
||||||
|
|
||||||
|
# TODO: replace with upstream librustzcash when these changes are merged (#3037)
|
||||||
|
zcash_proofs = { git = "https://github.com/ZcashFoundation/librustzcash.git", rev = "dea8d97d5ed09bdb6673cb64d0a63706f71c2f61", features = ["local-prover", "multicore", "download-params"] }
|
||||||
|
|
||||||
tower-fallback = { path = "../tower-fallback/" }
|
tower-fallback = { path = "../tower-fallback/" }
|
||||||
tower-batch = { path = "../tower-batch/" }
|
tower-batch = { path = "../tower-batch/" }
|
||||||
|
|
|
||||||
|
|
@ -198,11 +198,13 @@ where
|
||||||
S::Future: Send + 'static,
|
S::Future: Send + 'static,
|
||||||
{
|
{
|
||||||
// Pre-download Groth16 parameters in a separate thread.
|
// Pre-download Groth16 parameters in a separate thread.
|
||||||
// This thread must be launched first, so the download doesn't happen on the startup thread.
|
|
||||||
|
|
||||||
|
// Give other tasks priority, before spawning the download task.
|
||||||
|
tokio::task::yield_now().await;
|
||||||
|
|
||||||
|
// The parameter download thread must be launched before initializing any verifiers.
|
||||||
|
// Otherwise, the download might happen on the startup thread.
|
||||||
let groth16_download_handle = spawn_blocking(|| {
|
let groth16_download_handle = spawn_blocking(|| {
|
||||||
tracing::info!("checking if Zcash Sapling and Sprout parameters have been downloaded");
|
|
||||||
|
|
||||||
// The lazy static initializer does the download, if needed,
|
// The lazy static initializer does the download, if needed,
|
||||||
// and the file hash checks.
|
// and the file hash checks.
|
||||||
lazy_static::initialize(&crate::groth16::GROTH16_PARAMETERS);
|
lazy_static::initialize(&crate::groth16::GROTH16_PARAMETERS);
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,13 @@ use std::path::PathBuf;
|
||||||
use bellman::groth16;
|
use bellman::groth16;
|
||||||
use bls12_381::Bls12;
|
use bls12_381::Bls12;
|
||||||
|
|
||||||
|
/// The timeout for each parameter file download, in seconds.
|
||||||
|
///
|
||||||
|
/// Zebra assumes that it's running on at least a 10 Mbps connection.
|
||||||
|
/// So the parameter files should download in about 15 minutes using `zebrad download`.
|
||||||
|
/// But `zebrad start` downloads blocks at the same time, so we allow some extra time.
|
||||||
|
pub const PARAMETER_DOWNLOAD_TIMEOUT: u64 = 60 * 60;
|
||||||
|
|
||||||
lazy_static::lazy_static! {
|
lazy_static::lazy_static! {
|
||||||
/// Groth16 Zero-Knowledge Proof parameters for the Sapling and Sprout circuits.
|
/// Groth16 Zero-Knowledge Proof parameters for the Sapling and Sprout circuits.
|
||||||
///
|
///
|
||||||
|
|
@ -20,10 +27,28 @@ lazy_static::lazy_static! {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Groth16 Zero-Knowledge Proof parameters for the Sapling and Sprout circuits.
|
/// Groth16 Zero-Knowledge Proof parameters for the Sapling and Sprout circuits.
|
||||||
#[non_exhaustive]
|
|
||||||
pub struct Groth16Parameters {
|
pub struct Groth16Parameters {
|
||||||
/// The Sapling circuit Groth16 parameters.
|
/// The Sapling circuit Groth16 parameters.
|
||||||
pub sapling: SaplingParameters,
|
pub sapling: SaplingParameters,
|
||||||
|
|
||||||
|
/// The Sprout circuit Groth16 spend parameter.
|
||||||
|
pub sprout: SproutParameters,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Groth16 Zero-Knowledge Proof spend and output parameters for the Sapling circuit.
|
||||||
|
pub struct SaplingParameters {
|
||||||
|
pub spend: groth16::Parameters<Bls12>,
|
||||||
|
pub spend_prepared_verifying_key: groth16::PreparedVerifyingKey<Bls12>,
|
||||||
|
|
||||||
|
pub output: groth16::Parameters<Bls12>,
|
||||||
|
pub output_prepared_verifying_key: groth16::PreparedVerifyingKey<Bls12>,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Groth16 Zero-Knowledge Proof spend parameters for the Sprout circuit.
|
||||||
|
///
|
||||||
|
/// New Sprout outputs were disabled by the Canopy network upgrade.
|
||||||
|
pub struct SproutParameters {
|
||||||
|
pub spend_prepared_verifying_key: groth16::PreparedVerifyingKey<Bls12>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Groth16Parameters {
|
impl Groth16Parameters {
|
||||||
|
|
@ -33,9 +58,64 @@ impl Groth16Parameters {
|
||||||
///
|
///
|
||||||
/// If the downloaded or pre-existing parameter files are invalid.
|
/// If the downloaded or pre-existing parameter files are invalid.
|
||||||
fn new() -> Groth16Parameters {
|
fn new() -> Groth16Parameters {
|
||||||
Groth16Parameters {
|
let params_directory = Groth16Parameters::directory();
|
||||||
sapling: SaplingParameters::new(),
|
let sapling_spend_path = params_directory.join(zcash_proofs::SAPLING_SPEND_NAME);
|
||||||
|
let sapling_output_path = params_directory.join(zcash_proofs::SAPLING_OUTPUT_NAME);
|
||||||
|
let sprout_path = params_directory.join(zcash_proofs::SPROUT_NAME);
|
||||||
|
|
||||||
|
// TODO: instead of the path check, add a zcash_proofs argument to skip hashing existing files
|
||||||
|
// (we check them on load anyway)
|
||||||
|
if !sapling_spend_path.exists() || !sapling_output_path.exists() {
|
||||||
|
tracing::info!("downloading Zcash Sapling parameters");
|
||||||
|
let new_sapling_paths =
|
||||||
|
zcash_proofs::download_sapling_parameters(Some(PARAMETER_DOWNLOAD_TIMEOUT))
|
||||||
|
.unwrap_or_else(|error| {
|
||||||
|
panic!(
|
||||||
|
"error downloading Sapling parameter files: {:?}. {}",
|
||||||
|
error,
|
||||||
|
Groth16Parameters::failure_hint()
|
||||||
|
)
|
||||||
|
});
|
||||||
|
assert_eq!(sapling_spend_path, new_sapling_paths.spend);
|
||||||
|
assert_eq!(sapling_output_path, new_sapling_paths.output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !sprout_path.exists() {
|
||||||
|
tracing::info!("downloading Zcash Sprout parameters");
|
||||||
|
let new_sprout_path =
|
||||||
|
zcash_proofs::download_sprout_parameters(Some(PARAMETER_DOWNLOAD_TIMEOUT))
|
||||||
|
.unwrap_or_else(|error| {
|
||||||
|
panic!(
|
||||||
|
"error downloading Sprout parameter files: {:?}. {}",
|
||||||
|
error,
|
||||||
|
Groth16Parameters::failure_hint()
|
||||||
|
)
|
||||||
|
});
|
||||||
|
assert_eq!(sprout_path, new_sprout_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: if loading fails, log a message including `failure_hint`
|
||||||
|
tracing::info!("checking and loading Zcash Sapling and Sprout parameters");
|
||||||
|
let parameters = zcash_proofs::load_parameters(
|
||||||
|
&sapling_spend_path,
|
||||||
|
&sapling_output_path,
|
||||||
|
Some(&sprout_path),
|
||||||
|
);
|
||||||
|
|
||||||
|
let sapling = SaplingParameters {
|
||||||
|
spend: parameters.spend_params,
|
||||||
|
spend_prepared_verifying_key: parameters.spend_vk,
|
||||||
|
output: parameters.output_params,
|
||||||
|
output_prepared_verifying_key: parameters.output_vk,
|
||||||
|
};
|
||||||
|
|
||||||
|
let sprout = SproutParameters {
|
||||||
|
spend_prepared_verifying_key: parameters
|
||||||
|
.sprout_vk
|
||||||
|
.expect("unreachable code: sprout loader panics on failure"),
|
||||||
|
};
|
||||||
|
|
||||||
|
Groth16Parameters { sapling, sprout }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the path to the Groth16 parameters directory.
|
/// Returns the path to the Groth16 parameters directory.
|
||||||
|
|
@ -51,52 +131,3 @@ impl Groth16Parameters {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Groth16 Zero-Knowledge Proof spend and output parameters for the Sapling circuit.
|
|
||||||
#[non_exhaustive]
|
|
||||||
pub struct SaplingParameters {
|
|
||||||
pub spend: groth16::Parameters<Bls12>,
|
|
||||||
pub spend_prepared_verifying_key: groth16::PreparedVerifyingKey<Bls12>,
|
|
||||||
|
|
||||||
pub output: groth16::Parameters<Bls12>,
|
|
||||||
pub output_prepared_verifying_key: groth16::PreparedVerifyingKey<Bls12>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl SaplingParameters {
|
|
||||||
/// Download if needed, cache, check, and load the Sapling Groth16 parameters.
|
|
||||||
///
|
|
||||||
/// # Panics
|
|
||||||
///
|
|
||||||
/// If the downloaded or pre-existing parameter files are invalid.
|
|
||||||
fn new() -> SaplingParameters {
|
|
||||||
// TODO: Sprout
|
|
||||||
|
|
||||||
let params_directory = Groth16Parameters::directory();
|
|
||||||
let spend_path = params_directory.join("sapling-spend.params");
|
|
||||||
let output_path = params_directory.join("sapling-output.params");
|
|
||||||
|
|
||||||
// Download parameters if needed.
|
|
||||||
//
|
|
||||||
// TODO: use try_exists when it stabilises, to exit early on permissions errors (#83186)
|
|
||||||
if !spend_path.exists() || !output_path.exists() {
|
|
||||||
tracing::info!("downloading Zcash Sapling parameters");
|
|
||||||
zcash_proofs::download_parameters().unwrap_or_else(|_| {
|
|
||||||
panic!(
|
|
||||||
"error downloading parameter files. {}",
|
|
||||||
Groth16Parameters::failure_hint()
|
|
||||||
)
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: if loading fails, log a message including `failure_hint`
|
|
||||||
tracing::info!("checking and loading Zcash Sapling parameters");
|
|
||||||
let parameters = zcash_proofs::load_parameters(&spend_path, &output_path, None);
|
|
||||||
|
|
||||||
SaplingParameters {
|
|
||||||
spend: parameters.spend_params,
|
|
||||||
spend_prepared_verifying_key: parameters.spend_vk,
|
|
||||||
output: parameters.output_params,
|
|
||||||
output_prepared_verifying_key: parameters.output_vk,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,9 @@
|
||||||
//! * verifies blocks using zebra-chain, then stores verified blocks in zebra-state
|
//! * verifies blocks using zebra-chain, then stores verified blocks in zebra-state
|
||||||
//! * verifies mempool and block transactions using zebra-chain and zebra-script,
|
//! * verifies mempool and block transactions using zebra-chain and zebra-script,
|
||||||
//! and returns verified mempool transactions for mempool storage
|
//! and returns verified mempool transactions for mempool storage
|
||||||
|
//! * Groth16 Parameters Download Task
|
||||||
|
//! * downloads the Sprout and Sapling Groth16 circuit parameter files
|
||||||
|
//! * finishes when the download is complete and the download file hashes have been checked
|
||||||
//! * Inbound Service
|
//! * Inbound Service
|
||||||
//! * handles requests from peers for network data, chain data, and mempool transactions
|
//! * handles requests from peers for network data, chain data, and mempool transactions
|
||||||
//! * spawns download and verify tasks for each gossiped block
|
//! * spawns download and verify tasks for each gossiped block
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue