Просмотр исходного кода

burn example: use BridgeTree and MerkleNode to build merkle tree for inclusion proof.

narodnik 4 лет назад
Родитель
Сommit
343ce6e594
1 измененных файлов с 24 добавлено и 4 удалено
  1. 24 4
      src/bin/burn.rs

+ 24 - 4
src/bin/burn.rs

@@ -32,6 +32,10 @@ use halo2_gadgets::{
         lookup_range_check::LookupRangeCheckConfig, CellValue, UtilitiesInstructions, Var,
     },
 };
+use incrementalmerkletree::{
+    bridgetree::{BridgeTree, Frontier as BridgeFrontier},
+    Altitude, Frontier, Tree,
+};
 use pasta_curves::{
     arithmetic::{CurveAffine, Field},
     group::{
@@ -49,6 +53,7 @@ use drk::crypto::{
         },
         OrchardFixedBases,
     },
+    merkle_node2::MerkleNode,
     proof::{Proof, ProvingKey, VerifyingKey},
     util::{pedersen_commitment_scalar, pedersen_commitment_u64},
 };
@@ -553,12 +558,27 @@ fn main() {
         coin += hash;
     }
 
+    let mut tree = BridgeTree::<MerkleNode, 32>::new(100);
+    for _ in 0..10 {
+        let random_node = MerkleNode(pallas::Base::random(&mut OsRng));
+        tree.append(&random_node);
+    }
+    let node = MerkleNode(coin.clone());
+    tree.append(&node);
+    tree.witness();
+    for _ in 0..10 {
+        let random_node = MerkleNode(pallas::Base::random(&mut OsRng));
+        tree.append(&random_node);
+    }
+
+    let (merkle_position, merkle_path) = tree.authentication_path(&node).unwrap();
+
     // Merkle root
     //let leaf = pallas::Base::random(&mut OsRng);
     let leaf = coin.clone();
-    let pos = rand::random::<u32>();
-    let path: Vec<_> = (0..32).map(|_| pallas::Base::random(&mut OsRng)).collect();
-    let merkle_root = root(path.clone().try_into().unwrap(), pos, leaf);
+    let pos: u64 = merkle_position.into();
+    let path: Vec<pallas::Base> = merkle_path.iter().map(|node| node.0).collect();
+    let merkle_root = tree.root().0;
 
     // Value and asset commitments
     let value_blind = pallas::Scalar::random(&mut OsRng);
@@ -594,7 +614,7 @@ fn main() {
         value_blind: Some(value_blind),
         asset_blind: Some(asset_blind),
         leaf: Some(leaf),
-        leaf_pos: Some(pos),
+        leaf_pos: Some(pos as u32),
         merkle_path: Some(path.try_into().unwrap()),
         sig_secret: Some(sig_secret),
     };