From b67aacd5cf62a4021fb2448aecb4234e2c563e3f Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 15:06:05 +0200 Subject: [PATCH 01/52] [feat]: Updated bridge pool vp with the the new merklized storage --- .../src/ledger/eth_bridge/bridge_pool_vp.rs | 63 +++++++------------ .../ledger/eth_bridge/storage/bridge_pool.rs | 13 +--- shared/src/types/storage.rs | 17 +++++ 3 files changed, 42 insertions(+), 51 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index b7b8cf1cf2..5d6f4d7177 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -14,16 +14,15 @@ use std::collections::{BTreeSet, HashSet}; use borsh::BorshDeserialize; use eyre::eyre; -use crate::ledger::eth_bridge::storage::bridge_pool::{ - get_pending_key, is_protected_storage, BRIDGE_POOL_ADDRESS, -}; +use crate::ledger::eth_bridge::storage::bridge_pool::{get_pending_key, is_protected_storage, BRIDGE_POOL_ADDRESS, is_bridge_pool_key}; use crate::ledger::native_vp::{Ctx, NativeVp, StorageReader}; use crate::ledger::storage::traits::StorageHasher; use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::storage::Key; +use crate::types::keccak::encode::Encode; +use crate::types::storage::{Key, KeySeg}; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; @@ -115,43 +114,27 @@ where } }; - // check that only the pending_key value is changed - if keys_changed.iter().any(is_protected_storage) { - tracing::debug!( - "Rejecting transaction as it is attempting to change the \ - bridge pool storage other than the pending transaction pool" - ); - return Ok(false); + let pending_key = get_pending_key(&transfer); + for key in keys_changed.iter().filter(is_bridge_pool_key) { + if key != pending_key { + tracing::debug!( + "Rejecting transaction as it is attempting to change an incorrect \ + key in the pending transaction pool." + ); + return Ok(false); + } } - // check that the pending transfer (and only that) was added to the pool - // TODO: This will change slightly when we merkelize the pool, - // but that will be a separate PR. - let pending_key = get_pending_key(); - let pending_pre: HashSet = - (&self.ctx).read_pre_value(&pending_key)?.ok_or(eyre!( - "The bridge pool transfers are missing from storage" - ))?; - let pending_post: HashSet = + let pending: PendingTransfer = (&self.ctx).read_post_value(&pending_key)?.ok_or(eyre!( - "The bridge pool transfers are missing from storage" - ))?; - if !pending_post.contains(&transfer) { - tracing::debug!( "Rejecting transaction as the transfer wasn't added to the \ pending transfers" + ))?; + if pending != transfer { + tracing::debug!( + "An incorrect transfer was added to the pool." ); return Ok(false); } - for item in pending_pre.symmetric_difference(&pending_post) { - if item != &transfer { - tracing::debug!( - ?item, - "Rejecting transaction as an unrecognized item was added \ - to the pending transfers" - ); - return Ok(false); - } - } // check that gas fees were put into escrow @@ -228,8 +211,8 @@ mod test_bridge_pool_vp { } /// The bridge pool at the beginning of all tests - fn initial_pool() -> HashSet { - let transfer = PendingTransfer { + fn initial_pool() -> PendingTransfer { + PendingTransfer { transfer: TransferToEthereum { asset: EthAddress([0; 20]), recipient: EthAddress([0; 20]), @@ -240,9 +223,7 @@ mod test_bridge_pool_vp { amount: 0.into(), payer: bertha_address(), }, - }; - - HashSet::::from([transfer]) + } } /// Create a new storage @@ -252,9 +233,9 @@ mod test_bridge_pool_vp { writelog .write(&get_signed_root_key(), Hash([0; 32]).try_to_vec().unwrap()) .unwrap(); - + let transfer = initial_pool(); writelog - .write(&get_pending_key(), initial_pool().try_to_vec().unwrap()) + .write(&get_pending_key(&transfer), transfer.try_to_vec().unwrap()) .unwrap(); let escrow_key = balance_key(&xan(), &BRIDGE_POOL_ADDRESS); let amount: Amount = ESCROWED_AMOUNT.into(); diff --git a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs index f900efb595..47e4f62a66 100644 --- a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs @@ -11,7 +11,7 @@ use crate::types::eth_bridge_pool::PendingTransfer; use crate::types::hash::Hash; use crate::types::keccak::encode::Encode; use crate::types::keccak::{keccak_hash, KeccakHash}; -use crate::types::storage::{DbKeySeg, Key}; +use crate::types::storage::{DbKeySeg, Key, KeySeg}; /// The main address of the Ethereum bridge pool pub const BRIDGE_POOL_ADDRESS: Address = @@ -27,11 +27,11 @@ const SIGNED_ROOT_SEG: &str = "signed_root"; pub struct Error(#[from] eyre::Error); /// Get the storage key for the transfers in the pool -pub fn get_pending_key() -> Key { +pub fn get_pending_key(transfer: &PendingTransfer) -> Key { Key { segments: vec![ DbKeySeg::AddressSeg(BRIDGE_POOL_ADDRESS), - DbKeySeg::StringSeg(PENDING_TRANSFERS_SEG.into()), + transfer.keccak256().to_db_key(), ], } } @@ -52,13 +52,6 @@ pub fn is_bridge_pool_key(key: &Key) -> bool { matches!(&key.segments[0], DbKeySeg::AddressSeg(addr) if addr == &BRIDGE_POOL_ADDRESS) } -/// Check if a key belongs to the bridge pool but is not -/// the key for the pending transaction pool. Such keys -/// may not be modified via transactions. -pub fn is_protected_storage(key: &Key) -> bool { - is_bridge_pool_key(key) && *key != get_pending_key() -} - /// A simple Merkle tree for the Ethereum bridge pool #[derive( Debug, Default, Clone, BorshSerialize, BorshDeserialize, BorshSchema, diff --git a/shared/src/types/storage.rs b/shared/src/types/storage.rs index db7cada8ec..08ee160662 100644 --- a/shared/src/types/storage.rs +++ b/shared/src/types/storage.rs @@ -20,6 +20,7 @@ use crate::ledger::storage::IBC_KEY_LIMIT; use crate::types::address::{self, Address}; use crate::types::eth_bridge_pool::PendingTransfer; use crate::types::hash::Hash; +use crate::types::keccak::KeccakHash; use crate::types::time::DateTimeUtc; #[allow(missing_docs)] @@ -640,6 +641,22 @@ impl KeySeg for Hash { } } +impl KeySeg for KeccakHash { + fn parse(seg: String) -> Result { + seg.clone() + .try_into() + .map_err(|_| Error::ParseError(seg, "Hash".into())) + } + + fn raw(&self) -> String { + self.to_string() + } + + fn to_db_key(&self) -> DbKeySeg { + DbKeySeg::StringSeg(self.raw()) + } +} + /// Epoch identifier. Epochs are identified by consecutive numbers. #[derive( Clone, From acbb77e42c2a2682b59aa2babb759f81d93b7ab7 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 17:25:52 +0200 Subject: [PATCH 02/52] [feat]: Changed the bridge pool vp to used the merklized storage --- apps/src/lib/node/ledger/protocol/mod.rs | 3 +- .../transactions/ethereum_events/events.rs | 3 +- .../transactions/ethereum_events/mod.rs | 5 +- .../transactions/ethereum_events/read.rs | 3 +- .../transactions/ethereum_events/update.rs | 3 +- apps/src/lib/node/ledger/shell/mod.rs | 8 +- .../lib/node/ledger/shell/prepare_proposal.rs | 3 +- .../shell/vote_extensions/eth_events.rs | 3 +- .../shell/vote_extensions/val_set_update.rs | 3 +- apps/src/lib/node/ledger/storage/mod.rs | 3 +- apps/src/lib/node/ledger/storage/rocksdb.rs | 3 +- .../src/ledger/eth_bridge/bridge_pool_vp.rs | 210 ++++++++++------- .../ledger/eth_bridge/storage/bridge_pool.rs | 223 ++++++++++-------- shared/src/ledger/storage/merkle_tree.rs | 18 +- shared/src/ledger/storage/mod.rs | 10 +- shared/src/types/eth_bridge_pool.rs | 6 +- tests/src/native_vp/pos.rs | 3 +- 17 files changed, 302 insertions(+), 208 deletions(-) diff --git a/apps/src/lib/node/ledger/protocol/mod.rs b/apps/src/lib/node/ledger/protocol/mod.rs index 35ca06fc60..9ffc1cd367 100644 --- a/apps/src/lib/node/ledger/protocol/mod.rs +++ b/apps/src/lib/node/ledger/protocol/mod.rs @@ -12,8 +12,9 @@ use namada::ledger::ibc::vp::{Ibc, IbcToken}; use namada::ledger::native_vp::{self, NativeVp}; use namada::ledger::parameters::{self, ParametersVp}; use namada::ledger::pos::{self, PosVP}; +use namada::ledger::storage::traits::StorageHasher; use namada::ledger::storage::write_log::WriteLog; -use namada::ledger::storage::{DB, DBIter, Storage, traits::StorageHasher}; +use namada::ledger::storage::{DBIter, Storage, DB}; use namada::ledger::treasury::TreasuryVp; use namada::proto::{self, Tx}; use namada::types::address::{Address, InternalAddress}; diff --git a/apps/src/lib/node/ledger/protocol/transactions/ethereum_events/events.rs b/apps/src/lib/node/ledger/protocol/transactions/ethereum_events/events.rs index 2564830a2c..b639a01fd2 100644 --- a/apps/src/lib/node/ledger/protocol/transactions/ethereum_events/events.rs +++ b/apps/src/lib/node/ledger/protocol/transactions/ethereum_events/events.rs @@ -4,7 +4,8 @@ use std::collections::BTreeSet; use eyre::Result; use namada::ledger::eth_bridge::storage::wrapped_erc20s; -use namada::ledger::storage::{DBIter, Storage, StorageHasher, DB}; +use namada::ledger::storage::traits::StorageHasher; +use namada::ledger::storage::{DBIter, Storage, DB}; use namada::types::ethereum_events::{EthereumEvent, TransferToNamada}; use namada::types::storage::Key; diff --git a/apps/src/lib/node/ledger/protocol/transactions/ethereum_events/mod.rs b/apps/src/lib/node/ledger/protocol/transactions/ethereum_events/mod.rs index a9b24deb39..8d9ea01eff 100644 --- a/apps/src/lib/node/ledger/protocol/transactions/ethereum_events/mod.rs +++ b/apps/src/lib/node/ledger/protocol/transactions/ethereum_events/mod.rs @@ -14,7 +14,8 @@ use eth_msgs::{EthMsg, EthMsgUpdate}; use eyre::{eyre, Result}; use namada::ledger::eth_bridge::storage::eth_msgs::Keys; use namada::ledger::pos::types::WeightedValidator; -use namada::ledger::storage::{DBIter, Storage, StorageHasher, DB}; +use namada::ledger::storage::traits::StorageHasher; +use namada::ledger::storage::{DBIter, Storage, DB}; use namada::types::address::Address; use namada::types::ethereum_events::EthereumEvent; use namada::types::storage::{self, BlockHeight}; @@ -306,7 +307,7 @@ mod tests { use namada::ledger::pos::types::ValidatorSet; use namada::ledger::storage::mockdb::MockDB; use namada::ledger::storage::testing::TestStorage; - use namada::ledger::storage::Sha256Hasher; + use namada::ledger::storage::traits::Sha256Hasher; use namada::types::address; use namada::types::ethereum_events::testing::{ arbitrary_amount, arbitrary_eth_address, arbitrary_nonce, diff --git a/apps/src/lib/node/ledger/protocol/transactions/ethereum_events/read.rs b/apps/src/lib/node/ledger/protocol/transactions/ethereum_events/read.rs index 5f377f8133..90cc960509 100644 --- a/apps/src/lib/node/ledger/protocol/transactions/ethereum_events/read.rs +++ b/apps/src/lib/node/ledger/protocol/transactions/ethereum_events/read.rs @@ -1,7 +1,8 @@ //! Helpers for reading from storage use borsh::BorshDeserialize; use eyre::{eyre, Result}; -use namada::ledger::storage::{DBIter, Storage, StorageHasher, DB}; +use namada::ledger::storage::traits::StorageHasher; +use namada::ledger::storage::{DBIter, Storage, DB}; use namada::types::storage; use namada::types::token::Amount; diff --git a/apps/src/lib/node/ledger/protocol/transactions/ethereum_events/update.rs b/apps/src/lib/node/ledger/protocol/transactions/ethereum_events/update.rs index d6aebac3b6..092dada10a 100644 --- a/apps/src/lib/node/ledger/protocol/transactions/ethereum_events/update.rs +++ b/apps/src/lib/node/ledger/protocol/transactions/ethereum_events/update.rs @@ -1,7 +1,8 @@ //! Helpers for writing to storage use borsh::{BorshDeserialize, BorshSerialize}; use eyre::Result; -use namada::ledger::storage::{DBIter, Storage, StorageHasher, DB}; +use namada::ledger::storage::traits::StorageHasher; +use namada::ledger::storage::{DBIter, Storage, DB}; use namada::types::storage; use namada::types::token::Amount; diff --git a/apps/src/lib/node/ledger/shell/mod.rs b/apps/src/lib/node/ledger/shell/mod.rs index 1f179c0db9..2936cf4db9 100644 --- a/apps/src/lib/node/ledger/shell/mod.rs +++ b/apps/src/lib/node/ledger/shell/mod.rs @@ -26,10 +26,9 @@ use namada::ledger::pos::namada_proof_of_stake::types::{ ActiveValidator, ValidatorSetUpdate, }; use namada::ledger::pos::namada_proof_of_stake::PosBase; +use namada::ledger::storage::traits::{Sha256Hasher, StorageHasher}; use namada::ledger::storage::write_log::WriteLog; -use namada::ledger::storage::{ - DBIter, traits::Sha256Hasher, Storage, traits::StorageHasher, DB, -}; +use namada::ledger::storage::{DBIter, Storage, DB}; use namada::ledger::{ibc, parameters, pos}; use namada::proto::{self, Tx}; use namada::types::chain::ChainId; @@ -760,7 +759,8 @@ mod test_utils { #[cfg(not(feature = "abcipp"))] use namada::ledger::pos::namada_proof_of_stake::types::VotingPower; use namada::ledger::storage::mockdb::MockDB; - use namada::ledger::storage::{BlockStateWrite, MerkleTree, traits::Sha256Hasher}; + use namada::ledger::storage::traits::Sha256Hasher; + use namada::ledger::storage::{BlockStateWrite, MerkleTree}; use namada::types::address::{xan, EstablishedAddressGen}; use namada::types::chain::ChainId; use namada::types::hash::Hash; diff --git a/apps/src/lib/node/ledger/shell/prepare_proposal.rs b/apps/src/lib/node/ledger/shell/prepare_proposal.rs index 6880bd0598..521c704dca 100644 --- a/apps/src/lib/node/ledger/shell/prepare_proposal.rs +++ b/apps/src/lib/node/ledger/shell/prepare_proposal.rs @@ -1,6 +1,7 @@ //! Implementation of the [`RequestPrepareProposal`] ABCI++ method for the Shell -use namada::ledger::storage::{DB, DBIter, traits::StorageHasher}; +use namada::ledger::storage::traits::StorageHasher; +use namada::ledger::storage::{DBIter, DB}; use namada::proto::Tx; use namada::types::storage::BlockHeight; use namada::types::transaction::tx_types::TxType; diff --git a/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs b/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs index 2ced18ae08..f1caae112a 100644 --- a/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs +++ b/apps/src/lib/node/ledger/shell/vote_extensions/eth_events.rs @@ -3,7 +3,8 @@ use std::collections::{BTreeMap, HashMap, HashSet}; use namada::ledger::pos::namada_proof_of_stake::types::VotingPower; -use namada::ledger::storage::{DB, DBIter, traits::StorageHasher}; +use namada::ledger::storage::traits::StorageHasher; +use namada::ledger::storage::{DBIter, DB}; use namada::proto::Signed; use namada::types::ethereum_events::EthereumEvent; use namada::types::storage::BlockHeight; diff --git a/apps/src/lib/node/ledger/shell/vote_extensions/val_set_update.rs b/apps/src/lib/node/ledger/shell/vote_extensions/val_set_update.rs index 91d581337f..542bf6b81f 100644 --- a/apps/src/lib/node/ledger/shell/vote_extensions/val_set_update.rs +++ b/apps/src/lib/node/ledger/shell/vote_extensions/val_set_update.rs @@ -4,7 +4,8 @@ use std::collections::HashMap; use namada::ledger::pos::types::VotingPower; -use namada::ledger::storage::{DB, DBIter, traits::StorageHasher}; +use namada::ledger::storage::traits::StorageHasher; +use namada::ledger::storage::{DBIter, DB}; use namada::types::storage::BlockHeight; use namada::types::vote_extensions::validator_set_update; #[cfg(feature = "abcipp")] diff --git a/apps/src/lib/node/ledger/storage/mod.rs b/apps/src/lib/node/ledger/storage/mod.rs index 8017c6b7e4..373da98d5a 100644 --- a/apps/src/lib/node/ledger/storage/mod.rs +++ b/apps/src/lib/node/ledger/storage/mod.rs @@ -9,7 +9,8 @@ use arse_merkle_tree::blake2b::Blake2bHasher; use arse_merkle_tree::traits::Hasher; use arse_merkle_tree::H256; use blake2b_rs::{Blake2b, Blake2bBuilder}; -use namada::ledger::storage::{Storage, traits::StorageHasher}; +use namada::ledger::storage::traits::StorageHasher; +use namada::ledger::storage::Storage; #[derive(Default)] pub struct PersistentStorageHasher(Blake2bHasher); diff --git a/apps/src/lib/node/ledger/storage/rocksdb.rs b/apps/src/lib/node/ledger/storage/rocksdb.rs index 128900240c..069b6ed0a7 100644 --- a/apps/src/lib/node/ledger/storage/rocksdb.rs +++ b/apps/src/lib/node/ledger/storage/rocksdb.rs @@ -930,7 +930,8 @@ mod imp { #[cfg(test)] mod test { - use namada::ledger::storage::{MerkleTree, traits::Sha256Hasher}; + use namada::ledger::storage::traits::Sha256Hasher; + use namada::ledger::storage::MerkleTree; use namada::types::address::EstablishedAddressGen; use namada::types::storage::{BlockHash, Epoch, Epochs}; use tempfile::tempdir; diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 5d6f4d7177..d347755e76 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -9,20 +9,21 @@ //! This VP checks that additions to the pool are handled //! correctly. This means that the appropriate data is //! added to the pool and gas fees are submitted appropriately. -use std::collections::{BTreeSet, HashSet}; +use std::collections::BTreeSet; use borsh::BorshDeserialize; use eyre::eyre; -use crate::ledger::eth_bridge::storage::bridge_pool::{get_pending_key, is_protected_storage, BRIDGE_POOL_ADDRESS, is_bridge_pool_key}; +use crate::ledger::eth_bridge::storage::bridge_pool::{ + get_pending_key, is_bridge_pool_key, BRIDGE_POOL_ADDRESS, +}; use crate::ledger::native_vp::{Ctx, NativeVp, StorageReader}; use crate::ledger::storage::traits::StorageHasher; use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::keccak::encode::Encode; -use crate::types::storage::{Key, KeySeg}; +use crate::types::storage::Key; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; @@ -115,11 +116,11 @@ where }; let pending_key = get_pending_key(&transfer); - for key in keys_changed.iter().filter(is_bridge_pool_key) { - if key != pending_key { + for key in keys_changed.iter().filter(|k| is_bridge_pool_key(k)) { + if *key != pending_key { tracing::debug!( - "Rejecting transaction as it is attempting to change an incorrect \ - key in the pending transaction pool." + "Rejecting transaction as it is attempting to change an \ + incorrect key in the pending transaction pool." ); return Ok(false); } @@ -130,9 +131,7 @@ where pending transfers" ))?; if pending != transfer { - tracing::debug!( - "An incorrect transfer was added to the pool." - ); + tracing::debug!("An incorrect transfer was added to the pool."); return Ok(false); } @@ -268,19 +267,21 @@ mod test_bridge_pool_vp { ) } + enum Expect { + True, + False, + Error, + } + /// Helper function that tests various ways gas can be escrowed, /// either correctly or incorrectly, is handled appropriately fn assert_bridge_pool( payer_delta: SignedAmount, escrow_delta: SignedAmount, insert_transfer: F, - keys_changed: BTreeSet, - expect: bool, + expect: Expect, ) where - F: FnOnce( - PendingTransfer, - HashSet, - ) -> HashSet, + F: FnOnce(PendingTransfer, &mut WriteLog) -> BTreeSet, { // setup let mut write_log = new_writelog(); @@ -336,10 +337,7 @@ mod test_bridge_pool_vp { .expect("Test failed"); // add transfer to pool - let pool = insert_transfer(transfer.clone(), initial_pool()); - write_log - .write(&get_pending_key(), pool.try_to_vec().expect("Test failed")) - .expect("Test failed"); + let keys_changed = insert_transfer(transfer.clone(), &mut write_log); // create the data to be given to the vp let vp = BridgePoolVp { @@ -356,10 +354,12 @@ mod test_bridge_pool_vp { .expect("Test failed"); let verifiers = BTreeSet::default(); - let res = vp - .validate_tx(&signed, &keys_changed, &verifiers) - .expect("Test failed"); - assert_eq!(res, expect); + let res = vp.validate_tx(&signed, &keys_changed, &verifiers); + match expect { + Expect::True => assert!(res.expect("Test failed")), + Expect::False => assert!(!res.expect("Test failed")), + Expect::Error => assert!(res.is_err()), + } } /// Test adding a transfer to the pool and escrowing gas passes vp @@ -368,13 +368,15 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - true, + Expect::True, ); } @@ -385,13 +387,15 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(10.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::False, ); } @@ -402,13 +406,15 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Positive(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::False, ); } @@ -419,13 +425,15 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(10.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::False, ); } @@ -436,58 +444,83 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Negative(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::False, ); } - /// Test that if a transaction is removed from - /// the pool, the tx is rejected. + /// Test that if the transfer was not added to the + /// pool, the vp rejects #[test] - fn test_remove_transfer_rejected() { + fn test_not_adding_transfer_rejected() { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, _pool| HashSet::from([transfer]), - BTreeSet::default(), - false, + |transfer, _| BTreeSet::from([get_pending_key(&transfer)]), + Expect::Error, ); } - /// Test that if the transfer was not added to the - /// pool, the vp rejects + /// Test that if the wrong transaction was added + /// to the pool, it is rejected. #[test] - fn test_not_adding_transfer_rejected() { + fn test_add_wrong_transfer() { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |_transfer, pool| pool, - BTreeSet::default(), - false, + |transfer, log| { + let t = PendingTransfer { + transfer: TransferToEthereum { + asset: EthAddress([0; 20]), + recipient: EthAddress([1; 20]), + amount: 100.into(), + nonce: 10u64.into(), + }, + gas_fee: GasFee { + amount: GAS_FEE.into(), + payer: bertha_address(), + }, + }; + log.write(&get_pending_key(&transfer), t.try_to_vec().unwrap()) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) + }, + Expect::False, ); } /// Test that if the wrong transaction was added /// to the pool, it is rejected. #[test] - fn test_add_wrong_transfer() { + fn test_add_wrong_key() { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |_transfer, pool| { - let mut pool = pool; - let wrong_transfer = - initial_pool().into_iter().next().expect("Test failed"); - pool.insert(wrong_transfer); - pool + |transfer, log| { + let t = PendingTransfer { + transfer: TransferToEthereum { + asset: EthAddress([0; 20]), + recipient: EthAddress([1; 20]), + amount: 100.into(), + nonce: 10u64.into(), + }, + gas_fee: GasFee { + amount: GAS_FEE.into(), + payer: bertha_address(), + }, + }; + log.write(&get_pending_key(&t), transfer.try_to_vec().unwrap()) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::Error, ); } @@ -498,13 +531,18 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([ + get_pending_key(&transfer), + get_signed_root_key(), + ]) }, - BTreeSet::from([get_signed_root_key()]), - false, + Expect::False, ); } @@ -535,11 +573,11 @@ mod test_bridge_pool_vp { }, }; - // add transfer to pool - let mut pool = initial_pool(); - pool.insert(transfer.clone()); write_log - .write(&get_pending_key(), pool.try_to_vec().expect("Test failed")) + .write( + &get_pending_key(&transfer), + transfer.try_to_vec().expect("Test failed"), + ) .expect("Test failed"); // create the data to be given to the vp diff --git a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs index 47e4f62a66..c0ccf75f68 100644 --- a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs @@ -16,8 +16,6 @@ use crate::types::storage::{DbKeySeg, Key, KeySeg}; /// The main address of the Ethereum bridge pool pub const BRIDGE_POOL_ADDRESS: Address = Address::Internal(InternalAddress::EthBridgePool); -/// Sub-segmnet for getting the contents of the pool -const PENDING_TRANSFERS_SEG: &str = "pending_transfers"; /// Sub-segment for getting the latest signed const SIGNED_ROOT_SEG: &str = "signed_root"; @@ -150,7 +148,10 @@ impl BridgePoolTree { for (key, value) in keys.iter().zip(values.iter()) { let hash = Self::parse_key(key)?; if hash != value.keccak256() { - return Err(eyre!("Hashes of keys did not match hashes of values.").into()); + return Err(eyre!( + "Hashes of keys did not match hashes of values." + ) + .into()); } leaves.insert(hash); } @@ -351,8 +352,8 @@ mod test_bridge_pool_tree { use proptest::prelude::*; use super::*; - use crate::types::ethereum_events::EthAddress; use crate::types::eth_bridge_pool::{GasFee, TransferToEthereum}; + use crate::types::ethereum_events::EthAddress; /// An established user address for testing & development fn bertha_address() -> Address { @@ -368,7 +369,7 @@ mod test_bridge_pool_tree { assert_eq!(tree.root().0, [0; 32]); let transfer = PendingTransfer { transfer: TransferToEthereum { - asset: EthAddress([1;20]), + asset: EthAddress([1; 20]), recipient: EthAddress([2; 20]), amount: 1.into(), nonce: 42u64.into(), @@ -376,10 +377,11 @@ mod test_bridge_pool_tree { gas_fee: GasFee { amount: 0.into(), payer: bertha_address(), - } + }, }; let key = Key::from(&transfer); - let root = KeccakHash::from(tree.update_key(&key).expect("Test failed")); + let root = + KeccakHash::from(tree.update_key(&key).expect("Test failed")); assert_eq!(root, transfer.keccak256()); } @@ -390,21 +392,23 @@ mod test_bridge_pool_tree { for i in 0..2 { let transfer = PendingTransfer { transfer: TransferToEthereum { - asset: EthAddress([i;20]), - recipient: EthAddress([i+1; 20]), + asset: EthAddress([i; 20]), + recipient: EthAddress([i + 1; 20]), amount: (i as u64).into(), nonce: 42u64.into(), }, gas_fee: GasFee { amount: 0.into(), payer: bertha_address(), - } + }, }; let key = Key::from(&transfer); transfers.push(transfer); let _ = tree.update_key(&key).expect("Test failed"); } - let expected: Hash = hash_pair(transfers[0].keccak256(), transfers[1].keccak256()).into(); + let expected: Hash = + hash_pair(transfers[0].keccak256(), transfers[1].keccak256()) + .into(); assert_eq!(tree.root(), expected); } @@ -416,26 +420,29 @@ mod test_bridge_pool_tree { for i in 0..3 { let transfer = PendingTransfer { transfer: TransferToEthereum { - asset: EthAddress([i;20]), - recipient: EthAddress([i+1; 20]), + asset: EthAddress([i; 20]), + recipient: EthAddress([i + 1; 20]), amount: (i as u64).into(), nonce: 42u64.into(), }, gas_fee: GasFee { amount: 0.into(), payer: bertha_address(), - } + }, }; let key = Key::from(&transfer); transfers.push(transfer); let _ = tree.update_key(&key).expect("Test failed"); } transfers.sort_by_key(|t| t.keccak256()); - let hashes: BTreeSet = transfers.iter().map(|t| t.keccak256()).collect(); + let hashes: BTreeSet = + transfers.iter().map(|t| t.keccak256()).collect(); assert_eq!(hashes, tree.store); - let left_hash = hash_pair(transfers[0].keccak256(), transfers[1].keccak256()); - let right_hash = hash_pair(transfers[2].keccak256(), Default::default()); + let left_hash = + hash_pair(transfers[0].keccak256(), transfers[1].keccak256()); + let right_hash = + hash_pair(transfers[2].keccak256(), Default::default()); let expected: Hash = hash_pair(left_hash, right_hash).into(); assert_eq!(tree.root(), expected); } @@ -447,7 +454,7 @@ mod test_bridge_pool_tree { let transfer = PendingTransfer { transfer: TransferToEthereum { - asset: EthAddress([1;20]), + asset: EthAddress([1; 20]), recipient: EthAddress([2; 20]), amount: 1.into(), nonce: 42u64.into(), @@ -455,10 +462,11 @@ mod test_bridge_pool_tree { gas_fee: GasFee { amount: 0.into(), payer: bertha_address(), - } + }, }; let key = Key::from(&transfer); - let root = KeccakHash::from(tree.update_key(&key).expect("Test failed")); + let root = + KeccakHash::from(tree.update_key(&key).expect("Test failed")); assert_eq!(root, transfer.keccak256()); tree.delete_key(&key).expect("Test failed"); assert_eq!(tree.root().0, [0; 32]); @@ -472,15 +480,15 @@ mod test_bridge_pool_tree { for i in 0..3 { let transfer = PendingTransfer { transfer: TransferToEthereum { - asset: EthAddress([i;20]), - recipient: EthAddress([i+1; 20]), + asset: EthAddress([i; 20]), + recipient: EthAddress([i + 1; 20]), amount: (i as u64).into(), nonce: 42u64.into(), }, gas_fee: GasFee { amount: 0.into(), payer: bertha_address(), - } + }, }; let key = Key::from(&transfer); @@ -491,7 +499,9 @@ mod test_bridge_pool_tree { tree.delete_key(&Key::from(&transfers[1])) .expect("Test failed"); - let expected: Hash = hash_pair(transfers[0].keccak256(), transfers[2].keccak256()).into(); + let expected: Hash = + hash_pair(transfers[0].keccak256(), transfers[2].keccak256()) + .into(); assert_eq!(tree.root(), expected); } @@ -508,11 +518,14 @@ mod test_bridge_pool_tree { gas_fee: GasFee { amount: 0.into(), payer: bertha_address(), - } + }, }; let expected = transfer.keccak256(); let key = Key::from(&transfer); - assert_eq!(BridgePoolTree::parse_key(&key).expect("Test failed"), expected); + assert_eq!( + BridgePoolTree::parse_key(&key).expect("Test failed"), + expected + ); } /// Test that parsing a key with multiple segments fails @@ -528,24 +541,31 @@ mod test_bridge_pool_tree { gas_fee: GasFee { amount: 0.into(), payer: bertha_address(), - } + }, }; let hash = transfer.keccak256().to_string(); - let key = Key{segments: vec![DbKeySeg::AddressSeg(bertha_address()), DbKeySeg::StringSeg(hash)]}; + let key = Key { + segments: vec![ + DbKeySeg::AddressSeg(bertha_address()), + DbKeySeg::StringSeg(hash), + ], + }; assert!(BridgePoolTree::parse_key(&key).is_err()); } /// Test that parsing a key that is not a hash fails #[test] fn test_key_not_hash() { - let key = Key{segments: vec![DbKeySeg::StringSeg("bloop".into())]}; + let key = Key { + segments: vec![DbKeySeg::StringSeg("bloop".into())], + }; assert!(BridgePoolTree::parse_key(&key).is_err()); } /// Test that [`contains_key`] works correctly #[test] fn test_contains_key() { - let mut tree = BridgePoolTree::default(); + let mut tree = BridgePoolTree::default(); let transfer = PendingTransfer { transfer: TransferToEthereum { asset: EthAddress([1; 20]), @@ -556,10 +576,13 @@ mod test_bridge_pool_tree { gas_fee: GasFee { amount: 0.into(), payer: bertha_address(), - } + }, }; tree.update_key(&Key::from(&transfer)).expect("Test failed"); - assert!(tree.contains_key(&Key::from(&transfer)).expect("Test failed")); + assert!( + tree.contains_key(&Key::from(&transfer)) + .expect("Test failed") + ); let transfer = PendingTransfer { transfer: TransferToEthereum { asset: EthAddress([1; 20]), @@ -570,9 +593,13 @@ mod test_bridge_pool_tree { gas_fee: GasFee { amount: 0.into(), payer: bertha_address(), - } + }, }; - assert!(!tree.contains_key(&Key::from(&transfer)).expect("Test failed")); + assert!( + !tree + .contains_key(&Key::from(&transfer)) + .expect("Test failed") + ); } /// Test that the empty proof works. @@ -581,7 +608,9 @@ mod test_bridge_pool_tree { let tree = BridgePoolTree::default(); let keys = vec![]; let values = vec![]; - let proof = tree.get_membership_proof(&keys, values).expect("Test failed"); + let proof = tree + .get_membership_proof(&keys, values) + .expect("Test failed"); assert!(proof.verify(Default::default())); } @@ -593,17 +622,19 @@ mod test_bridge_pool_tree { asset: EthAddress([0; 20]), recipient: EthAddress([0; 20]), amount: 0.into(), - nonce: 0.into() + nonce: 0.into(), }, gas_fee: GasFee { amount: 0.into(), - payer: bertha_address() - } + payer: bertha_address(), + }, }; let mut tree = BridgePoolTree::default(); let key = Key::from(&transfer); let _ = tree.update_key(&key).expect("Test failed"); - let proof = tree.get_membership_proof(array::from_ref(&key), vec![transfer]).expect("Test failed"); + let proof = tree + .get_membership_proof(array::from_ref(&key), vec![transfer]) + .expect("Test failed"); assert!(proof.verify(tree.root().into())); } @@ -616,15 +647,15 @@ mod test_bridge_pool_tree { for i in 0..2 { let transfer = PendingTransfer { transfer: TransferToEthereum { - asset: EthAddress([i;20]), - recipient: EthAddress([i+1; 20]), + asset: EthAddress([i; 20]), + recipient: EthAddress([i + 1; 20]), amount: (i as u64).into(), nonce: 42u64.into(), }, gas_fee: GasFee { amount: 0.into(), payer: bertha_address(), - } + }, }; let key = Key::from(&transfer); @@ -632,11 +663,12 @@ mod test_bridge_pool_tree { let _ = tree.update_key(&key).expect("Test failed"); } let key = Key::from(&transfers[0]); - let proof = tree.get_membership_proof( - array::from_ref(&key), - vec![transfers.remove(0)] - ) - .expect("Test failed"); + let proof = tree + .get_membership_proof( + array::from_ref(&key), + vec![transfers.remove(0)], + ) + .expect("Test failed"); assert!(proof.verify(tree.root().into())); } @@ -648,15 +680,15 @@ mod test_bridge_pool_tree { for i in 0..3 { let transfer = PendingTransfer { transfer: TransferToEthereum { - asset: EthAddress([i;20]), - recipient: EthAddress([i+1; 20]), + asset: EthAddress([i; 20]), + recipient: EthAddress([i + 1; 20]), amount: (i as u64).into(), nonce: 42u64.into(), }, gas_fee: GasFee { amount: 0.into(), payer: bertha_address(), - } + }, }; let key = Key::from(&transfer); @@ -666,7 +698,9 @@ mod test_bridge_pool_tree { transfers.sort_by_key(|t| t.keccak256()); let keys = vec![Key::from(&transfers[0]), Key::from(&transfers[1])]; let values = vec![transfers[0].clone(), transfers[1].clone()]; - let proof = tree.get_membership_proof(&keys, values).expect("Test failed"); + let proof = tree + .get_membership_proof(&keys, values) + .expect("Test failed"); assert!(proof.verify(tree.root().into())); } @@ -678,15 +712,15 @@ mod test_bridge_pool_tree { for i in 0..3 { let transfer = PendingTransfer { transfer: TransferToEthereum { - asset: EthAddress([i;20]), - recipient: EthAddress([i+1; 20]), + asset: EthAddress([i; 20]), + recipient: EthAddress([i + 1; 20]), amount: (i as u64).into(), nonce: 42u64.into(), }, gas_fee: GasFee { amount: 0.into(), payer: bertha_address(), - } + }, }; let key = Key::from(&transfer); transfers.push(transfer); @@ -694,7 +728,9 @@ mod test_bridge_pool_tree { } let keys = vec![]; let values = vec![]; - let proof = tree.get_membership_proof(&keys, values).expect("Test failed"); + let proof = tree + .get_membership_proof(&keys, values) + .expect("Test failed"); assert!(proof.verify(tree.root().into())) } @@ -706,15 +742,15 @@ mod test_bridge_pool_tree { for i in 0..2 { let transfer = PendingTransfer { transfer: TransferToEthereum { - asset: EthAddress([i;20]), - recipient: EthAddress([i+1; 20]), + asset: EthAddress([i; 20]), + recipient: EthAddress([i + 1; 20]), amount: (i as u64).into(), nonce: 42u64.into(), }, gas_fee: GasFee { amount: 0.into(), payer: bertha_address(), - } + }, }; let key = Key::from(&transfer); transfers.push(transfer); @@ -722,7 +758,9 @@ mod test_bridge_pool_tree { } transfers.sort_by_key(|t| t.keccak256()); let keys: Vec<_> = transfers.iter().map(Key::from).collect(); - let proof = tree.get_membership_proof(&keys, transfers).expect("Test failed"); + let proof = tree + .get_membership_proof(&keys, transfers) + .expect("Test failed"); assert!(proof.verify(tree.root().into())); } @@ -734,15 +772,15 @@ mod test_bridge_pool_tree { for i in 0..3 { let transfer = PendingTransfer { transfer: TransferToEthereum { - asset: EthAddress([i;20]), - recipient: EthAddress([i+1; 20]), + asset: EthAddress([i; 20]), + recipient: EthAddress([i + 1; 20]), amount: (i as u64).into(), nonce: 42u64.into(), }, gas_fee: GasFee { amount: 0.into(), payer: bertha_address(), - } + }, }; let key = Key::from(&transfer); transfers.push(transfer); @@ -750,7 +788,9 @@ mod test_bridge_pool_tree { } transfers.sort_by_key(|t| t.keccak256()); let keys: Vec<_> = transfers.iter().map(Key::from).collect(); - let proof = tree.get_membership_proof(&keys, transfers).expect("Test failed"); + let proof = tree + .get_membership_proof(&keys, transfers) + .expect("Test failed"); assert!(proof.verify(tree.root().into())); } @@ -762,64 +802,57 @@ mod test_bridge_pool_tree { for i in 0..5 { let transfer = PendingTransfer { transfer: TransferToEthereum { - asset: EthAddress([i;20]), - recipient: EthAddress([i+1; 20]), + asset: EthAddress([i; 20]), + recipient: EthAddress([i + 1; 20]), amount: (i as u64).into(), nonce: 42u64.into(), }, gas_fee: GasFee { amount: 0.into(), payer: bertha_address(), - } + }, }; let key = Key::from(&transfer); transfers.push(transfer); let _ = tree.update_key(&key).expect("Test failed"); } transfers.sort_by_key(|t| t.keccak256()); - let keys: Vec<_> = transfers - .iter() - .step_by(2) - .map(Key::from) - .collect(); - let values: Vec<_> = transfers - .iter() - .step_by(2) - .cloned() - .collect(); - let proof = tree.get_membership_proof(&keys, values).expect("Test failed"); + let keys: Vec<_> = transfers.iter().step_by(2).map(Key::from).collect(); + let values: Vec<_> = transfers.iter().step_by(2).cloned().collect(); + let proof = tree + .get_membership_proof(&keys, values) + .expect("Test failed"); assert!(proof.verify(tree.root().into())); } /// Create a random set of transfers. - fn random_transfers(number: usize) -> impl Strategy> { + fn random_transfers( + number: usize, + ) -> impl Strategy> { prop::collection::vec( - ( - prop::array::uniform20(0u8..), - prop::num::u64::ANY, - ), + (prop::array::uniform20(0u8..), prop::num::u64::ANY), 0..=number, ) - .prop_flat_map( | addrs | + .prop_flat_map(|addrs| { Just( - addrs.into_iter().map(| (addr, nonce)| - PendingTransfer { + addrs + .into_iter() + .map(|(addr, nonce)| PendingTransfer { transfer: TransferToEthereum { asset: EthAddress(addr), recipient: EthAddress(addr), amount: Default::default(), - nonce: nonce.into() + nonce: nonce.into(), }, gas_fee: GasFee { amount: Default::default(), - payer: bertha_address() - } - }, - ) - .dedup() - .collect::>() + payer: bertha_address(), + }, + }) + .dedup() + .collect::>(), ) - ) + }) } prop_compose! { @@ -836,7 +869,7 @@ mod test_bridge_pool_tree { } } - proptest!{ + proptest! { /// Given a random tree and a subset of leaves, /// verify that the constructed multi-proof correctly /// verifies. @@ -859,4 +892,4 @@ mod test_bridge_pool_tree { assert!(proof.verify(tree.root().into())); } } -} \ No newline at end of file +} diff --git a/shared/src/ledger/storage/merkle_tree.rs b/shared/src/ledger/storage/merkle_tree.rs index 21f16031ad..1d175e83d2 100644 --- a/shared/src/ledger/storage/merkle_tree.rs +++ b/shared/src/ledger/storage/merkle_tree.rs @@ -17,7 +17,9 @@ use thiserror::Error; use super::traits::{StorageHasher, SubTreeRead, SubTreeWrite}; use super::IBC_KEY_LIMIT; use crate::bytes::ByteBuf; -use crate::ledger::eth_bridge::storage::bridge_pool::{BridgePoolTree, get_signed_root_key}; +use crate::ledger::eth_bridge::storage::bridge_pool::{ + get_signed_root_key, BridgePoolTree, +}; use crate::ledger::storage::ics23_specs::ibc_leaf_spec; use crate::ledger::storage::{ics23_specs, types}; use crate::types::address::{Address, InternalAddress}; @@ -717,7 +719,8 @@ mod test { std::array::from_ref(&ibc_key), vec![ibc_val.clone().into()], ) - .unwrap(){ + .unwrap() + { MembershipProof::ICS23(proof) => proof, _ => panic!("Test failed"), }; @@ -770,11 +773,12 @@ mod test { tree.update(&pos_key, pos_val.clone()).unwrap(); let specs = proof_specs::(); - let proof = match tree.get_sub_tree_existence_proof( - std::array::from_ref(&pos_key), - vec![pos_val.clone().into()], - ) - .unwrap() + let proof = match tree + .get_sub_tree_existence_proof( + std::array::from_ref(&pos_key), + vec![pos_val.clone().into()], + ) + .unwrap() { MembershipProof::ICS23(proof) => proof, _ => panic!("Test failed"), diff --git a/shared/src/ledger/storage/mod.rs b/shared/src/ledger/storage/mod.rs index 1dd03af3d9..61f9ced6be 100644 --- a/shared/src/ledger/storage/mod.rs +++ b/shared/src/ledger/storage/mod.rs @@ -523,7 +523,8 @@ where .block .tree .get_sub_tree_existence_proof(array::from_ref(key), vec![value]) - .map_err(Error::MerkleTreeError)? { + .map_err(Error::MerkleTreeError)? + { self.block .tree .get_tendermint_proof(key, proof) @@ -540,11 +541,14 @@ where array::from_ref(key), vec![value], ) - .map_err(Error::MerkleTreeError)? { + .map_err(Error::MerkleTreeError)? + { tree.get_tendermint_proof(key, proof) .map_err(Error::MerkleTreeError) } else { - Err(Error::MerkleTreeError(MerkleTreeError::TendermintProof)) + Err(Error::MerkleTreeError( + MerkleTreeError::TendermintProof, + )) } } None => Err(Error::NoMerkleTree { height }), diff --git a/shared/src/types/eth_bridge_pool.rs b/shared/src/types/eth_bridge_pool.rs index e7c55df8d8..36a378b8db 100644 --- a/shared/src/types/eth_bridge_pool.rs +++ b/shared/src/types/eth_bridge_pool.rs @@ -68,7 +68,11 @@ impl keccak::encode::Encode for PendingTransfer { impl From<&PendingTransfer> for Key { fn from(transfer: &PendingTransfer) -> Self { - Key{segments: vec![DbKeySeg::StringSeg(transfer.keccak256().to_string())]} + Key { + segments: vec![DbKeySeg::StringSeg( + transfer.keccak256().to_string(), + )], + } } } diff --git a/tests/src/native_vp/pos.rs b/tests/src/native_vp/pos.rs index 7be49ac538..e7c7daf7c1 100644 --- a/tests/src/native_vp/pos.rs +++ b/tests/src/native_vp/pos.rs @@ -411,7 +411,8 @@ mod tests { // Use the tx_env to run PoS VP let tx_env = tx_host_env::take(); let vp_env = TestNativeVpEnv::new(tx_env); - let result: Result = vp_env.validate_tx(PosVP::new, |_tx_data| {}); + let result: Result = + vp_env.validate_tx(PosVP::new, |_tx_data| {}); // Put the tx_env back before checking the result tx_host_env::set(vp_env.tx_env); let result = From 8302e24f272a01501d3ba8a8c3c5e2e4e853e706 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 17:30:31 +0200 Subject: [PATCH 03/52] [feat]: Fixed the wasm blob for adding transfers for the bridge pool --- wasm/wasm_source/src/tx_bridge_pool.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/wasm/wasm_source/src/tx_bridge_pool.rs b/wasm/wasm_source/src/tx_bridge_pool.rs index bed8e3820e..0c945d6925 100644 --- a/wasm/wasm_source/src/tx_bridge_pool.rs +++ b/wasm/wasm_source/src/tx_bridge_pool.rs @@ -20,8 +20,6 @@ fn apply_tx(tx_data: Vec) { } = transfer.gas_fees; token::transfer(payer, &BRIDGE_POOL_ADDRESS, &address::xan(), amount); // add transfer into the pool - let pending_key = bridge_pool::get_pending_key(); - let mut pending: HashSet = read(&pending_key).unwrap(); - pending.insert(transfer); - write(pending_key, pending.try_to_vec().unwrap()); + let pending_key = bridge_pool::get_pending_key(&transfer); + write(pending_key, transfer.try_to_vec().unwrap()); } \ No newline at end of file From 649f68c20c56fe92384ffe27e9d8e338a400e177 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 12 Oct 2022 08:32:58 +0000 Subject: [PATCH 04/52] [ci] wasm checksums update --- wasm/checksums.json | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/wasm/checksums.json b/wasm/checksums.json index 057829c654..73038833d5 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,20 +1,19 @@ { - "tx_bond.wasm": "tx_bond.aac575fac2ddaba8fca6f341b2ca6a77dd430767aae628e75aebf0b05470173f.wasm", "tx_bridge_pool.wasm": "tx_bridge_pool.e21563260c03cfdab1f195878f49bf93722027ad26fcd097cfebbc5c4d279082.wasm", - "tx_from_intent.wasm": "tx_from_intent.3b89f8ae7c2d0e78d813fd249bcfb80871205fa0eac306004184155df972bda5.wasm", - "tx_ibc.wasm": "tx_ibc.948b68260e10def4a1b80d0a13c8c02d25f18920cbbb6ef0febacd800cd2e4aa.wasm", - "tx_init_account.wasm": "tx_init_account.33ba50356486f46204bb311259446bad8217b3fad3338d3729097c4c27cf6123.wasm", - "tx_init_nft.wasm": "tx_init_nft.37dc3000a2365db54f0fbf550501e6d9ac6572820ce7a70dfa894e07e67bb764.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.f5db61cb13d2739fdb72e4f46b9f0413d41102d5b91b5b0c01fed87555c68723.wasm", - "tx_init_validator.wasm": "tx_init_validator.b564420e6a58e6a397df44c929e1e8e3d3297a76f17a008c0035cd95f46974d0.wasm", - "tx_mint_nft.wasm": "tx_mint_nft.26733715c5ef27cb27a6f88cbef2d468f092e357c39f2272195b94db3a2ca63e.wasm", - "tx_transfer.wasm": "tx_transfer.eb6d5fa86d9276f3628e3e093acaf11a77b1f44d8016ac971803e8f4613bdc2f.wasm", - "tx_unbond.wasm": "tx_unbond.553d6ca840850f1e76c3fda04efc8d3a929b4e0e69c0129685f3871a060b3ed0.wasm", - "tx_update_vp.wasm": "tx_update_vp.8e12c05146f0189242f53ba0aa077729fb25b1617b179180b290a92f4d0117b1.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.0f6c8bb64f0b5121efffe1f72a8dfcd584b523979b7fdd3e73e93e61a46bf31b.wasm", - "tx_withdraw.wasm": "tx_withdraw.fdbdf0db6de1d53c259f84b503d807a67560a3b45f477301e9a0b20ea8275034.wasm", - "vp_nft.wasm": "vp_nft.b1387806bd245f55eb7ef6ba70f4e645eab7dcc048ac8d314d8162fdd021cb9d.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.356e4873a8d44eba2f5472c2d37485a30b24fd6785fe1dc017d031ec116dbe6f.wasm", - "vp_token.wasm": "vp_token.3f492f380226899d1c0da5d5b69a6de5e67b8a7ebfc5179a506bf38c23819c96.wasm", - "vp_user.wasm": "vp_user.c11d62664abc50e9b613acba04b040f93c2a8fe013a4a916e452c6323cb1bd29.wasm" + "tx_from_intent.wasm": "tx_from_intent.d5fc1b1c43e88ebdb60da385d2c4d0561f01cd40f4dacdc7c87ed7c8028679cf.wasm", + "tx_ibc.wasm": "tx_ibc.e97671a3584072c854d0a3638adcd87370b3a15e0084f1721babe6169a325499.wasm", + "tx_init_account.wasm": "tx_init_account.cc60e72a9f3e010793f2255320559f8508a8f41f699012a15e7e2ad7b9b91e8d.wasm", + "tx_init_nft.wasm": "tx_init_nft.fc4846b333cde985a0435ece4c67cf4720fc690f0b691d7c47750164dc25b7f7.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.5e440b0dd0087fd8a0ffa41725038e66ecf5f6932d013faf73550ae95d598db4.wasm", + "tx_init_validator.wasm": "tx_init_validator.6088e7415f6d346ef15533ef2b9116141707e63a08dc734a22847b972fa61d10.wasm", + "tx_mint_nft.wasm": "tx_mint_nft.0ec77f549ed90b9e5c1b03e6697835250ff426c20c09904c28e37b27930cc9f9.wasm", + "tx_transfer.wasm": "tx_transfer.855a118f90703815f72425f162c0beba543870db2768a2e2855ce29b508c6594.wasm", + "tx_unbond.wasm": "tx_unbond.8c24da4d52ae3bb513ac08889b1b7f10fa3a26271713cca4f758a5a72f0f7fa9.wasm", + "tx_update_vp.wasm": "tx_update_vp.a7b0c9370d60d4168a198af66ed5e3ce094e250e566bdff23ec0fbb2236d576e.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.3d0433598d600227b936caadd1e2e9c7cf7e1989225cc5d2660a1f8bc0d00e09.wasm", + "tx_withdraw.wasm": "tx_withdraw.dfdee0959a74df3335c2e262fd18030e4ce5dff862fc98ab4c9a461ccb2a4dd3.wasm", + "vp_nft.wasm": "vp_nft.aea9aa6952d86799992c8374f568b589a48750f32ce3f19c8807281307204a6d.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.64bc3bc9a5f8d03204aa834d2105b4a91fee65e685a5672ff4a203df5eff44ad.wasm", + "vp_token.wasm": "vp_token.a08656587dcaa572872f3757d05f30494b4add02d821c0101b4244a1068bfae2.wasm", + "vp_user.wasm": "vp_user.b7daaa56f48b385f936b2ff907b85298ee1aa8d422ef6fd9df3c044ee7fdadbf.wasm" } \ No newline at end of file From cf7bdfe190f1275b66c320f45b20c1ec971afb84 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 12 Oct 2022 08:33:01 +0000 Subject: [PATCH 05/52] [ci] wasm checksums update --- wasm/checksums.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/wasm/checksums.json b/wasm/checksums.json index 73038833d5..4754de3ff7 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,19 +1,19 @@ { "tx_bridge_pool.wasm": "tx_bridge_pool.e21563260c03cfdab1f195878f49bf93722027ad26fcd097cfebbc5c4d279082.wasm", - "tx_from_intent.wasm": "tx_from_intent.d5fc1b1c43e88ebdb60da385d2c4d0561f01cd40f4dacdc7c87ed7c8028679cf.wasm", - "tx_ibc.wasm": "tx_ibc.e97671a3584072c854d0a3638adcd87370b3a15e0084f1721babe6169a325499.wasm", - "tx_init_account.wasm": "tx_init_account.cc60e72a9f3e010793f2255320559f8508a8f41f699012a15e7e2ad7b9b91e8d.wasm", - "tx_init_nft.wasm": "tx_init_nft.fc4846b333cde985a0435ece4c67cf4720fc690f0b691d7c47750164dc25b7f7.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.5e440b0dd0087fd8a0ffa41725038e66ecf5f6932d013faf73550ae95d598db4.wasm", - "tx_init_validator.wasm": "tx_init_validator.6088e7415f6d346ef15533ef2b9116141707e63a08dc734a22847b972fa61d10.wasm", - "tx_mint_nft.wasm": "tx_mint_nft.0ec77f549ed90b9e5c1b03e6697835250ff426c20c09904c28e37b27930cc9f9.wasm", - "tx_transfer.wasm": "tx_transfer.855a118f90703815f72425f162c0beba543870db2768a2e2855ce29b508c6594.wasm", - "tx_unbond.wasm": "tx_unbond.8c24da4d52ae3bb513ac08889b1b7f10fa3a26271713cca4f758a5a72f0f7fa9.wasm", + "tx_from_intent.wasm": "tx_from_intent.658fa18092d794db18c0084779568411c4c1b7c8d163b78c5338d6016a75d6c6.wasm", + "tx_ibc.wasm": "tx_ibc.5188c4ff27f8823b672e7e85844208893332a9f47adbbff08a51bc7694e9bab0.wasm", + "tx_init_account.wasm": "tx_init_account.159d8afce1e760d1e4bbb0a699dfe1e8543074238523964c69ac9ea6b9ac8d9a.wasm", + "tx_init_nft.wasm": "tx_init_nft.6ee23f0cff039a81a2fdbb5ca4bdc332aee2bc96f205bf55f35e3d04f16bffd5.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.cc839bb461efe6d0ea9337d6e2d8698d829c2c6b828d46dbb9e9deed1977337d.wasm", + "tx_init_validator.wasm": "tx_init_validator.7b230affa897b6dca91915d8d9486204edb8c3b2d0a9fa72277d06d3085887e7.wasm", + "tx_mint_nft.wasm": "tx_mint_nft.87767ccb2483d75f195470dbd3b961132e85a1aeb9bce55a10d24e4d11dfbfba.wasm", + "tx_transfer.wasm": "tx_transfer.d7cb47c03c3036f053c99c9cbb467e3e4e3ca80c9ffa5f893e0737174423bdb8.wasm", + "tx_unbond.wasm": "tx_unbond.f5bc85a36a9b26a0290404362997428de321f34098e42b1e37876b87d2bed965.wasm", "tx_update_vp.wasm": "tx_update_vp.a7b0c9370d60d4168a198af66ed5e3ce094e250e566bdff23ec0fbb2236d576e.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.3d0433598d600227b936caadd1e2e9c7cf7e1989225cc5d2660a1f8bc0d00e09.wasm", - "tx_withdraw.wasm": "tx_withdraw.dfdee0959a74df3335c2e262fd18030e4ce5dff862fc98ab4c9a461ccb2a4dd3.wasm", - "vp_nft.wasm": "vp_nft.aea9aa6952d86799992c8374f568b589a48750f32ce3f19c8807281307204a6d.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.64bc3bc9a5f8d03204aa834d2105b4a91fee65e685a5672ff4a203df5eff44ad.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.8d4e8653c40e703c2c4ad50eb1d3e0e5d40a5ed8e4ec83d37ff13b2b102f0390.wasm", + "tx_withdraw.wasm": "tx_withdraw.3abc393edcd9ac5b7ea0a4f086d339adf31c0a16bd8c267a0bce7dd66a976d59.wasm", + "vp_nft.wasm": "vp_nft.c1c9e2e806ec23da24b404d5124dd70e94a4eb9d7176d0893a6c06b564817b12.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.a4c1c679ea003bd2b39293cddfc3db58b0d68ed3609aed4b5b0c7010cb6d235d.wasm", "vp_token.wasm": "vp_token.a08656587dcaa572872f3757d05f30494b4add02d821c0101b4244a1068bfae2.wasm", - "vp_user.wasm": "vp_user.b7daaa56f48b385f936b2ff907b85298ee1aa8d422ef6fd9df3c044ee7fdadbf.wasm" + "vp_user.wasm": "vp_user.cbcfe75a037fe36e192f841a8b65f8f81dab2fac61d57f08d0a6bafbc0e2b016.wasm" } \ No newline at end of file From dcfbe0526fa8ad8aaa030e79bec574f07ff55b97 Mon Sep 17 00:00:00 2001 From: satan Date: Mon, 17 Oct 2022 16:52:38 +0200 Subject: [PATCH 06/52] [fix]: Fixed broken doc link --- shared/src/ledger/eth_bridge/storage/bridge_pool.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs index c0ccf75f68..89e220335f 100644 --- a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs @@ -118,7 +118,7 @@ impl BridgePoolTree { } } - /// Return the root as a [`Hash`] type. + /// Return the root as a [struct@`Hash`] type. pub fn root(&self) -> Hash { self.root.clone().into() } From 009c33cbefd0fde5a95d4b2ccede6b49d95f87ae Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 17 Oct 2022 15:33:09 +0000 Subject: [PATCH 07/52] [ci] wasm checksums update --- wasm/checksums.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/wasm/checksums.json b/wasm/checksums.json index 2634122c96..850b41f1b8 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,19 +1,19 @@ { "tx_bridge_pool.wasm": "tx_bridge_pool.e21563260c03cfdab1f195878f49bf93722027ad26fcd097cfebbc5c4d279082.wasm", - "tx_from_intent.wasm": "tx_from_intent.7a56e31fb9977d230d5d601129fd11e67bf54159ab2d694184fc934ec2244314.wasm", - "tx_ibc.wasm": "tx_ibc.fe0036ec90159b3e704247201345ddff0aea5fa2e234e85d0e4df895b509d692.wasm", - "tx_init_account.wasm": "tx_init_account.313e8ab8c7eac72e75f916c67a6c7ec2f204f77d60d89e825acc78b4856a70c5.wasm", - "tx_init_nft.wasm": "tx_init_nft.5339cef3b36a3a31ea370cd67e6a43f99e03d13032bb786335976dd251988d4e.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.d5598fcac82ebd5c618b84f4582992a2de80c2dfbb37f10fb574afaa36045ec2.wasm", - "tx_init_validator.wasm": "tx_init_validator.1e1374e7bcd0973cf7d3166085946ddf43443bb67037b56cfa6f2a5715d44ef2.wasm", - "tx_mint_nft.wasm": "tx_mint_nft.15b0e03bc27c41feda24918f56263f85d84b26f43be831998c6c619baa92a601.wasm", - "tx_transfer.wasm": "tx_transfer.2195fe962f9cb0c776d8518d0df9a450cc2521510d60423b57f0e2744ce38564.wasm", - "tx_unbond.wasm": "tx_unbond.a7313bb14d1c3a852630f86fc07d5e048e5df19a8f4be193d95c21fbeb49ae03.wasm", - "tx_update_vp.wasm": "tx_update_vp.f21d0233f9629193cea49c9c3742c2cac6764b09dd0adc7360d1f649543f2c39.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.08daa0021aac28a1255ebb28005e1f07e01fc8118496934a0d46ee4456da7470.wasm", - "tx_withdraw.wasm": "tx_withdraw.0de22e367b9931045cf4c6b844cdd2e1390796e9cc7f8b15288d7753913e3ca9.wasm", - "vp_nft.wasm": "vp_nft.4656bec0cf0ff84b672605e45e25b16915a36ee982ffddf1ee0b7d6c72871e5a.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.41c53f6536966989374dfb4b732b389919c0b980fba316ed842dc4b889b3abc1.wasm", - "vp_token.wasm": "vp_token.6eff1ea735d6b79e72e9f860a261e3eb91004b829cda2e3e3cc8f1b24e3b6715.wasm", - "vp_user.wasm": "vp_user.7829b1e5eb367785abc50bb7eaefa917665bec380495c162e83e08eaa57065f7.wasm" + "tx_from_intent.wasm": "tx_from_intent.7e9893f8e2affcfbb4e04fe936bb18571645353da08d8e08d880971f2cfca053.wasm", + "tx_ibc.wasm": "tx_ibc.29d0881d94f45a2fd67bb0f8cbc432a4c2c18ce96c1e17712b721a3ae04788d2.wasm", + "tx_init_account.wasm": "tx_init_account.fff73dad57c9f1f670593939b4a0a895ed538324a9a39958e3724a51b1fc1524.wasm", + "tx_init_nft.wasm": "tx_init_nft.378007b60d8324df95f0db09b568b8924b411d6402a76e0280ce5bb95835dff2.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.59c9755b31a9727c7b5908c2c404f193b9de7ffac919833c342e06e4bca31953.wasm", + "tx_init_validator.wasm": "tx_init_validator.34b7afb1af8f7b23c00812e969f89058754c8447704a9cd1acd595281c58d16a.wasm", + "tx_mint_nft.wasm": "tx_mint_nft.7962f00c4735a88cae4363ca172e6bbe1cd0b75c7271b5203b141e29a2d039ff.wasm", + "tx_transfer.wasm": "tx_transfer.e818885f13cbe1349c8702fa848991263b4032cae6c2f68df75cf9e4a7d4b4db.wasm", + "tx_unbond.wasm": "tx_unbond.1e3a5e7e5e85cf6222af2255e8bea9658693758473aba1022304c4b5af4d7f78.wasm", + "tx_update_vp.wasm": "tx_update_vp.4e5d802da0ef98daa6c904522c6fd4964020cc9ce948f16579a6cec1793337b8.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.d61eb971b9e8eab8d8d2ddf5ff238f2de769bc227cbcb14beb6e36462102ff36.wasm", + "tx_withdraw.wasm": "tx_withdraw.76c8c25e235a9e351796caef61a783e15e289f0a8b8ebdfba6ffefb027ec4f68.wasm", + "vp_nft.wasm": "vp_nft.acd5da5193e1d02caf3a278ea88eaa22943cd280e9c84a8d381217399c8bdabf.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.cc2633219e7fe4a807fb6e25ae8c7248b35dcea239dd6b108293bfee26d3a512.wasm", + "vp_token.wasm": "vp_token.cee6c283ec93ecf78d473cf382b2ec78a891d705fa48ca5c7393c61b74bb2aa7.wasm", + "vp_user.wasm": "vp_user.62b8491c45cb9fb1b2b4f4d4590a119ba34fcca8d63539ed2717c3bef365aff1.wasm" } \ No newline at end of file From 45084dc6bdec5c479a6d7dc225d0507b127eef7b Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 15:06:05 +0200 Subject: [PATCH 08/52] [feat]: Updated bridge pool vp with the the new merklized storage --- .../src/ledger/eth_bridge/bridge_pool_vp.rs | 63 +++++++------------ .../ledger/eth_bridge/storage/bridge_pool.rs | 13 +--- shared/src/types/storage.rs | 17 +++++ 3 files changed, 42 insertions(+), 51 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index b7b8cf1cf2..5d6f4d7177 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -14,16 +14,15 @@ use std::collections::{BTreeSet, HashSet}; use borsh::BorshDeserialize; use eyre::eyre; -use crate::ledger::eth_bridge::storage::bridge_pool::{ - get_pending_key, is_protected_storage, BRIDGE_POOL_ADDRESS, -}; +use crate::ledger::eth_bridge::storage::bridge_pool::{get_pending_key, is_protected_storage, BRIDGE_POOL_ADDRESS, is_bridge_pool_key}; use crate::ledger::native_vp::{Ctx, NativeVp, StorageReader}; use crate::ledger::storage::traits::StorageHasher; use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::storage::Key; +use crate::types::keccak::encode::Encode; +use crate::types::storage::{Key, KeySeg}; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; @@ -115,43 +114,27 @@ where } }; - // check that only the pending_key value is changed - if keys_changed.iter().any(is_protected_storage) { - tracing::debug!( - "Rejecting transaction as it is attempting to change the \ - bridge pool storage other than the pending transaction pool" - ); - return Ok(false); + let pending_key = get_pending_key(&transfer); + for key in keys_changed.iter().filter(is_bridge_pool_key) { + if key != pending_key { + tracing::debug!( + "Rejecting transaction as it is attempting to change an incorrect \ + key in the pending transaction pool." + ); + return Ok(false); + } } - // check that the pending transfer (and only that) was added to the pool - // TODO: This will change slightly when we merkelize the pool, - // but that will be a separate PR. - let pending_key = get_pending_key(); - let pending_pre: HashSet = - (&self.ctx).read_pre_value(&pending_key)?.ok_or(eyre!( - "The bridge pool transfers are missing from storage" - ))?; - let pending_post: HashSet = + let pending: PendingTransfer = (&self.ctx).read_post_value(&pending_key)?.ok_or(eyre!( - "The bridge pool transfers are missing from storage" - ))?; - if !pending_post.contains(&transfer) { - tracing::debug!( "Rejecting transaction as the transfer wasn't added to the \ pending transfers" + ))?; + if pending != transfer { + tracing::debug!( + "An incorrect transfer was added to the pool." ); return Ok(false); } - for item in pending_pre.symmetric_difference(&pending_post) { - if item != &transfer { - tracing::debug!( - ?item, - "Rejecting transaction as an unrecognized item was added \ - to the pending transfers" - ); - return Ok(false); - } - } // check that gas fees were put into escrow @@ -228,8 +211,8 @@ mod test_bridge_pool_vp { } /// The bridge pool at the beginning of all tests - fn initial_pool() -> HashSet { - let transfer = PendingTransfer { + fn initial_pool() -> PendingTransfer { + PendingTransfer { transfer: TransferToEthereum { asset: EthAddress([0; 20]), recipient: EthAddress([0; 20]), @@ -240,9 +223,7 @@ mod test_bridge_pool_vp { amount: 0.into(), payer: bertha_address(), }, - }; - - HashSet::::from([transfer]) + } } /// Create a new storage @@ -252,9 +233,9 @@ mod test_bridge_pool_vp { writelog .write(&get_signed_root_key(), Hash([0; 32]).try_to_vec().unwrap()) .unwrap(); - + let transfer = initial_pool(); writelog - .write(&get_pending_key(), initial_pool().try_to_vec().unwrap()) + .write(&get_pending_key(&transfer), transfer.try_to_vec().unwrap()) .unwrap(); let escrow_key = balance_key(&xan(), &BRIDGE_POOL_ADDRESS); let amount: Amount = ESCROWED_AMOUNT.into(); diff --git a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs index f1dfc181c9..70dc9929b4 100644 --- a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs @@ -11,7 +11,7 @@ use crate::types::eth_bridge_pool::PendingTransfer; use crate::types::hash::Hash; use crate::types::keccak::encode::Encode; use crate::types::keccak::{keccak_hash, KeccakHash}; -use crate::types::storage::{DbKeySeg, Key}; +use crate::types::storage::{DbKeySeg, Key, KeySeg}; /// The main address of the Ethereum bridge pool pub const BRIDGE_POOL_ADDRESS: Address = @@ -27,11 +27,11 @@ const SIGNED_ROOT_SEG: &str = "signed_root"; pub struct Error(#[from] eyre::Error); /// Get the storage key for the transfers in the pool -pub fn get_pending_key() -> Key { +pub fn get_pending_key(transfer: &PendingTransfer) -> Key { Key { segments: vec![ DbKeySeg::AddressSeg(BRIDGE_POOL_ADDRESS), - DbKeySeg::StringSeg(PENDING_TRANSFERS_SEG.into()), + transfer.keccak256().to_db_key(), ], } } @@ -52,13 +52,6 @@ pub fn is_bridge_pool_key(key: &Key) -> bool { matches!(&key.segments[0], DbKeySeg::AddressSeg(addr) if addr == &BRIDGE_POOL_ADDRESS) } -/// Check if a key belongs to the bridge pool but is not -/// the key for the pending transaction pool. Such keys -/// may not be modified via transactions. -pub fn is_protected_storage(key: &Key) -> bool { - is_bridge_pool_key(key) && *key != get_pending_key() -} - /// A simple Merkle tree for the Ethereum bridge pool #[derive( Debug, Default, Clone, BorshSerialize, BorshDeserialize, BorshSchema, diff --git a/shared/src/types/storage.rs b/shared/src/types/storage.rs index db7cada8ec..08ee160662 100644 --- a/shared/src/types/storage.rs +++ b/shared/src/types/storage.rs @@ -20,6 +20,7 @@ use crate::ledger::storage::IBC_KEY_LIMIT; use crate::types::address::{self, Address}; use crate::types::eth_bridge_pool::PendingTransfer; use crate::types::hash::Hash; +use crate::types::keccak::KeccakHash; use crate::types::time::DateTimeUtc; #[allow(missing_docs)] @@ -640,6 +641,22 @@ impl KeySeg for Hash { } } +impl KeySeg for KeccakHash { + fn parse(seg: String) -> Result { + seg.clone() + .try_into() + .map_err(|_| Error::ParseError(seg, "Hash".into())) + } + + fn raw(&self) -> String { + self.to_string() + } + + fn to_db_key(&self) -> DbKeySeg { + DbKeySeg::StringSeg(self.raw()) + } +} + /// Epoch identifier. Epochs are identified by consecutive numbers. #[derive( Clone, From 76b231dea50bedc91d0bca9f10bcd27152963e53 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 17:25:52 +0200 Subject: [PATCH 09/52] [feat]: Changed the bridge pool vp to used the merklized storage --- .../src/ledger/eth_bridge/bridge_pool_vp.rs | 210 +++++++++++------- .../ledger/eth_bridge/storage/bridge_pool.rs | 2 - 2 files changed, 124 insertions(+), 88 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 5d6f4d7177..d347755e76 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -9,20 +9,21 @@ //! This VP checks that additions to the pool are handled //! correctly. This means that the appropriate data is //! added to the pool and gas fees are submitted appropriately. -use std::collections::{BTreeSet, HashSet}; +use std::collections::BTreeSet; use borsh::BorshDeserialize; use eyre::eyre; -use crate::ledger::eth_bridge::storage::bridge_pool::{get_pending_key, is_protected_storage, BRIDGE_POOL_ADDRESS, is_bridge_pool_key}; +use crate::ledger::eth_bridge::storage::bridge_pool::{ + get_pending_key, is_bridge_pool_key, BRIDGE_POOL_ADDRESS, +}; use crate::ledger::native_vp::{Ctx, NativeVp, StorageReader}; use crate::ledger::storage::traits::StorageHasher; use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::keccak::encode::Encode; -use crate::types::storage::{Key, KeySeg}; +use crate::types::storage::Key; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; @@ -115,11 +116,11 @@ where }; let pending_key = get_pending_key(&transfer); - for key in keys_changed.iter().filter(is_bridge_pool_key) { - if key != pending_key { + for key in keys_changed.iter().filter(|k| is_bridge_pool_key(k)) { + if *key != pending_key { tracing::debug!( - "Rejecting transaction as it is attempting to change an incorrect \ - key in the pending transaction pool." + "Rejecting transaction as it is attempting to change an \ + incorrect key in the pending transaction pool." ); return Ok(false); } @@ -130,9 +131,7 @@ where pending transfers" ))?; if pending != transfer { - tracing::debug!( - "An incorrect transfer was added to the pool." - ); + tracing::debug!("An incorrect transfer was added to the pool."); return Ok(false); } @@ -268,19 +267,21 @@ mod test_bridge_pool_vp { ) } + enum Expect { + True, + False, + Error, + } + /// Helper function that tests various ways gas can be escrowed, /// either correctly or incorrectly, is handled appropriately fn assert_bridge_pool( payer_delta: SignedAmount, escrow_delta: SignedAmount, insert_transfer: F, - keys_changed: BTreeSet, - expect: bool, + expect: Expect, ) where - F: FnOnce( - PendingTransfer, - HashSet, - ) -> HashSet, + F: FnOnce(PendingTransfer, &mut WriteLog) -> BTreeSet, { // setup let mut write_log = new_writelog(); @@ -336,10 +337,7 @@ mod test_bridge_pool_vp { .expect("Test failed"); // add transfer to pool - let pool = insert_transfer(transfer.clone(), initial_pool()); - write_log - .write(&get_pending_key(), pool.try_to_vec().expect("Test failed")) - .expect("Test failed"); + let keys_changed = insert_transfer(transfer.clone(), &mut write_log); // create the data to be given to the vp let vp = BridgePoolVp { @@ -356,10 +354,12 @@ mod test_bridge_pool_vp { .expect("Test failed"); let verifiers = BTreeSet::default(); - let res = vp - .validate_tx(&signed, &keys_changed, &verifiers) - .expect("Test failed"); - assert_eq!(res, expect); + let res = vp.validate_tx(&signed, &keys_changed, &verifiers); + match expect { + Expect::True => assert!(res.expect("Test failed")), + Expect::False => assert!(!res.expect("Test failed")), + Expect::Error => assert!(res.is_err()), + } } /// Test adding a transfer to the pool and escrowing gas passes vp @@ -368,13 +368,15 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - true, + Expect::True, ); } @@ -385,13 +387,15 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(10.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::False, ); } @@ -402,13 +406,15 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Positive(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::False, ); } @@ -419,13 +425,15 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(10.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::False, ); } @@ -436,58 +444,83 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Negative(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::False, ); } - /// Test that if a transaction is removed from - /// the pool, the tx is rejected. + /// Test that if the transfer was not added to the + /// pool, the vp rejects #[test] - fn test_remove_transfer_rejected() { + fn test_not_adding_transfer_rejected() { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, _pool| HashSet::from([transfer]), - BTreeSet::default(), - false, + |transfer, _| BTreeSet::from([get_pending_key(&transfer)]), + Expect::Error, ); } - /// Test that if the transfer was not added to the - /// pool, the vp rejects + /// Test that if the wrong transaction was added + /// to the pool, it is rejected. #[test] - fn test_not_adding_transfer_rejected() { + fn test_add_wrong_transfer() { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |_transfer, pool| pool, - BTreeSet::default(), - false, + |transfer, log| { + let t = PendingTransfer { + transfer: TransferToEthereum { + asset: EthAddress([0; 20]), + recipient: EthAddress([1; 20]), + amount: 100.into(), + nonce: 10u64.into(), + }, + gas_fee: GasFee { + amount: GAS_FEE.into(), + payer: bertha_address(), + }, + }; + log.write(&get_pending_key(&transfer), t.try_to_vec().unwrap()) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) + }, + Expect::False, ); } /// Test that if the wrong transaction was added /// to the pool, it is rejected. #[test] - fn test_add_wrong_transfer() { + fn test_add_wrong_key() { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |_transfer, pool| { - let mut pool = pool; - let wrong_transfer = - initial_pool().into_iter().next().expect("Test failed"); - pool.insert(wrong_transfer); - pool + |transfer, log| { + let t = PendingTransfer { + transfer: TransferToEthereum { + asset: EthAddress([0; 20]), + recipient: EthAddress([1; 20]), + amount: 100.into(), + nonce: 10u64.into(), + }, + gas_fee: GasFee { + amount: GAS_FEE.into(), + payer: bertha_address(), + }, + }; + log.write(&get_pending_key(&t), transfer.try_to_vec().unwrap()) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::Error, ); } @@ -498,13 +531,18 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([ + get_pending_key(&transfer), + get_signed_root_key(), + ]) }, - BTreeSet::from([get_signed_root_key()]), - false, + Expect::False, ); } @@ -535,11 +573,11 @@ mod test_bridge_pool_vp { }, }; - // add transfer to pool - let mut pool = initial_pool(); - pool.insert(transfer.clone()); write_log - .write(&get_pending_key(), pool.try_to_vec().expect("Test failed")) + .write( + &get_pending_key(&transfer), + transfer.try_to_vec().expect("Test failed"), + ) .expect("Test failed"); // create the data to be given to the vp diff --git a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs index 70dc9929b4..c9d3be5366 100644 --- a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs @@ -16,8 +16,6 @@ use crate::types::storage::{DbKeySeg, Key, KeySeg}; /// The main address of the Ethereum bridge pool pub const BRIDGE_POOL_ADDRESS: Address = Address::Internal(InternalAddress::EthBridgePool); -/// Sub-segmnet for getting the contents of the pool -const PENDING_TRANSFERS_SEG: &str = "pending_transfers"; /// Sub-segment for getting the latest signed const SIGNED_ROOT_SEG: &str = "signed_root"; From b630ed94fcd69eb3ac1cc2f9d532128c6ad768fc Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 17:30:31 +0200 Subject: [PATCH 10/52] [feat]: Fixed the wasm blob for adding transfers for the bridge pool --- wasm/wasm_source/src/tx_bridge_pool.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/wasm/wasm_source/src/tx_bridge_pool.rs b/wasm/wasm_source/src/tx_bridge_pool.rs index bed8e3820e..0c945d6925 100644 --- a/wasm/wasm_source/src/tx_bridge_pool.rs +++ b/wasm/wasm_source/src/tx_bridge_pool.rs @@ -20,8 +20,6 @@ fn apply_tx(tx_data: Vec) { } = transfer.gas_fees; token::transfer(payer, &BRIDGE_POOL_ADDRESS, &address::xan(), amount); // add transfer into the pool - let pending_key = bridge_pool::get_pending_key(); - let mut pending: HashSet = read(&pending_key).unwrap(); - pending.insert(transfer); - write(pending_key, pending.try_to_vec().unwrap()); + let pending_key = bridge_pool::get_pending_key(&transfer); + write(pending_key, transfer.try_to_vec().unwrap()); } \ No newline at end of file From 61a7fb837cdcc8b20f9b1310fa9d03023b8461fc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 12 Oct 2022 08:32:58 +0000 Subject: [PATCH 11/52] [ci] wasm checksums update --- wasm/checksums.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/wasm/checksums.json b/wasm/checksums.json index 1250ca7e3e..73038833d5 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,19 +1,19 @@ { "tx_bridge_pool.wasm": "tx_bridge_pool.e21563260c03cfdab1f195878f49bf93722027ad26fcd097cfebbc5c4d279082.wasm", - "tx_from_intent.wasm": "tx_from_intent.536ed89ef1c74d3c6b3e005d60cc53bbab7c36935b46bb69f7287de0a54f91e1.wasm", - "tx_ibc.wasm": "tx_ibc.790e710a87d31a215c19dd29d3c3723f6bb0e22482b3a368c21a367df99aefe8.wasm", - "tx_init_account.wasm": "tx_init_account.a50110eb561a84549708b98b5841358ed87de5a9b08f8a947711c5908eb13558.wasm", - "tx_init_nft.wasm": "tx_init_nft.bee3fbefc9e6319eea9244b9abc7fa5e80a62b43a003260803989856aef8d438.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.26ed1981f8f0ee5b9852dd96d7ad171707194056db5731e9915dbb1747892303.wasm", - "tx_init_validator.wasm": "tx_init_validator.8b37971addbd3ace29174db5f618f06b62115cd7b44ff1b7d756c9d4d81cbc56.wasm", - "tx_mint_nft.wasm": "tx_mint_nft.659dbac8df06b8e6775e680ebb772c3d19733b9e14ea513c665a78ac70788610.wasm", - "tx_transfer.wasm": "tx_transfer.03a7bff45511f240ebdf92f5e4612e244cc937fda3a22ba0a77936e36d834f37.wasm", - "tx_unbond.wasm": "tx_unbond.74388ad956a8ed618974140836e97ae254ae9e8a3e24065908e3a318d55fd37b.wasm", - "tx_update_vp.wasm": "tx_update_vp.4e5d802da0ef98daa6c904522c6fd4964020cc9ce948f16579a6cec1793337b8.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.f3103ee1148954898e2cd92eb0134b34792e7a373a505f37544f389b3cd3cc88.wasm", - "tx_withdraw.wasm": "tx_withdraw.3e1619ad5db6dcb2146684bf54f2e383747fa81f1baf9d00005c4431a3d0a566.wasm", - "vp_nft.wasm": "vp_nft.31a3045be40eeabb48140d2f68db26006991dffb208f6bd394a0b6740cd5b4d0.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.d4b27eadcb98ed3664028bee05fe33f8acb7a59182ca22833a77df696d1cf369.wasm", - "vp_token.wasm": "vp_token.aea6ee5649995c6352d982687c30cfe44fcf05a0cd9cb9b0b48d80768633d098.wasm", - "vp_user.wasm": "vp_user.589011534fd04c4b44fb4412b2f58ea548628dc1ba4db5d45a9aaa1f9e6f0552.wasm" + "tx_from_intent.wasm": "tx_from_intent.d5fc1b1c43e88ebdb60da385d2c4d0561f01cd40f4dacdc7c87ed7c8028679cf.wasm", + "tx_ibc.wasm": "tx_ibc.e97671a3584072c854d0a3638adcd87370b3a15e0084f1721babe6169a325499.wasm", + "tx_init_account.wasm": "tx_init_account.cc60e72a9f3e010793f2255320559f8508a8f41f699012a15e7e2ad7b9b91e8d.wasm", + "tx_init_nft.wasm": "tx_init_nft.fc4846b333cde985a0435ece4c67cf4720fc690f0b691d7c47750164dc25b7f7.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.5e440b0dd0087fd8a0ffa41725038e66ecf5f6932d013faf73550ae95d598db4.wasm", + "tx_init_validator.wasm": "tx_init_validator.6088e7415f6d346ef15533ef2b9116141707e63a08dc734a22847b972fa61d10.wasm", + "tx_mint_nft.wasm": "tx_mint_nft.0ec77f549ed90b9e5c1b03e6697835250ff426c20c09904c28e37b27930cc9f9.wasm", + "tx_transfer.wasm": "tx_transfer.855a118f90703815f72425f162c0beba543870db2768a2e2855ce29b508c6594.wasm", + "tx_unbond.wasm": "tx_unbond.8c24da4d52ae3bb513ac08889b1b7f10fa3a26271713cca4f758a5a72f0f7fa9.wasm", + "tx_update_vp.wasm": "tx_update_vp.a7b0c9370d60d4168a198af66ed5e3ce094e250e566bdff23ec0fbb2236d576e.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.3d0433598d600227b936caadd1e2e9c7cf7e1989225cc5d2660a1f8bc0d00e09.wasm", + "tx_withdraw.wasm": "tx_withdraw.dfdee0959a74df3335c2e262fd18030e4ce5dff862fc98ab4c9a461ccb2a4dd3.wasm", + "vp_nft.wasm": "vp_nft.aea9aa6952d86799992c8374f568b589a48750f32ce3f19c8807281307204a6d.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.64bc3bc9a5f8d03204aa834d2105b4a91fee65e685a5672ff4a203df5eff44ad.wasm", + "vp_token.wasm": "vp_token.a08656587dcaa572872f3757d05f30494b4add02d821c0101b4244a1068bfae2.wasm", + "vp_user.wasm": "vp_user.b7daaa56f48b385f936b2ff907b85298ee1aa8d422ef6fd9df3c044ee7fdadbf.wasm" } \ No newline at end of file From 9aae01bcfe100cdd2fea2d810b0884e6ffeac63d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 12 Oct 2022 08:33:01 +0000 Subject: [PATCH 12/52] [ci] wasm checksums update --- wasm/checksums.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/wasm/checksums.json b/wasm/checksums.json index 73038833d5..4754de3ff7 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,19 +1,19 @@ { "tx_bridge_pool.wasm": "tx_bridge_pool.e21563260c03cfdab1f195878f49bf93722027ad26fcd097cfebbc5c4d279082.wasm", - "tx_from_intent.wasm": "tx_from_intent.d5fc1b1c43e88ebdb60da385d2c4d0561f01cd40f4dacdc7c87ed7c8028679cf.wasm", - "tx_ibc.wasm": "tx_ibc.e97671a3584072c854d0a3638adcd87370b3a15e0084f1721babe6169a325499.wasm", - "tx_init_account.wasm": "tx_init_account.cc60e72a9f3e010793f2255320559f8508a8f41f699012a15e7e2ad7b9b91e8d.wasm", - "tx_init_nft.wasm": "tx_init_nft.fc4846b333cde985a0435ece4c67cf4720fc690f0b691d7c47750164dc25b7f7.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.5e440b0dd0087fd8a0ffa41725038e66ecf5f6932d013faf73550ae95d598db4.wasm", - "tx_init_validator.wasm": "tx_init_validator.6088e7415f6d346ef15533ef2b9116141707e63a08dc734a22847b972fa61d10.wasm", - "tx_mint_nft.wasm": "tx_mint_nft.0ec77f549ed90b9e5c1b03e6697835250ff426c20c09904c28e37b27930cc9f9.wasm", - "tx_transfer.wasm": "tx_transfer.855a118f90703815f72425f162c0beba543870db2768a2e2855ce29b508c6594.wasm", - "tx_unbond.wasm": "tx_unbond.8c24da4d52ae3bb513ac08889b1b7f10fa3a26271713cca4f758a5a72f0f7fa9.wasm", + "tx_from_intent.wasm": "tx_from_intent.658fa18092d794db18c0084779568411c4c1b7c8d163b78c5338d6016a75d6c6.wasm", + "tx_ibc.wasm": "tx_ibc.5188c4ff27f8823b672e7e85844208893332a9f47adbbff08a51bc7694e9bab0.wasm", + "tx_init_account.wasm": "tx_init_account.159d8afce1e760d1e4bbb0a699dfe1e8543074238523964c69ac9ea6b9ac8d9a.wasm", + "tx_init_nft.wasm": "tx_init_nft.6ee23f0cff039a81a2fdbb5ca4bdc332aee2bc96f205bf55f35e3d04f16bffd5.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.cc839bb461efe6d0ea9337d6e2d8698d829c2c6b828d46dbb9e9deed1977337d.wasm", + "tx_init_validator.wasm": "tx_init_validator.7b230affa897b6dca91915d8d9486204edb8c3b2d0a9fa72277d06d3085887e7.wasm", + "tx_mint_nft.wasm": "tx_mint_nft.87767ccb2483d75f195470dbd3b961132e85a1aeb9bce55a10d24e4d11dfbfba.wasm", + "tx_transfer.wasm": "tx_transfer.d7cb47c03c3036f053c99c9cbb467e3e4e3ca80c9ffa5f893e0737174423bdb8.wasm", + "tx_unbond.wasm": "tx_unbond.f5bc85a36a9b26a0290404362997428de321f34098e42b1e37876b87d2bed965.wasm", "tx_update_vp.wasm": "tx_update_vp.a7b0c9370d60d4168a198af66ed5e3ce094e250e566bdff23ec0fbb2236d576e.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.3d0433598d600227b936caadd1e2e9c7cf7e1989225cc5d2660a1f8bc0d00e09.wasm", - "tx_withdraw.wasm": "tx_withdraw.dfdee0959a74df3335c2e262fd18030e4ce5dff862fc98ab4c9a461ccb2a4dd3.wasm", - "vp_nft.wasm": "vp_nft.aea9aa6952d86799992c8374f568b589a48750f32ce3f19c8807281307204a6d.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.64bc3bc9a5f8d03204aa834d2105b4a91fee65e685a5672ff4a203df5eff44ad.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.8d4e8653c40e703c2c4ad50eb1d3e0e5d40a5ed8e4ec83d37ff13b2b102f0390.wasm", + "tx_withdraw.wasm": "tx_withdraw.3abc393edcd9ac5b7ea0a4f086d339adf31c0a16bd8c267a0bce7dd66a976d59.wasm", + "vp_nft.wasm": "vp_nft.c1c9e2e806ec23da24b404d5124dd70e94a4eb9d7176d0893a6c06b564817b12.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.a4c1c679ea003bd2b39293cddfc3db58b0d68ed3609aed4b5b0c7010cb6d235d.wasm", "vp_token.wasm": "vp_token.a08656587dcaa572872f3757d05f30494b4add02d821c0101b4244a1068bfae2.wasm", - "vp_user.wasm": "vp_user.b7daaa56f48b385f936b2ff907b85298ee1aa8d422ef6fd9df3c044ee7fdadbf.wasm" + "vp_user.wasm": "vp_user.cbcfe75a037fe36e192f841a8b65f8f81dab2fac61d57f08d0a6bafbc0e2b016.wasm" } \ No newline at end of file From 289839e387279fcffadbbf1d5d787b086c0025cb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 17 Oct 2022 15:33:09 +0000 Subject: [PATCH 13/52] [ci] wasm checksums update --- wasm/checksums.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/wasm/checksums.json b/wasm/checksums.json index 4754de3ff7..850b41f1b8 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,19 +1,19 @@ { "tx_bridge_pool.wasm": "tx_bridge_pool.e21563260c03cfdab1f195878f49bf93722027ad26fcd097cfebbc5c4d279082.wasm", - "tx_from_intent.wasm": "tx_from_intent.658fa18092d794db18c0084779568411c4c1b7c8d163b78c5338d6016a75d6c6.wasm", - "tx_ibc.wasm": "tx_ibc.5188c4ff27f8823b672e7e85844208893332a9f47adbbff08a51bc7694e9bab0.wasm", - "tx_init_account.wasm": "tx_init_account.159d8afce1e760d1e4bbb0a699dfe1e8543074238523964c69ac9ea6b9ac8d9a.wasm", - "tx_init_nft.wasm": "tx_init_nft.6ee23f0cff039a81a2fdbb5ca4bdc332aee2bc96f205bf55f35e3d04f16bffd5.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.cc839bb461efe6d0ea9337d6e2d8698d829c2c6b828d46dbb9e9deed1977337d.wasm", - "tx_init_validator.wasm": "tx_init_validator.7b230affa897b6dca91915d8d9486204edb8c3b2d0a9fa72277d06d3085887e7.wasm", - "tx_mint_nft.wasm": "tx_mint_nft.87767ccb2483d75f195470dbd3b961132e85a1aeb9bce55a10d24e4d11dfbfba.wasm", - "tx_transfer.wasm": "tx_transfer.d7cb47c03c3036f053c99c9cbb467e3e4e3ca80c9ffa5f893e0737174423bdb8.wasm", - "tx_unbond.wasm": "tx_unbond.f5bc85a36a9b26a0290404362997428de321f34098e42b1e37876b87d2bed965.wasm", - "tx_update_vp.wasm": "tx_update_vp.a7b0c9370d60d4168a198af66ed5e3ce094e250e566bdff23ec0fbb2236d576e.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.8d4e8653c40e703c2c4ad50eb1d3e0e5d40a5ed8e4ec83d37ff13b2b102f0390.wasm", - "tx_withdraw.wasm": "tx_withdraw.3abc393edcd9ac5b7ea0a4f086d339adf31c0a16bd8c267a0bce7dd66a976d59.wasm", - "vp_nft.wasm": "vp_nft.c1c9e2e806ec23da24b404d5124dd70e94a4eb9d7176d0893a6c06b564817b12.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.a4c1c679ea003bd2b39293cddfc3db58b0d68ed3609aed4b5b0c7010cb6d235d.wasm", - "vp_token.wasm": "vp_token.a08656587dcaa572872f3757d05f30494b4add02d821c0101b4244a1068bfae2.wasm", - "vp_user.wasm": "vp_user.cbcfe75a037fe36e192f841a8b65f8f81dab2fac61d57f08d0a6bafbc0e2b016.wasm" + "tx_from_intent.wasm": "tx_from_intent.7e9893f8e2affcfbb4e04fe936bb18571645353da08d8e08d880971f2cfca053.wasm", + "tx_ibc.wasm": "tx_ibc.29d0881d94f45a2fd67bb0f8cbc432a4c2c18ce96c1e17712b721a3ae04788d2.wasm", + "tx_init_account.wasm": "tx_init_account.fff73dad57c9f1f670593939b4a0a895ed538324a9a39958e3724a51b1fc1524.wasm", + "tx_init_nft.wasm": "tx_init_nft.378007b60d8324df95f0db09b568b8924b411d6402a76e0280ce5bb95835dff2.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.59c9755b31a9727c7b5908c2c404f193b9de7ffac919833c342e06e4bca31953.wasm", + "tx_init_validator.wasm": "tx_init_validator.34b7afb1af8f7b23c00812e969f89058754c8447704a9cd1acd595281c58d16a.wasm", + "tx_mint_nft.wasm": "tx_mint_nft.7962f00c4735a88cae4363ca172e6bbe1cd0b75c7271b5203b141e29a2d039ff.wasm", + "tx_transfer.wasm": "tx_transfer.e818885f13cbe1349c8702fa848991263b4032cae6c2f68df75cf9e4a7d4b4db.wasm", + "tx_unbond.wasm": "tx_unbond.1e3a5e7e5e85cf6222af2255e8bea9658693758473aba1022304c4b5af4d7f78.wasm", + "tx_update_vp.wasm": "tx_update_vp.4e5d802da0ef98daa6c904522c6fd4964020cc9ce948f16579a6cec1793337b8.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.d61eb971b9e8eab8d8d2ddf5ff238f2de769bc227cbcb14beb6e36462102ff36.wasm", + "tx_withdraw.wasm": "tx_withdraw.76c8c25e235a9e351796caef61a783e15e289f0a8b8ebdfba6ffefb027ec4f68.wasm", + "vp_nft.wasm": "vp_nft.acd5da5193e1d02caf3a278ea88eaa22943cd280e9c84a8d381217399c8bdabf.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.cc2633219e7fe4a807fb6e25ae8c7248b35dcea239dd6b108293bfee26d3a512.wasm", + "vp_token.wasm": "vp_token.cee6c283ec93ecf78d473cf382b2ec78a891d705fa48ca5c7393c61b74bb2aa7.wasm", + "vp_user.wasm": "vp_user.62b8491c45cb9fb1b2b4f4d4590a119ba34fcca8d63539ed2717c3bef365aff1.wasm" } \ No newline at end of file From e88eeac2f7eae59466fce12b22f02d50415fd4f6 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 18 Oct 2022 16:06:12 +0200 Subject: [PATCH 14/52] [fix]: Added some more logging --- shared/src/ledger/eth_bridge/bridge_pool_vp.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index d347755e76..b9dc885e04 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -120,7 +120,10 @@ where if *key != pending_key { tracing::debug!( "Rejecting transaction as it is attempting to change an \ - incorrect key in the pending transaction pool." + incorrect key in the pending transaction pool: {}.\n \ + Expected key: {}", + key, + pending_key ); return Ok(false); } @@ -131,7 +134,12 @@ where pending transfers" ))?; if pending != transfer { - tracing::debug!("An incorrect transfer was added to the pool."); + tracing::debug!( + "An incorrect transfer was added to the pool: {:?}.\n \ + Expected: {:?}", + transfer, + pending + ); return Ok(false); } From 1185da7440d2945c323bd314248fea0a2f8eb4b9 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 15:06:05 +0200 Subject: [PATCH 15/52] [feat]: Updated bridge pool vp with the the new merklized storage --- .../src/ledger/eth_bridge/bridge_pool_vp.rs | 63 +++++++------------ .../ledger/eth_bridge/storage/bridge_pool.rs | 13 +--- shared/src/types/storage.rs | 17 +++++ 3 files changed, 42 insertions(+), 51 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 0624a83ae1..f558c2d2dc 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -14,16 +14,15 @@ use std::collections::{BTreeSet, HashSet}; use borsh::BorshDeserialize; use eyre::eyre; -use crate::ledger::eth_bridge::storage::bridge_pool::{ - get_pending_key, is_protected_storage, BRIDGE_POOL_ADDRESS, -}; +use crate::ledger::eth_bridge::storage::bridge_pool::{get_pending_key, is_protected_storage, BRIDGE_POOL_ADDRESS, is_bridge_pool_key}; use crate::ledger::native_vp::{Ctx, NativeVp, StorageReader}; use crate::ledger::storage::traits::StorageHasher; use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::storage::Key; +use crate::types::keccak::encode::Encode; +use crate::types::storage::{Key, KeySeg}; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; @@ -115,43 +114,27 @@ where } }; - // check that only the pending_key value is changed - if keys_changed.iter().any(is_protected_storage) { - tracing::debug!( - "Rejecting transaction as it is attempting to change the \ - bridge pool storage other than the pending transaction pool" - ); - return Ok(false); + let pending_key = get_pending_key(&transfer); + for key in keys_changed.iter().filter(is_bridge_pool_key) { + if key != pending_key { + tracing::debug!( + "Rejecting transaction as it is attempting to change an incorrect \ + key in the pending transaction pool." + ); + return Ok(false); + } } - // check that the pending transfer (and only that) was added to the pool - // TODO: This will change slightly when we merkelize the pool, - // but that will be a separate PR. - let pending_key = get_pending_key(); - let pending_pre: HashSet = - (&self.ctx).read_pre_value(&pending_key)?.ok_or(eyre!( - "The bridge pool transfers are missing from storage" - ))?; - let pending_post: HashSet = + let pending: PendingTransfer = (&self.ctx).read_post_value(&pending_key)?.ok_or(eyre!( - "The bridge pool transfers are missing from storage" - ))?; - if !pending_post.contains(&transfer) { - tracing::debug!( "Rejecting transaction as the transfer wasn't added to the \ pending transfers" + ))?; + if pending != transfer { + tracing::debug!( + "An incorrect transfer was added to the pool." ); return Ok(false); } - for item in pending_pre.symmetric_difference(&pending_post) { - if item != &transfer { - tracing::debug!( - ?item, - "Rejecting transaction as an unrecognized item was added \ - to the pending transfers" - ); - return Ok(false); - } - } // check that gas fees were put into escrow @@ -232,8 +215,8 @@ mod test_bridge_pool_vp { } /// The bridge pool at the beginning of all tests - fn initial_pool() -> HashSet { - let transfer = PendingTransfer { + fn initial_pool() -> PendingTransfer { + PendingTransfer { transfer: TransferToEthereum { asset: EthAddress([0; 20]), recipient: EthAddress([0; 20]), @@ -244,9 +227,7 @@ mod test_bridge_pool_vp { amount: 0.into(), payer: bertha_address(), }, - }; - - HashSet::::from([transfer]) + } } /// Create a new storage @@ -256,9 +237,9 @@ mod test_bridge_pool_vp { writelog .write(&get_signed_root_key(), Hash([0; 32]).try_to_vec().unwrap()) .unwrap(); - + let transfer = initial_pool(); writelog - .write(&get_pending_key(), initial_pool().try_to_vec().unwrap()) + .write(&get_pending_key(&transfer), transfer.try_to_vec().unwrap()) .unwrap(); let escrow_key = balance_key(&xan(), &BRIDGE_POOL_ADDRESS); let amount: Amount = ESCROWED_AMOUNT.into(); diff --git a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs index 0a3afe7eda..8de9bcfef9 100644 --- a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs @@ -11,7 +11,7 @@ use crate::types::eth_bridge_pool::PendingTransfer; use crate::types::hash::Hash; use crate::types::keccak::encode::Encode; use crate::types::keccak::{keccak_hash, KeccakHash}; -use crate::types::storage::{DbKeySeg, Key}; +use crate::types::storage::{DbKeySeg, Key, KeySeg}; /// The main address of the Ethereum bridge pool pub const BRIDGE_POOL_ADDRESS: Address = @@ -27,11 +27,11 @@ const SIGNED_ROOT_SEG: &str = "signed_root"; pub struct Error(#[from] eyre::Error); /// Get the storage key for the transfers in the pool -pub fn get_pending_key() -> Key { +pub fn get_pending_key(transfer: &PendingTransfer) -> Key { Key { segments: vec![ DbKeySeg::AddressSeg(BRIDGE_POOL_ADDRESS), - DbKeySeg::StringSeg(PENDING_TRANSFERS_SEG.into()), + transfer.keccak256().to_db_key(), ], } } @@ -52,13 +52,6 @@ pub fn is_bridge_pool_key(key: &Key) -> bool { matches!(&key.segments[0], DbKeySeg::AddressSeg(addr) if addr == &BRIDGE_POOL_ADDRESS) } -/// Check if a key belongs to the bridge pool but is not -/// the key for the pending transaction pool. Such keys -/// may not be modified via transactions. -pub fn is_protected_storage(key: &Key) -> bool { - is_bridge_pool_key(key) && *key != get_pending_key() -} - /// A simple Merkle tree for the Ethereum bridge pool #[derive( Debug, Default, Clone, BorshSerialize, BorshDeserialize, BorshSchema, diff --git a/shared/src/types/storage.rs b/shared/src/types/storage.rs index be15012cfa..78e54a154a 100644 --- a/shared/src/types/storage.rs +++ b/shared/src/types/storage.rs @@ -20,6 +20,7 @@ use crate::ledger::storage::IBC_KEY_LIMIT; use crate::types::address::{self, Address}; use crate::types::eth_bridge_pool::PendingTransfer; use crate::types::hash::Hash; +use crate::types::keccak::KeccakHash; use crate::types::time::DateTimeUtc; #[allow(missing_docs)] @@ -640,6 +641,22 @@ impl KeySeg for Hash { } } +impl KeySeg for KeccakHash { + fn parse(seg: String) -> Result { + seg.clone() + .try_into() + .map_err(|_| Error::ParseError(seg, "Hash".into())) + } + + fn raw(&self) -> String { + self.to_string() + } + + fn to_db_key(&self) -> DbKeySeg { + DbKeySeg::StringSeg(self.raw()) + } +} + /// Epoch identifier. Epochs are identified by consecutive numbers. #[derive( Clone, From f414afd08afc1e7cf539590872be1810fe41bafa Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 17:25:52 +0200 Subject: [PATCH 16/52] [feat]: Changed the bridge pool vp to used the merklized storage --- .../src/ledger/eth_bridge/bridge_pool_vp.rs | 210 +++++++++++------- .../ledger/eth_bridge/storage/bridge_pool.rs | 2 - 2 files changed, 124 insertions(+), 88 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index f558c2d2dc..774b2d8b39 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -9,20 +9,21 @@ //! This VP checks that additions to the pool are handled //! correctly. This means that the appropriate data is //! added to the pool and gas fees are submitted appropriately. -use std::collections::{BTreeSet, HashSet}; +use std::collections::BTreeSet; use borsh::BorshDeserialize; use eyre::eyre; -use crate::ledger::eth_bridge::storage::bridge_pool::{get_pending_key, is_protected_storage, BRIDGE_POOL_ADDRESS, is_bridge_pool_key}; +use crate::ledger::eth_bridge::storage::bridge_pool::{ + get_pending_key, is_bridge_pool_key, BRIDGE_POOL_ADDRESS, +}; use crate::ledger::native_vp::{Ctx, NativeVp, StorageReader}; use crate::ledger::storage::traits::StorageHasher; use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::keccak::encode::Encode; -use crate::types::storage::{Key, KeySeg}; +use crate::types::storage::Key; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; @@ -115,11 +116,11 @@ where }; let pending_key = get_pending_key(&transfer); - for key in keys_changed.iter().filter(is_bridge_pool_key) { - if key != pending_key { + for key in keys_changed.iter().filter(|k| is_bridge_pool_key(k)) { + if *key != pending_key { tracing::debug!( - "Rejecting transaction as it is attempting to change an incorrect \ - key in the pending transaction pool." + "Rejecting transaction as it is attempting to change an \ + incorrect key in the pending transaction pool." ); return Ok(false); } @@ -130,9 +131,7 @@ where pending transfers" ))?; if pending != transfer { - tracing::debug!( - "An incorrect transfer was added to the pool." - ); + tracing::debug!("An incorrect transfer was added to the pool."); return Ok(false); } @@ -272,19 +271,21 @@ mod test_bridge_pool_vp { ) } + enum Expect { + True, + False, + Error, + } + /// Helper function that tests various ways gas can be escrowed, /// either correctly or incorrectly, is handled appropriately fn assert_bridge_pool( payer_delta: SignedAmount, escrow_delta: SignedAmount, insert_transfer: F, - keys_changed: BTreeSet, - expect: bool, + expect: Expect, ) where - F: FnOnce( - PendingTransfer, - HashSet, - ) -> HashSet, + F: FnOnce(PendingTransfer, &mut WriteLog) -> BTreeSet, { // setup let mut write_log = new_writelog(); @@ -340,10 +341,7 @@ mod test_bridge_pool_vp { .expect("Test failed"); // add transfer to pool - let pool = insert_transfer(transfer.clone(), initial_pool()); - write_log - .write(&get_pending_key(), pool.try_to_vec().expect("Test failed")) - .expect("Test failed"); + let keys_changed = insert_transfer(transfer.clone(), &mut write_log); // create the data to be given to the vp let vp = BridgePoolVp { @@ -360,10 +358,12 @@ mod test_bridge_pool_vp { .expect("Test failed"); let verifiers = BTreeSet::default(); - let res = vp - .validate_tx(&signed, &keys_changed, &verifiers) - .expect("Test failed"); - assert_eq!(res, expect); + let res = vp.validate_tx(&signed, &keys_changed, &verifiers); + match expect { + Expect::True => assert!(res.expect("Test failed")), + Expect::False => assert!(!res.expect("Test failed")), + Expect::Error => assert!(res.is_err()), + } } /// Test adding a transfer to the pool and escrowing gas passes vp @@ -372,13 +372,15 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - true, + Expect::True, ); } @@ -389,13 +391,15 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(10.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::False, ); } @@ -406,13 +410,15 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Positive(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::False, ); } @@ -423,13 +429,15 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(10.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::False, ); } @@ -440,58 +448,83 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Negative(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::False, ); } - /// Test that if a transaction is removed from - /// the pool, the tx is rejected. + /// Test that if the transfer was not added to the + /// pool, the vp rejects #[test] - fn test_remove_transfer_rejected() { + fn test_not_adding_transfer_rejected() { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, _pool| HashSet::from([transfer]), - BTreeSet::default(), - false, + |transfer, _| BTreeSet::from([get_pending_key(&transfer)]), + Expect::Error, ); } - /// Test that if the transfer was not added to the - /// pool, the vp rejects + /// Test that if the wrong transaction was added + /// to the pool, it is rejected. #[test] - fn test_not_adding_transfer_rejected() { + fn test_add_wrong_transfer() { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |_transfer, pool| pool, - BTreeSet::default(), - false, + |transfer, log| { + let t = PendingTransfer { + transfer: TransferToEthereum { + asset: EthAddress([0; 20]), + recipient: EthAddress([1; 20]), + amount: 100.into(), + nonce: 10u64.into(), + }, + gas_fee: GasFee { + amount: GAS_FEE.into(), + payer: bertha_address(), + }, + }; + log.write(&get_pending_key(&transfer), t.try_to_vec().unwrap()) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) + }, + Expect::False, ); } /// Test that if the wrong transaction was added /// to the pool, it is rejected. #[test] - fn test_add_wrong_transfer() { + fn test_add_wrong_key() { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |_transfer, pool| { - let mut pool = pool; - let wrong_transfer = - initial_pool().into_iter().next().expect("Test failed"); - pool.insert(wrong_transfer); - pool + |transfer, log| { + let t = PendingTransfer { + transfer: TransferToEthereum { + asset: EthAddress([0; 20]), + recipient: EthAddress([1; 20]), + amount: 100.into(), + nonce: 10u64.into(), + }, + gas_fee: GasFee { + amount: GAS_FEE.into(), + payer: bertha_address(), + }, + }; + log.write(&get_pending_key(&t), transfer.try_to_vec().unwrap()) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::Error, ); } @@ -502,13 +535,18 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([ + get_pending_key(&transfer), + get_signed_root_key(), + ]) }, - BTreeSet::from([get_signed_root_key()]), - false, + Expect::False, ); } @@ -539,11 +577,11 @@ mod test_bridge_pool_vp { }, }; - // add transfer to pool - let mut pool = initial_pool(); - pool.insert(transfer.clone()); write_log - .write(&get_pending_key(), pool.try_to_vec().expect("Test failed")) + .write( + &get_pending_key(&transfer), + transfer.try_to_vec().expect("Test failed"), + ) .expect("Test failed"); // create the data to be given to the vp diff --git a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs index 8de9bcfef9..42e20b6065 100644 --- a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs @@ -16,8 +16,6 @@ use crate::types::storage::{DbKeySeg, Key, KeySeg}; /// The main address of the Ethereum bridge pool pub const BRIDGE_POOL_ADDRESS: Address = Address::Internal(InternalAddress::EthBridgePool); -/// Sub-segmnet for getting the contents of the pool -const PENDING_TRANSFERS_SEG: &str = "pending_transfers"; /// Sub-segment for getting the latest signed const SIGNED_ROOT_SEG: &str = "signed_root"; From 44ccbc5d878b5f6df8fbcd0fbda7954b9059ac3b Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 17:30:31 +0200 Subject: [PATCH 17/52] [feat]: Fixed the wasm blob for adding transfers for the bridge pool --- wasm/wasm_source/src/tx_bridge_pool.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/wasm/wasm_source/src/tx_bridge_pool.rs b/wasm/wasm_source/src/tx_bridge_pool.rs index bed8e3820e..0c945d6925 100644 --- a/wasm/wasm_source/src/tx_bridge_pool.rs +++ b/wasm/wasm_source/src/tx_bridge_pool.rs @@ -20,8 +20,6 @@ fn apply_tx(tx_data: Vec) { } = transfer.gas_fees; token::transfer(payer, &BRIDGE_POOL_ADDRESS, &address::xan(), amount); // add transfer into the pool - let pending_key = bridge_pool::get_pending_key(); - let mut pending: HashSet = read(&pending_key).unwrap(); - pending.insert(transfer); - write(pending_key, pending.try_to_vec().unwrap()); + let pending_key = bridge_pool::get_pending_key(&transfer); + write(pending_key, transfer.try_to_vec().unwrap()); } \ No newline at end of file From 23048b485b100595855fe139f9236ff13cb698f7 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 15:06:05 +0200 Subject: [PATCH 18/52] [feat]: Updated bridge pool vp with the the new merklized storage --- shared/src/ledger/eth_bridge/bridge_pool_vp.rs | 15 +++++++++------ shared/src/types/storage.rs | 16 ++++++++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 774b2d8b39..97aa273088 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -23,7 +23,8 @@ use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::storage::Key; +use crate::types::keccak::encode::Encode; +use crate::types::storage::{Key, KeySeg}; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; @@ -116,11 +117,11 @@ where }; let pending_key = get_pending_key(&transfer); - for key in keys_changed.iter().filter(|k| is_bridge_pool_key(k)) { - if *key != pending_key { + for key in keys_changed.iter().filter(is_bridge_pool_key) { + if key != pending_key { tracing::debug!( - "Rejecting transaction as it is attempting to change an \ - incorrect key in the pending transaction pool." + "Rejecting transaction as it is attempting to change an incorrect \ + key in the pending transaction pool." ); return Ok(false); } @@ -131,7 +132,9 @@ where pending transfers" ))?; if pending != transfer { - tracing::debug!("An incorrect transfer was added to the pool."); + tracing::debug!( + "An incorrect transfer was added to the pool." + ); return Ok(false); } diff --git a/shared/src/types/storage.rs b/shared/src/types/storage.rs index 78e54a154a..4cb6d91f69 100644 --- a/shared/src/types/storage.rs +++ b/shared/src/types/storage.rs @@ -657,6 +657,22 @@ impl KeySeg for KeccakHash { } } +impl KeySeg for KeccakHash { + fn parse(seg: String) -> Result { + seg.clone() + .try_into() + .map_err(|_| Error::ParseError(seg, "Hash".into())) + } + + fn raw(&self) -> String { + self.to_string() + } + + fn to_db_key(&self) -> DbKeySeg { + DbKeySeg::StringSeg(self.raw()) + } +} + /// Epoch identifier. Epochs are identified by consecutive numbers. #[derive( Clone, From 5e0a1c39817c5561bedc1b9d8ba1c6c23343d63d Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 17:25:52 +0200 Subject: [PATCH 19/52] [feat]: Changed the bridge pool vp to used the merklized storage --- shared/src/ledger/eth_bridge/bridge_pool_vp.rs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 97aa273088..774b2d8b39 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -23,8 +23,7 @@ use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::keccak::encode::Encode; -use crate::types::storage::{Key, KeySeg}; +use crate::types::storage::Key; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; @@ -117,11 +116,11 @@ where }; let pending_key = get_pending_key(&transfer); - for key in keys_changed.iter().filter(is_bridge_pool_key) { - if key != pending_key { + for key in keys_changed.iter().filter(|k| is_bridge_pool_key(k)) { + if *key != pending_key { tracing::debug!( - "Rejecting transaction as it is attempting to change an incorrect \ - key in the pending transaction pool." + "Rejecting transaction as it is attempting to change an \ + incorrect key in the pending transaction pool." ); return Ok(false); } @@ -132,9 +131,7 @@ where pending transfers" ))?; if pending != transfer { - tracing::debug!( - "An incorrect transfer was added to the pool." - ); + tracing::debug!("An incorrect transfer was added to the pool."); return Ok(false); } From 82bc30b145c8acd29e495358a257b7dc6b7b27af Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 18 Oct 2022 16:06:12 +0200 Subject: [PATCH 20/52] [fix]: Added some more logging --- shared/src/ledger/eth_bridge/bridge_pool_vp.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 774b2d8b39..3588d76734 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -120,7 +120,10 @@ where if *key != pending_key { tracing::debug!( "Rejecting transaction as it is attempting to change an \ - incorrect key in the pending transaction pool." + incorrect key in the pending transaction pool: {}.\n \ + Expected key: {}", + key, + pending_key ); return Ok(false); } @@ -131,7 +134,12 @@ where pending transfers" ))?; if pending != transfer { - tracing::debug!("An incorrect transfer was added to the pool."); + tracing::debug!( + "An incorrect transfer was added to the pool: {:?}.\n \ + Expected: {:?}", + transfer, + pending + ); return Ok(false); } From 5c20b7e118bca8c654f464117be72348e1a3f783 Mon Sep 17 00:00:00 2001 From: satan Date: Thu, 20 Oct 2022 15:40:29 +0200 Subject: [PATCH 21/52] [fix]: Fixed some garbage created by rebasing --- shared/src/types/storage.rs | 39 +++---------------------------------- 1 file changed, 3 insertions(+), 36 deletions(-) diff --git a/shared/src/types/storage.rs b/shared/src/types/storage.rs index 655c7be0ed..eee9b5b847 100644 --- a/shared/src/types/storage.rs +++ b/shared/src/types/storage.rs @@ -20,7 +20,7 @@ use crate::ledger::storage::IBC_KEY_LIMIT; use crate::types::address::{self, Address}; use crate::types::eth_bridge_pool::PendingTransfer; use crate::types::hash::Hash; -use crate::types::keccak::KeccakHash; +use crate::types::keccak::{KeccakHash, TryFromError}; use crate::types::time::DateTimeUtc; #[allow(missing_docs)] @@ -643,41 +643,8 @@ impl KeySeg for Hash { impl KeySeg for KeccakHash { fn parse(seg: String) -> Result { - seg.clone() - .try_into() - .map_err(|_| Error::ParseError(seg, "Hash".into())) - } - - fn raw(&self) -> String { - self.to_string() - } - - fn to_db_key(&self) -> DbKeySeg { - DbKeySeg::StringSeg(self.raw()) - } -} - -impl KeySeg for KeccakHash { - fn parse(seg: String) -> Result { - seg.clone() - .try_into() - .map_err(|_| Error::ParseError(seg, "Hash".into())) - } - - fn raw(&self) -> String { - self.to_string() - } - - fn to_db_key(&self) -> DbKeySeg { - DbKeySeg::StringSeg(self.raw()) - } -} - -impl KeySeg for KeccakHash { - fn parse(seg: String) -> Result { - seg.clone() - .try_into() - .map_err(|_| Error::ParseError(seg, "Hash".into())) + seg.try_into() + .map_err(|e: TryFromError| Error::ParseError(e.to_string())) } fn raw(&self) -> String { From 9cbd5351c47ced16c0f76ae6d7a12c6722076e90 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 21 Oct 2022 08:39:54 +0000 Subject: [PATCH 22/52] [ci] wasm checksums update --- wasm/checksums.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/wasm/checksums.json b/wasm/checksums.json index 48dd45169b..5f5b21643b 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,20 +1,20 @@ { + "tx_bond.wasm": "tx_bond.730e12ff5cebf2e8bdb23882a0e3ab9ed20df6bfe20e2d6b3578bb474c97a04d.wasm", "tx_bridge_pool.wasm": "tx_bridge_pool.e21563260c03cfdab1f195878f49bf93722027ad26fcd097cfebbc5c4d279082.wasm", - "tx_from_intent.wasm": "tx_from_intent.7e9893f8e2affcfbb4e04fe936bb18571645353da08d8e08d880971f2cfca053.wasm", - "tx_ibc.wasm": "tx_ibc.29d0881d94f45a2fd67bb0f8cbc432a4c2c18ce96c1e17712b721a3ae04788d2.wasm", - "tx_init_account.wasm": "tx_init_account.fff73dad57c9f1f670593939b4a0a895ed538324a9a39958e3724a51b1fc1524.wasm", - "tx_init_nft.wasm": "tx_init_nft.378007b60d8324df95f0db09b568b8924b411d6402a76e0280ce5bb95835dff2.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.59c9755b31a9727c7b5908c2c404f193b9de7ffac919833c342e06e4bca31953.wasm", - "tx_init_validator.wasm": "tx_init_validator.34b7afb1af8f7b23c00812e969f89058754c8447704a9cd1acd595281c58d16a.wasm", - "tx_mint_nft.wasm": "tx_mint_nft.7962f00c4735a88cae4363ca172e6bbe1cd0b75c7271b5203b141e29a2d039ff.wasm", - "tx_transfer.wasm": "tx_transfer.e818885f13cbe1349c8702fa848991263b4032cae6c2f68df75cf9e4a7d4b4db.wasm", - "tx_unbond.wasm": "tx_unbond.1e3a5e7e5e85cf6222af2255e8bea9658693758473aba1022304c4b5af4d7f78.wasm", + "tx_from_intent.wasm": "tx_from_intent.f3add97540ff97ee0e7af21c8b628f8cd6221d2c7150354f9a33fbda4f7da85a.wasm", + "tx_ibc.wasm": "tx_ibc.49f1e97533207af795362dadfc5be7ce6c119a51830707ee12ab14e3eb5e60ba.wasm", + "tx_init_account.wasm": "tx_init_account.5eedb88e7fa75066fbaeaf79a7b63f78346ce5c55ad76325ca7b2ee786cb124d.wasm", + "tx_init_nft.wasm": "tx_init_nft.f4b14f460478f6ab5268a431948da24add566188129b0297a39230e86a945b38.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.ed94170605b1b1b6e0440d2235d25598f1c6976a4a0dbf3d90a1e0154f815740.wasm", + "tx_init_validator.wasm": "tx_init_validator.8db2f2f7b180310591b8163b5db9494e80b59b66bcea72f71d8af09ec8c6da0d.wasm", + "tx_mint_nft.wasm": "tx_mint_nft.deca7087433d476e273094c5017e3b83534d7c8f576c35561f05ab48aeffdea8.wasm", + "tx_transfer.wasm": "tx_transfer.a7f182f0b1398a1da79e8a74d41b70d2b0e39329b1598f9774fb99e46791c895.wasm", + "tx_unbond.wasm": "tx_unbond.7fedc39de1b6f197de757563b142ad43dfe280234df7f0f0434f083419fd7476.wasm", "tx_update_vp.wasm": "tx_update_vp.4e5d802da0ef98daa6c904522c6fd4964020cc9ce948f16579a6cec1793337b8.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.d61eb971b9e8eab8d8d2ddf5ff238f2de769bc227cbcb14beb6e36462102ff36.wasm", - "tx_withdraw.wasm": "tx_withdraw.76c8c25e235a9e351796caef61a783e15e289f0a8b8ebdfba6ffefb027ec4f68.wasm", - "vp_nft.wasm": "vp_nft.acd5da5193e1d02caf3a278ea88eaa22943cd280e9c84a8d381217399c8bdabf.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.cc2633219e7fe4a807fb6e25ae8c7248b35dcea239dd6b108293bfee26d3a512.wasm", - "vp_token.wasm": "vp_token.cee6c283ec93ecf78d473cf382b2ec78a891d705fa48ca5c7393c61b74bb2aa7.wasm", - "vp_user.wasm": "vp_user.62b8491c45cb9fb1b2b4f4d4590a119ba34fcca8d63539ed2717c3bef365aff1.wasm" - + "tx_vote_proposal.wasm": "tx_vote_proposal.af655290e235244a73d7fe16211d790bb45c08c903be40726bb806f84ae2bd2f.wasm", + "tx_withdraw.wasm": "tx_withdraw.9ecd4a4b8b037b79900605f946791677236b7544ea0fa41890d0a3f9bc264a68.wasm", + "vp_nft.wasm": "vp_nft.a7a93adb21605e532bef10274c580d5b8d11c8f49298f6c08ad2e1cd22db5b89.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.8c7c23b7dc72c9b4ecaf1602989431d6338111f730ad85f93b80dfd6a7806417.wasm", + "vp_token.wasm": "vp_token.e2d4cebc4c592ec68a452e1ef55a6bb6b16bd0cf7d77ec3527b4cde82d243251.wasm", + "vp_user.wasm": "vp_user.0e094c576229c2f72d39cdf1ec4a65d35c76dc5823ff4ea2537d22f8c7856977.wasm" } \ No newline at end of file From 2bdc99af57a52432b0c0313ed87af5ab30f5b057 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 15:06:05 +0200 Subject: [PATCH 23/52] [feat]: Updated bridge pool vp with the the new merklized storage --- .../src/ledger/eth_bridge/bridge_pool_vp.rs | 63 +++++++------------ .../ledger/eth_bridge/storage/bridge_pool.rs | 13 +--- shared/src/types/storage.rs | 17 +++++ 3 files changed, 42 insertions(+), 51 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 0624a83ae1..f558c2d2dc 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -14,16 +14,15 @@ use std::collections::{BTreeSet, HashSet}; use borsh::BorshDeserialize; use eyre::eyre; -use crate::ledger::eth_bridge::storage::bridge_pool::{ - get_pending_key, is_protected_storage, BRIDGE_POOL_ADDRESS, -}; +use crate::ledger::eth_bridge::storage::bridge_pool::{get_pending_key, is_protected_storage, BRIDGE_POOL_ADDRESS, is_bridge_pool_key}; use crate::ledger::native_vp::{Ctx, NativeVp, StorageReader}; use crate::ledger::storage::traits::StorageHasher; use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::storage::Key; +use crate::types::keccak::encode::Encode; +use crate::types::storage::{Key, KeySeg}; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; @@ -115,43 +114,27 @@ where } }; - // check that only the pending_key value is changed - if keys_changed.iter().any(is_protected_storage) { - tracing::debug!( - "Rejecting transaction as it is attempting to change the \ - bridge pool storage other than the pending transaction pool" - ); - return Ok(false); + let pending_key = get_pending_key(&transfer); + for key in keys_changed.iter().filter(is_bridge_pool_key) { + if key != pending_key { + tracing::debug!( + "Rejecting transaction as it is attempting to change an incorrect \ + key in the pending transaction pool." + ); + return Ok(false); + } } - // check that the pending transfer (and only that) was added to the pool - // TODO: This will change slightly when we merkelize the pool, - // but that will be a separate PR. - let pending_key = get_pending_key(); - let pending_pre: HashSet = - (&self.ctx).read_pre_value(&pending_key)?.ok_or(eyre!( - "The bridge pool transfers are missing from storage" - ))?; - let pending_post: HashSet = + let pending: PendingTransfer = (&self.ctx).read_post_value(&pending_key)?.ok_or(eyre!( - "The bridge pool transfers are missing from storage" - ))?; - if !pending_post.contains(&transfer) { - tracing::debug!( "Rejecting transaction as the transfer wasn't added to the \ pending transfers" + ))?; + if pending != transfer { + tracing::debug!( + "An incorrect transfer was added to the pool." ); return Ok(false); } - for item in pending_pre.symmetric_difference(&pending_post) { - if item != &transfer { - tracing::debug!( - ?item, - "Rejecting transaction as an unrecognized item was added \ - to the pending transfers" - ); - return Ok(false); - } - } // check that gas fees were put into escrow @@ -232,8 +215,8 @@ mod test_bridge_pool_vp { } /// The bridge pool at the beginning of all tests - fn initial_pool() -> HashSet { - let transfer = PendingTransfer { + fn initial_pool() -> PendingTransfer { + PendingTransfer { transfer: TransferToEthereum { asset: EthAddress([0; 20]), recipient: EthAddress([0; 20]), @@ -244,9 +227,7 @@ mod test_bridge_pool_vp { amount: 0.into(), payer: bertha_address(), }, - }; - - HashSet::::from([transfer]) + } } /// Create a new storage @@ -256,9 +237,9 @@ mod test_bridge_pool_vp { writelog .write(&get_signed_root_key(), Hash([0; 32]).try_to_vec().unwrap()) .unwrap(); - + let transfer = initial_pool(); writelog - .write(&get_pending_key(), initial_pool().try_to_vec().unwrap()) + .write(&get_pending_key(&transfer), transfer.try_to_vec().unwrap()) .unwrap(); let escrow_key = balance_key(&xan(), &BRIDGE_POOL_ADDRESS); let amount: Amount = ESCROWED_AMOUNT.into(); diff --git a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs index e03d499af3..24e31a2791 100644 --- a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs @@ -11,7 +11,7 @@ use crate::types::eth_bridge_pool::PendingTransfer; use crate::types::hash::Hash; use crate::types::keccak::encode::Encode; use crate::types::keccak::{keccak_hash, KeccakHash}; -use crate::types::storage::{DbKeySeg, Key}; +use crate::types::storage::{DbKeySeg, Key, KeySeg}; /// The main address of the Ethereum bridge pool pub const BRIDGE_POOL_ADDRESS: Address = @@ -27,11 +27,11 @@ const SIGNED_ROOT_SEG: &str = "signed_root"; pub struct Error(#[from] eyre::Error); /// Get the storage key for the transfers in the pool -pub fn get_pending_key() -> Key { +pub fn get_pending_key(transfer: &PendingTransfer) -> Key { Key { segments: vec![ DbKeySeg::AddressSeg(BRIDGE_POOL_ADDRESS), - DbKeySeg::StringSeg(PENDING_TRANSFERS_SEG.into()), + transfer.keccak256().to_db_key(), ], } } @@ -52,13 +52,6 @@ pub fn is_bridge_pool_key(key: &Key) -> bool { matches!(&key.segments[0], DbKeySeg::AddressSeg(addr) if addr == &BRIDGE_POOL_ADDRESS) } -/// Check if a key belongs to the bridge pool but is not -/// the key for the pending transaction pool. Such keys -/// may not be modified via transactions. -pub fn is_protected_storage(key: &Key) -> bool { - is_bridge_pool_key(key) && *key != get_pending_key() -} - /// A simple Merkle tree for the Ethereum bridge pool /// /// Note that an empty tree has root [0u8; 20] by definition. diff --git a/shared/src/types/storage.rs b/shared/src/types/storage.rs index be15012cfa..78e54a154a 100644 --- a/shared/src/types/storage.rs +++ b/shared/src/types/storage.rs @@ -20,6 +20,7 @@ use crate::ledger::storage::IBC_KEY_LIMIT; use crate::types::address::{self, Address}; use crate::types::eth_bridge_pool::PendingTransfer; use crate::types::hash::Hash; +use crate::types::keccak::KeccakHash; use crate::types::time::DateTimeUtc; #[allow(missing_docs)] @@ -640,6 +641,22 @@ impl KeySeg for Hash { } } +impl KeySeg for KeccakHash { + fn parse(seg: String) -> Result { + seg.clone() + .try_into() + .map_err(|_| Error::ParseError(seg, "Hash".into())) + } + + fn raw(&self) -> String { + self.to_string() + } + + fn to_db_key(&self) -> DbKeySeg { + DbKeySeg::StringSeg(self.raw()) + } +} + /// Epoch identifier. Epochs are identified by consecutive numbers. #[derive( Clone, From 4c3e0bfc43b95d355660c8988cbc68d028a24d90 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 17:25:52 +0200 Subject: [PATCH 24/52] [feat]: Changed the bridge pool vp to used the merklized storage --- .../src/ledger/eth_bridge/bridge_pool_vp.rs | 210 +++++++++++------- .../ledger/eth_bridge/storage/bridge_pool.rs | 2 - 2 files changed, 124 insertions(+), 88 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index f558c2d2dc..774b2d8b39 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -9,20 +9,21 @@ //! This VP checks that additions to the pool are handled //! correctly. This means that the appropriate data is //! added to the pool and gas fees are submitted appropriately. -use std::collections::{BTreeSet, HashSet}; +use std::collections::BTreeSet; use borsh::BorshDeserialize; use eyre::eyre; -use crate::ledger::eth_bridge::storage::bridge_pool::{get_pending_key, is_protected_storage, BRIDGE_POOL_ADDRESS, is_bridge_pool_key}; +use crate::ledger::eth_bridge::storage::bridge_pool::{ + get_pending_key, is_bridge_pool_key, BRIDGE_POOL_ADDRESS, +}; use crate::ledger::native_vp::{Ctx, NativeVp, StorageReader}; use crate::ledger::storage::traits::StorageHasher; use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::keccak::encode::Encode; -use crate::types::storage::{Key, KeySeg}; +use crate::types::storage::Key; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; @@ -115,11 +116,11 @@ where }; let pending_key = get_pending_key(&transfer); - for key in keys_changed.iter().filter(is_bridge_pool_key) { - if key != pending_key { + for key in keys_changed.iter().filter(|k| is_bridge_pool_key(k)) { + if *key != pending_key { tracing::debug!( - "Rejecting transaction as it is attempting to change an incorrect \ - key in the pending transaction pool." + "Rejecting transaction as it is attempting to change an \ + incorrect key in the pending transaction pool." ); return Ok(false); } @@ -130,9 +131,7 @@ where pending transfers" ))?; if pending != transfer { - tracing::debug!( - "An incorrect transfer was added to the pool." - ); + tracing::debug!("An incorrect transfer was added to the pool."); return Ok(false); } @@ -272,19 +271,21 @@ mod test_bridge_pool_vp { ) } + enum Expect { + True, + False, + Error, + } + /// Helper function that tests various ways gas can be escrowed, /// either correctly or incorrectly, is handled appropriately fn assert_bridge_pool( payer_delta: SignedAmount, escrow_delta: SignedAmount, insert_transfer: F, - keys_changed: BTreeSet, - expect: bool, + expect: Expect, ) where - F: FnOnce( - PendingTransfer, - HashSet, - ) -> HashSet, + F: FnOnce(PendingTransfer, &mut WriteLog) -> BTreeSet, { // setup let mut write_log = new_writelog(); @@ -340,10 +341,7 @@ mod test_bridge_pool_vp { .expect("Test failed"); // add transfer to pool - let pool = insert_transfer(transfer.clone(), initial_pool()); - write_log - .write(&get_pending_key(), pool.try_to_vec().expect("Test failed")) - .expect("Test failed"); + let keys_changed = insert_transfer(transfer.clone(), &mut write_log); // create the data to be given to the vp let vp = BridgePoolVp { @@ -360,10 +358,12 @@ mod test_bridge_pool_vp { .expect("Test failed"); let verifiers = BTreeSet::default(); - let res = vp - .validate_tx(&signed, &keys_changed, &verifiers) - .expect("Test failed"); - assert_eq!(res, expect); + let res = vp.validate_tx(&signed, &keys_changed, &verifiers); + match expect { + Expect::True => assert!(res.expect("Test failed")), + Expect::False => assert!(!res.expect("Test failed")), + Expect::Error => assert!(res.is_err()), + } } /// Test adding a transfer to the pool and escrowing gas passes vp @@ -372,13 +372,15 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - true, + Expect::True, ); } @@ -389,13 +391,15 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(10.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::False, ); } @@ -406,13 +410,15 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Positive(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::False, ); } @@ -423,13 +429,15 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(10.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::False, ); } @@ -440,58 +448,83 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Negative(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::False, ); } - /// Test that if a transaction is removed from - /// the pool, the tx is rejected. + /// Test that if the transfer was not added to the + /// pool, the vp rejects #[test] - fn test_remove_transfer_rejected() { + fn test_not_adding_transfer_rejected() { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, _pool| HashSet::from([transfer]), - BTreeSet::default(), - false, + |transfer, _| BTreeSet::from([get_pending_key(&transfer)]), + Expect::Error, ); } - /// Test that if the transfer was not added to the - /// pool, the vp rejects + /// Test that if the wrong transaction was added + /// to the pool, it is rejected. #[test] - fn test_not_adding_transfer_rejected() { + fn test_add_wrong_transfer() { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |_transfer, pool| pool, - BTreeSet::default(), - false, + |transfer, log| { + let t = PendingTransfer { + transfer: TransferToEthereum { + asset: EthAddress([0; 20]), + recipient: EthAddress([1; 20]), + amount: 100.into(), + nonce: 10u64.into(), + }, + gas_fee: GasFee { + amount: GAS_FEE.into(), + payer: bertha_address(), + }, + }; + log.write(&get_pending_key(&transfer), t.try_to_vec().unwrap()) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) + }, + Expect::False, ); } /// Test that if the wrong transaction was added /// to the pool, it is rejected. #[test] - fn test_add_wrong_transfer() { + fn test_add_wrong_key() { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |_transfer, pool| { - let mut pool = pool; - let wrong_transfer = - initial_pool().into_iter().next().expect("Test failed"); - pool.insert(wrong_transfer); - pool + |transfer, log| { + let t = PendingTransfer { + transfer: TransferToEthereum { + asset: EthAddress([0; 20]), + recipient: EthAddress([1; 20]), + amount: 100.into(), + nonce: 10u64.into(), + }, + gas_fee: GasFee { + amount: GAS_FEE.into(), + payer: bertha_address(), + }, + }; + log.write(&get_pending_key(&t), transfer.try_to_vec().unwrap()) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::Error, ); } @@ -502,13 +535,18 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([ + get_pending_key(&transfer), + get_signed_root_key(), + ]) }, - BTreeSet::from([get_signed_root_key()]), - false, + Expect::False, ); } @@ -539,11 +577,11 @@ mod test_bridge_pool_vp { }, }; - // add transfer to pool - let mut pool = initial_pool(); - pool.insert(transfer.clone()); write_log - .write(&get_pending_key(), pool.try_to_vec().expect("Test failed")) + .write( + &get_pending_key(&transfer), + transfer.try_to_vec().expect("Test failed"), + ) .expect("Test failed"); // create the data to be given to the vp diff --git a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs index 24e31a2791..0ec98b31b6 100644 --- a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs @@ -16,8 +16,6 @@ use crate::types::storage::{DbKeySeg, Key, KeySeg}; /// The main address of the Ethereum bridge pool pub const BRIDGE_POOL_ADDRESS: Address = Address::Internal(InternalAddress::EthBridgePool); -/// Sub-segmnet for getting the contents of the pool -const PENDING_TRANSFERS_SEG: &str = "pending_transfers"; /// Sub-segment for getting the latest signed const SIGNED_ROOT_SEG: &str = "signed_root"; From 3a97f866c334aadea2aac79c19b4b74fb35b63b5 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 17:30:31 +0200 Subject: [PATCH 25/52] [feat]: Fixed the wasm blob for adding transfers for the bridge pool --- wasm/wasm_source/src/tx_bridge_pool.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/wasm/wasm_source/src/tx_bridge_pool.rs b/wasm/wasm_source/src/tx_bridge_pool.rs index bed8e3820e..0c945d6925 100644 --- a/wasm/wasm_source/src/tx_bridge_pool.rs +++ b/wasm/wasm_source/src/tx_bridge_pool.rs @@ -20,8 +20,6 @@ fn apply_tx(tx_data: Vec) { } = transfer.gas_fees; token::transfer(payer, &BRIDGE_POOL_ADDRESS, &address::xan(), amount); // add transfer into the pool - let pending_key = bridge_pool::get_pending_key(); - let mut pending: HashSet = read(&pending_key).unwrap(); - pending.insert(transfer); - write(pending_key, pending.try_to_vec().unwrap()); + let pending_key = bridge_pool::get_pending_key(&transfer); + write(pending_key, transfer.try_to_vec().unwrap()); } \ No newline at end of file From ae75f07eb6a2d687b674bfcbd6f2cebd63608b8a Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 15:06:05 +0200 Subject: [PATCH 26/52] [feat]: Updated bridge pool vp with the the new merklized storage --- shared/src/ledger/eth_bridge/bridge_pool_vp.rs | 15 +++++++++------ shared/src/types/storage.rs | 16 ++++++++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 774b2d8b39..97aa273088 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -23,7 +23,8 @@ use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::storage::Key; +use crate::types::keccak::encode::Encode; +use crate::types::storage::{Key, KeySeg}; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; @@ -116,11 +117,11 @@ where }; let pending_key = get_pending_key(&transfer); - for key in keys_changed.iter().filter(|k| is_bridge_pool_key(k)) { - if *key != pending_key { + for key in keys_changed.iter().filter(is_bridge_pool_key) { + if key != pending_key { tracing::debug!( - "Rejecting transaction as it is attempting to change an \ - incorrect key in the pending transaction pool." + "Rejecting transaction as it is attempting to change an incorrect \ + key in the pending transaction pool." ); return Ok(false); } @@ -131,7 +132,9 @@ where pending transfers" ))?; if pending != transfer { - tracing::debug!("An incorrect transfer was added to the pool."); + tracing::debug!( + "An incorrect transfer was added to the pool." + ); return Ok(false); } diff --git a/shared/src/types/storage.rs b/shared/src/types/storage.rs index 78e54a154a..4cb6d91f69 100644 --- a/shared/src/types/storage.rs +++ b/shared/src/types/storage.rs @@ -657,6 +657,22 @@ impl KeySeg for KeccakHash { } } +impl KeySeg for KeccakHash { + fn parse(seg: String) -> Result { + seg.clone() + .try_into() + .map_err(|_| Error::ParseError(seg, "Hash".into())) + } + + fn raw(&self) -> String { + self.to_string() + } + + fn to_db_key(&self) -> DbKeySeg { + DbKeySeg::StringSeg(self.raw()) + } +} + /// Epoch identifier. Epochs are identified by consecutive numbers. #[derive( Clone, From 54df9ce5c98cd717fc9005351d52cf9f19f3465c Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 17:25:52 +0200 Subject: [PATCH 27/52] [feat]: Changed the bridge pool vp to used the merklized storage --- shared/src/ledger/eth_bridge/bridge_pool_vp.rs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 97aa273088..774b2d8b39 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -23,8 +23,7 @@ use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::keccak::encode::Encode; -use crate::types::storage::{Key, KeySeg}; +use crate::types::storage::Key; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; @@ -117,11 +116,11 @@ where }; let pending_key = get_pending_key(&transfer); - for key in keys_changed.iter().filter(is_bridge_pool_key) { - if key != pending_key { + for key in keys_changed.iter().filter(|k| is_bridge_pool_key(k)) { + if *key != pending_key { tracing::debug!( - "Rejecting transaction as it is attempting to change an incorrect \ - key in the pending transaction pool." + "Rejecting transaction as it is attempting to change an \ + incorrect key in the pending transaction pool." ); return Ok(false); } @@ -132,9 +131,7 @@ where pending transfers" ))?; if pending != transfer { - tracing::debug!( - "An incorrect transfer was added to the pool." - ); + tracing::debug!("An incorrect transfer was added to the pool."); return Ok(false); } From e45b6cf28fcf1632a96efe40365d5b1d6c10cf16 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 18 Oct 2022 16:06:12 +0200 Subject: [PATCH 28/52] [fix]: Added some more logging --- shared/src/ledger/eth_bridge/bridge_pool_vp.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 774b2d8b39..3588d76734 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -120,7 +120,10 @@ where if *key != pending_key { tracing::debug!( "Rejecting transaction as it is attempting to change an \ - incorrect key in the pending transaction pool." + incorrect key in the pending transaction pool: {}.\n \ + Expected key: {}", + key, + pending_key ); return Ok(false); } @@ -131,7 +134,12 @@ where pending transfers" ))?; if pending != transfer { - tracing::debug!("An incorrect transfer was added to the pool."); + tracing::debug!( + "An incorrect transfer was added to the pool: {:?}.\n \ + Expected: {:?}", + transfer, + pending + ); return Ok(false); } From 34aa825f8594e94aaa8cf8151df17bf80c692fc6 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 15:06:05 +0200 Subject: [PATCH 29/52] [feat]: Updated bridge pool vp with the the new merklized storage --- shared/src/ledger/eth_bridge/bridge_pool_vp.rs | 3 ++- shared/src/types/storage.rs | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 3588d76734..117c9e61ef 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -23,7 +23,8 @@ use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::storage::Key; +use crate::types::keccak::encode::Encode; +use crate::types::storage::{Key, KeySeg}; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; diff --git a/shared/src/types/storage.rs b/shared/src/types/storage.rs index 4cb6d91f69..655c7be0ed 100644 --- a/shared/src/types/storage.rs +++ b/shared/src/types/storage.rs @@ -673,6 +673,22 @@ impl KeySeg for KeccakHash { } } +impl KeySeg for KeccakHash { + fn parse(seg: String) -> Result { + seg.clone() + .try_into() + .map_err(|_| Error::ParseError(seg, "Hash".into())) + } + + fn raw(&self) -> String { + self.to_string() + } + + fn to_db_key(&self) -> DbKeySeg { + DbKeySeg::StringSeg(self.raw()) + } +} + /// Epoch identifier. Epochs are identified by consecutive numbers. #[derive( Clone, From f7c97441bf176784a0617a5b4f7ec4ccdcff128d Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 17:25:52 +0200 Subject: [PATCH 30/52] [feat]: Changed the bridge pool vp to used the merklized storage --- shared/src/ledger/eth_bridge/bridge_pool_vp.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 117c9e61ef..47aa3b7968 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -23,8 +23,7 @@ use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::keccak::encode::Encode; -use crate::types::storage::{Key, KeySeg}; +use crate::types::storage::Key; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; @@ -466,6 +465,15 @@ mod test_bridge_pool_vp { BTreeSet::from([get_pending_key(&transfer)]) }, Expect::False, + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) + }, + Expect::False, ); } From 8156bf06412a11c80102be9ee0eff74b6a288f8c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 17 Oct 2022 15:33:09 +0000 Subject: [PATCH 31/52] [ci] wasm checksums update --- wasm/checksums.json | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/wasm/checksums.json b/wasm/checksums.json index 7a6840ef5f..850b41f1b8 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,20 +1,19 @@ { - "tx_bond.wasm": "tx_bond.870a6cd86c7725df65306a4ef49ae05f39ac5d2f7c39bf12c901def38587c016.wasm", "tx_bridge_pool.wasm": "tx_bridge_pool.e21563260c03cfdab1f195878f49bf93722027ad26fcd097cfebbc5c4d279082.wasm", - "tx_from_intent.wasm": "tx_from_intent.f14bd1cf1bc9adce29ff5161d36cade38f75db58daaab0ac4446aeb3752ca491.wasm", - "tx_ibc.wasm": "tx_ibc.d88b6ea37611c9e82d012b468475a2dfe125d5f0ecf8162ee361a2e07ac48a7c.wasm", - "tx_init_account.wasm": "tx_init_account.1424aad69e094e6ddbbcc41c28484675d2ce181699d5820b365cade406a33e3a.wasm", - "tx_init_nft.wasm": "tx_init_nft.b6d193bf41c5b105de075ed832ed9ac5bb0ee03943c0f70ace1888474f50ece7.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.951e3667382e0d81de17ebda9248046a8f1cc2d7e714b0cfa7ae58920c0d02d6.wasm", - "tx_init_validator.wasm": "tx_init_validator.d9ec814be773d6bfd6c36ddb37ace2463effef02d7e089495c3f74de43de556f.wasm", - "tx_mint_nft.wasm": "tx_mint_nft.90b8cf9d1f52b758ae419cefaaa51b270d7492877348ea02357d589f83695099.wasm", - "tx_transfer.wasm": "tx_transfer.ad9707d3e02d01b261675fdb09eab6aedeebea0b8035726df76f68c7279b864b.wasm", - "tx_unbond.wasm": "tx_unbond.f73b997890f6ad61289fdfa01770940bc26e28bf06a8a2e856d2615acdcbe6ae.wasm", + "tx_from_intent.wasm": "tx_from_intent.7e9893f8e2affcfbb4e04fe936bb18571645353da08d8e08d880971f2cfca053.wasm", + "tx_ibc.wasm": "tx_ibc.29d0881d94f45a2fd67bb0f8cbc432a4c2c18ce96c1e17712b721a3ae04788d2.wasm", + "tx_init_account.wasm": "tx_init_account.fff73dad57c9f1f670593939b4a0a895ed538324a9a39958e3724a51b1fc1524.wasm", + "tx_init_nft.wasm": "tx_init_nft.378007b60d8324df95f0db09b568b8924b411d6402a76e0280ce5bb95835dff2.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.59c9755b31a9727c7b5908c2c404f193b9de7ffac919833c342e06e4bca31953.wasm", + "tx_init_validator.wasm": "tx_init_validator.34b7afb1af8f7b23c00812e969f89058754c8447704a9cd1acd595281c58d16a.wasm", + "tx_mint_nft.wasm": "tx_mint_nft.7962f00c4735a88cae4363ca172e6bbe1cd0b75c7271b5203b141e29a2d039ff.wasm", + "tx_transfer.wasm": "tx_transfer.e818885f13cbe1349c8702fa848991263b4032cae6c2f68df75cf9e4a7d4b4db.wasm", + "tx_unbond.wasm": "tx_unbond.1e3a5e7e5e85cf6222af2255e8bea9658693758473aba1022304c4b5af4d7f78.wasm", "tx_update_vp.wasm": "tx_update_vp.4e5d802da0ef98daa6c904522c6fd4964020cc9ce948f16579a6cec1793337b8.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.25bb52d647106263537467e229ddbc1ef57970c222d49830d1bc182727afe4f4.wasm", - "tx_withdraw.wasm": "tx_withdraw.ebe91941b7f8559e651ceeba786d5cf08fba7ee17d2991ef460cbf65e6501664.wasm", - "vp_nft.wasm": "vp_nft.e8bcdf806148418e765aad6fa509993c490a7c2fb7cbc9abe8e469babd371e05.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.d210846a57a8290b726689c50d8002ce374e54c5af08ca7b4edc852832cd42d8.wasm", - "vp_token.wasm": "vp_token.e2d4cebc4c592ec68a452e1ef55a6bb6b16bd0cf7d77ec3527b4cde82d243251.wasm", - "vp_user.wasm": "vp_user.856857cea31ce03e076dcb1a9e5d2a9cf30d3c883365e7230f0c8fa1d4c1dc8a.wasm" + "tx_vote_proposal.wasm": "tx_vote_proposal.d61eb971b9e8eab8d8d2ddf5ff238f2de769bc227cbcb14beb6e36462102ff36.wasm", + "tx_withdraw.wasm": "tx_withdraw.76c8c25e235a9e351796caef61a783e15e289f0a8b8ebdfba6ffefb027ec4f68.wasm", + "vp_nft.wasm": "vp_nft.acd5da5193e1d02caf3a278ea88eaa22943cd280e9c84a8d381217399c8bdabf.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.cc2633219e7fe4a807fb6e25ae8c7248b35dcea239dd6b108293bfee26d3a512.wasm", + "vp_token.wasm": "vp_token.cee6c283ec93ecf78d473cf382b2ec78a891d705fa48ca5c7393c61b74bb2aa7.wasm", + "vp_user.wasm": "vp_user.62b8491c45cb9fb1b2b4f4d4590a119ba34fcca8d63539ed2717c3bef365aff1.wasm" } \ No newline at end of file From e5246eb492eede797b67ed675738bba4d35ca575 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 15:06:05 +0200 Subject: [PATCH 32/52] [feat]: Updated bridge pool vp with the the new merklized storage --- shared/src/ledger/eth_bridge/bridge_pool_vp.rs | 1 + shared/src/types/storage.rs | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 47aa3b7968..c3b05e4e6f 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -23,6 +23,7 @@ use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; +use crate::types::keccak::encode::Encode; use crate::types::storage::Key; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; diff --git a/shared/src/types/storage.rs b/shared/src/types/storage.rs index 655c7be0ed..146d5cfb04 100644 --- a/shared/src/types/storage.rs +++ b/shared/src/types/storage.rs @@ -689,6 +689,22 @@ impl KeySeg for KeccakHash { } } +impl KeySeg for KeccakHash { + fn parse(seg: String) -> Result { + seg.clone() + .try_into() + .map_err(|_| Error::ParseError(seg, "Hash".into())) + } + + fn raw(&self) -> String { + self.to_string() + } + + fn to_db_key(&self) -> DbKeySeg { + DbKeySeg::StringSeg(self.raw()) + } +} + /// Epoch identifier. Epochs are identified by consecutive numbers. #[derive( Clone, From 87dd95fcf2944f435c5fa54de9b92e53dcffa5e8 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 17:25:52 +0200 Subject: [PATCH 33/52] [feat]: Changed the bridge pool vp to used the merklized storage --- shared/src/ledger/eth_bridge/bridge_pool_vp.rs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index c3b05e4e6f..2fbce42f60 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -466,15 +466,6 @@ mod test_bridge_pool_vp { BTreeSet::from([get_pending_key(&transfer)]) }, Expect::False, - |transfer, log| { - log.write( - &get_pending_key(&transfer), - transfer.try_to_vec().unwrap(), - ) - .unwrap(); - BTreeSet::from([get_pending_key(&transfer)]) - }, - Expect::False, ); } From db35c60005b2c16f3773c03e3feef7bd66a27d9f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 12 Oct 2022 08:32:58 +0000 Subject: [PATCH 34/52] [ci] wasm checksums update --- wasm/checksums.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/wasm/checksums.json b/wasm/checksums.json index 850b41f1b8..73038833d5 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,19 +1,19 @@ { "tx_bridge_pool.wasm": "tx_bridge_pool.e21563260c03cfdab1f195878f49bf93722027ad26fcd097cfebbc5c4d279082.wasm", - "tx_from_intent.wasm": "tx_from_intent.7e9893f8e2affcfbb4e04fe936bb18571645353da08d8e08d880971f2cfca053.wasm", - "tx_ibc.wasm": "tx_ibc.29d0881d94f45a2fd67bb0f8cbc432a4c2c18ce96c1e17712b721a3ae04788d2.wasm", - "tx_init_account.wasm": "tx_init_account.fff73dad57c9f1f670593939b4a0a895ed538324a9a39958e3724a51b1fc1524.wasm", - "tx_init_nft.wasm": "tx_init_nft.378007b60d8324df95f0db09b568b8924b411d6402a76e0280ce5bb95835dff2.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.59c9755b31a9727c7b5908c2c404f193b9de7ffac919833c342e06e4bca31953.wasm", - "tx_init_validator.wasm": "tx_init_validator.34b7afb1af8f7b23c00812e969f89058754c8447704a9cd1acd595281c58d16a.wasm", - "tx_mint_nft.wasm": "tx_mint_nft.7962f00c4735a88cae4363ca172e6bbe1cd0b75c7271b5203b141e29a2d039ff.wasm", - "tx_transfer.wasm": "tx_transfer.e818885f13cbe1349c8702fa848991263b4032cae6c2f68df75cf9e4a7d4b4db.wasm", - "tx_unbond.wasm": "tx_unbond.1e3a5e7e5e85cf6222af2255e8bea9658693758473aba1022304c4b5af4d7f78.wasm", - "tx_update_vp.wasm": "tx_update_vp.4e5d802da0ef98daa6c904522c6fd4964020cc9ce948f16579a6cec1793337b8.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.d61eb971b9e8eab8d8d2ddf5ff238f2de769bc227cbcb14beb6e36462102ff36.wasm", - "tx_withdraw.wasm": "tx_withdraw.76c8c25e235a9e351796caef61a783e15e289f0a8b8ebdfba6ffefb027ec4f68.wasm", - "vp_nft.wasm": "vp_nft.acd5da5193e1d02caf3a278ea88eaa22943cd280e9c84a8d381217399c8bdabf.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.cc2633219e7fe4a807fb6e25ae8c7248b35dcea239dd6b108293bfee26d3a512.wasm", - "vp_token.wasm": "vp_token.cee6c283ec93ecf78d473cf382b2ec78a891d705fa48ca5c7393c61b74bb2aa7.wasm", - "vp_user.wasm": "vp_user.62b8491c45cb9fb1b2b4f4d4590a119ba34fcca8d63539ed2717c3bef365aff1.wasm" + "tx_from_intent.wasm": "tx_from_intent.d5fc1b1c43e88ebdb60da385d2c4d0561f01cd40f4dacdc7c87ed7c8028679cf.wasm", + "tx_ibc.wasm": "tx_ibc.e97671a3584072c854d0a3638adcd87370b3a15e0084f1721babe6169a325499.wasm", + "tx_init_account.wasm": "tx_init_account.cc60e72a9f3e010793f2255320559f8508a8f41f699012a15e7e2ad7b9b91e8d.wasm", + "tx_init_nft.wasm": "tx_init_nft.fc4846b333cde985a0435ece4c67cf4720fc690f0b691d7c47750164dc25b7f7.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.5e440b0dd0087fd8a0ffa41725038e66ecf5f6932d013faf73550ae95d598db4.wasm", + "tx_init_validator.wasm": "tx_init_validator.6088e7415f6d346ef15533ef2b9116141707e63a08dc734a22847b972fa61d10.wasm", + "tx_mint_nft.wasm": "tx_mint_nft.0ec77f549ed90b9e5c1b03e6697835250ff426c20c09904c28e37b27930cc9f9.wasm", + "tx_transfer.wasm": "tx_transfer.855a118f90703815f72425f162c0beba543870db2768a2e2855ce29b508c6594.wasm", + "tx_unbond.wasm": "tx_unbond.8c24da4d52ae3bb513ac08889b1b7f10fa3a26271713cca4f758a5a72f0f7fa9.wasm", + "tx_update_vp.wasm": "tx_update_vp.a7b0c9370d60d4168a198af66ed5e3ce094e250e566bdff23ec0fbb2236d576e.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.3d0433598d600227b936caadd1e2e9c7cf7e1989225cc5d2660a1f8bc0d00e09.wasm", + "tx_withdraw.wasm": "tx_withdraw.dfdee0959a74df3335c2e262fd18030e4ce5dff862fc98ab4c9a461ccb2a4dd3.wasm", + "vp_nft.wasm": "vp_nft.aea9aa6952d86799992c8374f568b589a48750f32ce3f19c8807281307204a6d.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.64bc3bc9a5f8d03204aa834d2105b4a91fee65e685a5672ff4a203df5eff44ad.wasm", + "vp_token.wasm": "vp_token.a08656587dcaa572872f3757d05f30494b4add02d821c0101b4244a1068bfae2.wasm", + "vp_user.wasm": "vp_user.b7daaa56f48b385f936b2ff907b85298ee1aa8d422ef6fd9df3c044ee7fdadbf.wasm" } \ No newline at end of file From 297ae10b63d69f80beecfe2338127c24d96517f4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 12 Oct 2022 08:33:01 +0000 Subject: [PATCH 35/52] [ci] wasm checksums update --- wasm/checksums.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/wasm/checksums.json b/wasm/checksums.json index 73038833d5..4754de3ff7 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,19 +1,19 @@ { "tx_bridge_pool.wasm": "tx_bridge_pool.e21563260c03cfdab1f195878f49bf93722027ad26fcd097cfebbc5c4d279082.wasm", - "tx_from_intent.wasm": "tx_from_intent.d5fc1b1c43e88ebdb60da385d2c4d0561f01cd40f4dacdc7c87ed7c8028679cf.wasm", - "tx_ibc.wasm": "tx_ibc.e97671a3584072c854d0a3638adcd87370b3a15e0084f1721babe6169a325499.wasm", - "tx_init_account.wasm": "tx_init_account.cc60e72a9f3e010793f2255320559f8508a8f41f699012a15e7e2ad7b9b91e8d.wasm", - "tx_init_nft.wasm": "tx_init_nft.fc4846b333cde985a0435ece4c67cf4720fc690f0b691d7c47750164dc25b7f7.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.5e440b0dd0087fd8a0ffa41725038e66ecf5f6932d013faf73550ae95d598db4.wasm", - "tx_init_validator.wasm": "tx_init_validator.6088e7415f6d346ef15533ef2b9116141707e63a08dc734a22847b972fa61d10.wasm", - "tx_mint_nft.wasm": "tx_mint_nft.0ec77f549ed90b9e5c1b03e6697835250ff426c20c09904c28e37b27930cc9f9.wasm", - "tx_transfer.wasm": "tx_transfer.855a118f90703815f72425f162c0beba543870db2768a2e2855ce29b508c6594.wasm", - "tx_unbond.wasm": "tx_unbond.8c24da4d52ae3bb513ac08889b1b7f10fa3a26271713cca4f758a5a72f0f7fa9.wasm", + "tx_from_intent.wasm": "tx_from_intent.658fa18092d794db18c0084779568411c4c1b7c8d163b78c5338d6016a75d6c6.wasm", + "tx_ibc.wasm": "tx_ibc.5188c4ff27f8823b672e7e85844208893332a9f47adbbff08a51bc7694e9bab0.wasm", + "tx_init_account.wasm": "tx_init_account.159d8afce1e760d1e4bbb0a699dfe1e8543074238523964c69ac9ea6b9ac8d9a.wasm", + "tx_init_nft.wasm": "tx_init_nft.6ee23f0cff039a81a2fdbb5ca4bdc332aee2bc96f205bf55f35e3d04f16bffd5.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.cc839bb461efe6d0ea9337d6e2d8698d829c2c6b828d46dbb9e9deed1977337d.wasm", + "tx_init_validator.wasm": "tx_init_validator.7b230affa897b6dca91915d8d9486204edb8c3b2d0a9fa72277d06d3085887e7.wasm", + "tx_mint_nft.wasm": "tx_mint_nft.87767ccb2483d75f195470dbd3b961132e85a1aeb9bce55a10d24e4d11dfbfba.wasm", + "tx_transfer.wasm": "tx_transfer.d7cb47c03c3036f053c99c9cbb467e3e4e3ca80c9ffa5f893e0737174423bdb8.wasm", + "tx_unbond.wasm": "tx_unbond.f5bc85a36a9b26a0290404362997428de321f34098e42b1e37876b87d2bed965.wasm", "tx_update_vp.wasm": "tx_update_vp.a7b0c9370d60d4168a198af66ed5e3ce094e250e566bdff23ec0fbb2236d576e.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.3d0433598d600227b936caadd1e2e9c7cf7e1989225cc5d2660a1f8bc0d00e09.wasm", - "tx_withdraw.wasm": "tx_withdraw.dfdee0959a74df3335c2e262fd18030e4ce5dff862fc98ab4c9a461ccb2a4dd3.wasm", - "vp_nft.wasm": "vp_nft.aea9aa6952d86799992c8374f568b589a48750f32ce3f19c8807281307204a6d.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.64bc3bc9a5f8d03204aa834d2105b4a91fee65e685a5672ff4a203df5eff44ad.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.8d4e8653c40e703c2c4ad50eb1d3e0e5d40a5ed8e4ec83d37ff13b2b102f0390.wasm", + "tx_withdraw.wasm": "tx_withdraw.3abc393edcd9ac5b7ea0a4f086d339adf31c0a16bd8c267a0bce7dd66a976d59.wasm", + "vp_nft.wasm": "vp_nft.c1c9e2e806ec23da24b404d5124dd70e94a4eb9d7176d0893a6c06b564817b12.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.a4c1c679ea003bd2b39293cddfc3db58b0d68ed3609aed4b5b0c7010cb6d235d.wasm", "vp_token.wasm": "vp_token.a08656587dcaa572872f3757d05f30494b4add02d821c0101b4244a1068bfae2.wasm", - "vp_user.wasm": "vp_user.b7daaa56f48b385f936b2ff907b85298ee1aa8d422ef6fd9df3c044ee7fdadbf.wasm" + "vp_user.wasm": "vp_user.cbcfe75a037fe36e192f841a8b65f8f81dab2fac61d57f08d0a6bafbc0e2b016.wasm" } \ No newline at end of file From caf09061813fa52473f643c93ac613edb6507455 Mon Sep 17 00:00:00 2001 From: satan Date: Thu, 20 Oct 2022 15:40:29 +0200 Subject: [PATCH 36/52] [fix]: Fixed some garbage created by rebasing --- shared/src/types/storage.rs | 39 +++---------------------------------- 1 file changed, 3 insertions(+), 36 deletions(-) diff --git a/shared/src/types/storage.rs b/shared/src/types/storage.rs index 146d5cfb04..9fa5b65128 100644 --- a/shared/src/types/storage.rs +++ b/shared/src/types/storage.rs @@ -20,7 +20,7 @@ use crate::ledger::storage::IBC_KEY_LIMIT; use crate::types::address::{self, Address}; use crate::types::eth_bridge_pool::PendingTransfer; use crate::types::hash::Hash; -use crate::types::keccak::KeccakHash; +use crate::types::keccak::{KeccakHash, TryFromError}; use crate::types::time::DateTimeUtc; #[allow(missing_docs)] @@ -643,41 +643,8 @@ impl KeySeg for Hash { impl KeySeg for KeccakHash { fn parse(seg: String) -> Result { - seg.clone() - .try_into() - .map_err(|_| Error::ParseError(seg, "Hash".into())) - } - - fn raw(&self) -> String { - self.to_string() - } - - fn to_db_key(&self) -> DbKeySeg { - DbKeySeg::StringSeg(self.raw()) - } -} - -impl KeySeg for KeccakHash { - fn parse(seg: String) -> Result { - seg.clone() - .try_into() - .map_err(|_| Error::ParseError(seg, "Hash".into())) - } - - fn raw(&self) -> String { - self.to_string() - } - - fn to_db_key(&self) -> DbKeySeg { - DbKeySeg::StringSeg(self.raw()) - } -} - -impl KeySeg for KeccakHash { - fn parse(seg: String) -> Result { - seg.clone() - .try_into() - .map_err(|_| Error::ParseError(seg, "Hash".into())) + seg.try_into() + .map_err(|e: TryFromError| Error::ParseError(e.to_string())) } fn raw(&self) -> String { From 6c87b7e84a1b11445786b54b57762daca0708bb0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 21 Oct 2022 08:39:54 +0000 Subject: [PATCH 37/52] [ci] wasm checksums update --- wasm/checksums.json | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/wasm/checksums.json b/wasm/checksums.json index 4754de3ff7..5f5b21643b 100644 --- a/wasm/checksums.json +++ b/wasm/checksums.json @@ -1,19 +1,20 @@ { + "tx_bond.wasm": "tx_bond.730e12ff5cebf2e8bdb23882a0e3ab9ed20df6bfe20e2d6b3578bb474c97a04d.wasm", "tx_bridge_pool.wasm": "tx_bridge_pool.e21563260c03cfdab1f195878f49bf93722027ad26fcd097cfebbc5c4d279082.wasm", - "tx_from_intent.wasm": "tx_from_intent.658fa18092d794db18c0084779568411c4c1b7c8d163b78c5338d6016a75d6c6.wasm", - "tx_ibc.wasm": "tx_ibc.5188c4ff27f8823b672e7e85844208893332a9f47adbbff08a51bc7694e9bab0.wasm", - "tx_init_account.wasm": "tx_init_account.159d8afce1e760d1e4bbb0a699dfe1e8543074238523964c69ac9ea6b9ac8d9a.wasm", - "tx_init_nft.wasm": "tx_init_nft.6ee23f0cff039a81a2fdbb5ca4bdc332aee2bc96f205bf55f35e3d04f16bffd5.wasm", - "tx_init_proposal.wasm": "tx_init_proposal.cc839bb461efe6d0ea9337d6e2d8698d829c2c6b828d46dbb9e9deed1977337d.wasm", - "tx_init_validator.wasm": "tx_init_validator.7b230affa897b6dca91915d8d9486204edb8c3b2d0a9fa72277d06d3085887e7.wasm", - "tx_mint_nft.wasm": "tx_mint_nft.87767ccb2483d75f195470dbd3b961132e85a1aeb9bce55a10d24e4d11dfbfba.wasm", - "tx_transfer.wasm": "tx_transfer.d7cb47c03c3036f053c99c9cbb467e3e4e3ca80c9ffa5f893e0737174423bdb8.wasm", - "tx_unbond.wasm": "tx_unbond.f5bc85a36a9b26a0290404362997428de321f34098e42b1e37876b87d2bed965.wasm", - "tx_update_vp.wasm": "tx_update_vp.a7b0c9370d60d4168a198af66ed5e3ce094e250e566bdff23ec0fbb2236d576e.wasm", - "tx_vote_proposal.wasm": "tx_vote_proposal.8d4e8653c40e703c2c4ad50eb1d3e0e5d40a5ed8e4ec83d37ff13b2b102f0390.wasm", - "tx_withdraw.wasm": "tx_withdraw.3abc393edcd9ac5b7ea0a4f086d339adf31c0a16bd8c267a0bce7dd66a976d59.wasm", - "vp_nft.wasm": "vp_nft.c1c9e2e806ec23da24b404d5124dd70e94a4eb9d7176d0893a6c06b564817b12.wasm", - "vp_testnet_faucet.wasm": "vp_testnet_faucet.a4c1c679ea003bd2b39293cddfc3db58b0d68ed3609aed4b5b0c7010cb6d235d.wasm", - "vp_token.wasm": "vp_token.a08656587dcaa572872f3757d05f30494b4add02d821c0101b4244a1068bfae2.wasm", - "vp_user.wasm": "vp_user.cbcfe75a037fe36e192f841a8b65f8f81dab2fac61d57f08d0a6bafbc0e2b016.wasm" + "tx_from_intent.wasm": "tx_from_intent.f3add97540ff97ee0e7af21c8b628f8cd6221d2c7150354f9a33fbda4f7da85a.wasm", + "tx_ibc.wasm": "tx_ibc.49f1e97533207af795362dadfc5be7ce6c119a51830707ee12ab14e3eb5e60ba.wasm", + "tx_init_account.wasm": "tx_init_account.5eedb88e7fa75066fbaeaf79a7b63f78346ce5c55ad76325ca7b2ee786cb124d.wasm", + "tx_init_nft.wasm": "tx_init_nft.f4b14f460478f6ab5268a431948da24add566188129b0297a39230e86a945b38.wasm", + "tx_init_proposal.wasm": "tx_init_proposal.ed94170605b1b1b6e0440d2235d25598f1c6976a4a0dbf3d90a1e0154f815740.wasm", + "tx_init_validator.wasm": "tx_init_validator.8db2f2f7b180310591b8163b5db9494e80b59b66bcea72f71d8af09ec8c6da0d.wasm", + "tx_mint_nft.wasm": "tx_mint_nft.deca7087433d476e273094c5017e3b83534d7c8f576c35561f05ab48aeffdea8.wasm", + "tx_transfer.wasm": "tx_transfer.a7f182f0b1398a1da79e8a74d41b70d2b0e39329b1598f9774fb99e46791c895.wasm", + "tx_unbond.wasm": "tx_unbond.7fedc39de1b6f197de757563b142ad43dfe280234df7f0f0434f083419fd7476.wasm", + "tx_update_vp.wasm": "tx_update_vp.4e5d802da0ef98daa6c904522c6fd4964020cc9ce948f16579a6cec1793337b8.wasm", + "tx_vote_proposal.wasm": "tx_vote_proposal.af655290e235244a73d7fe16211d790bb45c08c903be40726bb806f84ae2bd2f.wasm", + "tx_withdraw.wasm": "tx_withdraw.9ecd4a4b8b037b79900605f946791677236b7544ea0fa41890d0a3f9bc264a68.wasm", + "vp_nft.wasm": "vp_nft.a7a93adb21605e532bef10274c580d5b8d11c8f49298f6c08ad2e1cd22db5b89.wasm", + "vp_testnet_faucet.wasm": "vp_testnet_faucet.8c7c23b7dc72c9b4ecaf1602989431d6338111f730ad85f93b80dfd6a7806417.wasm", + "vp_token.wasm": "vp_token.e2d4cebc4c592ec68a452e1ef55a6bb6b16bd0cf7d77ec3527b4cde82d243251.wasm", + "vp_user.wasm": "vp_user.0e094c576229c2f72d39cdf1ec4a65d35c76dc5823ff4ea2537d22f8c7856977.wasm" } \ No newline at end of file From c9ebd1efbec278235b4d63cf09021aea0732a89a Mon Sep 17 00:00:00 2001 From: satan Date: Mon, 24 Oct 2022 17:12:09 +0200 Subject: [PATCH 38/52] [chore]: Rebased onto PR #573 --- shared/src/ledger/eth_bridge/bridge_pool_vp.rs | 1 - shared/src/types/storage.rs | 16 ---------------- 2 files changed, 17 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 2fbce42f60..3588d76734 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -23,7 +23,6 @@ use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::keccak::encode::Encode; use crate::types::storage::Key; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; diff --git a/shared/src/types/storage.rs b/shared/src/types/storage.rs index 9fa5b65128..eee9b5b847 100644 --- a/shared/src/types/storage.rs +++ b/shared/src/types/storage.rs @@ -656,22 +656,6 @@ impl KeySeg for KeccakHash { } } -impl KeySeg for KeccakHash { - fn parse(seg: String) -> Result { - seg.clone() - .try_into() - .map_err(|_| Error::ParseError(seg, "Hash".into())) - } - - fn raw(&self) -> String { - self.to_string() - } - - fn to_db_key(&self) -> DbKeySeg { - DbKeySeg::StringSeg(self.raw()) - } -} - /// Epoch identifier. Epochs are identified by consecutive numbers. #[derive( Clone, From 04df62f6c2d9d17e464614af7f8e4dc159c076db Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 15:06:05 +0200 Subject: [PATCH 39/52] [feat]: Updated bridge pool vp with the the new merklized storage --- .../src/ledger/eth_bridge/bridge_pool_vp.rs | 63 +++++++------------ .../ledger/eth_bridge/storage/bridge_pool.rs | 13 +--- shared/src/types/storage.rs | 17 +++++ 3 files changed, 42 insertions(+), 51 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 0624a83ae1..f558c2d2dc 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -14,16 +14,15 @@ use std::collections::{BTreeSet, HashSet}; use borsh::BorshDeserialize; use eyre::eyre; -use crate::ledger::eth_bridge::storage::bridge_pool::{ - get_pending_key, is_protected_storage, BRIDGE_POOL_ADDRESS, -}; +use crate::ledger::eth_bridge::storage::bridge_pool::{get_pending_key, is_protected_storage, BRIDGE_POOL_ADDRESS, is_bridge_pool_key}; use crate::ledger::native_vp::{Ctx, NativeVp, StorageReader}; use crate::ledger::storage::traits::StorageHasher; use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::storage::Key; +use crate::types::keccak::encode::Encode; +use crate::types::storage::{Key, KeySeg}; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; @@ -115,43 +114,27 @@ where } }; - // check that only the pending_key value is changed - if keys_changed.iter().any(is_protected_storage) { - tracing::debug!( - "Rejecting transaction as it is attempting to change the \ - bridge pool storage other than the pending transaction pool" - ); - return Ok(false); + let pending_key = get_pending_key(&transfer); + for key in keys_changed.iter().filter(is_bridge_pool_key) { + if key != pending_key { + tracing::debug!( + "Rejecting transaction as it is attempting to change an incorrect \ + key in the pending transaction pool." + ); + return Ok(false); + } } - // check that the pending transfer (and only that) was added to the pool - // TODO: This will change slightly when we merkelize the pool, - // but that will be a separate PR. - let pending_key = get_pending_key(); - let pending_pre: HashSet = - (&self.ctx).read_pre_value(&pending_key)?.ok_or(eyre!( - "The bridge pool transfers are missing from storage" - ))?; - let pending_post: HashSet = + let pending: PendingTransfer = (&self.ctx).read_post_value(&pending_key)?.ok_or(eyre!( - "The bridge pool transfers are missing from storage" - ))?; - if !pending_post.contains(&transfer) { - tracing::debug!( "Rejecting transaction as the transfer wasn't added to the \ pending transfers" + ))?; + if pending != transfer { + tracing::debug!( + "An incorrect transfer was added to the pool." ); return Ok(false); } - for item in pending_pre.symmetric_difference(&pending_post) { - if item != &transfer { - tracing::debug!( - ?item, - "Rejecting transaction as an unrecognized item was added \ - to the pending transfers" - ); - return Ok(false); - } - } // check that gas fees were put into escrow @@ -232,8 +215,8 @@ mod test_bridge_pool_vp { } /// The bridge pool at the beginning of all tests - fn initial_pool() -> HashSet { - let transfer = PendingTransfer { + fn initial_pool() -> PendingTransfer { + PendingTransfer { transfer: TransferToEthereum { asset: EthAddress([0; 20]), recipient: EthAddress([0; 20]), @@ -244,9 +227,7 @@ mod test_bridge_pool_vp { amount: 0.into(), payer: bertha_address(), }, - }; - - HashSet::::from([transfer]) + } } /// Create a new storage @@ -256,9 +237,9 @@ mod test_bridge_pool_vp { writelog .write(&get_signed_root_key(), Hash([0; 32]).try_to_vec().unwrap()) .unwrap(); - + let transfer = initial_pool(); writelog - .write(&get_pending_key(), initial_pool().try_to_vec().unwrap()) + .write(&get_pending_key(&transfer), transfer.try_to_vec().unwrap()) .unwrap(); let escrow_key = balance_key(&xan(), &BRIDGE_POOL_ADDRESS); let amount: Amount = ESCROWED_AMOUNT.into(); diff --git a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs index 0e7d67eae6..7ce5584c94 100644 --- a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs @@ -11,7 +11,7 @@ use crate::types::eth_bridge_pool::PendingTransfer; use crate::types::hash::Hash; use crate::types::keccak::encode::Encode; use crate::types::keccak::{keccak_hash, KeccakHash}; -use crate::types::storage::{DbKeySeg, Key}; +use crate::types::storage::{DbKeySeg, Key, KeySeg}; /// The main address of the Ethereum bridge pool pub const BRIDGE_POOL_ADDRESS: Address = @@ -27,11 +27,11 @@ const SIGNED_ROOT_SEG: &str = "signed_root"; pub struct Error(#[from] eyre::Error); /// Get the storage key for the transfers in the pool -pub fn get_pending_key() -> Key { +pub fn get_pending_key(transfer: &PendingTransfer) -> Key { Key { segments: vec![ DbKeySeg::AddressSeg(BRIDGE_POOL_ADDRESS), - DbKeySeg::StringSeg(PENDING_TRANSFERS_SEG.into()), + transfer.keccak256().to_db_key(), ], } } @@ -52,13 +52,6 @@ pub fn is_bridge_pool_key(key: &Key) -> bool { matches!(&key.segments[0], DbKeySeg::AddressSeg(addr) if addr == &BRIDGE_POOL_ADDRESS) } -/// Check if a key belongs to the bridge pool but is not -/// the key for the pending transaction pool. Such keys -/// may not be modified via transactions. -pub fn is_protected_storage(key: &Key) -> bool { - is_bridge_pool_key(key) && *key != get_pending_key() -} - /// A simple Merkle tree for the Ethereum bridge pool /// /// Note that an empty tree has root [0u8; 20] by definition. diff --git a/shared/src/types/storage.rs b/shared/src/types/storage.rs index be15012cfa..78e54a154a 100644 --- a/shared/src/types/storage.rs +++ b/shared/src/types/storage.rs @@ -20,6 +20,7 @@ use crate::ledger::storage::IBC_KEY_LIMIT; use crate::types::address::{self, Address}; use crate::types::eth_bridge_pool::PendingTransfer; use crate::types::hash::Hash; +use crate::types::keccak::KeccakHash; use crate::types::time::DateTimeUtc; #[allow(missing_docs)] @@ -640,6 +641,22 @@ impl KeySeg for Hash { } } +impl KeySeg for KeccakHash { + fn parse(seg: String) -> Result { + seg.clone() + .try_into() + .map_err(|_| Error::ParseError(seg, "Hash".into())) + } + + fn raw(&self) -> String { + self.to_string() + } + + fn to_db_key(&self) -> DbKeySeg { + DbKeySeg::StringSeg(self.raw()) + } +} + /// Epoch identifier. Epochs are identified by consecutive numbers. #[derive( Clone, From 48c9b0f3a130644b2c2ed3145f5207d41b8bbf3c Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 17:25:52 +0200 Subject: [PATCH 40/52] [feat]: Changed the bridge pool vp to used the merklized storage --- .../src/ledger/eth_bridge/bridge_pool_vp.rs | 210 +++++++++++------- .../ledger/eth_bridge/storage/bridge_pool.rs | 2 - 2 files changed, 124 insertions(+), 88 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index f558c2d2dc..774b2d8b39 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -9,20 +9,21 @@ //! This VP checks that additions to the pool are handled //! correctly. This means that the appropriate data is //! added to the pool and gas fees are submitted appropriately. -use std::collections::{BTreeSet, HashSet}; +use std::collections::BTreeSet; use borsh::BorshDeserialize; use eyre::eyre; -use crate::ledger::eth_bridge::storage::bridge_pool::{get_pending_key, is_protected_storage, BRIDGE_POOL_ADDRESS, is_bridge_pool_key}; +use crate::ledger::eth_bridge::storage::bridge_pool::{ + get_pending_key, is_bridge_pool_key, BRIDGE_POOL_ADDRESS, +}; use crate::ledger::native_vp::{Ctx, NativeVp, StorageReader}; use crate::ledger::storage::traits::StorageHasher; use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::keccak::encode::Encode; -use crate::types::storage::{Key, KeySeg}; +use crate::types::storage::Key; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; @@ -115,11 +116,11 @@ where }; let pending_key = get_pending_key(&transfer); - for key in keys_changed.iter().filter(is_bridge_pool_key) { - if key != pending_key { + for key in keys_changed.iter().filter(|k| is_bridge_pool_key(k)) { + if *key != pending_key { tracing::debug!( - "Rejecting transaction as it is attempting to change an incorrect \ - key in the pending transaction pool." + "Rejecting transaction as it is attempting to change an \ + incorrect key in the pending transaction pool." ); return Ok(false); } @@ -130,9 +131,7 @@ where pending transfers" ))?; if pending != transfer { - tracing::debug!( - "An incorrect transfer was added to the pool." - ); + tracing::debug!("An incorrect transfer was added to the pool."); return Ok(false); } @@ -272,19 +271,21 @@ mod test_bridge_pool_vp { ) } + enum Expect { + True, + False, + Error, + } + /// Helper function that tests various ways gas can be escrowed, /// either correctly or incorrectly, is handled appropriately fn assert_bridge_pool( payer_delta: SignedAmount, escrow_delta: SignedAmount, insert_transfer: F, - keys_changed: BTreeSet, - expect: bool, + expect: Expect, ) where - F: FnOnce( - PendingTransfer, - HashSet, - ) -> HashSet, + F: FnOnce(PendingTransfer, &mut WriteLog) -> BTreeSet, { // setup let mut write_log = new_writelog(); @@ -340,10 +341,7 @@ mod test_bridge_pool_vp { .expect("Test failed"); // add transfer to pool - let pool = insert_transfer(transfer.clone(), initial_pool()); - write_log - .write(&get_pending_key(), pool.try_to_vec().expect("Test failed")) - .expect("Test failed"); + let keys_changed = insert_transfer(transfer.clone(), &mut write_log); // create the data to be given to the vp let vp = BridgePoolVp { @@ -360,10 +358,12 @@ mod test_bridge_pool_vp { .expect("Test failed"); let verifiers = BTreeSet::default(); - let res = vp - .validate_tx(&signed, &keys_changed, &verifiers) - .expect("Test failed"); - assert_eq!(res, expect); + let res = vp.validate_tx(&signed, &keys_changed, &verifiers); + match expect { + Expect::True => assert!(res.expect("Test failed")), + Expect::False => assert!(!res.expect("Test failed")), + Expect::Error => assert!(res.is_err()), + } } /// Test adding a transfer to the pool and escrowing gas passes vp @@ -372,13 +372,15 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - true, + Expect::True, ); } @@ -389,13 +391,15 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(10.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::False, ); } @@ -406,13 +410,15 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Positive(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::False, ); } @@ -423,13 +429,15 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(10.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::False, ); } @@ -440,58 +448,83 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Negative(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::False, ); } - /// Test that if a transaction is removed from - /// the pool, the tx is rejected. + /// Test that if the transfer was not added to the + /// pool, the vp rejects #[test] - fn test_remove_transfer_rejected() { + fn test_not_adding_transfer_rejected() { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, _pool| HashSet::from([transfer]), - BTreeSet::default(), - false, + |transfer, _| BTreeSet::from([get_pending_key(&transfer)]), + Expect::Error, ); } - /// Test that if the transfer was not added to the - /// pool, the vp rejects + /// Test that if the wrong transaction was added + /// to the pool, it is rejected. #[test] - fn test_not_adding_transfer_rejected() { + fn test_add_wrong_transfer() { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |_transfer, pool| pool, - BTreeSet::default(), - false, + |transfer, log| { + let t = PendingTransfer { + transfer: TransferToEthereum { + asset: EthAddress([0; 20]), + recipient: EthAddress([1; 20]), + amount: 100.into(), + nonce: 10u64.into(), + }, + gas_fee: GasFee { + amount: GAS_FEE.into(), + payer: bertha_address(), + }, + }; + log.write(&get_pending_key(&transfer), t.try_to_vec().unwrap()) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) + }, + Expect::False, ); } /// Test that if the wrong transaction was added /// to the pool, it is rejected. #[test] - fn test_add_wrong_transfer() { + fn test_add_wrong_key() { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |_transfer, pool| { - let mut pool = pool; - let wrong_transfer = - initial_pool().into_iter().next().expect("Test failed"); - pool.insert(wrong_transfer); - pool + |transfer, log| { + let t = PendingTransfer { + transfer: TransferToEthereum { + asset: EthAddress([0; 20]), + recipient: EthAddress([1; 20]), + amount: 100.into(), + nonce: 10u64.into(), + }, + gas_fee: GasFee { + amount: GAS_FEE.into(), + payer: bertha_address(), + }, + }; + log.write(&get_pending_key(&t), transfer.try_to_vec().unwrap()) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) }, - BTreeSet::default(), - false, + Expect::Error, ); } @@ -502,13 +535,18 @@ mod test_bridge_pool_vp { assert_bridge_pool( SignedAmount::Negative(GAS_FEE.into()), SignedAmount::Positive(GAS_FEE.into()), - |transfer, pool| { - let mut pool = pool; - pool.insert(transfer); - pool + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([ + get_pending_key(&transfer), + get_signed_root_key(), + ]) }, - BTreeSet::from([get_signed_root_key()]), - false, + Expect::False, ); } @@ -539,11 +577,11 @@ mod test_bridge_pool_vp { }, }; - // add transfer to pool - let mut pool = initial_pool(); - pool.insert(transfer.clone()); write_log - .write(&get_pending_key(), pool.try_to_vec().expect("Test failed")) + .write( + &get_pending_key(&transfer), + transfer.try_to_vec().expect("Test failed"), + ) .expect("Test failed"); // create the data to be given to the vp diff --git a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs index 7ce5584c94..19426af21c 100644 --- a/shared/src/ledger/eth_bridge/storage/bridge_pool.rs +++ b/shared/src/ledger/eth_bridge/storage/bridge_pool.rs @@ -16,8 +16,6 @@ use crate::types::storage::{DbKeySeg, Key, KeySeg}; /// The main address of the Ethereum bridge pool pub const BRIDGE_POOL_ADDRESS: Address = Address::Internal(InternalAddress::EthBridgePool); -/// Sub-segmnet for getting the contents of the pool -const PENDING_TRANSFERS_SEG: &str = "pending_transfers"; /// Sub-segment for getting the latest signed const SIGNED_ROOT_SEG: &str = "signed_root"; From 029dcb1cfbee7a1c4293ed6e483f9c08d2b584c7 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 17:30:31 +0200 Subject: [PATCH 41/52] [feat]: Fixed the wasm blob for adding transfers for the bridge pool --- wasm/wasm_source/src/tx_bridge_pool.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/wasm/wasm_source/src/tx_bridge_pool.rs b/wasm/wasm_source/src/tx_bridge_pool.rs index bed8e3820e..0c945d6925 100644 --- a/wasm/wasm_source/src/tx_bridge_pool.rs +++ b/wasm/wasm_source/src/tx_bridge_pool.rs @@ -20,8 +20,6 @@ fn apply_tx(tx_data: Vec) { } = transfer.gas_fees; token::transfer(payer, &BRIDGE_POOL_ADDRESS, &address::xan(), amount); // add transfer into the pool - let pending_key = bridge_pool::get_pending_key(); - let mut pending: HashSet = read(&pending_key).unwrap(); - pending.insert(transfer); - write(pending_key, pending.try_to_vec().unwrap()); + let pending_key = bridge_pool::get_pending_key(&transfer); + write(pending_key, transfer.try_to_vec().unwrap()); } \ No newline at end of file From 76726a5391ca5f9c37a2cf1b01486ae4acf9fe1a Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 15:06:05 +0200 Subject: [PATCH 42/52] [feat]: Updated bridge pool vp with the the new merklized storage --- shared/src/ledger/eth_bridge/bridge_pool_vp.rs | 15 +++++++++------ shared/src/types/storage.rs | 16 ++++++++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 774b2d8b39..97aa273088 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -23,7 +23,8 @@ use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::storage::Key; +use crate::types::keccak::encode::Encode; +use crate::types::storage::{Key, KeySeg}; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; @@ -116,11 +117,11 @@ where }; let pending_key = get_pending_key(&transfer); - for key in keys_changed.iter().filter(|k| is_bridge_pool_key(k)) { - if *key != pending_key { + for key in keys_changed.iter().filter(is_bridge_pool_key) { + if key != pending_key { tracing::debug!( - "Rejecting transaction as it is attempting to change an \ - incorrect key in the pending transaction pool." + "Rejecting transaction as it is attempting to change an incorrect \ + key in the pending transaction pool." ); return Ok(false); } @@ -131,7 +132,9 @@ where pending transfers" ))?; if pending != transfer { - tracing::debug!("An incorrect transfer was added to the pool."); + tracing::debug!( + "An incorrect transfer was added to the pool." + ); return Ok(false); } diff --git a/shared/src/types/storage.rs b/shared/src/types/storage.rs index 78e54a154a..4cb6d91f69 100644 --- a/shared/src/types/storage.rs +++ b/shared/src/types/storage.rs @@ -657,6 +657,22 @@ impl KeySeg for KeccakHash { } } +impl KeySeg for KeccakHash { + fn parse(seg: String) -> Result { + seg.clone() + .try_into() + .map_err(|_| Error::ParseError(seg, "Hash".into())) + } + + fn raw(&self) -> String { + self.to_string() + } + + fn to_db_key(&self) -> DbKeySeg { + DbKeySeg::StringSeg(self.raw()) + } +} + /// Epoch identifier. Epochs are identified by consecutive numbers. #[derive( Clone, From b8adf6254eba821f442583d1ce03f67750103a27 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 17:25:52 +0200 Subject: [PATCH 43/52] [feat]: Changed the bridge pool vp to used the merklized storage --- shared/src/ledger/eth_bridge/bridge_pool_vp.rs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 97aa273088..774b2d8b39 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -23,8 +23,7 @@ use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::keccak::encode::Encode; -use crate::types::storage::{Key, KeySeg}; +use crate::types::storage::Key; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; @@ -117,11 +116,11 @@ where }; let pending_key = get_pending_key(&transfer); - for key in keys_changed.iter().filter(is_bridge_pool_key) { - if key != pending_key { + for key in keys_changed.iter().filter(|k| is_bridge_pool_key(k)) { + if *key != pending_key { tracing::debug!( - "Rejecting transaction as it is attempting to change an incorrect \ - key in the pending transaction pool." + "Rejecting transaction as it is attempting to change an \ + incorrect key in the pending transaction pool." ); return Ok(false); } @@ -132,9 +131,7 @@ where pending transfers" ))?; if pending != transfer { - tracing::debug!( - "An incorrect transfer was added to the pool." - ); + tracing::debug!("An incorrect transfer was added to the pool."); return Ok(false); } From 49f73e7e7f39f7865e22314ba7bc1c49d2fe277a Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 18 Oct 2022 16:06:12 +0200 Subject: [PATCH 44/52] [fix]: Added some more logging --- shared/src/ledger/eth_bridge/bridge_pool_vp.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 774b2d8b39..3588d76734 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -120,7 +120,10 @@ where if *key != pending_key { tracing::debug!( "Rejecting transaction as it is attempting to change an \ - incorrect key in the pending transaction pool." + incorrect key in the pending transaction pool: {}.\n \ + Expected key: {}", + key, + pending_key ); return Ok(false); } @@ -131,7 +134,12 @@ where pending transfers" ))?; if pending != transfer { - tracing::debug!("An incorrect transfer was added to the pool."); + tracing::debug!( + "An incorrect transfer was added to the pool: {:?}.\n \ + Expected: {:?}", + transfer, + pending + ); return Ok(false); } From 2c365a666351c5b84941f805adcba44fee9631db Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 15:06:05 +0200 Subject: [PATCH 45/52] [feat]: Updated bridge pool vp with the the new merklized storage --- shared/src/ledger/eth_bridge/bridge_pool_vp.rs | 3 ++- shared/src/types/storage.rs | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 3588d76734..117c9e61ef 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -23,7 +23,8 @@ use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::storage::Key; +use crate::types::keccak::encode::Encode; +use crate::types::storage::{Key, KeySeg}; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; diff --git a/shared/src/types/storage.rs b/shared/src/types/storage.rs index 4cb6d91f69..655c7be0ed 100644 --- a/shared/src/types/storage.rs +++ b/shared/src/types/storage.rs @@ -673,6 +673,22 @@ impl KeySeg for KeccakHash { } } +impl KeySeg for KeccakHash { + fn parse(seg: String) -> Result { + seg.clone() + .try_into() + .map_err(|_| Error::ParseError(seg, "Hash".into())) + } + + fn raw(&self) -> String { + self.to_string() + } + + fn to_db_key(&self) -> DbKeySeg { + DbKeySeg::StringSeg(self.raw()) + } +} + /// Epoch identifier. Epochs are identified by consecutive numbers. #[derive( Clone, From a7a04bfb52010b60312e358f1cd659f327ffaa76 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 17:25:52 +0200 Subject: [PATCH 46/52] [feat]: Changed the bridge pool vp to used the merklized storage --- shared/src/ledger/eth_bridge/bridge_pool_vp.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 117c9e61ef..47aa3b7968 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -23,8 +23,7 @@ use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::keccak::encode::Encode; -use crate::types::storage::{Key, KeySeg}; +use crate::types::storage::Key; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; @@ -466,6 +465,15 @@ mod test_bridge_pool_vp { BTreeSet::from([get_pending_key(&transfer)]) }, Expect::False, + |transfer, log| { + log.write( + &get_pending_key(&transfer), + transfer.try_to_vec().unwrap(), + ) + .unwrap(); + BTreeSet::from([get_pending_key(&transfer)]) + }, + Expect::False, ); } From 115dac9416a76da8aa9a48d70704fbb0f65f35b1 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 15:06:05 +0200 Subject: [PATCH 47/52] [feat]: Updated bridge pool vp with the the new merklized storage --- shared/src/ledger/eth_bridge/bridge_pool_vp.rs | 1 + shared/src/types/storage.rs | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 47aa3b7968..c3b05e4e6f 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -23,6 +23,7 @@ use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; +use crate::types::keccak::encode::Encode; use crate::types::storage::Key; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; diff --git a/shared/src/types/storage.rs b/shared/src/types/storage.rs index 655c7be0ed..146d5cfb04 100644 --- a/shared/src/types/storage.rs +++ b/shared/src/types/storage.rs @@ -689,6 +689,22 @@ impl KeySeg for KeccakHash { } } +impl KeySeg for KeccakHash { + fn parse(seg: String) -> Result { + seg.clone() + .try_into() + .map_err(|_| Error::ParseError(seg, "Hash".into())) + } + + fn raw(&self) -> String { + self.to_string() + } + + fn to_db_key(&self) -> DbKeySeg { + DbKeySeg::StringSeg(self.raw()) + } +} + /// Epoch identifier. Epochs are identified by consecutive numbers. #[derive( Clone, From 9f472c72a241392683d8ea4e677ef1c9de4ccc7a Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 17:25:52 +0200 Subject: [PATCH 48/52] [feat]: Changed the bridge pool vp to used the merklized storage --- shared/src/ledger/eth_bridge/bridge_pool_vp.rs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index c3b05e4e6f..2fbce42f60 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -466,15 +466,6 @@ mod test_bridge_pool_vp { BTreeSet::from([get_pending_key(&transfer)]) }, Expect::False, - |transfer, log| { - log.write( - &get_pending_key(&transfer), - transfer.try_to_vec().unwrap(), - ) - .unwrap(); - BTreeSet::from([get_pending_key(&transfer)]) - }, - Expect::False, ); } From a12a68cfbc3284b0cfaa643c8cb509cf9ef8fb9b Mon Sep 17 00:00:00 2001 From: satan Date: Thu, 20 Oct 2022 15:40:29 +0200 Subject: [PATCH 49/52] [fix]: Fixed some garbage created by rebasing --- shared/src/types/storage.rs | 39 +++---------------------------------- 1 file changed, 3 insertions(+), 36 deletions(-) diff --git a/shared/src/types/storage.rs b/shared/src/types/storage.rs index 146d5cfb04..9fa5b65128 100644 --- a/shared/src/types/storage.rs +++ b/shared/src/types/storage.rs @@ -20,7 +20,7 @@ use crate::ledger::storage::IBC_KEY_LIMIT; use crate::types::address::{self, Address}; use crate::types::eth_bridge_pool::PendingTransfer; use crate::types::hash::Hash; -use crate::types::keccak::KeccakHash; +use crate::types::keccak::{KeccakHash, TryFromError}; use crate::types::time::DateTimeUtc; #[allow(missing_docs)] @@ -643,41 +643,8 @@ impl KeySeg for Hash { impl KeySeg for KeccakHash { fn parse(seg: String) -> Result { - seg.clone() - .try_into() - .map_err(|_| Error::ParseError(seg, "Hash".into())) - } - - fn raw(&self) -> String { - self.to_string() - } - - fn to_db_key(&self) -> DbKeySeg { - DbKeySeg::StringSeg(self.raw()) - } -} - -impl KeySeg for KeccakHash { - fn parse(seg: String) -> Result { - seg.clone() - .try_into() - .map_err(|_| Error::ParseError(seg, "Hash".into())) - } - - fn raw(&self) -> String { - self.to_string() - } - - fn to_db_key(&self) -> DbKeySeg { - DbKeySeg::StringSeg(self.raw()) - } -} - -impl KeySeg for KeccakHash { - fn parse(seg: String) -> Result { - seg.clone() - .try_into() - .map_err(|_| Error::ParseError(seg, "Hash".into())) + seg.try_into() + .map_err(|e: TryFromError| Error::ParseError(e.to_string())) } fn raw(&self) -> String { From ef7c7cac2750036828cd6c3ebf4a042b430eec59 Mon Sep 17 00:00:00 2001 From: satan Date: Mon, 24 Oct 2022 17:12:09 +0200 Subject: [PATCH 50/52] [chore]: Rebased onto PR #573 --- shared/src/ledger/eth_bridge/bridge_pool_vp.rs | 1 - shared/src/types/storage.rs | 16 ---------------- 2 files changed, 17 deletions(-) diff --git a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs index 2fbce42f60..3588d76734 100644 --- a/shared/src/ledger/eth_bridge/bridge_pool_vp.rs +++ b/shared/src/ledger/eth_bridge/bridge_pool_vp.rs @@ -23,7 +23,6 @@ use crate::ledger::storage::{DBIter, DB}; use crate::proto::SignedTxData; use crate::types::address::{xan, Address, InternalAddress}; use crate::types::eth_bridge_pool::PendingTransfer; -use crate::types::keccak::encode::Encode; use crate::types::storage::Key; use crate::types::token::{balance_key, Amount}; use crate::vm::WasmCacheAccess; diff --git a/shared/src/types/storage.rs b/shared/src/types/storage.rs index 9fa5b65128..eee9b5b847 100644 --- a/shared/src/types/storage.rs +++ b/shared/src/types/storage.rs @@ -656,22 +656,6 @@ impl KeySeg for KeccakHash { } } -impl KeySeg for KeccakHash { - fn parse(seg: String) -> Result { - seg.clone() - .try_into() - .map_err(|_| Error::ParseError(seg, "Hash".into())) - } - - fn raw(&self) -> String { - self.to_string() - } - - fn to_db_key(&self) -> DbKeySeg { - DbKeySeg::StringSeg(self.raw()) - } -} - /// Epoch identifier. Epochs are identified by consecutive numbers. #[derive( Clone, From 19650ab09e73c4007602aaf8eefdfc935b843d93 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 15:06:05 +0200 Subject: [PATCH 51/52] [feat]: Updated bridge pool vp with the the new merklized storage --- shared/src/types/storage.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/shared/src/types/storage.rs b/shared/src/types/storage.rs index eee9b5b847..9fa5b65128 100644 --- a/shared/src/types/storage.rs +++ b/shared/src/types/storage.rs @@ -656,6 +656,22 @@ impl KeySeg for KeccakHash { } } +impl KeySeg for KeccakHash { + fn parse(seg: String) -> Result { + seg.clone() + .try_into() + .map_err(|_| Error::ParseError(seg, "Hash".into())) + } + + fn raw(&self) -> String { + self.to_string() + } + + fn to_db_key(&self) -> DbKeySeg { + DbKeySeg::StringSeg(self.raw()) + } +} + /// Epoch identifier. Epochs are identified by consecutive numbers. #[derive( Clone, From 9f151a5eaeb7c23d784e70eb82384a1f83d32c68 Mon Sep 17 00:00:00 2001 From: satan Date: Tue, 11 Oct 2022 15:06:05 +0200 Subject: [PATCH 52/52] [feat]: Updated bridge pool vp with the the new merklized storage --- shared/src/types/storage.rs | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/shared/src/types/storage.rs b/shared/src/types/storage.rs index 9fa5b65128..eee9b5b847 100644 --- a/shared/src/types/storage.rs +++ b/shared/src/types/storage.rs @@ -656,22 +656,6 @@ impl KeySeg for KeccakHash { } } -impl KeySeg for KeccakHash { - fn parse(seg: String) -> Result { - seg.clone() - .try_into() - .map_err(|_| Error::ParseError(seg, "Hash".into())) - } - - fn raw(&self) -> String { - self.to_string() - } - - fn to_db_key(&self) -> DbKeySeg { - DbKeySeg::StringSeg(self.raw()) - } -} - /// Epoch identifier. Epochs are identified by consecutive numbers. #[derive( Clone,