diff --git a/Cargo.lock b/Cargo.lock index 427f1593f..2cf0ecbf3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -855,8 +855,7 @@ dependencies = [ [[package]] name = "incrementalmerkletree" version = "0.3.0-beta.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cad6be282c89afc05aebe4801b0d5f9d6b7c556a8f398e447f4b26ea56a6b45e" +source = "git+https://github.com/nuttycom/incrementalmerkletree?rev=027a98e53ad59699662d258ac22cd2095ae02aea#027a98e53ad59699662d258ac22cd2095ae02aea" dependencies = [ "serde", ] diff --git a/Cargo.toml b/Cargo.toml index 5ed7955df..0e0b3bf60 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -87,6 +87,7 @@ codegen-units = 1 [patch.crates-io] hdwallet = { git = "https://github.com/nuttycom/hdwallet", rev = "576683b9f2865f1118c309017ff36e01f84420c9" } +incrementalmerkletree = { git = "https://github.com/nuttycom/incrementalmerkletree", rev = "027a98e53ad59699662d258ac22cd2095ae02aea" } zcash_address = { git = "https://github.com/zcash/librustzcash.git", rev = "9c1ed86c5aa8ae3b6d6dcc1478f2d6ba1264488f" } zcash_encoding = { git = "https://github.com/zcash/librustzcash.git", rev = "9c1ed86c5aa8ae3b6d6dcc1478f2d6ba1264488f" } zcash_history = { git = "https://github.com/zcash/librustzcash.git", rev = "9c1ed86c5aa8ae3b6d6dcc1478f2d6ba1264488f" } diff --git a/src/rust/src/incremental_merkle_tree.rs b/src/rust/src/incremental_merkle_tree.rs index ec2e31998..29d780122 100644 --- a/src/rust/src/incremental_merkle_tree.rs +++ b/src/rust/src/incremental_merkle_tree.rs @@ -5,7 +5,7 @@ use incrementalmerkletree::{ bridgetree::{BridgeTree, Checkpoint}, Hashable, }; -use zcash_encoding::Vector; +use zcash_encoding::{Optional, Vector}; use zcash_primitives::merkle_tree::{ incremental::{ read_bridge_v1, read_leu64_usize, read_position, write_bridge_v1, write_position, @@ -14,18 +14,14 @@ use zcash_primitives::merkle_tree::{ HashSer, }; -pub fn write_checkpoint_v1( - mut writer: W, - checkpoint: &Checkpoint, -) -> io::Result<()> { +pub fn write_checkpoint_v1(mut writer: W, checkpoint: &Checkpoint) -> io::Result<()> { write_usize_leu64(&mut writer, checkpoint.bridges_len())?; writer.write_u8(if checkpoint.is_witnessed() { 1 } else { 0 })?; Vector::write_sized( &mut writer, checkpoint.forgotten().iter(), - |mut w, ((pos, leaf_value), idx)| { + |mut w, (pos, idx)| { write_position(&mut w, *pos)?; - leaf_value.write(&mut w)?; write_usize_leu64(&mut w, *idx) }, )?; @@ -33,15 +29,12 @@ pub fn write_checkpoint_v1( Ok(()) } -pub fn read_checkpoint_v1(mut reader: R) -> io::Result> { +pub fn read_checkpoint_v1(mut reader: R) -> io::Result { Ok(Checkpoint::from_parts( read_leu64_usize(&mut reader)?, reader.read_u8()? == 1, Vector::read_collected(&mut reader, |mut r| { - Ok(( - (read_position(&mut r)?, H::read(&mut r)?), - read_leu64_usize(&mut r)?, - )) + Ok((read_position(&mut r)?, read_leu64_usize(&mut r)?)) })?, )) } @@ -50,13 +43,17 @@ pub fn write_tree_v1( mut writer: W, tree: &BridgeTree, ) -> io::Result<()> { - Vector::write(&mut writer, tree.bridges(), |w, b| write_bridge_v1(w, b))?; + Vector::write(&mut writer, tree.prior_bridges(), |w, b| { + write_bridge_v1(w, b) + })?; + Optional::write(&mut writer, tree.current_bridge().as_ref(), |w, b| { + write_bridge_v1(w, b) + })?; Vector::write_sized( &mut writer, tree.witnessed_indices().iter(), - |mut w, ((pos, a), i)| { + |mut w, (pos, i)| { write_position(&mut w, *pos)?; - a.write(&mut w)?; write_usize_leu64(&mut w, *i) }, )?; @@ -74,11 +71,9 @@ pub fn read_tree_v1( ) -> io::Result> { BridgeTree::from_parts( Vector::read(&mut reader, |r| read_bridge_v1(r))?, + Optional::read(&mut reader, |r| read_bridge_v1(r))?, Vector::read_collected(&mut reader, |mut r| { - Ok(( - (read_position(&mut r)?, H::read(&mut r)?), - read_leu64_usize(&mut r)?, - )) + Ok((read_position(&mut r)?, read_leu64_usize(&mut r)?)) })?, Vector::read(&mut reader, |r| read_checkpoint_v1(r))?, read_leu64_usize(&mut reader)?, diff --git a/src/rust/src/wallet.rs b/src/rust/src/wallet.rs index 33960fbd7..765390e53 100644 --- a/src/rust/src/wallet.rs +++ b/src/rust/src/wallet.rs @@ -559,8 +559,7 @@ impl Wallet { .and_then(|n| n.decrypted_notes.get(&action_idx)) .is_some() { - let (pos, cmx) = self.witness_tree.witness().expect("tree is not empty"); - assert_eq!(cmx, MerkleHashOrchard::from_cmx(action.cmx())); + let pos = self.witness_tree.witness().expect("tree is not empty"); self.wallet_note_positions .get_mut(txid) .expect("We created this above") @@ -653,12 +652,15 @@ impl Wallet { .and_then(|tx_notes| tx_notes.note_positions.get(&outpoint.action_idx)), ) .map(|(fvk, position)| { + assert_eq!( + self.witness_tree + .get_witnessed_leaf(*position) + .expect("tree has witnessed the leaf for this note."), + &MerkleHashOrchard::from_cmx(&dnote.note.commitment().into()), + ); let path = self .witness_tree - .authentication_path( - *position, - &MerkleHashOrchard::from_cmx(&dnote.note.commitment().into()), - ) + .authentication_path(*position) .expect("wallet always has paths to positioned notes"); OrchardSpendInfo::from_parts( fvk.clone(),