pub mod circuit;
mod consensus;
use consensus::{HG, M};
pub mod error;
use snarkvm_algorithms::snark;
use snarkvm_curves::bls12_377::Bls12_377;
use snarkvm_models::curves::PairingEngine;
use snarkvm_objects::{
merkle_root_with_subroots,
pedersen_merkle_root,
MerkleRootHash,
PedersenMerkleRootHash,
MASKED_TREE_DEPTH,
};
pub type Posw = GenericPosw<GM17<Bls12_377>, Bls12_377>;
pub type PoswMarlin = GenericPosw<Marlin<Bls12_377>, Bls12_377>;
type GenericPosw<S, E> = consensus::Posw<S, <E as PairingEngine>::Fr, M, HG, params::PoSWParams>;
pub type GM17<E> = snark::gm17::GM17<E, Circuit<<E as PairingEngine>::Fr>, Vec<<E as PairingEngine>::Fr>>;
pub type Marlin<E> =
snarkvm_marlin::snark::MarlinSnark<'static, E, Circuit<<E as PairingEngine>::Fr>, Vec<<E as PairingEngine>::Fr>>;
type Circuit<F> = circuit::POSWCircuit<F, M, HG, params::PoSWParams>;
mod params {
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct PoSWParams;
impl crate::circuit::POSWCircuitParameters for PoSWParams {
const MASK_LENGTH: usize = 32;
}
}
pub fn txids_to_roots(transaction_ids: &[[u8; 32]]) -> (MerkleRootHash, PedersenMerkleRootHash, Vec<[u8; 32]>) {
let (root, subroots) = merkle_root_with_subroots(transaction_ids, MASKED_TREE_DEPTH);
let mut merkle_root_bytes = [0u8; 32];
merkle_root_bytes[..].copy_from_slice(&root);
(
MerkleRootHash(merkle_root_bytes),
pedersen_merkle_root(&subroots),
subroots,
)
}
#[cfg(test)]
mod tests {
use super::*;
use rand::SeedableRng;
use rand_xorshift::XorShiftRng;
use snarkvm_models::algorithms::SNARK;
use snarkvm_utilities::bytes::FromBytes;
#[test]
fn load_params_verify() {
let _params = PoswMarlin::verify_only().unwrap();
}
#[test]
fn load_params() {
let _params = PoswMarlin::load().unwrap();
}
#[test]
fn gm17_ok() {
let rng = &mut XorShiftRng::seed_from_u64(1234567);
let posw = Posw::setup(rng).unwrap();
let difficulty_target = 0xFFFF_FFFF_FFFF_FFFF_u64;
let transaction_ids = vec![[1u8; 32]; 8];
let (_, pedersen_merkle_root, subroots) = txids_to_roots(&transaction_ids);
let (nonce, proof) = posw
.mine(&subroots, difficulty_target, &mut rand::thread_rng(), std::u32::MAX)
.unwrap();
assert_eq!(proof.len(), 193);
let proof = <GM17<Bls12_377> as SNARK>::Proof::read(&proof[..]).unwrap();
posw.verify(nonce, &proof, &pedersen_merkle_root).unwrap();
}
#[test]
fn marlin_ok() {
let rng = &mut XorShiftRng::seed_from_u64(1234567);
let universal_srs =
snarkvm_marlin::snark::Marlin::<Bls12_377>::universal_setup(10000, 10000, 100000, rng).unwrap();
let posw = PoswMarlin::index(universal_srs).unwrap();
let difficulty_target = 0xFFFF_FFFF_FFFF_FFFF_u64;
let transaction_ids = vec![[1u8; 32]; 8];
let (_, pedersen_merkle_root, subroots) = txids_to_roots(&transaction_ids);
let (nonce, proof) = posw
.mine(&subroots, difficulty_target, &mut rand::thread_rng(), std::u32::MAX)
.unwrap();
assert_eq!(proof.len(), 972);
let proof = <Marlin<Bls12_377> as SNARK>::Proof::read(&proof[..]).unwrap();
posw.verify(nonce, &proof, &pedersen_merkle_root).unwrap();
}
}