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

use merkle path inside the burn proof generation

narodnik 4 лет назад
Родитель
Сommit
ac346ea2d8
3 измененных файлов с 23 добавлено и 14 удалено
  1. 16 1
      src/bin/tx2.rs
  2. 5 1
      src/crypto/spend_proof.rs
  3. 2 12
      src/tx/builder.rs

+ 16 - 1
src/bin/tx2.rs

@@ -663,7 +663,6 @@ impl Hashable for MerkleNode {
 */
 */
 
 
 fn main() -> std::result::Result<(), failure::Error> {
 fn main() -> std::result::Result<(), failure::Error> {
-    use incrementalmerkletree::Hashable;
     use drk::{
     use drk::{
         crypto::{
         crypto::{
             merkle_node2::MerkleNode,
             merkle_node2::MerkleNode,
@@ -672,6 +671,7 @@ fn main() -> std::result::Result<(), failure::Error> {
         },
         },
         types::{DrkCircuitField, DrkCoinBlind, DrkSerial},
         types::{DrkCircuitField, DrkCoinBlind, DrkSerial},
     };
     };
+    use incrementalmerkletree::Hashable;
 
 
     let cashier_secret = schnorr::SecretKey::random();
     let cashier_secret = schnorr::SecretKey::random();
     let cashier_public = cashier_secret.public_key();
     let cashier_public = cashier_secret.public_key();
@@ -703,12 +703,27 @@ fn main() -> std::result::Result<(), failure::Error> {
 
 
     let tx = builder.build()?;
     let tx = builder.build()?;
 
 
+    tx.verify(&state.mint_vk, &state.spend_vk)
+        .expect("tx verify");
+
     let mut tree = BridgeTree::<MerkleNode, 2>::new(100);
     let mut tree = BridgeTree::<MerkleNode, 2>::new(100);
     let node = MerkleNode(tx.outputs[0].revealed.coin.clone());
     let node = MerkleNode(tx.outputs[0].revealed.coin.clone());
     tree.append(&node);
     tree.append(&node);
     tree.witness();
     tree.witness();
     let (merkle_position, merkle_path) = tree.authentication_path(&node).unwrap();
     let (merkle_position, merkle_path) = tree.authentication_path(&node).unwrap();
 
 
+    let mut current = node;
+    let position: u64 = merkle_position.into();
+    for (level, sibling) in merkle_path.iter().enumerate() {
+        let level = level as u8;
+        current = if position & (1 << level) == 0 {
+            MerkleNode::combine(level.into(), &current, sibling)
+        } else {
+            MerkleNode::combine(level.into(), sibling, &current)
+        };
+    }
+    assert_eq!(current, tree.root());
+
     let note = tx.outputs[0].enc_note.decrypt(&secret)?;
     let note = tx.outputs[0].enc_note.decrypt(&secret)?;
 
 
     //let update = state_transition(&state, tx)?;
     //let update = state_transition(&state, tx)?;

+ 5 - 1
src/crypto/spend_proof.rs

@@ -9,6 +9,7 @@ use log::debug;
 use pasta_curves::{
 use pasta_curves::{
     arithmetic::{CurveAffine, FieldExt},
     arithmetic::{CurveAffine, FieldExt},
     group::Curve,
     group::Curve,
+    pallas,
 };
 };
 
 
 use super::{
 use super::{
@@ -18,6 +19,7 @@ use super::{
 };
 };
 use crate::{
 use crate::{
     circuit::spend_contract::SpendContract,
     circuit::spend_contract::SpendContract,
+    crypto::merkle_node2::MerkleNode,
     serial::{Decodable, Encodable},
     serial::{Decodable, Encodable},
     types::*,
     types::*,
     Result,
     Result,
@@ -130,11 +132,13 @@ pub fn create_spend_proof(
     serial: DrkSerial,
     serial: DrkSerial,
     coin_blind: DrkCoinBlind,
     coin_blind: DrkCoinBlind,
     secret: DrkSecretKey,
     secret: DrkSecretKey,
-    merkle_path: Vec<DrkCoin>,
+    merkle_path: Vec<MerkleNode>,
     signature_secret: DrkSecretKey,
     signature_secret: DrkSecretKey,
 ) -> Result<(Proof, SpendRevealedValues)> {
 ) -> Result<(Proof, SpendRevealedValues)> {
     const K: u32 = 11;
     const K: u32 = 11;
 
 
+    let merkle_path: Vec<pallas::Base> = merkle_path.iter().map(|node| node.0).collect();
+
     let revealed = SpendRevealedValues::compute(
     let revealed = SpendRevealedValues::compute(
         value,
         value,
         token_id,
         token_id,

+ 2 - 12
src/tx/builder.rs

@@ -83,21 +83,11 @@ impl TransactionBuilder {
         let mut inputs = vec![];
         let mut inputs = vec![];
         let mut input_blinds = vec![];
         let mut input_blinds = vec![];
         let mut signature_secrets = vec![];
         let mut signature_secrets = vec![];
-        for input in &self.inputs {
+        for input in self.inputs {
             input_blinds.push(input.note.value_blind);
             input_blinds.push(input.note.value_blind);
 
 
             let signature_secret = DrkSecretKey::random(&mut OsRng);
             let signature_secret = DrkSecretKey::random(&mut OsRng);
 
 
-            /*
-            // TODO: Some stupid glue code. Need to sort this out
-            let auth_path: Vec<(bls12_381::Scalar, bool)> = input
-                .merkle_path
-                .auth_path
-                .iter()
-                .map(|(node, b)| ((*node).into(), *b))
-                .collect();
-            */
-
             let (proof, revealed) = create_spend_proof(
             let (proof, revealed) = create_spend_proof(
                 input.note.value,
                 input.note.value,
                 input.note.token_id,
                 input.note.token_id,
@@ -106,7 +96,7 @@ impl TransactionBuilder {
                 input.note.serial,
                 input.note.serial,
                 input.note.coin_blind,
                 input.note.coin_blind,
                 input.secret,
                 input.secret,
-                vec![],
+                input.merkle_path,
                 signature_secret,
                 signature_secret,
             )?;
             )?;