Skip to main content

snarkvm_console_network/
lib.rs

1// Copyright (c) 2019-2026 Provable Inc.
2// This file is part of the snarkVM library.
3
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at:
7
8// http://www.apache.org/licenses/LICENSE-2.0
9
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16#![forbid(unsafe_code)]
17#![allow(clippy::too_many_arguments)]
18#![warn(clippy::cast_possible_truncation)]
19
20#[macro_use]
21extern crate lazy_static;
22
23pub use snarkvm_console_network_environment as environment;
24pub use snarkvm_console_network_environment::*;
25
26mod helpers;
27pub use helpers::*;
28
29mod canary_v0;
30pub use canary_v0::*;
31
32mod consensus_heights;
33pub use consensus_heights::*;
34
35mod mainnet_v0;
36pub use mainnet_v0::*;
37
38mod testnet_v0;
39
40pub use testnet_v0::*;
41
42pub mod prelude {
43    #[cfg(feature = "wasm")]
44    pub use crate::get_or_init_consensus_version_heights;
45    pub use crate::{
46        CANARY_V0_CONSENSUS_VERSION_HEIGHTS,
47        CanaryV0,
48        ConsensusVersion,
49        MAINNET_V0_CONSENSUS_VERSION_HEIGHTS,
50        MainnetV0,
51        Network,
52        TEST_CONSENSUS_VERSION_HEIGHTS,
53        TESTNET_V0_CONSENSUS_VERSION_HEIGHTS,
54        TestnetV0,
55        consensus_config_value,
56        consensus_config_value_by_version,
57        environment::prelude::*,
58    };
59}
60
61pub use crate::environment::prelude::*;
62
63use snarkvm_algorithms::{
64    AlgebraicSponge,
65    crypto_hash::PoseidonSponge,
66    snark::varuna::{CircuitProvingKey, CircuitVerifyingKey, VarunaHidingMode},
67    srs::{UniversalProver, UniversalVerifier},
68};
69use snarkvm_console_algorithms::{BHP512, BHP1024, Poseidon2, Poseidon4, Poseidon8};
70use snarkvm_console_collections::merkle_tree::{MerklePath, MerkleTree};
71use snarkvm_console_types::{Field, Group, Scalar};
72use snarkvm_curves::PairingEngine;
73
74use indexmap::IndexMap;
75use std::sync::{Arc, OnceLock};
76
77/// A helper type for the BHP Merkle tree.
78pub type BHPMerkleTree<N, const DEPTH: u8> = MerkleTree<N, BHP1024<N>, BHP512<N>, DEPTH>;
79/// A helper type for the Poseidon Merkle tree.
80pub type PoseidonMerkleTree<N, const DEPTH: u8> = MerkleTree<N, Poseidon4<N>, Poseidon2<N>, DEPTH>;
81
82/// Helper types for the Varuna parameters.
83type Fq<N> = <<N as Environment>::PairingCurve as PairingEngine>::Fq;
84pub type FiatShamir<N> = PoseidonSponge<Fq<N>, 2, 1>;
85pub type FiatShamirParameters<N> = <FiatShamir<N> as AlgebraicSponge<Fq<N>, 2>>::Parameters;
86
87/// Helper types for the Varuna proving and verifying key.
88pub(crate) type VarunaProvingKey<N> = CircuitProvingKey<<N as Environment>::PairingCurve, VarunaHidingMode>;
89pub(crate) type VarunaVerifyingKey<N> = CircuitVerifyingKey<<N as Environment>::PairingCurve>;
90
91/// A list of consensus versions and their corresponding block heights.
92static CONSENSUS_VERSION_HEIGHTS: OnceLock<[(ConsensusVersion, u32); NUM_CONSENSUS_VERSIONS]> = OnceLock::new();
93
94pub trait Network:
95    'static
96    + Environment
97    + Copy
98    + Clone
99    + Debug
100    + Eq
101    + PartialEq
102    + core::hash::Hash
103    + Serialize
104    + DeserializeOwned
105    + for<'a> Deserialize<'a>
106    + Send
107    + Sync
108{
109    /// The network ID.
110    const ID: u16;
111    /// The (long) network name.
112    const NAME: &'static str;
113    /// The short network name (used, for example, in query URLs).
114    const SHORT_NAME: &'static str;
115
116    /// The function name for the inclusion circuit.
117    const INCLUSION_FUNCTION_NAME: &'static str;
118
119    /// The fixed timestamp of the genesis block.
120    const GENESIS_TIMESTAMP: i64;
121    /// The genesis block coinbase target.
122    const GENESIS_COINBASE_TARGET: u64;
123    /// The genesis block proof target.
124    const GENESIS_PROOF_TARGET: u64;
125    /// The maximum number of solutions that can be included per block as a power of 2.
126    const MAX_SOLUTIONS_AS_POWER_OF_TWO: u8 = 2; // 4 solutions
127    /// The maximum number of solutions that can be included per block.
128    const MAX_SOLUTIONS: usize = 1 << Self::MAX_SOLUTIONS_AS_POWER_OF_TWO; // 4 solutions
129
130    /// The starting supply of Aleo credits.
131    const STARTING_SUPPLY: u64 = 1_500_000_000_000_000; // 1.5B credits
132    /// The maximum supply of Aleo credits.
133    /// This value represents the absolute upper bound on all ALEO created over the lifetime of the network.
134    const MAX_SUPPLY: u64 = 5_000_000_000_000_000; // 5B credits
135    /// The block height that upper bounds the total supply of Aleo credits to 5 billion.
136    #[cfg(not(feature = "test"))]
137    const MAX_SUPPLY_LIMIT_HEIGHT: u32 = 263_527_685;
138    /// The block height that upper bounds the total supply of Aleo credits to 5 billion.
139    /// This is deliberately set to a low value for testing purposes only.
140    #[cfg(feature = "test")]
141    const MAX_SUPPLY_LIMIT_HEIGHT: u32 = 5;
142    /// The cost in microcredits per byte for the deployment transaction.
143    const DEPLOYMENT_FEE_MULTIPLIER: u64 = 1_000; // 1 millicredit per byte
144    /// The multiplier in microcredits for each command in the constructor.
145    const CONSTRUCTOR_FEE_MULTIPLIER: u64 = 100; // 100x per command
146    /// The constant that divides the storage polynomial.
147    const EXECUTION_STORAGE_FEE_SCALING_FACTOR: u64 = 5000;
148    /// The maximum size execution transactions can be before a quadratic storage penalty applies.
149    const EXECUTION_STORAGE_PENALTY_THRESHOLD: u64 = 5000;
150    /// The cost in microcredits per constraint for the deployment transaction.
151    const SYNTHESIS_FEE_MULTIPLIER: u64 = 25; // 25 microcredits per constraint
152    /// The maximum number of variables in a deployment. This limit was enforced at the transaction level up to
153    /// consensus version V16 (inclusive). This corresponds to ~0.5 second single-threaded runtime at
154    /// mainnet launch reference validator hardware.
155    const MAX_DEPLOYMENT_VARIABLES: u64 = 1 << 21; // 2,097,152 variables
156    /// The maximum number of constraints in a deployment. This limit was enforced at the transaction level up to
157    /// consensus version V16 (inclusive). This corresponds to ~0.5 second single-threaded runtime at mainnet
158    /// launch reference validator hardware.
159    const MAX_DEPLOYMENT_CONSTRAINTS: u64 = 1 << 21; // 2,097,152 constraints
160    /// Approximate conversion factor from non-zero circuit entries to seconds of certificate-verification work
161    /// when checking a deployment. From it, a per-proposal synthesis limit is enforced starting at consensus
162    /// version V17 which overrides the two per-transaction limits above.
163    const SYNTHESIS_PER_SECOND_OF_RUNTIME: u64 = 1_500_000;
164    const MAX_BATCH_PROOF_INSTANCES: usize = 128;
165    /// The maximum number of microcredits that can be spent as a fee.
166    const MAX_FEE: u64 = 1_000_000_000_000_000;
167    /// A list of consensus versions and their corresponding transaction spend limits in microcredits.
168    //  Note: This value must **not** decrease without considering the impact on transaction validity.
169    const TRANSACTION_SPEND_LIMIT: [(ConsensusVersion, u64); 2] =
170        [(ConsensusVersion::V1, 100_000_000), (ConsensusVersion::V10, 4_000_000)];
171    /// The compute discount approved by ARC 0005.
172    const ARC_0005_COMPUTE_DISCOUNT: u64 =
173        Self::CREDITS_PER_SECOND_OF_RUNTIME[0].1 / Self::CREDITS_PER_SECOND_OF_RUNTIME[1].1;
174    /// The number of microcredits representing a second of runtime.
175    const CREDITS_PER_SECOND_OF_RUNTIME: [(ConsensusVersion, u64); 2] =
176        [(ConsensusVersion::V1, 100_000_000), (ConsensusVersion::V10, 4_000_000)];
177
178    /// The anchor height, defined as the expected number of blocks to reach the coinbase target.
179    /// Note: The anchor height used exclusively by `coinbase_reward_v1`.
180    const ANCHOR_HEIGHT: u32 = Self::REWARD_ANCHOR_TIME as u32 / Self::BLOCK_TIME as u32;
181    /// The anchor time used specifically for calculating the coinbase reward.
182    /// We ensure that the reward anchor time matches the original ConsensusVersion::V1 anchor time
183    /// to maintain the original coinbase reward schedule.
184    const REWARD_ANCHOR_TIME: u16 = 25;
185    /// A list of (consensus_version, anchor_time_in_seconds) pairs (sparse).
186    /// Each entry takes effect at the specified version and remains active until the next entry.
187    /// The anchor time, defined as the expected time in seconds to reach the coinbase target.
188    const ANCHOR_TIMES: [(ConsensusVersion, u16); 3] = [
189        (ConsensusVersion::V1, Self::REWARD_ANCHOR_TIME),
190        (ConsensusVersion::V15, 35),
191        (ConsensusVersion::V17, Self::REWARD_ANCHOR_TIME),
192    ];
193    /// The expected time per block in seconds.
194    const BLOCK_TIME: u16 = 10;
195    /// The number of blocks per epoch.
196    #[cfg(not(feature = "test"))]
197    const NUM_BLOCKS_PER_EPOCH: u32 = 3600 / Self::BLOCK_TIME as u32; // 360 blocks == ~1 hour
198    /// The number of blocks per epoch.
199    /// This is deliberately set to a low value for testing purposes only.
200    #[cfg(feature = "test")]
201    const NUM_BLOCKS_PER_EPOCH: u32 = 10;
202
203    /// The maximum number of entries in data.
204    const MAX_DATA_ENTRIES: usize = 32;
205    /// The maximum recursive depth of an entry.
206    /// Note: This value must be strictly less than u8::MAX.
207    const MAX_DATA_DEPTH: usize = 32;
208    /// The maximum number of fields in data (must not exceed u16::MAX).
209    #[allow(clippy::cast_possible_truncation)]
210    const MAX_DATA_SIZE_IN_FIELDS: u32 = ((128 * 1024 * 8) / Field::<Self>::SIZE_IN_DATA_BITS) as u32;
211
212    /// The minimum number of entries in a struct.
213    const MIN_STRUCT_ENTRIES: usize = 1; // This ensures the struct is not empty.
214    /// The maximum number of entries in a struct.
215    const MAX_STRUCT_ENTRIES: usize = Self::MAX_DATA_ENTRIES;
216
217    /// The minimum number of elements in an array.
218    const MIN_ARRAY_ELEMENTS: usize = 1; // This ensures the array is not empty.
219    ///  A list of (consensus_version, size) pairs indicating the maximum number of elements in an array.
220    const MAX_ARRAY_ELEMENTS: [(ConsensusVersion, usize); 3] =
221        [(ConsensusVersion::V1, 32), (ConsensusVersion::V11, 512), (ConsensusVersion::V14, 2048)];
222
223    /// The minimum number of entries in a record.
224    const MIN_RECORD_ENTRIES: usize = 1; // This accounts for 'record.owner'.
225    /// The maximum number of entries in a record.
226    const MAX_RECORD_ENTRIES: usize = Self::MIN_RECORD_ENTRIES.saturating_add(Self::MAX_DATA_ENTRIES);
227
228    /// The maximum program size by number of characters.
229    const MAX_PROGRAM_SIZE: [(ConsensusVersion, usize); 3] = [
230        (ConsensusVersion::V1, 100_000),    // 100 kB
231        (ConsensusVersion::V14, 512_000),   // 512 kB
232        (ConsensusVersion::V16, 2_048_000), // 2048 kB
233    ];
234    /// The maximum number of mappings in a program.
235    const MAX_MAPPINGS: usize = 31;
236    /// The maximum number of functions in a program.
237    const MAX_FUNCTIONS: usize = 31;
238    /// The maximum number of structs in a program.
239    const MAX_STRUCTS: usize = 10 * Self::MAX_FUNCTIONS;
240    /// The maximum number of records in a program.
241    const MAX_RECORDS: usize = 10 * Self::MAX_FUNCTIONS;
242    /// The maximum number of closures in a program.
243    const MAX_CLOSURES: usize = 2 * Self::MAX_FUNCTIONS;
244    /// The maximum number of view functions in a program.
245    const MAX_VIEWS: usize = 2 * Self::MAX_FUNCTIONS;
246    /// The maximum number of operands in an instruction.
247    const MAX_OPERANDS: usize = Self::MAX_INPUTS;
248    /// The maximum number of instructions in a closure or function.
249    const MAX_INSTRUCTIONS: usize = u16::MAX as usize;
250    /// The maximum number of commands in finalize.
251    const MAX_COMMANDS: usize = u16::MAX as usize;
252    /// The maximum number of `call` commands in a finalize body. Matched to
253    /// `Transaction::MAX_TRANSITIONS` so view-call arity in a finalize is bounded analogously
254    /// to the static-call bound on transition graphs.
255    const MAX_CALLS: usize = 32;
256    /// The maximum number of write commands in finalize.
257    const MAX_WRITES: [(ConsensusVersion, u16); 2] = [(ConsensusVersion::V1, 16), (ConsensusVersion::V14, 32)];
258    /// The maximum number of `position` commands in finalize.
259    const MAX_POSITIONS: usize = u8::MAX as usize;
260
261    /// The maximum number of inputs per transition.
262    const MAX_INPUTS: usize = 16;
263    /// The maximum number of outputs per transition.
264    const MAX_OUTPUTS: usize = 16;
265
266    /// The maximum number of imports.
267    const MAX_IMPORTS: usize = 64;
268
269    /// A list of consensus versions and their corresponding maximum transaction sizes in bytes.
270    ///
271    /// A transaction consists of fixed identifiers, deployment data, and fees.
272    /// Fixed components include identifiers, ownership, checksums, and fees.
273    /// Variable components include the program bytecode and verifying-key entries.
274    /// Verifying-key entries scale with the number of functions and records.
275    ///
276    /// MAX_TRANSACTION_SIZE = C + MAX_PROGRAM_SIZE + (673 + 58) * (MAX_FUNCTIONS + MAX_RECORDS)
277    /// C = fixed size components (Up to 2367 bytes)
278    // Note: This value must **not** decrease without considering the impact on transaction validity.
279    const MAX_TRANSACTION_SIZE: [(ConsensusVersion, usize); 3] = [
280        (ConsensusVersion::V1, 128_000),    // 128 kB
281        (ConsensusVersion::V14, 768_000),   // 768 kB
282        (ConsensusVersion::V16, 2_304_000), // 2304 kB
283    ];
284
285    /// The state root type.
286    type StateRoot: Bech32ID<Field<Self>>;
287    /// The block hash type.
288    type BlockHash: Bech32ID<Field<Self>>;
289    /// The ratification ID type.
290    type RatificationID: Bech32ID<Field<Self>>;
291    /// The transaction ID type.
292    type TransactionID: Bech32ID<Field<Self>>;
293    /// The transition ID type.
294    type TransitionID: Bech32ID<Field<Self>>;
295    /// The transmission checksum type.
296    type TransmissionChecksum: IntegerType;
297
298    /// A list of (consensus_version, block_height) pairs indicating when each consensus version takes effect.
299    /// Documentation for what is changed at each version can be found in `N::CONSENSUS_VERSION`
300    /// Do not read this directly outside of tests, use `N::CONSENSUS_VERSION_HEIGHTS()` instead.
301    const _CONSENSUS_VERSION_HEIGHTS: [(ConsensusVersion, u32); NUM_CONSENSUS_VERSIONS];
302
303    ///  A list of (consensus_version, size) pairs indicating the maximum number of validators in a committee.
304    //  Note: This value must **not** decrease without considering the impact on serialization.
305    //  Decreasing this value will break backwards compatibility of serialization without explicit
306    //  declaration of migration based on round number rather than block height.
307    //  Increasing this value will require a migration to prevent forking during network upgrades.
308    const MAX_CERTIFICATES: [(ConsensusVersion, u16); 5];
309
310    /// Returns the list of consensus versions.
311    #[allow(non_snake_case)]
312    #[cfg(not(any(test, feature = "test", feature = "test_consensus_heights")))]
313    fn CONSENSUS_VERSION_HEIGHTS() -> &'static [(ConsensusVersion, u32); NUM_CONSENSUS_VERSIONS] {
314        // Initialize the consensus version heights directly from the constant.
315        CONSENSUS_VERSION_HEIGHTS.get_or_init(|| Self::_CONSENSUS_VERSION_HEIGHTS)
316    }
317    /// Returns the list of test consensus versions.
318    #[allow(non_snake_case)]
319    #[cfg(any(test, feature = "test", feature = "test_consensus_heights"))]
320    fn CONSENSUS_VERSION_HEIGHTS() -> &'static [(ConsensusVersion, u32); NUM_CONSENSUS_VERSIONS] {
321        CONSENSUS_VERSION_HEIGHTS.get_or_init(load_test_consensus_heights)
322    }
323
324    /// A set of incrementing consensus version heights used for tests.
325    #[allow(non_snake_case)]
326    #[cfg(any(test, feature = "test", feature = "test_consensus_heights"))]
327    const TEST_CONSENSUS_VERSION_HEIGHTS: [(ConsensusVersion, u32); NUM_CONSENSUS_VERSIONS] =
328        TEST_CONSENSUS_VERSION_HEIGHTS;
329    /// Returns the consensus version which is active at the given height.
330    #[allow(non_snake_case)]
331    fn CONSENSUS_VERSION(seek_height: u32) -> anyhow::Result<ConsensusVersion> {
332        match Self::CONSENSUS_VERSION_HEIGHTS().binary_search_by(|(_, height)| height.cmp(&seek_height)) {
333            // If a consensus version was found at this height, return it.
334            Ok(index) => Ok(Self::CONSENSUS_VERSION_HEIGHTS()[index].0),
335            // If the specified height was not found, determine whether to return an appropriate version.
336            Err(index) => {
337                if index == 0 {
338                    Err(anyhow!("Expected consensus version 1 to exist at height 0."))
339                } else {
340                    // Return the appropriate version belonging to the height *lower* than the sought height.
341                    Ok(Self::CONSENSUS_VERSION_HEIGHTS()[index - 1].0)
342                }
343            }
344        }
345    }
346    /// Returns the height at which a specified consensus version becomes active.
347    #[allow(non_snake_case)]
348    fn CONSENSUS_HEIGHT(version: ConsensusVersion) -> Result<u32> {
349        Ok(Self::CONSENSUS_VERSION_HEIGHTS().get(version as usize - 1).ok_or(anyhow!("Invalid consensus version"))?.1)
350    }
351    /// Returns the last `MAX_ARRAY_ELEMENTS` value.
352    #[allow(non_snake_case)]
353    fn LATEST_MAX_ARRAY_ELEMENTS() -> usize {
354        Self::MAX_ARRAY_ELEMENTS.last().expect("MAX_ARRAY_ELEMENTS must have at least one entry").1
355    }
356    /// Returns the last `MAX_CERTIFICATES` value.
357    #[allow(non_snake_case)]
358    fn LATEST_MAX_CERTIFICATES() -> u16 {
359        Self::MAX_CERTIFICATES.last().expect("MAX_CERTIFICATES must have at least one entry").1
360    }
361
362    /// Returns the last `MAX_PROGRAM_SIZE` value.
363    #[allow(non_snake_case)]
364    fn LATEST_MAX_PROGRAM_SIZE() -> usize {
365        Self::MAX_PROGRAM_SIZE.last().expect("MAX_PROGRAM_SIZE must have at least one entry").1
366    }
367
368    /// Returns the last `MAX_WRITES` value.
369    #[allow(non_snake_case)]
370    fn LATEST_MAX_WRITES() -> u16 {
371        Self::MAX_WRITES.last().expect("MAX_WRITES must have at least one entry").1
372    }
373
374    /// Returns the last `MAX_TRANSACTION_SIZE` value.
375    #[allow(non_snake_case)]
376    fn LATEST_MAX_TRANSACTION_SIZE() -> usize {
377        Self::MAX_TRANSACTION_SIZE.last().expect("MAX_TRANSACTION_SIZE must have at least one entry").1
378    }
379
380    /// Returns the block height where the the inclusion proof will be updated.
381    #[allow(non_snake_case)]
382    fn INCLUSION_UPGRADE_HEIGHT() -> Result<u32>;
383
384    /// Returns the genesis block bytes.
385    fn genesis_bytes() -> &'static [u8];
386
387    /// Returns the restrictions list as a JSON-compatible string.
388    fn restrictions_list_as_str() -> &'static str;
389
390    /// Returns the proving key for the given function name in the v0 version of `credits.aleo`.
391    fn get_credits_v0_proving_key(function_name: String) -> Result<&'static Arc<VarunaProvingKey<Self>>>;
392
393    /// Returns the verifying key for the given function name in the v0 version of `credits.aleo`.
394    fn get_credits_v0_verifying_key(function_name: String) -> Result<&'static Arc<VarunaVerifyingKey<Self>>>;
395
396    /// Returns the proving key for the given function name in `credits.aleo`.
397    fn get_credits_proving_key(function_name: String) -> Result<&'static Arc<VarunaProvingKey<Self>>>;
398
399    /// Returns the verifying key for the given function name in `credits.aleo`.
400    fn get_credits_verifying_key(function_name: String) -> Result<&'static Arc<VarunaVerifyingKey<Self>>>;
401
402    #[cfg(not(feature = "wasm"))]
403    /// Returns the `proving key` for the inclusion_v0 circuit.
404    fn inclusion_v0_proving_key() -> &'static Arc<VarunaProvingKey<Self>>;
405
406    #[cfg(feature = "wasm")]
407    /// Returns the `proving key` for the inclusion_v0 circuit.
408    fn inclusion_v0_proving_key(bytes: Option<Vec<u8>>) -> &'static Arc<VarunaProvingKey<Self>>;
409
410    /// Returns the `verifying key` for the inclusion_v0 circuit.
411    fn inclusion_v0_verifying_key() -> &'static Arc<VarunaVerifyingKey<Self>>;
412
413    #[cfg(not(feature = "wasm"))]
414    /// Returns the `proving key` for the inclusion circuit.
415    fn inclusion_proving_key() -> &'static Arc<VarunaProvingKey<Self>>;
416
417    #[cfg(feature = "wasm")]
418    fn inclusion_proving_key(bytes: Option<Vec<u8>>) -> &'static Arc<VarunaProvingKey<Self>>;
419
420    /// Returns the `verifying key` for the inclusion circuit.
421    fn inclusion_verifying_key() -> &'static Arc<VarunaVerifyingKey<Self>>;
422
423    #[cfg(not(feature = "wasm"))]
424    /// Returns the `proving key` for the translation circuit.
425    fn translation_credits_proving_key() -> &'static Arc<VarunaProvingKey<Self>>;
426
427    #[cfg(feature = "wasm")]
428    /// Returns the `proving key` for the translation circuit.
429    fn translation_credits_proving_key(bytes: Option<Vec<u8>>) -> &'static Arc<VarunaProvingKey<Self>>;
430
431    /// Returns the `verifying key` for the translation circuit.
432    fn translation_credits_verifying_key() -> &'static Arc<VarunaVerifyingKey<Self>>;
433
434    /// Returns the powers of `G`.
435    fn g_powers() -> &'static Vec<Group<Self>>;
436
437    /// Returns the scalar multiplication on the generator `G`.
438    fn g_scalar_multiply(scalar: &Scalar<Self>) -> Group<Self>;
439
440    /// Returns the Varuna universal prover.
441    fn varuna_universal_prover() -> &'static UniversalProver<Self::PairingCurve>;
442
443    /// Returns the Varuna universal verifier.
444    fn varuna_universal_verifier() -> &'static UniversalVerifier<Self::PairingCurve>;
445
446    /// Returns the sponge parameters for Varuna.
447    fn varuna_fs_parameters() -> &'static FiatShamirParameters<Self>;
448
449    /// Returns the commitment domain as a constant field element.
450    fn commitment_domain() -> Field<Self>;
451
452    /// Returns the encryption domain as a constant field element.
453    fn encryption_domain() -> Field<Self>;
454
455    /// Returns the graph key domain as a constant field element.
456    fn graph_key_domain() -> Field<Self>;
457
458    /// Returns the serial number domain as a constant field element.
459    fn serial_number_domain() -> Field<Self>;
460
461    /// Returns a BHP commitment with an input hasher of 256-bits and randomizer.
462    fn commit_bhp256(input: &[bool], randomizer: &Scalar<Self>) -> Result<Field<Self>>;
463
464    /// Returns a BHP commitment with an input hasher of 512-bits and randomizer.
465    fn commit_bhp512(input: &[bool], randomizer: &Scalar<Self>) -> Result<Field<Self>>;
466
467    /// Returns a BHP commitment with an input hasher of 768-bits and randomizer.
468    fn commit_bhp768(input: &[bool], randomizer: &Scalar<Self>) -> Result<Field<Self>>;
469
470    /// Returns a BHP commitment with an input hasher of 1024-bits and randomizer.
471    fn commit_bhp1024(input: &[bool], randomizer: &Scalar<Self>) -> Result<Field<Self>>;
472
473    /// Returns a Pedersen commitment for the given (up to) 64-bit input and randomizer.
474    fn commit_ped64(input: &[bool], randomizer: &Scalar<Self>) -> Result<Field<Self>>;
475
476    /// Returns a Pedersen commitment for the given (up to) 128-bit input and randomizer.
477    fn commit_ped128(input: &[bool], randomizer: &Scalar<Self>) -> Result<Field<Self>>;
478
479    /// Returns a BHP commitment with an input hasher of 256-bits and randomizer.
480    fn commit_to_group_bhp256(input: &[bool], randomizer: &Scalar<Self>) -> Result<Group<Self>>;
481
482    /// Returns a BHP commitment with an input hasher of 512-bits and randomizer.
483    fn commit_to_group_bhp512(input: &[bool], randomizer: &Scalar<Self>) -> Result<Group<Self>>;
484
485    /// Returns a BHP commitment with an input hasher of 768-bits and randomizer.
486    fn commit_to_group_bhp768(input: &[bool], randomizer: &Scalar<Self>) -> Result<Group<Self>>;
487
488    /// Returns a BHP commitment with an input hasher of 1024-bits and randomizer.
489    fn commit_to_group_bhp1024(input: &[bool], randomizer: &Scalar<Self>) -> Result<Group<Self>>;
490
491    /// Returns a Pedersen commitment for the given (up to) 64-bit input and randomizer.
492    fn commit_to_group_ped64(input: &[bool], randomizer: &Scalar<Self>) -> Result<Group<Self>>;
493
494    /// Returns a Pedersen commitment for the given (up to) 128-bit input and randomizer.
495    fn commit_to_group_ped128(input: &[bool], randomizer: &Scalar<Self>) -> Result<Group<Self>>;
496
497    /// Returns the BHP hash with an input hasher of 256-bits.
498    fn hash_bhp256(input: &[bool]) -> Result<Field<Self>>;
499
500    /// Returns the BHP hash with an input hasher of 512-bits.
501    fn hash_bhp512(input: &[bool]) -> Result<Field<Self>>;
502
503    /// Returns the BHP hash with an input hasher of 768-bits.
504    fn hash_bhp768(input: &[bool]) -> Result<Field<Self>>;
505
506    /// Returns the BHP hash with an input hasher of 1024-bits.
507    fn hash_bhp1024(input: &[bool]) -> Result<Field<Self>>;
508
509    /// Returns the Keccak hash with a 256-bit output.
510    fn hash_keccak256(input: &[bool]) -> Result<Vec<bool>>;
511
512    /// Returns the Keccak hash with a 384-bit output.
513    fn hash_keccak384(input: &[bool]) -> Result<Vec<bool>>;
514
515    /// Returns the Keccak hash with a 512-bit output.
516    fn hash_keccak512(input: &[bool]) -> Result<Vec<bool>>;
517
518    /// Returns the Pedersen hash for a given (up to) 64-bit input.
519    fn hash_ped64(input: &[bool]) -> Result<Field<Self>>;
520
521    /// Returns the Pedersen hash for a given (up to) 128-bit input.
522    fn hash_ped128(input: &[bool]) -> Result<Field<Self>>;
523
524    /// Returns the Poseidon hash with an input rate of 2.
525    fn hash_psd2(input: &[Field<Self>]) -> Result<Field<Self>>;
526
527    /// Returns the Poseidon hash with an input rate of 4.
528    fn hash_psd4(input: &[Field<Self>]) -> Result<Field<Self>>;
529
530    /// Returns the Poseidon hash with an input rate of 8.
531    fn hash_psd8(input: &[Field<Self>]) -> Result<Field<Self>>;
532
533    /// Returns the SHA-3 hash with a 256-bit output.
534    fn hash_sha3_256(input: &[bool]) -> Result<Vec<bool>>;
535
536    /// Returns the SHA-3 hash with a 384-bit output.
537    fn hash_sha3_384(input: &[bool]) -> Result<Vec<bool>>;
538
539    /// Returns the SHA-3 hash with a 512-bit output.
540    fn hash_sha3_512(input: &[bool]) -> Result<Vec<bool>>;
541
542    /// Returns the extended Poseidon hash with an input rate of 2.
543    fn hash_many_psd2(input: &[Field<Self>], num_outputs: u16) -> Vec<Field<Self>>;
544
545    /// Returns the extended Poseidon hash with an input rate of 4.
546    fn hash_many_psd4(input: &[Field<Self>], num_outputs: u16) -> Vec<Field<Self>>;
547
548    /// Returns the extended Poseidon hash with an input rate of 8.
549    fn hash_many_psd8(input: &[Field<Self>], num_outputs: u16) -> Vec<Field<Self>>;
550
551    /// Returns the BHP hash with an input hasher of 256-bits.
552    fn hash_to_group_bhp256(input: &[bool]) -> Result<Group<Self>>;
553
554    /// Returns the BHP hash with an input hasher of 512-bits.
555    fn hash_to_group_bhp512(input: &[bool]) -> Result<Group<Self>>;
556
557    /// Returns the BHP hash with an input hasher of 768-bits.
558    fn hash_to_group_bhp768(input: &[bool]) -> Result<Group<Self>>;
559
560    /// Returns the BHP hash with an input hasher of 1024-bits.
561    fn hash_to_group_bhp1024(input: &[bool]) -> Result<Group<Self>>;
562
563    /// Returns the Pedersen hash for a given (up to) 64-bit input.
564    fn hash_to_group_ped64(input: &[bool]) -> Result<Group<Self>>;
565
566    /// Returns the Pedersen hash for a given (up to) 128-bit input.
567    fn hash_to_group_ped128(input: &[bool]) -> Result<Group<Self>>;
568
569    /// Returns the Poseidon hash with an input rate of 2 on the affine curve.
570    fn hash_to_group_psd2(input: &[Field<Self>]) -> Result<Group<Self>>;
571
572    /// Returns the Poseidon hash with an input rate of 4 on the affine curve.
573    fn hash_to_group_psd4(input: &[Field<Self>]) -> Result<Group<Self>>;
574
575    /// Returns the Poseidon hash with an input rate of 8 on the affine curve.
576    fn hash_to_group_psd8(input: &[Field<Self>]) -> Result<Group<Self>>;
577
578    /// Returns the Poseidon hash with an input rate of 2 on the scalar field.
579    fn hash_to_scalar_psd2(input: &[Field<Self>]) -> Result<Scalar<Self>>;
580
581    /// Returns the Poseidon hash with an input rate of 4 on the scalar field.
582    fn hash_to_scalar_psd4(input: &[Field<Self>]) -> Result<Scalar<Self>>;
583
584    /// Returns the Poseidon hash with an input rate of 8 on the scalar field.
585    fn hash_to_scalar_psd8(input: &[Field<Self>]) -> Result<Scalar<Self>>;
586
587    /// Returns a Merkle tree with a BHP leaf hasher of 1024-bits and a BHP path hasher of 512-bits.
588    fn merkle_tree_bhp<const DEPTH: u8>(leaves: &[Vec<bool>]) -> Result<BHPMerkleTree<Self, DEPTH>>;
589
590    /// Returns a Merkle tree with a Poseidon leaf hasher with input rate of 4 and a Poseidon path hasher with input rate of 2.
591    fn merkle_tree_psd<const DEPTH: u8>(leaves: &[Vec<Field<Self>>]) -> Result<PoseidonMerkleTree<Self, DEPTH>>;
592
593    /// Returns `true` if the given Merkle path is valid for the given root and leaf.
594    #[allow(clippy::ptr_arg)]
595    fn verify_merkle_path_bhp<const DEPTH: u8>(
596        path: &MerklePath<Self, DEPTH>,
597        root: &Field<Self>,
598        leaf: &Vec<bool>,
599    ) -> bool;
600
601    /// Returns `true` if the given Merkle path is valid for the given root and leaf.
602    #[allow(clippy::ptr_arg)]
603    fn verify_merkle_path_psd<const DEPTH: u8>(
604        path: &MerklePath<Self, DEPTH>,
605        root: &Field<Self>,
606        leaf: &Vec<Field<Self>>,
607    ) -> bool;
608
609    /// Returns the Poseidon leaf hasher for dynamic records (rate 8).
610    fn dynamic_record_leaf_hasher() -> &'static Poseidon8<Self>;
611
612    /// Returns the Poseidon path hasher for dynamic records (rate 2).
613    fn dynamic_record_path_hasher() -> &'static Poseidon2<Self>;
614}
615
616/// Returns the consensus version heights, initializing them if necessary.
617///
618/// If a `heights` string is provided, it must be a comma-separated list of ascending block heights
619/// starting from zero (e.g., `"0,2,3,4,..."`) with a number of heights exactly equal to the value
620/// of the Network trait's `NUM_CONSENSUS_VERSIONS` constant. These heights correspond to the
621/// activation block of each `ConsensusVersion`.
622///
623/// If `heights` is `None`, the function will use SnarkVM's default test consensus heights.
624///
625/// This function caches the initialized heights, and can be set only once. Further calls will
626/// return the cached heights.
627///
628/// This method should be called by `wasm` users who need to set test values for consensus heights
629/// for purposes such as testing on a local devnet. If this method needs to be used, it should be
630/// called immediately after the wasm module is initialized.
631#[cfg(feature = "wasm")]
632pub fn get_or_init_consensus_version_heights(
633    heights: Option<String>,
634) -> [(ConsensusVersion, u32); NUM_CONSENSUS_VERSIONS] {
635    let heights = load_test_consensus_heights_inner(heights);
636    *CONSENSUS_VERSION_HEIGHTS.get_or_init(|| heights)
637}