From f5040f201e0cdd78d22bfd1d9528a6b284d10f04 Mon Sep 17 00:00:00 2001 From: satan Date: Wed, 30 Nov 2022 14:22:20 +0100 Subject: [PATCH 1/2] [feat]: Removed MerkleValue type --- shared/src/ledger/queries/shell.rs | 4 ++-- shared/src/ledger/storage/merkle_tree.rs | 26 +++++++++++------------ shared/src/ledger/storage/mod.rs | 4 ++-- shared/src/ledger/storage/traits.rs | 27 ++++++++++-------------- shared/src/types/storage.rs | 21 ------------------ 5 files changed, 28 insertions(+), 54 deletions(-) diff --git a/shared/src/ledger/queries/shell.rs b/shared/src/ledger/queries/shell.rs index 4662381499..4e87eac5ab 100644 --- a/shared/src/ledger/queries/shell.rs +++ b/shared/src/ledger/queries/shell.rs @@ -207,7 +207,7 @@ where .storage .get_existence_proof( &storage_key, - value.clone().into(), + value.clone(), request.height, ) .into_storage_result()?; @@ -264,7 +264,7 @@ where for PrefixValue { key, value } in &data { let mut proof = ctx .storage - .get_existence_proof(key, value.clone().into(), request.height) + .get_existence_proof(key, value.clone(), request.height) .into_storage_result()?; ops.append(&mut proof.ops); } diff --git a/shared/src/ledger/storage/merkle_tree.rs b/shared/src/ledger/storage/merkle_tree.rs index 49afb3dcfc..e7f9a33703 100644 --- a/shared/src/ledger/storage/merkle_tree.rs +++ b/shared/src/ledger/storage/merkle_tree.rs @@ -22,8 +22,7 @@ use crate::tendermint::merkle::proof::{Proof, ProofOp}; use crate::types::address::{Address, InternalAddress}; use crate::types::hash::Hash; use crate::types::storage::{ - DbKeySeg, Error as StorageError, Key, MembershipProof, MerkleValue, - StringKey, TreeBytes, + DbKeySeg, Error as StorageError, Key, MembershipProof, StringKey, TreeBytes, }; #[allow(missing_docs)] @@ -52,6 +51,9 @@ pub enum Error { /// Result for functions that may fail type Result = std::result::Result; +/// Type alias for bytes to be put into the Merkle storage +pub(super) type StorageBytes = Vec; + /// Type aliases for the different merkle trees and backing stores pub type SmtStore = DefaultStore; pub type AmtStore = DefaultStore; @@ -278,9 +280,11 @@ impl MerkleTree { &mut self, store_type: &StoreType, key: &Key, - value: MerkleValue, + value: impl AsRef<[u8]>, ) -> Result<()> { - let sub_root = self.tree_mut(store_type).subtree_update(key, value)?; + let sub_root = self + .tree_mut(store_type) + .subtree_update(key, value.as_ref())?; // update the base tree with the updated sub root without hashing if *store_type != StoreType::Base { let base_key = H::hash(store_type.to_string()); @@ -296,13 +300,9 @@ impl MerkleTree { } /// Update the tree with the given key and value - pub fn update( - &mut self, - key: &Key, - value: impl Into, - ) -> Result<()> { + pub fn update(&mut self, key: &Key, value: impl AsRef<[u8]>) -> Result<()> { let (store_type, sub_key) = StoreType::sub_key(key)?; - self.update_tree(&store_type, &sub_key, value.into()) + self.update_tree(&store_type, &sub_key, value) } /// Delete the value corresponding to the given key @@ -335,7 +335,7 @@ impl MerkleTree { pub fn get_sub_tree_existence_proof( &self, keys: &[Key], - values: Vec, + values: Vec, ) -> Result { let first_key = keys.iter().next().ok_or_else(|| { Error::InvalidMerkleKey( @@ -675,7 +675,7 @@ mod test { let MembershipProof::ICS23(proof) = tree .get_sub_tree_existence_proof( std::array::from_ref(&ibc_key), - vec![ibc_val.clone().into()], + vec![ibc_val.clone()], ) .unwrap(); let proof = tree.get_tendermint_proof(&ibc_key, proof).unwrap(); @@ -730,7 +730,7 @@ mod test { let MembershipProof::ICS23(proof) = tree .get_sub_tree_existence_proof( std::array::from_ref(&pos_key), - vec![pos_val.clone().into()], + vec![pos_val.clone()], ) .unwrap(); let proof = tree.get_tendermint_proof(&pos_key, proof).unwrap(); diff --git a/shared/src/ledger/storage/mod.rs b/shared/src/ledger/storage/mod.rs index 571d33b4ab..233854d7e7 100644 --- a/shared/src/ledger/storage/mod.rs +++ b/shared/src/ledger/storage/mod.rs @@ -46,7 +46,7 @@ use crate::types::chain::{ChainId, CHAIN_ID_LENGTH}; use crate::types::storage::TxQueue; use crate::types::storage::{ BlockHash, BlockHeight, BlockResults, Epoch, Epochs, Header, Key, KeySeg, - MembershipProof, MerkleValue, TxIndex, BLOCK_HASH_LENGTH, + MembershipProof, TxIndex, BLOCK_HASH_LENGTH, }; use crate::types::time::DateTimeUtc; use crate::types::token; @@ -625,7 +625,7 @@ where pub fn get_existence_proof( &self, key: &Key, - value: MerkleValue, + value: Vec, height: BlockHeight, ) -> Result { if height >= self.get_block_height().0 { diff --git a/shared/src/ledger/storage/traits.rs b/shared/src/ledger/storage/traits.rs index e382f34d73..a488c58786 100644 --- a/shared/src/ledger/storage/traits.rs +++ b/shared/src/ledger/storage/traits.rs @@ -8,13 +8,12 @@ use arse_merkle_tree::{Key as TreeKey, H256}; use ics23::commitment_proof::Proof as Ics23Proof; use ics23::{CommitmentProof, ExistenceProof}; use sha2::{Digest, Sha256}; +use crate::ledger::storage::merkle_tree::StorageBytes; use super::merkle_tree::{Amt, Error, Smt}; use super::{ics23_specs, IBC_KEY_LIMIT}; use crate::types::hash::Hash; -use crate::types::storage::{ - Key, MembershipProof, MerkleValue, StringKey, TreeBytes, -}; +use crate::types::storage::{Key, MembershipProof, StringKey, TreeBytes}; /// Trait for reading from a merkle tree that is a sub-tree /// of the global merkle tree. @@ -25,7 +24,7 @@ pub trait SubTreeRead { fn subtree_membership_proof( &self, keys: &[Key], - values: Vec, + values: Vec, ) -> Result; } @@ -36,7 +35,7 @@ pub trait SubTreeWrite { fn subtree_update( &mut self, key: &Key, - value: MerkleValue, + value: &[u8], ) -> Result; /// Delete a key from the sub-tree fn subtree_delete(&mut self, key: &Key) -> Result; @@ -53,13 +52,13 @@ impl<'a, H: StorageHasher + Default> SubTreeRead for &'a Smt { fn subtree_membership_proof( &self, keys: &[Key], - mut values: Vec, + mut values: Vec, ) -> Result { if keys.len() != 1 || values.len() != 1 { return Err(Error::Ics23MultiLeaf); } let key: &Key = &keys[0]; - let MerkleValue::Bytes(value) = values.remove(0); + let value = values.remove(0); let cp = self.membership_proof(&H::hash(key.to_string()).into())?; // Replace the values and the leaf op for the verification match cp.proof.expect("The proof should exist") { @@ -82,11 +81,9 @@ impl<'a, H: StorageHasher + Default> SubTreeWrite for &'a mut Smt { fn subtree_update( &mut self, key: &Key, - value: MerkleValue, + value: &[u8], ) -> Result { - let value = match value { - MerkleValue::Bytes(bytes) => H::hash(bytes.as_slice()), - }; + let value = H::hash(value); self.update(H::hash(key.to_string()).into(), value.into()) .map(Hash::from) .map_err(|err| Error::MerkleTree(err.to_string())) @@ -112,7 +109,7 @@ impl<'a, H: StorageHasher + Default> SubTreeRead for &'a Amt { fn subtree_membership_proof( &self, keys: &[Key], - _: Vec, + _: Vec, ) -> Result { if keys.len() != 1 { return Err(Error::Ics23MultiLeaf); @@ -139,12 +136,10 @@ impl<'a, H: StorageHasher + Default> SubTreeWrite for &'a mut Amt { fn subtree_update( &mut self, key: &Key, - value: MerkleValue, + value: &[u8], ) -> Result { let key = StringKey::try_from_bytes(key.to_string().as_bytes())?; - let value = match value { - MerkleValue::Bytes(bytes) => TreeBytes::from(bytes), - }; + let value = TreeBytes::from(value.as_ref().to_owned()); self.update(key, value) .map(Into::into) .map_err(|err| Error::MerkleTree(err.to_string())) diff --git a/shared/src/types/storage.rs b/shared/src/types/storage.rs index bec847e8aa..a96032086a 100644 --- a/shared/src/types/storage.rs +++ b/shared/src/types/storage.rs @@ -356,27 +356,6 @@ impl FromStr for Key { } } -/// An enum representing the different types of values -/// that can be passed into Anoma's storage. -/// -/// This is a multi-store organized as -/// several Merkle trees, each of which is -/// responsible for understanding how to parse -/// this value. -pub enum MerkleValue { - /// raw bytes - Bytes(Vec), -} - -impl From for MerkleValue -where - T: AsRef<[u8]>, -{ - fn from(bytes: T) -> Self { - Self::Bytes(bytes.as_ref().to_owned()) - } -} - /// Storage keys that are utf8 encoded strings #[derive(Eq, PartialEq, Copy, Clone, Hash)] pub struct StringKey { From 7b50cac9ce29a0696eeee12438aa77cb83b45784 Mon Sep 17 00:00:00 2001 From: satan Date: Thu, 1 Dec 2022 10:37:41 +0100 Subject: [PATCH 2/2] [fix]: Changed Vec to &[u8] for getting merkle proofs --- shared/src/ledger/queries/shell.rs | 8 ++------ shared/src/ledger/storage/merkle_tree.rs | 6 +++--- shared/src/ledger/storage/mod.rs | 4 ++-- shared/src/ledger/storage/traits.rs | 10 +++++----- 4 files changed, 12 insertions(+), 16 deletions(-) diff --git a/shared/src/ledger/queries/shell.rs b/shared/src/ledger/queries/shell.rs index 4e87eac5ab..d973180541 100644 --- a/shared/src/ledger/queries/shell.rs +++ b/shared/src/ledger/queries/shell.rs @@ -205,11 +205,7 @@ where let proof = if request.prove { let proof = ctx .storage - .get_existence_proof( - &storage_key, - value.clone(), - request.height, - ) + .get_existence_proof(&storage_key, &value, request.height) .into_storage_result()?; Some(proof) } else { @@ -264,7 +260,7 @@ where for PrefixValue { key, value } in &data { let mut proof = ctx .storage - .get_existence_proof(key, value.clone(), request.height) + .get_existence_proof(key, value, request.height) .into_storage_result()?; ops.append(&mut proof.ops); } diff --git a/shared/src/ledger/storage/merkle_tree.rs b/shared/src/ledger/storage/merkle_tree.rs index e7f9a33703..bd26259a41 100644 --- a/shared/src/ledger/storage/merkle_tree.rs +++ b/shared/src/ledger/storage/merkle_tree.rs @@ -52,7 +52,7 @@ pub enum Error { type Result = std::result::Result; /// Type alias for bytes to be put into the Merkle storage -pub(super) type StorageBytes = Vec; +pub(super) type StorageBytes<'a> = &'a [u8]; /// Type aliases for the different merkle trees and backing stores pub type SmtStore = DefaultStore; @@ -675,7 +675,7 @@ mod test { let MembershipProof::ICS23(proof) = tree .get_sub_tree_existence_proof( std::array::from_ref(&ibc_key), - vec![ibc_val.clone()], + vec![&ibc_val], ) .unwrap(); let proof = tree.get_tendermint_proof(&ibc_key, proof).unwrap(); @@ -730,7 +730,7 @@ mod test { let MembershipProof::ICS23(proof) = tree .get_sub_tree_existence_proof( std::array::from_ref(&pos_key), - vec![pos_val.clone()], + vec![&pos_val], ) .unwrap(); let proof = tree.get_tendermint_proof(&pos_key, proof).unwrap(); diff --git a/shared/src/ledger/storage/mod.rs b/shared/src/ledger/storage/mod.rs index 233854d7e7..87cb49ec75 100644 --- a/shared/src/ledger/storage/mod.rs +++ b/shared/src/ledger/storage/mod.rs @@ -31,7 +31,7 @@ use super::storage_api::{ResultExt, StorageRead, StorageWrite}; use crate::ledger::gas::MIN_STORAGE_GAS; use crate::ledger::parameters::EpochDuration; use crate::ledger::storage::merkle_tree::{ - Error as MerkleTreeError, MerkleRoot, + Error as MerkleTreeError, MerkleRoot, StorageBytes, }; pub use crate::ledger::storage::merkle_tree::{ MerkleTree, MerkleTreeStoresRead, MerkleTreeStoresWrite, StoreType, @@ -625,7 +625,7 @@ where pub fn get_existence_proof( &self, key: &Key, - value: Vec, + value: StorageBytes, height: BlockHeight, ) -> Result { if height >= self.get_block_height().0 { diff --git a/shared/src/ledger/storage/traits.rs b/shared/src/ledger/storage/traits.rs index a488c58786..dfb820a96b 100644 --- a/shared/src/ledger/storage/traits.rs +++ b/shared/src/ledger/storage/traits.rs @@ -8,10 +8,10 @@ use arse_merkle_tree::{Key as TreeKey, H256}; use ics23::commitment_proof::Proof as Ics23Proof; use ics23::{CommitmentProof, ExistenceProof}; use sha2::{Digest, Sha256}; -use crate::ledger::storage::merkle_tree::StorageBytes; use super::merkle_tree::{Amt, Error, Smt}; use super::{ics23_specs, IBC_KEY_LIMIT}; +use crate::ledger::storage::merkle_tree::StorageBytes; use crate::types::hash::Hash; use crate::types::storage::{Key, MembershipProof, StringKey, TreeBytes}; @@ -35,7 +35,7 @@ pub trait SubTreeWrite { fn subtree_update( &mut self, key: &Key, - value: &[u8], + value: StorageBytes, ) -> Result; /// Delete a key from the sub-tree fn subtree_delete(&mut self, key: &Key) -> Result; @@ -65,7 +65,7 @@ impl<'a, H: StorageHasher + Default> SubTreeRead for &'a Smt { Ics23Proof::Exist(ep) => Ok(CommitmentProof { proof: Some(Ics23Proof::Exist(ExistenceProof { key: key.to_string().as_bytes().to_vec(), - value, + value: value.to_vec(), leaf: Some(ics23_specs::leaf_spec::()), ..ep })), @@ -81,7 +81,7 @@ impl<'a, H: StorageHasher + Default> SubTreeWrite for &'a mut Smt { fn subtree_update( &mut self, key: &Key, - value: &[u8], + value: StorageBytes, ) -> Result { let value = H::hash(value); self.update(H::hash(key.to_string()).into(), value.into()) @@ -136,7 +136,7 @@ impl<'a, H: StorageHasher + Default> SubTreeWrite for &'a mut Amt { fn subtree_update( &mut self, key: &Key, - value: &[u8], + value: StorageBytes, ) -> Result { let key = StringKey::try_from_bytes(key.to_string().as_bytes())?; let value = TreeBytes::from(value.as_ref().to_owned());