From e4ee9039970c1cee83f6cebc7a544f6063a5260f Mon Sep 17 00:00:00 2001 From: arkpar Date: Tue, 19 Mar 2019 19:48:12 +0100 Subject: [PATCH 1/8] Account for pending insertions when pruning --- core/state-db/src/pruning.rs | 67 +++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/core/state-db/src/pruning.rs b/core/state-db/src/pruning.rs index c2e40abe413be..02d2f3302f82d 100644 --- a/core/state-db/src/pruning.rs +++ b/core/state-db/src/pruning.rs @@ -23,7 +23,6 @@ //! The changes are journaled in the DB. use std::collections::{HashMap, HashSet, VecDeque}; -use std::mem; use crate::codec::{Encode, Decode}; use crate::{CommitSet, Error, MetaDb, to_meta_key, Hash}; use log::{trace, warn}; @@ -36,7 +35,7 @@ pub struct RefWindow { death_rows: VecDeque>, death_index: HashMap, pending_number: u64, - pending_records: Vec<(u64, JournalRecord)>, + pending_finalizatons: usize, pending_prunings: usize, } @@ -71,7 +70,7 @@ impl RefWindow { death_rows: Default::default(), death_index: Default::default(), pending_number: pending_number, - pending_records: Default::default(), + pending_finalizatons: 0, pending_prunings: 0, }; // read the journal @@ -114,7 +113,7 @@ impl RefWindow { } pub fn window_size(&self) -> u64 { - (self.death_rows.len() + self.pending_records.len() - self.pending_prunings) as u64 + (self.death_rows.len() - self.pending_prunings) as u64 } pub fn next_hash(&self) -> Option { @@ -130,8 +129,7 @@ impl RefWindow { } pub fn have_block(&self, hash: &BlockHash) -> bool { - self.death_rows.iter().skip(self.pending_prunings).any(|r| r.hash == *hash) || - self.pending_records.iter().any(|(_, record)| record.hash == *hash) + self.death_rows.iter().skip(self.pending_prunings).any(|r| r.hash == *hash) } /// Prune next block. Expects at least one block in the window. Adds changes to `commit`. @@ -143,13 +141,6 @@ impl RefWindow { commit.meta.inserted.push((to_meta_key(LAST_PRUNED, &()), index.encode())); commit.meta.deleted.push(pruned.journal_key.clone()); self.pending_prunings += 1; - } else if let Some((block, pruned)) = self.pending_records.get(self.pending_prunings - self.death_rows.len()) { - trace!(target: "state-db", "Pruning pending{:?} ({} deleted)", pruned.hash, pruned.deleted.len()); - commit.data.deleted.extend(pruned.deleted.iter().cloned()); - commit.meta.inserted.push((to_meta_key(LAST_PRUNED, &()), block.encode())); - let journal_key = to_journal_key(*block); - commit.meta.deleted.push(journal_key); - self.pending_prunings += 1; } else { warn!(target: "state-db", "Trying to prune when there's nothing to prune"); } @@ -165,21 +156,16 @@ impl RefWindow { inserted, deleted, }; - // Calculate pending block number taking pending canonicalizations into account, but not pending prunings - // as these are always applied last. - let block = self.pending_number + (self.death_rows.len() + self.pending_records.len()) as u64; + let block = self.pending_number + self.death_rows.len() as u64; let journal_key = to_journal_key(block); commit.meta.inserted.push((journal_key.clone(), journal_record.encode())); - self.pending_records.push((block, journal_record)); + self.import(&journal_record.hash, journal_key, journal_record.inserted.into_iter(), journal_record.deleted); + self.pending_finalizatons += 1; } /// Apply all pending changes pub fn apply_pending(&mut self) { - for (block, journal_record) in mem::replace(&mut self.pending_records, Default::default()).into_iter() { - trace!(target: "state-db", "Applying pruning window record: {}: {:?}", block, journal_record.hash); - let journal_key = to_journal_key(block); - self.import(&journal_record.hash, journal_key, journal_record.inserted.into_iter(), journal_record.deleted); - } + self.pending_finalizatons = 0; for _ in 0 .. self.pending_prunings { let pruned = self.death_rows.pop_front().expect("pending_prunings is always < death_rows.len()"); trace!(target: "state-db", "Applying pruning {:?} ({} deleted)", pruned.hash, pruned.deleted.len()); @@ -193,7 +179,10 @@ impl RefWindow { /// Revert all pending changes pub fn revert_pending(&mut self) { - self.pending_records.clear(); + self.death_rows.truncate(self.death_rows.len() - self.pending_finalizatons); + let new_max_block = self.death_rows.len() as u64 + self.pending_number; + self.death_index.retain(|_, block| *block < new_max_block); + self.pending_finalizatons = 0; self.pending_prunings = 0; } } @@ -231,7 +220,7 @@ mod tests { assert!(pruning.death_rows.is_empty()); assert!(pruning.death_index.is_empty()); assert!(pruning.pending_prunings == 0); - assert!(pruning.pending_records.is_empty()); + assert!(pruning.pending_finalizatons == 0); } #[test] @@ -346,4 +335,34 @@ mod tests { pruning.apply_pending(); assert_eq!(pruning.pending_number, 3); } + + #[test] + fn reinserted_survivew_pending() { + let mut db = make_db(&[1, 2, 3]); + let mut pruning: RefWindow = RefWindow::new(&db).unwrap(); + let mut commit = make_commit(&[], &[2]); + pruning.note_canonical(&H256::random(), &mut commit); + db.commit(&commit); + let mut commit = make_commit(&[2], &[]); + pruning.note_canonical(&H256::random(), &mut commit); + db.commit(&commit); + let mut commit = make_commit(&[], &[2]); + pruning.note_canonical(&H256::random(), &mut commit); + db.commit(&commit); + assert!(db.data_eq(&make_db(&[1, 2, 3]))); + + let mut commit = CommitSet::default(); + pruning.prune_one(&mut commit); + db.commit(&commit); + assert!(db.data_eq(&make_db(&[1, 2, 3]))); + let mut commit = CommitSet::default(); + pruning.prune_one(&mut commit); + db.commit(&commit); + assert!(db.data_eq(&make_db(&[1, 2, 3]))); + pruning.prune_one(&mut commit); + db.commit(&commit); + assert!(db.data_eq(&make_db(&[1, 3]))); + pruning.apply_pending(); + assert_eq!(pruning.pending_number, 3); + } } From bb77d05a975eb81ba69a0b76e8b527165a3f1fee Mon Sep 17 00:00:00 2001 From: arkpar Date: Wed, 20 Mar 2019 10:32:11 +0100 Subject: [PATCH 2/8] Prefixed trie storage --- core/client/db/src/lib.rs | 27 ++++++------ core/client/src/client.rs | 4 +- core/client/src/in_mem.rs | 4 +- core/client/src/light/fetcher.rs | 2 +- core/state-db/src/lib.rs | 16 ++++--- .../src/changes_trie/changes_iterator.rs | 2 +- core/state-machine/src/changes_trie/mod.rs | 2 +- .../state-machine/src/changes_trie/storage.rs | 8 ++-- core/state-machine/src/proving_backend.rs | 4 +- .../state-machine/src/trie_backend_essence.rs | 44 +++++++++---------- core/trie/src/lib.rs | 2 + 11 files changed, 61 insertions(+), 54 deletions(-) diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index d276992f08cdf..f20ef5801ee23 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -40,7 +40,7 @@ use client::ExecutionStrategies; use parity_codec::{Decode, Encode}; use hash_db::Hasher; use kvdb::{KeyValueDB, DBTransaction}; -use trie::MemoryDB; +use trie::{MemoryDB, full_key}; use parking_lot::RwLock; use primitives::{H256, Blake2Hasher, ChangesTrieConfiguration, convert_hash}; use primitives::storage::well_known_keys; @@ -374,22 +374,23 @@ where Block: BlockT, struct StorageDb { pub db: Arc, - pub state_db: StateDb, + pub state_db: StateDb>, } impl state_machine::Storage for StorageDb { - fn get(&self, key: &H256) -> Result, String> { - self.state_db.get(key, self).map(|r| r.map(|v| DBValue::from_slice(&v))) + fn get(&self, key: &H256, prefix: &[u8]) -> Result, String> { + let key = full_key::(key, prefix); + self.state_db.get(&key, self).map(|r| r.map(|v| DBValue::from_slice(&v))) .map_err(|e| format!("Database backend error: {:?}", e)) } } -impl state_db::HashDb for StorageDb { +impl state_db::NodeDb for StorageDb { type Error = io::Error; - type Hash = H256; + type Key = [u8]; - fn get(&self, key: &H256) -> Result>, Self::Error> { - self.db.get(columns::STATE, key.as_bytes()).map(|r| r.map(|v| v.to_vec())) + fn get(&self, key: &[u8]) -> Result>, Self::Error> { + self.db.get(columns::STATE, key).map(|r| r.map(|v| v.to_vec())) } } @@ -405,7 +406,7 @@ impl DbGenesisStorage { } impl state_machine::Storage for DbGenesisStorage { - fn get(&self, _key: &H256) -> Result, String> { + fn get(&self, _key: &H256, _prefix: &[u8]) -> Result, String> { Ok(None) } } @@ -515,7 +516,7 @@ impl state_machine::ChangesTrieRootsStorage for DbC } impl state_machine::ChangesTrieStorage for DbChangesTrieStorage { - fn get(&self, key: &H256) -> Result, String> { + fn get(&self, key: &H256, _prefix: &[u8]) -> Result, String> { self.db.get(columns::CHANGES_TRIE, &key[..]) .map_err(|err| format!("{}", err)) } @@ -559,7 +560,7 @@ impl> Backend { let blockchain = BlockchainDb::new(db.clone())?; let meta = blockchain.meta.clone(); let map_e = |e: state_db::Error| ::client::error::Error::from(format!("State database error: {:?}", e)); - let state_db: StateDb = StateDb::new(pruning, &StateMetaDb(&*db)).map_err(map_e)?; + let state_db: StateDb<_, _> = StateDb::new(pruning, &StateMetaDb(&*db)).map_err(map_e)?; let storage_db = StorageDb { db: db.clone(), state_db, @@ -832,7 +833,7 @@ impl> Backend { transaction.put(columns::META, meta_keys::GENESIS_HASH, hash.as_ref()); } - let mut changeset: state_db::ChangeSet = state_db::ChangeSet::default(); + let mut changeset: state_db::ChangeSet> = state_db::ChangeSet::default(); for (key, (val, rc)) in operation.db_updates.drain() { if rc > 0 { changeset.inserted.push((key, val.to_vec())); @@ -981,7 +982,7 @@ impl> Backend { } } -fn apply_state_commit(transaction: &mut DBTransaction, commit: state_db::CommitSet) { +fn apply_state_commit(transaction: &mut DBTransaction, commit: state_db::CommitSet>) { for (key, val) in commit.data.inserted.into_iter() { transaction.put(columns::STATE, &key[..], &val); } diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 34723deb8cca1..c1446c6311626 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -503,8 +503,8 @@ impl Client where } impl<'a, Block: BlockT> ChangesTrieStorage for AccessedRootsRecorder<'a, Block> { - fn get(&self, key: &H256) -> Result, String> { - self.storage.get(key) + fn get(&self, key: &H256, prefix: &[u8]) -> Result, String> { + self.storage.get(key, prefix) } } diff --git a/core/client/src/in_mem.rs b/core/client/src/in_mem.rs index fc95e9664b4e4..7f3cdfd8dde62 100644 --- a/core/client/src/in_mem.rs +++ b/core/client/src/in_mem.rs @@ -742,8 +742,8 @@ impl state_machine::ChangesTrieRootsStorage for ChangesTrieStorage } impl state_machine::ChangesTrieStorage for ChangesTrieStorage where H::Out: HeapSizeOf { - fn get(&self, key: &H::Out) -> Result, String> { - self.0.get(key) + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + self.0.get(key, prefix) } } diff --git a/core/client/src/light/fetcher.rs b/core/client/src/light/fetcher.rs index bb6624f91f1a9..893682d5f8698 100644 --- a/core/client/src/light/fetcher.rs +++ b/core/client/src/light/fetcher.rs @@ -282,7 +282,7 @@ impl, F> LightDataChecker Result, Self::Error>; + fn get(&self, key: &Self::Key) -> Result, Self::Error>; } /// Error type. @@ -285,11 +285,13 @@ impl StateDbSync { self.pinned.remove(hash); } - pub fn get>(&self, key: &Key, db: &D) -> Result, Error> { + pub fn get(&self, key: &Key, db: &D) -> Result, Error> + where Key: AsRef + { if let Some(value) = self.non_canonical.get(key) { return Ok(Some(value)); } - db.get(key).map_err(|e| Error::Db(e)) + db.get(key.as_ref()).map_err(|e| Error::Db(e)) } pub fn apply_pending(&mut self) { @@ -349,7 +351,9 @@ impl StateDb { } /// Get a value from non-canonical/pruning overlay or the backing DB. - pub fn get>(&self, key: &Key, db: &D) -> Result, Error> { + pub fn get(&self, key: &Key, db: &D) -> Result, Error> + where Key: AsRef + { self.db.read().get(key, db) } diff --git a/core/state-machine/src/changes_trie/changes_iterator.rs b/core/state-machine/src/changes_trie/changes_iterator.rs index f524b0799cc35..ad70117984989 100644 --- a/core/state-machine/src/changes_trie/changes_iterator.rs +++ b/core/state-machine/src/changes_trie/changes_iterator.rs @@ -115,7 +115,7 @@ pub fn key_changes_proof_check, H: Hasher>( let mut proof_db = MemoryDB::::default(); for item in proof { - proof_db.insert(&item); + proof_db.insert(&[], &item); } let proof_db = InMemoryStorage::with_db(proof_db); diff --git a/core/state-machine/src/changes_trie/mod.rs b/core/state-machine/src/changes_trie/mod.rs index 0119c3ca3105b..c29131cc0c5d8 100644 --- a/core/state-machine/src/changes_trie/mod.rs +++ b/core/state-machine/src/changes_trie/mod.rs @@ -77,7 +77,7 @@ pub trait RootsStorage: Send + Sync { /// Changes trie storage. Provides access to trie roots and trie nodes. pub trait Storage: RootsStorage { /// Get a trie node. - fn get(&self, key: &H::Out) -> Result, String>; + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String>; } /// Changes trie configuration. diff --git a/core/state-machine/src/changes_trie/storage.rs b/core/state-machine/src/changes_trie/storage.rs index 4eb8db0de9035..2704a469559a8 100644 --- a/core/state-machine/src/changes_trie/storage.rs +++ b/core/state-machine/src/changes_trie/storage.rs @@ -116,8 +116,8 @@ impl RootsStorage for InMemoryStorage where H::Out: HeapSizeOf } impl Storage for InMemoryStorage where H::Out: HeapSizeOf { - fn get(&self, key: &H::Out) -> Result, String> { - MemoryDB::::get(&self.data.read().mdb, key) + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + MemoryDB::::get(&self.data.read().mdb, key, prefix) } } @@ -128,7 +128,7 @@ impl<'a, H: Hasher, S: 'a + Storage> TrieBackendAdapter<'a, H, S> { } impl<'a, H: Hasher, S: 'a + Storage> TrieBackendStorage for TrieBackendAdapter<'a, H, S> { - fn get(&self, key: &H::Out) -> Result, String> { - self.storage.get(key) + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + self.storage.get(key, prefix) } } diff --git a/core/state-machine/src/proving_backend.rs b/core/state-machine/src/proving_backend.rs index 81d68352c8699..085819c7fb126 100644 --- a/core/state-machine/src/proving_backend.rs +++ b/core/state-machine/src/proving_backend.rs @@ -181,7 +181,7 @@ where { let db = create_proof_check_backend_storage(proof); - if !db.contains(&root) { + if !db.contains(&root, &[]) { return Err(Box::new(ExecutionError::InvalidProof) as Box); } @@ -198,7 +198,7 @@ where { let mut db = MemoryDB::default(); for item in proof { - db.insert(&item); + db.insert(&[], &item); } db } diff --git a/core/state-machine/src/trie_backend_essence.rs b/core/state-machine/src/trie_backend_essence.rs index b429e7aa04619..16b25dce75175 100644 --- a/core/state-machine/src/trie_backend_essence.rs +++ b/core/state-machine/src/trie_backend_essence.rs @@ -28,7 +28,7 @@ use crate::changes_trie::Storage as ChangesTrieStorage; /// Patricia trie-based storage trait. pub trait Storage: Send + Sync { /// Get a trie node. - fn get(&self, key: &H::Out) -> Result, String>; + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String>; } /// Patricia trie-based pairs storage essence. @@ -190,7 +190,7 @@ impl<'a, if let Some(val) = hash_db::PlainDB::get(self.overlay, key) { Some(val) } else { - match self.storage.get(&key) { + match self.storage.get(&key, &[]) { Ok(x) => x, Err(e) => { warn!(target: "trie", "Failed to read from DB: {}", e); @@ -231,11 +231,11 @@ impl<'a, for Ephemeral<'a, S, H> where H::Out: HeapSizeOf { - fn get(&self, key: &H::Out) -> Option { - if let Some(val) = hash_db::HashDB::get(self.overlay, key) { + fn get(&self, key: &H::Out, prefix: &[u8]) -> Option { + if let Some(val) = hash_db::HashDB::get(self.overlay, key, prefix) { Some(val) } else { - match self.storage.get(&key) { + match self.storage.get(&key, prefix) { Ok(x) => x, Err(e) => { warn!(target: "trie", "Failed to read from DB: {}", e); @@ -245,20 +245,20 @@ impl<'a, } } - fn contains(&self, key: &H::Out) -> bool { - hash_db::HashDB::get(self, key).is_some() + fn contains(&self, key: &H::Out, prefix: &[u8]) -> bool { + hash_db::HashDB::get(self, key, prefix).is_some() } - fn insert(&mut self, value: &[u8]) -> H::Out { - hash_db::HashDB::insert(self.overlay, value) + fn insert(&mut self, prefix: &[u8], value: &[u8]) -> H::Out { + hash_db::HashDB::insert(self.overlay, prefix, value) } - fn emplace(&mut self, key: H::Out, value: DBValue) { - hash_db::HashDB::emplace(self.overlay, key, value) + fn emplace(&mut self, key: H::Out, prefix: &[u8], value: DBValue) { + hash_db::HashDB::emplace(self.overlay, key, prefix, value) } - fn remove(&mut self, key: &H::Out) { - hash_db::HashDB::remove(self.overlay, key) + fn remove(&mut self, key: &H::Out, prefix: &[u8]) { + hash_db::HashDB::remove(self.overlay, key, prefix) } } @@ -269,33 +269,33 @@ impl<'a, for Ephemeral<'a, S, H> where H::Out: HeapSizeOf { - fn get(&self, key: &H::Out) -> Option { hash_db::HashDB::get(self, key) } - fn contains(&self, key: &H::Out) -> bool { hash_db::HashDB::contains(self, key) } + fn get(&self, key: &H::Out, prefix: &[u8]) -> Option { hash_db::HashDB::get(self, key, prefix) } + fn contains(&self, key: &H::Out, prefix: &[u8]) -> bool { hash_db::HashDB::contains(self, key, prefix) } } /// Key-value pairs storage that is used by trie backend essence. pub trait TrieBackendStorage: Send + Sync { /// Get the value stored at key. - fn get(&self, key: &H::Out) -> Result, String>; + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String>; } // This implementation is used by normal storage trie clients. impl TrieBackendStorage for Arc> { - fn get(&self, key: &H::Out) -> Result, String> { - Storage::::get(self.deref(), key) + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + Storage::::get(self.deref(), key, prefix) } } // This implementation is used by test storage trie clients. impl TrieBackendStorage for MemoryDB { - fn get(&self, key: &H::Out) -> Result, String> { - Ok(hash_db::PlainDB::get(self, key)) + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + Ok(hash_db::HashDB::get(self, key, prefix)) } } // This implementation is used by changes trie clients. impl<'a, S, H: Hasher> TrieBackendStorage for &'a S where S: ChangesTrieStorage { - fn get(&self, key: &H::Out) -> Result, String> { - ChangesTrieStorage::::get(*self, key) + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + ChangesTrieStorage::::get(*self, key, prefix) } } diff --git a/core/trie/src/lib.rs b/core/trie/src/lib.rs index 071f49d875514..8b90edb9dcea1 100644 --- a/core/trie/src/lib.rs +++ b/core/trie/src/lib.rs @@ -32,6 +32,8 @@ pub use trie_stream::TrieStream; pub use node_codec::NodeCodec; /// Various re-exports from the `trie-db` crate. pub use trie_db::{Trie, TrieMut, DBValue, Recorder, Query}; +/// Various re-exports from the `memory-db` crate. +pub use memory_db::full_key; /// As in `trie_db`, but less generic, error type for the crate. pub type TrieError = trie_db::TrieError; From f9ba7965cca79b1b7b9ea33a30dd17c4d0a5cf96 Mon Sep 17 00:00:00 2001 From: arkpar Date: Wed, 20 Mar 2019 10:55:42 +0100 Subject: [PATCH 3/8] Comments --- core/state-db/src/pruning.rs | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/core/state-db/src/pruning.rs b/core/state-db/src/pruning.rs index 02d2f3302f82d..078745c7a2644 100644 --- a/core/state-db/src/pruning.rs +++ b/core/state-db/src/pruning.rs @@ -32,10 +32,17 @@ const PRUNING_JOURNAL: &[u8] = b"pruning_journal"; /// See module documentation. pub struct RefWindow { + /// A queue of keys that should be deleted for each block in the pruning window. death_rows: VecDeque>, + /// An index that maps each key from `death_rows` to block number. death_index: HashMap, + /// Block number that corresponts to the front of `death_rows` pending_number: u64, - pending_finalizatons: usize, + /// Number of call of `note_canonical` after + /// last call `apply_pending` or `revert_pending` + pending_canonicalizations: usize, + /// Number of calls of `prune_one` after + /// last call `apply_pending` or `revert_pending` pending_prunings: usize, } @@ -70,7 +77,7 @@ impl RefWindow { death_rows: Default::default(), death_index: Default::default(), pending_number: pending_number, - pending_finalizatons: 0, + pending_canonicalizations: 0, pending_prunings: 0, }; // read the journal @@ -160,12 +167,12 @@ impl RefWindow { let journal_key = to_journal_key(block); commit.meta.inserted.push((journal_key.clone(), journal_record.encode())); self.import(&journal_record.hash, journal_key, journal_record.inserted.into_iter(), journal_record.deleted); - self.pending_finalizatons += 1; + self.pending_canonicalizations += 1; } /// Apply all pending changes pub fn apply_pending(&mut self) { - self.pending_finalizatons = 0; + self.pending_canonicalizations = 0; for _ in 0 .. self.pending_prunings { let pruned = self.death_rows.pop_front().expect("pending_prunings is always < death_rows.len()"); trace!(target: "state-db", "Applying pruning {:?} ({} deleted)", pruned.hash, pruned.deleted.len()); @@ -179,10 +186,14 @@ impl RefWindow { /// Revert all pending changes pub fn revert_pending(&mut self) { - self.death_rows.truncate(self.death_rows.len() - self.pending_finalizatons); + // Revert pending deletions. + // Note that pending insertions might cause some existing deletions to be removed from `death_index` + // We don't bother to track and revert that for now. This means that a few nodes might end up no being + // deleted in case transaction fails and `revert_pending` is called. + self.death_rows.truncate(self.death_rows.len() - self.pending_canonicalizations); let new_max_block = self.death_rows.len() as u64 + self.pending_number; self.death_index.retain(|_, block| *block < new_max_block); - self.pending_finalizatons = 0; + self.pending_canonicalizations = 0; self.pending_prunings = 0; } } @@ -220,7 +231,7 @@ mod tests { assert!(pruning.death_rows.is_empty()); assert!(pruning.death_index.is_empty()); assert!(pruning.pending_prunings == 0); - assert!(pruning.pending_finalizatons == 0); + assert!(pruning.pending_canonicalizations == 0); } #[test] From 2e3d55e4e0e4d9d4a56f328b192b004725a9df86 Mon Sep 17 00:00:00 2001 From: arkpar Date: Fri, 22 Mar 2019 22:10:54 +0100 Subject: [PATCH 4/8] Prefixed trie storage --- core/client/db/src/lib.rs | 4 ++-- core/trie/src/lib.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index f20ef5801ee23..7ac1da9600638 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -40,7 +40,7 @@ use client::ExecutionStrategies; use parity_codec::{Decode, Encode}; use hash_db::Hasher; use kvdb::{KeyValueDB, DBTransaction}; -use trie::{MemoryDB, full_key}; +use trie::{MemoryDB, prefixed_key}; use parking_lot::RwLock; use primitives::{H256, Blake2Hasher, ChangesTrieConfiguration, convert_hash}; use primitives::storage::well_known_keys; @@ -379,7 +379,7 @@ struct StorageDb { impl state_machine::Storage for StorageDb { fn get(&self, key: &H256, prefix: &[u8]) -> Result, String> { - let key = full_key::(key, prefix); + let key = prefixed_key::(key, prefix); self.state_db.get(&key, self).map(|r| r.map(|v| DBValue::from_slice(&v))) .map_err(|e| format!("Database backend error: {:?}", e)) } diff --git a/core/trie/src/lib.rs b/core/trie/src/lib.rs index 8b90edb9dcea1..3c1b39783624d 100644 --- a/core/trie/src/lib.rs +++ b/core/trie/src/lib.rs @@ -33,7 +33,7 @@ pub use node_codec::NodeCodec; /// Various re-exports from the `trie-db` crate. pub use trie_db::{Trie, TrieMut, DBValue, Recorder, Query}; /// Various re-exports from the `memory-db` crate. -pub use memory_db::full_key; +pub use memory_db::prefixed_key; /// As in `trie_db`, but less generic, error type for the crate. pub type TrieError = trie_db::TrieError; @@ -45,7 +45,7 @@ pub type HashDB<'a, H> = hash_db::HashDB + 'a; /// As in `hash_db`, but less generic, trait exposed. pub type PlainDB<'a, K> = hash_db::PlainDB + 'a; /// As in `memory_db`, but less generic, trait exposed. -pub type MemoryDB = memory_db::MemoryDB; +pub type MemoryDB = memory_db::MemoryDB, trie_db::DBValue>; /// Persistent trie database read-access interface for the a given hasher. pub type TrieDB<'a, H> = trie_db::TrieDB<'a, H, NodeCodec>; From a7eda290a589c46ef49ada927fce3c8b8bc6c033 Mon Sep 17 00:00:00 2001 From: arkpar Date: Wed, 27 Mar 2019 19:31:54 +0100 Subject: [PATCH 5/8] Fixed tests --- Cargo.lock | 63 +++++++++++++++---- core/client/Cargo.toml | 2 +- core/client/db/Cargo.toml | 2 +- core/client/db/src/lib.rs | 50 +++++++-------- core/primitives/Cargo.toml | 2 +- core/sr-io/Cargo.toml | 2 +- core/state-db/src/test.rs | 6 +- core/state-machine/Cargo.toml | 6 +- .../state-machine/src/changes_trie/storage.rs | 2 +- core/trie/Cargo.toml | 8 +-- core/trie/src/lib.rs | 1 - node-template/Cargo.toml | 2 +- node/executor/Cargo.toml | 2 +- 13 files changed, 92 insertions(+), 56 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 52eec67507ffb..4f36e275f1908 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -906,6 +906,11 @@ name = "hash-db" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "hash-db" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "hash256-std-hasher" version = "0.11.0" @@ -1729,6 +1734,15 @@ dependencies = [ "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "memory-db" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "memory_units" version = "0.3.0" @@ -1921,7 +1935,7 @@ dependencies = [ "substrate-primitives 0.1.0", "substrate-state-machine 0.1.0", "substrate-trie 0.4.0", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2002,7 +2016,7 @@ dependencies = [ "substrate-service 0.3.0", "substrate-transaction-pool 0.1.0", "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3002,7 +3016,7 @@ name = "sr-io" version = "0.1.0" dependencies = [ "environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3673,7 +3687,7 @@ dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", @@ -3701,7 +3715,7 @@ name = "substrate-client-db" version = "0.1.0" dependencies = [ "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "kvdb-rocksdb 0.1.4 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", @@ -4008,7 +4022,7 @@ dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4153,7 +4167,7 @@ dependencies = [ name = "substrate-state-machine" version = "0.1.0" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4162,8 +4176,8 @@ dependencies = [ "substrate-panic-handler 0.1.0", "substrate-primitives 0.1.0", "substrate-trie 0.4.0", - "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4263,15 +4277,15 @@ name = "substrate-trie" version = "0.4.0" dependencies = [ "criterion 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", "trie-bench 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "trie-standardmap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4663,6 +4677,17 @@ dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "trie-db" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "trie-root" version = "0.11.0" @@ -4671,6 +4696,14 @@ dependencies = [ "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "trie-root" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "trie-standardmap" version = "0.11.0" @@ -5143,6 +5176,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum globset 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4743617a7464bbda3c8aec8558ff2f9429047e025771037df561d383337ff865" "checksum h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "ddb2b25a33e231484694267af28fec74ac63b5ccf51ee2065a5e313b834d836e" "checksum hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b03501f6e1a2a97f1618879aba3156f14ca2847faa530c4e28859638bd11483" +"checksum hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07463834729d0ce8d475e7dd6d302e407093ad9a9c02d77eb07fb74b5373829d" "checksum hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5c13dbac3cc50684760f54af18545c9e80fb75e93a3e586d71ebdc13138f6a4" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" @@ -5216,6 +5250,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1dd4eaac298c32ce07eb6ed9242eda7d82955b9170b7d6db59b2e02cc63fcb8" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94da53143d45f6bad3753f532e56ad57a6a26c0ca6881794583310c7cb4c885f" +"checksum memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3dd87d4d64f7b86d8804bbb419f8ecb187cb8f40a50e91c72848075c604ba88d" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum merlin 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a9e97b439f6d38cbe2a4a4aa93f6770c5305f62761b78b1851406c09c87ee2a" "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" @@ -5388,7 +5423,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" "checksum trie-bench 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "77087d1bce467cf8371a5c0e10e4d925b065ec6cfad8b9cdff1fad4f218c6750" "checksum trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7319e28ca295f27359d944a682f7f65b419158bf1590c92cadc0000258d788" +"checksum trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f23230c31251bdbdba89cd9caa0cbe2aa9e4aa5f92a80e6eb6296bb290e9146" "checksum trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3c6fef2705af3258ec46a7e22286090394a44216201a1cf7d04b78db825e543" +"checksum trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e45632ecaf2b8b4a40b5208383cd659b4e66f58ccd40086467a4614b45781430" "checksum trie-standardmap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0e4729504b8102acb1bef3f16e6b64d41aeb1ff0e329081451e8191df0f61ab2" "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" diff --git a/core/client/Cargo.toml b/core/client/Cargo.toml index f797d93f1fe9c..cfc7eb3e3447e 100644 --- a/core/client/Cargo.toml +++ b/core/client/Cargo.toml @@ -18,7 +18,7 @@ state-machine = { package = "substrate-state-machine", path = "../state-machine" keyring = { package = "substrate-keyring", path = "../keyring", optional = true } trie = { package = "substrate-trie", path = "../trie", optional = true } substrate-telemetry = { path = "../telemetry", optional = true } -hash-db = { version = "0.11", optional = true } +hash-db = { version = "0.12", optional = true } kvdb = { git = "https://github.com/paritytech/parity-common", optional = true, rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } parity-codec = { version = "3.2", default-features = false, features = ["derive"] } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } diff --git a/core/client/db/Cargo.toml b/core/client/db/Cargo.toml index 97de2cd7cdc8b..7fc1cc5d95750 100644 --- a/core/client/db/Cargo.toml +++ b/core/client/db/Cargo.toml @@ -12,7 +12,7 @@ kvdb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c kvdb-rocksdb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } kvdb-memorydb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d", optional = true } lru-cache = "0.1.1" -hash-db = { version = "0.11" } +hash-db = { version = "0.12" } primitives = { package = "substrate-primitives", path = "../../primitives" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } client = { package = "substrate-client", path = "../../client" } diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index 0d73e304b7cbe..86bd5e3e47e90 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -1415,7 +1415,7 @@ mod tests { op.reset_storage(storage.iter().cloned().collect(), Default::default()).unwrap(); - key = op.db_updates.insert(b"hello"); + key = op.db_updates.insert(&[], b"hello"); op.set_block_data( header, Some(vec![]), @@ -1449,8 +1449,8 @@ mod tests { ).0.into(); let hash = header.hash(); - op.db_updates.insert(b"hello"); - op.db_updates.remove(&key); + op.db_updates.insert(&[], b"hello"); + op.db_updates.remove(&key, &[]); op.set_block_data( header, Some(vec![]), @@ -1484,7 +1484,7 @@ mod tests { ).0.into(); let hash = header.hash(); - op.db_updates.remove(&key); + op.db_updates.remove(&key, &[]); op.set_block_data( header, Some(vec![]), @@ -1550,7 +1550,7 @@ mod tests { assert_eq!(backend.changes_tries_storage.root(&anchor, block), Ok(Some(changes_root))); for (key, (val, _)) in changes_trie_update.drain() { - assert_eq!(backend.changes_trie_storage().unwrap().get(&key), Ok(Some(val))); + assert_eq!(backend.changes_trie_storage().unwrap().get(&H256::from_slice(key.as_slice()), &[]), Ok(Some(val))); } }; @@ -1676,23 +1676,23 @@ mod tests { let mut tx = DBTransaction::new(); backend.changes_tries_storage.prune(Some(config.clone()), &mut tx, Default::default(), 12); backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root1).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root2).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root3).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root4).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root5).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root6).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root7).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root8).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root1, &[]).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root2, &[]).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root3, &[]).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root4, &[]).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root5, &[]).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root6, &[]).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root7, &[]).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root8, &[]).unwrap().is_some()); // now simulate finalization of block#16, causing prune of tries at #5..#8 let mut tx = DBTransaction::new(); backend.changes_tries_storage.prune(Some(config.clone()), &mut tx, Default::default(), 16); backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root5).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root6).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root7).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root8).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root5, &[]).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root6, &[]).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root7, &[]).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root8, &[]).unwrap().is_none()); // now "change" pruning mode to archive && simulate finalization of block#20 // => no changes tries are pruned, because we never prune in archive mode @@ -1700,10 +1700,10 @@ mod tests { let mut tx = DBTransaction::new(); backend.changes_tries_storage.prune(Some(config), &mut tx, Default::default(), 20); backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root9).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root10).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root11).unwrap().is_some()); - assert!(backend.changes_tries_storage.get(&root12).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root9, &[]).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root10, &[]).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root11, &[]).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root12, &[]).unwrap().is_some()); } #[test] @@ -1742,15 +1742,15 @@ mod tests { let mut tx = DBTransaction::new(); backend.changes_tries_storage.prune(Some(config.clone()), &mut tx, block5, 5); backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root1).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root2).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root1, &[]).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root2, &[]).unwrap().is_some()); // now simulate finalization of block#6, causing prune of tries at #2 let mut tx = DBTransaction::new(); backend.changes_tries_storage.prune(Some(config.clone()), &mut tx, block6, 6); backend.storage.db.write(tx).unwrap(); - assert!(backend.changes_tries_storage.get(&root2).unwrap().is_none()); - assert!(backend.changes_tries_storage.get(&root3).unwrap().is_some()); + assert!(backend.changes_tries_storage.get(&root2, &[]).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root3, &[]).unwrap().is_some()); } #[test] diff --git a/core/primitives/Cargo.toml b/core/primitives/Cargo.toml index 7de8d9d33afd2..18f95f2729a9f 100644 --- a/core/primitives/Cargo.toml +++ b/core/primitives/Cargo.toml @@ -15,7 +15,7 @@ byteorder = { version = "1.1", default-features = false } primitive-types = { version = "0.2", default-features = false, features = ["codec"] } impl-serde = { version = "0.1", optional = true } wasmi = { version = "0.4.3", optional = true } -hash-db = { version = "0.11", default-features = false } +hash-db = { version = "0.12", default-features = false } hash256-std-hasher = { version = "0.11", default-features = false } ring = { version = "0.14", optional = true } untrusted = { version = "0.6", optional = true } diff --git a/core/sr-io/Cargo.toml b/core/sr-io/Cargo.toml index 0c4c8b7ada543..01555a6f473c3 100644 --- a/core/sr-io/Cargo.toml +++ b/core/sr-io/Cargo.toml @@ -12,7 +12,7 @@ rustc_version = "0.2" rstd = { package = "sr-std", path = "../sr-std", default-features = false } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } parity-codec = { version = "3.2", default-features = false } -hash-db = { version = "0.11", default-features = false } +hash-db = { version = "0.12", default-features = false } libsecp256k1 = { version = "0.2.1", optional = true } tiny-keccak = { version = "1.4.2", optional = true } environmental = { version = "1.0.1", optional = true } diff --git a/core/state-db/src/test.rs b/core/state-db/src/test.rs index cec5935142e74..d90c36990612e 100644 --- a/core/state-db/src/test.rs +++ b/core/state-db/src/test.rs @@ -18,7 +18,7 @@ use std::collections::HashMap; use primitives::H256; -use crate::{DBValue, ChangeSet, CommitSet, MetaDb, HashDb}; +use crate::{DBValue, ChangeSet, CommitSet, MetaDb, NodeDb}; #[derive(Default, Debug, Clone, PartialEq, Eq)] pub struct TestDb { @@ -34,9 +34,9 @@ impl MetaDb for TestDb { } } -impl HashDb for TestDb { +impl NodeDb for TestDb { type Error = (); - type Hash = H256; + type Key = H256; fn get(&self, key: &H256) -> Result, ()> { Ok(self.data.get(key).cloned()) diff --git a/core/state-machine/Cargo.toml b/core/state-machine/Cargo.toml index 61a99f8e94fde..d81079b5f9c39 100644 --- a/core/state-machine/Cargo.toml +++ b/core/state-machine/Cargo.toml @@ -10,9 +10,9 @@ hex-literal = "0.1.0" log = "0.4" parking_lot = "0.7.1" heapsize = "0.4" -hash-db = "0.11" -trie-db = "0.11" -trie-root = "0.11" +hash-db = "0.12" +trie-db = "0.12" +trie-root = "0.12" trie = { package = "substrate-trie", path = "../trie" } primitives = { package = "substrate-primitives", path = "../primitives" } panic-handler = { package = "substrate-panic-handler", path = "../panic-handler" } diff --git a/core/state-machine/src/changes_trie/storage.rs b/core/state-machine/src/changes_trie/storage.rs index 2704a469559a8..f92b8229f5413 100644 --- a/core/state-machine/src/changes_trie/storage.rs +++ b/core/state-machine/src/changes_trie/storage.rs @@ -92,7 +92,7 @@ impl InMemoryStorage where H::Out: HeapSizeOf { pub fn remove_from_storage(&self, keys: &HashSet) { let mut data = self.data.write(); for key in keys { - data.mdb.remove_and_purge(key); + data.mdb.remove_and_purge(key, &[]); } } diff --git a/core/trie/Cargo.toml b/core/trie/Cargo.toml index 9d93cbe599b65..3b3a608ca770d 100644 --- a/core/trie/Cargo.toml +++ b/core/trie/Cargo.toml @@ -13,10 +13,10 @@ harness = false [dependencies] codec = { package = "parity-codec", version = "3.2" } -hash-db = { version = "0.11", default-features = false } -trie-db = { version = "0.11", optional = true } -trie-root = { version = "0.11", default-features = false } -memory-db = { version = "0.11", optional = true } +hash-db = { version = "0.12", default-features = false } +trie-db = { version = "0.12", optional = true } +trie-root = { version = "0.12", default-features = false } +memory-db = { version = "0.12", optional = true } [dev-dependencies] substrate-primitives = { path = "../primitives" } diff --git a/core/trie/src/lib.rs b/core/trie/src/lib.rs index 3c1b39783624d..80d2066b4958f 100644 --- a/core/trie/src/lib.rs +++ b/core/trie/src/lib.rs @@ -315,7 +315,6 @@ mod tests { use super::*; use codec::{Encode, Compact}; use substrate_primitives::Blake2Hasher; - use memory_db::MemoryDB; use hash_db::{HashDB, Hasher}; use trie_db::{DBValue, TrieMut, Trie}; use trie_standardmap::{Alphabet, ValueMode, StandardMap}; diff --git a/node-template/Cargo.toml b/node-template/Cargo.toml index 53874bb181111..786f49023b403 100644 --- a/node-template/Cargo.toml +++ b/node-template/Cargo.toml @@ -19,7 +19,7 @@ exit-future = "0.1" parking_lot = "0.7.1" hex-literal = "0.1" parity-codec = "3.2" -trie-root = "0.11.0" +trie-root = "0.12.0" sr-io = { path = "../core/sr-io" } substrate-cli = { path = "../core/cli" } primitives = { package = "substrate-primitives", path = "../core/primitives" } diff --git a/node/executor/Cargo.toml b/node/executor/Cargo.toml index 572aa9dbcfb55..3c2e9a688cb9b 100644 --- a/node/executor/Cargo.toml +++ b/node/executor/Cargo.toml @@ -6,7 +6,7 @@ description = "Substrate node implementation in Rust." edition = "2018" [dependencies] -trie-root = "0.11" +trie-root = "0.12" parity-codec = "3.2" runtime_io = { package = "sr-io", path = "../../core/sr-io" } state_machine = { package = "substrate-state-machine", path = "../../core/state-machine" } From d9d83e485c082e7c9f84eb6e66b0af84790890b9 Mon Sep 17 00:00:00 2001 From: arkpar Date: Thu, 28 Mar 2019 17:12:21 +0100 Subject: [PATCH 6/8] Fixed tests --- Cargo.lock | 91 ++++++------------- core/client/db/src/lib.rs | 12 +-- core/primitives/Cargo.toml | 2 +- core/state-machine/src/backend.rs | 4 +- .../state-machine/src/changes_trie/storage.rs | 2 + core/state-machine/src/proving_backend.rs | 16 ++-- core/state-machine/src/trie_backend.rs | 26 +++--- .../state-machine/src/trie_backend_essence.rs | 39 +++++--- core/trie/Cargo.toml | 6 +- core/trie/src/lib.rs | 8 +- node-template/runtime/wasm/Cargo.lock | 42 ++++----- 11 files changed, 117 insertions(+), 131 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b8449dcc6028c..774c843a7fc9e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -901,11 +901,6 @@ dependencies = [ "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "hash-db" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "hash-db" version = "0.12.0" @@ -913,7 +908,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1209,11 +1204,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "keccak-hasher" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1725,15 +1720,6 @@ name = "memoffset" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "memory-db" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "memory-db" version = "0.12.0" @@ -4053,7 +4039,7 @@ dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4208,7 +4194,7 @@ dependencies = [ "substrate-panic-handler 0.1.0", "substrate-primitives 0.1.0", "substrate-trie 0.4.0", - "trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4312,14 +4298,14 @@ dependencies = [ "criterion 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", - "trie-bench 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-bench 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-standardmap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-standardmap 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4686,33 +4672,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "trie-bench" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "criterion 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-standardmap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "trie-db" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-standardmap 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trie-db" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4721,14 +4696,6 @@ dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "trie-root" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "trie-root" version = "0.12.0" @@ -4739,12 +4706,12 @@ dependencies = [ [[package]] name = "trie-standardmap" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "criterion 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4767,7 +4734,7 @@ name = "twox-hash" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5208,9 +5175,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" "checksum globset 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4743617a7464bbda3c8aec8558ff2f9429047e025771037df561d383337ff865" "checksum h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "ddb2b25a33e231484694267af28fec74ac63b5ccf51ee2065a5e313b834d836e" -"checksum hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b03501f6e1a2a97f1618879aba3156f14ca2847faa530c4e28859638bd11483" "checksum hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07463834729d0ce8d475e7dd6d302e407093ad9a9c02d77eb07fb74b5373829d" -"checksum hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5c13dbac3cc50684760f54af18545c9e80fb75e93a3e586d71ebdc13138f6a4" +"checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" @@ -5241,7 +5207,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum jsonrpc-server-utils 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5521613b31ea22d36d9f95ad642058dccec846a94ed8690957652d479f620707" "checksum jsonrpc-ws-server 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20b8333a5a6e6ccbcf5c90f90919de557cba4929efa164e9bd0e8e497eb20e46" "checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" -"checksum keccak-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb9d3670023f4c04153d90b8a557a822d1b27ed702bb015a87cf7bffead5b611" +"checksum keccak-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a02fb74dc1b613522069b5f2023c014756ce121c6c6fb39364c139b0efc39a2d" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" @@ -5282,7 +5248,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1dd4eaac298c32ce07eb6ed9242eda7d82955b9170b7d6db59b2e02cc63fcb8" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" -"checksum memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94da53143d45f6bad3753f532e56ad57a6a26c0ca6881794583310c7cb4c885f" "checksum memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3dd87d4d64f7b86d8804bbb419f8ecb187cb8f40a50e91c72848075c604ba88d" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum merlin 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a9e97b439f6d38cbe2a4a4aa93f6770c5305f62761b78b1851406c09c87ee2a" @@ -5454,12 +5419,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" "checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" -"checksum trie-bench 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "77087d1bce467cf8371a5c0e10e4d925b065ec6cfad8b9cdff1fad4f218c6750" -"checksum trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7319e28ca295f27359d944a682f7f65b419158bf1590c92cadc0000258d788" -"checksum trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f23230c31251bdbdba89cd9caa0cbe2aa9e4aa5f92a80e6eb6296bb290e9146" -"checksum trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3c6fef2705af3258ec46a7e22286090394a44216201a1cf7d04b78db825e543" +"checksum trie-bench 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eafa32a8662c06f5bf135984bc1a12821fd38770b5c2f2f9e8750327fcbe3955" +"checksum trie-db 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "843af112ba3a8c919cd961edf3cac9272353f5e277ad8678c7023fa70e5c0e2d" "checksum trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e45632ecaf2b8b4a40b5208383cd659b4e66f58ccd40086467a4614b45781430" -"checksum trie-standardmap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0e4729504b8102acb1bef3f16e6b64d41aeb1ff0e329081451e8191df0f61ab2" +"checksum trie-standardmap 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006314f54f2ea7944a878e66fd93ad7978095bc355f30a2f26ec40f664d86c86" "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" "checksum twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "555cd4909480122bbbf21e34faac4cb08a171f324775670447ed116726c474af" diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index 86bd5e3e47e90..93adb990240a6 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -40,7 +40,7 @@ use client::ExecutionStrategies; use parity_codec::{Decode, Encode}; use hash_db::Hasher; use kvdb::{KeyValueDB, DBTransaction}; -use trie::{MemoryDB, prefixed_key}; +use trie::{MemoryDB, PrefixedMemoryDB, prefixed_key}; use parking_lot::RwLock; use primitives::{H256, Blake2Hasher, ChangesTrieConfiguration, convert_hash}; use primitives::storage::well_known_keys; @@ -259,7 +259,7 @@ impl client::blockchain::Backend for BlockchainDb { /// Database transaction pub struct BlockImportOperation { old_state: CachingState, - db_updates: MemoryDB, + db_updates: PrefixedMemoryDB, storage_updates: Vec<(Vec, Option>)>, changes_trie_updates: MemoryDB, pending_block: Option>, @@ -310,7 +310,7 @@ where Block: BlockT, // currently authorities are not cached on full nodes } - fn update_db_storage(&mut self, update: MemoryDB) -> Result<(), client::error::Error> { + fn update_db_storage(&mut self, update: PrefixedMemoryDB) -> Result<(), client::error::Error> { self.db_updates = update; Ok(()) } @@ -321,7 +321,7 @@ where Block: BlockT, return Err(client::error::ErrorKind::GenesisInvalid.into()); } - let mut transaction: MemoryDB = Default::default(); + let mut transaction: PrefixedMemoryDB = Default::default(); for (child_key, child_map) in children { if !well_known_keys::is_child_storage_key(&child_key) { @@ -1032,7 +1032,7 @@ impl client::backend::Backend for Backend whe Ok(BlockImportOperation { pending_block: None, old_state, - db_updates: MemoryDB::default(), + db_updates: PrefixedMemoryDB::default(), storage_updates: Default::default(), changes_trie_updates: MemoryDB::default(), aux_ops: Vec::new(), @@ -1550,7 +1550,7 @@ mod tests { assert_eq!(backend.changes_tries_storage.root(&anchor, block), Ok(Some(changes_root))); for (key, (val, _)) in changes_trie_update.drain() { - assert_eq!(backend.changes_trie_storage().unwrap().get(&H256::from_slice(key.as_slice()), &[]), Ok(Some(val))); + assert_eq!(backend.changes_trie_storage().unwrap().get(&key, &[]), Ok(Some(val))); } }; diff --git a/core/primitives/Cargo.toml b/core/primitives/Cargo.toml index 18f95f2729a9f..fb4893613858b 100644 --- a/core/primitives/Cargo.toml +++ b/core/primitives/Cargo.toml @@ -16,7 +16,7 @@ primitive-types = { version = "0.2", default-features = false, features = ["code impl-serde = { version = "0.1", optional = true } wasmi = { version = "0.4.3", optional = true } hash-db = { version = "0.12", default-features = false } -hash256-std-hasher = { version = "0.11", default-features = false } +hash256-std-hasher = { version = "0.12", default-features = false } ring = { version = "0.14", optional = true } untrusted = { version = "0.6", optional = true } hex-literal = { version = "0.1", optional = true } diff --git a/core/state-machine/src/backend.rs b/core/state-machine/src/backend.rs index 0acbf278579ba..14e60b140a0e8 100644 --- a/core/state-machine/src/backend.rs +++ b/core/state-machine/src/backend.rs @@ -112,9 +112,9 @@ impl Consolidate for Vec<(Option>, Vec, Option>)> { } } -impl Consolidate for MemoryDB { +impl> Consolidate for trie::GenericMemoryDB { fn consolidate(&mut self, other: Self) { - MemoryDB::consolidate(self, other) + trie::GenericMemoryDB::consolidate(self, other) } } diff --git a/core/state-machine/src/changes_trie/storage.rs b/core/state-machine/src/changes_trie/storage.rs index f92b8229f5413..decc332c1a618 100644 --- a/core/state-machine/src/changes_trie/storage.rs +++ b/core/state-machine/src/changes_trie/storage.rs @@ -128,6 +128,8 @@ impl<'a, H: Hasher, S: 'a + Storage> TrieBackendAdapter<'a, H, S> { } impl<'a, H: Hasher, S: 'a + Storage> TrieBackendStorage for TrieBackendAdapter<'a, H, S> { + type Overlay = MemoryDB; + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { self.storage.get(key, prefix) } diff --git a/core/state-machine/src/proving_backend.rs b/core/state-machine/src/proving_backend.rs index 085819c7fb126..4d85791faf681 100644 --- a/core/state-machine/src/proving_backend.rs +++ b/core/state-machine/src/proving_backend.rs @@ -21,7 +21,7 @@ use log::debug; use hash_db::Hasher; use heapsize::HeapSizeOf; use hash_db::HashDB; -use trie::{Recorder, MemoryDB, TrieError, default_child_trie_root, read_trie_value_with, read_child_trie_value_with, record_all_keys}; +use trie::{Recorder, MemoryDB, PrefixedMemoryDB, TrieError, default_child_trie_root, read_trie_value_with, read_child_trie_value_with, record_all_keys}; use crate::trie_backend::TrieBackend; use crate::trie_backend_essence::{Ephemeral, TrieBackendEssence, TrieBackendStorage}; use crate::{Error, ExecutionError, Backend}; @@ -40,7 +40,7 @@ impl<'a, S, H> ProvingBackendEssence<'a, S, H> H::Out: HeapSizeOf, { pub fn storage(&mut self, key: &[u8]) -> Result>, String> { - let mut read_overlay = MemoryDB::default(); + let mut read_overlay = S::Overlay::default(); let eph = Ephemeral::new( self.backend.backend_storage(), &mut read_overlay, @@ -54,7 +54,7 @@ impl<'a, S, H> ProvingBackendEssence<'a, S, H> pub fn child_storage(&mut self, storage_key: &[u8], key: &[u8]) -> Result>, String> { let root = self.storage(storage_key)?.unwrap_or(default_child_trie_root::(storage_key)); - let mut read_overlay = MemoryDB::default(); + let mut read_overlay = S::Overlay::default(); let eph = Ephemeral::new( self.backend.backend_storage(), &mut read_overlay, @@ -66,7 +66,7 @@ impl<'a, S, H> ProvingBackendEssence<'a, S, H> } pub fn record_all_keys(&mut self) { - let mut read_overlay = MemoryDB::default(); + let mut read_overlay = S::Overlay::default(); let eph = Ephemeral::new( self.backend.backend_storage(), &mut read_overlay, @@ -116,8 +116,8 @@ impl<'a, S, H> Backend for ProvingBackend<'a, S, H> H::Out: Ord + HeapSizeOf, { type Error = String; - type Transaction = MemoryDB; - type TrieBackendStorage = MemoryDB; + type Transaction = S::Overlay; + type TrieBackendStorage = PrefixedMemoryDB; fn storage(&self, key: &[u8]) -> Result>, Self::Error> { ProvingBackendEssence { @@ -151,7 +151,7 @@ impl<'a, S, H> Backend for ProvingBackend<'a, S, H> self.backend.keys(prefix) } - fn storage_root(&self, delta: I) -> (H::Out, MemoryDB) + fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) where I: IntoIterator, Option>)> { self.backend.storage_root(delta) @@ -210,7 +210,7 @@ mod tests { use super::*; use primitives::{Blake2Hasher}; - fn test_proving<'a>(trie_backend: &'a TrieBackend, Blake2Hasher>) -> ProvingBackend<'a, MemoryDB, Blake2Hasher> { + fn test_proving<'a>(trie_backend: &'a TrieBackend, Blake2Hasher>) -> ProvingBackend<'a, PrefixedMemoryDB, Blake2Hasher> { ProvingBackend::new(trie_backend) } diff --git a/core/state-machine/src/trie_backend.rs b/core/state-machine/src/trie_backend.rs index 5de6c8837b8e3..b152d7fea1857 100644 --- a/core/state-machine/src/trie_backend.rs +++ b/core/state-machine/src/trie_backend.rs @@ -19,7 +19,7 @@ use log::{warn, debug}; use hash_db::Hasher; use heapsize::HeapSizeOf; -use trie::{TrieDB, TrieError, Trie, MemoryDB, delta_trie_root, default_child_trie_root, child_delta_trie_root}; +use trie::{TrieDB, TrieError, Trie, delta_trie_root, default_child_trie_root, child_delta_trie_root}; use crate::trie_backend_essence::{TrieBackendEssence, TrieBackendStorage, Ephemeral}; use crate::Backend; @@ -63,7 +63,7 @@ impl, H: Hasher> Backend for TrieBackend where H::Out: Ord + HeapSizeOf, { type Error = String; - type Transaction = MemoryDB; + type Transaction = S::Overlay; type TrieBackendStorage = S; fn storage(&self, key: &[u8]) -> Result>, Self::Error> { @@ -83,7 +83,7 @@ impl, H: Hasher> Backend for TrieBackend where } fn pairs(&self) -> Vec<(Vec, Vec)> { - let mut read_overlay = MemoryDB::default(); + let mut read_overlay = S::Overlay::default(); let eph = Ephemeral::new(self.essence.backend_storage(), &mut read_overlay); let collect_all = || -> Result<_, Box>> { @@ -107,7 +107,7 @@ impl, H: Hasher> Backend for TrieBackend where } fn keys(&self, prefix: &Vec) -> Vec> { - let mut read_overlay = MemoryDB::default(); + let mut read_overlay = S::Overlay::default(); let eph = Ephemeral::new(self.essence.backend_storage(), &mut read_overlay); let collect_all = || -> Result<_, Box>> { @@ -126,10 +126,10 @@ impl, H: Hasher> Backend for TrieBackend where collect_all().map_err(|e| debug!(target: "trie", "Error extracting trie keys: {}", e)).unwrap_or_default() } - fn storage_root(&self, delta: I) -> (H::Out, MemoryDB) + fn storage_root(&self, delta: I) -> (H::Out, S::Overlay) where I: IntoIterator, Option>)> { - let mut write_overlay = MemoryDB::default(); + let mut write_overlay = S::Overlay::default(); let mut root = *self.essence.root(); { @@ -154,7 +154,7 @@ impl, H: Hasher> Backend for TrieBackend where { let default_root = default_child_trie_root::(storage_key); - let mut write_overlay = MemoryDB::default(); + let mut write_overlay = S::Overlay::default(); let mut root = match self.storage(storage_key) { Ok(value) => value.unwrap_or(default_child_trie_root::(storage_key)), Err(e) => { @@ -189,12 +189,12 @@ impl, H: Hasher> Backend for TrieBackend where pub mod tests { use std::collections::HashSet; use primitives::{Blake2Hasher, H256}; - use trie::{TrieMut, TrieDBMut}; + use trie::{TrieMut, TrieDBMut, PrefixedMemoryDB}; use super::*; - fn test_db() -> (MemoryDB, H256) { + fn test_db() -> (PrefixedMemoryDB, H256) { let mut root = H256::default(); - let mut mdb = MemoryDB::::default(); + let mut mdb = PrefixedMemoryDB::::default(); { let mut trie = TrieDBMut::new(&mut mdb, &mut root); trie.insert(b"key", b"value").expect("insert failed"); @@ -208,7 +208,7 @@ pub mod tests { (mdb, root) } - pub(crate) fn test_trie() -> TrieBackend, Blake2Hasher> { + pub(crate) fn test_trie() -> TrieBackend, Blake2Hasher> { let (mdb, root) = test_db(); TrieBackend::new(mdb, root) } @@ -230,8 +230,8 @@ pub mod tests { #[test] fn pairs_are_empty_on_empty_storage() { - assert!(TrieBackend::, Blake2Hasher>::new( - MemoryDB::default(), + assert!(TrieBackend::, Blake2Hasher>::new( + PrefixedMemoryDB::default(), Default::default(), ).pairs().is_empty()); } diff --git a/core/state-machine/src/trie_backend_essence.rs b/core/state-machine/src/trie_backend_essence.rs index 16b25dce75175..8101126c39d78 100644 --- a/core/state-machine/src/trie_backend_essence.rs +++ b/core/state-machine/src/trie_backend_essence.rs @@ -22,8 +22,9 @@ use std::sync::Arc; use log::{debug, warn}; use hash_db::{self, Hasher}; use heapsize::HeapSizeOf; -use trie::{TrieDB, Trie, MemoryDB, DBValue, TrieError, default_child_trie_root, read_trie_value, read_child_trie_value, for_keys_in_child_trie}; +use trie::{TrieDB, Trie, MemoryDB, PrefixedMemoryDB, DBValue, TrieError, default_child_trie_root, read_trie_value, read_child_trie_value, for_keys_in_child_trie}; use crate::changes_trie::Storage as ChangesTrieStorage; +use crate::backend::Consolidate; /// Patricia trie-based storage trait. pub trait Storage: Send + Sync { @@ -63,7 +64,7 @@ impl, H: Hasher> TrieBackendEssence where H::Out: /// Get the value of storage at given key. pub fn storage(&self, key: &[u8]) -> Result>, String> { - let mut read_overlay = MemoryDB::default(); + let mut read_overlay = S::Overlay::default(); let eph = Ephemeral { storage: &self.storage, overlay: &mut read_overlay, @@ -78,7 +79,7 @@ impl, H: Hasher> TrieBackendEssence where H::Out: pub fn child_storage(&self, storage_key: &[u8], key: &[u8]) -> Result>, String> { let root = self.storage(storage_key)?.unwrap_or(default_child_trie_root::(storage_key)); - let mut read_overlay = MemoryDB::default(); + let mut read_overlay = S::Overlay::default(); let eph = Ephemeral { storage: &self.storage, overlay: &mut read_overlay, @@ -99,7 +100,7 @@ impl, H: Hasher> TrieBackendEssence where H::Out: } }; - let mut read_overlay = MemoryDB::default(); + let mut read_overlay = S::Overlay::default(); let eph = Ephemeral { storage: &self.storage, overlay: &mut read_overlay, @@ -112,7 +113,7 @@ impl, H: Hasher> TrieBackendEssence where H::Out: /// Execute given closure for all keys starting with prefix. pub fn for_keys_with_prefix(&self, prefix: &[u8], mut f: F) { - let mut read_overlay = MemoryDB::default(); + let mut read_overlay = S::Overlay::default(); let eph = Ephemeral { storage: &self.storage, overlay: &mut read_overlay, @@ -145,7 +146,7 @@ impl, H: Hasher> TrieBackendEssence where H::Out: pub(crate) struct Ephemeral<'a, S: 'a + TrieBackendStorage, H: 'a + Hasher> { storage: &'a S, - overlay: &'a mut MemoryDB, + overlay: &'a mut S::Overlay, } impl<'a, @@ -171,7 +172,7 @@ impl<'a, } impl<'a, S: TrieBackendStorage, H: Hasher> Ephemeral<'a, S, H> { - pub fn new(storage: &'a S, overlay: &'a mut MemoryDB) -> Self { + pub fn new(storage: &'a S, overlay: &'a mut S::Overlay) -> Self { Ephemeral { storage, overlay, @@ -187,7 +188,7 @@ impl<'a, where H::Out: HeapSizeOf { fn get(&self, key: &H::Out) -> Option { - if let Some(val) = hash_db::PlainDB::get(self.overlay, key) { + if let Some(val) = hash_db::HashDB::get(self.overlay, key, &[]) { Some(val) } else { match self.storage.get(&key, &[]) { @@ -201,15 +202,15 @@ impl<'a, } fn contains(&self, key: &H::Out) -> bool { - hash_db::PlainDB::get(self, key).is_some() + hash_db::HashDB::get(self, key, &[]).is_some() } fn emplace(&mut self, key: H::Out, value: DBValue) { - hash_db::PlainDB::emplace(self.overlay, key, value) + hash_db::HashDB::emplace(self.overlay, key, &[], value) } fn remove(&mut self, key: &H::Out) { - hash_db::PlainDB::remove(self.overlay, key) + hash_db::HashDB::remove(self.overlay, key, &[]) } } @@ -275,19 +276,33 @@ impl<'a, /// Key-value pairs storage that is used by trie backend essence. pub trait TrieBackendStorage: Send + Sync { + /// Type of in-memory overlay. + type Overlay: hash_db::HashDB + Default + Consolidate; /// Get the value stored at key. fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String>; } // This implementation is used by normal storage trie clients. impl TrieBackendStorage for Arc> { + type Overlay = PrefixedMemoryDB; + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { Storage::::get(self.deref(), key, prefix) } } // This implementation is used by test storage trie clients. +impl TrieBackendStorage for PrefixedMemoryDB { + type Overlay = PrefixedMemoryDB; + + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + Ok(hash_db::HashDB::get(self, key, prefix)) + } +} + impl TrieBackendStorage for MemoryDB { + type Overlay = MemoryDB; + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { Ok(hash_db::HashDB::get(self, key, prefix)) } @@ -295,6 +310,8 @@ impl TrieBackendStorage for MemoryDB { // This implementation is used by changes trie clients. impl<'a, S, H: Hasher> TrieBackendStorage for &'a S where S: ChangesTrieStorage { + type Overlay = MemoryDB; + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { ChangesTrieStorage::::get(*self, key, prefix) } diff --git a/core/trie/Cargo.toml b/core/trie/Cargo.toml index 3b3a608ca770d..a75aac23431e9 100644 --- a/core/trie/Cargo.toml +++ b/core/trie/Cargo.toml @@ -20,9 +20,9 @@ memory-db = { version = "0.12", optional = true } [dev-dependencies] substrate-primitives = { path = "../primitives" } -trie-bench = { version = "0.11" } -trie-standardmap = { version = "0.11" } -keccak-hasher = { version = "0.11" } +trie-bench = { version = "0.12" } +trie-standardmap = { version = "0.12" } +keccak-hasher = { version = "0.12" } criterion = "0.2" hex-literal = "0.1.0" diff --git a/core/trie/src/lib.rs b/core/trie/src/lib.rs index 80d2066b4958f..999f1e67c9f86 100644 --- a/core/trie/src/lib.rs +++ b/core/trie/src/lib.rs @@ -33,7 +33,7 @@ pub use node_codec::NodeCodec; /// Various re-exports from the `trie-db` crate. pub use trie_db::{Trie, TrieMut, DBValue, Recorder, Query}; /// Various re-exports from the `memory-db` crate. -pub use memory_db::prefixed_key; +pub use memory_db::{KeyFunction, prefixed_key}; /// As in `trie_db`, but less generic, error type for the crate. pub type TrieError = trie_db::TrieError; @@ -44,8 +44,12 @@ impl> AsHashDB for T {} pub type HashDB<'a, H> = hash_db::HashDB + 'a; /// As in `hash_db`, but less generic, trait exposed. pub type PlainDB<'a, K> = hash_db::PlainDB + 'a; +/// As in `memory_db::MemoryDB` that uses prefixed storage key scheme. +pub type PrefixedMemoryDB = memory_db::MemoryDB, trie_db::DBValue>; +/// As in `memory_db::MemoryDB` that uses prefixed storage key scheme. +pub type MemoryDB = memory_db::MemoryDB, trie_db::DBValue>; /// As in `memory_db`, but less generic, trait exposed. -pub type MemoryDB = memory_db::MemoryDB, trie_db::DBValue>; +pub type GenericMemoryDB = memory_db::MemoryDB; /// Persistent trie database read-access interface for the a given hasher. pub type TrieDB<'a, H> = trie_db::TrieDB<'a, H, NodeCodec>; diff --git a/node-template/runtime/wasm/Cargo.lock b/node-template/runtime/wasm/Cargo.lock index 34fc8036ed992..ee04b1ee9f40d 100644 --- a/node-template/runtime/wasm/Cargo.lock +++ b/node-template/runtime/wasm/Cargo.lock @@ -611,7 +611,7 @@ dependencies = [ [[package]] name = "hash-db" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1153,10 +1153,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memory-db" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2053,7 +2053,7 @@ name = "sr-io" version = "0.1.0" dependencies = [ "environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2420,7 +2420,7 @@ dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", @@ -2534,7 +2534,7 @@ dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2569,7 +2569,7 @@ dependencies = [ name = "substrate-state-machine" version = "0.1.0" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2578,8 +2578,8 @@ dependencies = [ "substrate-panic-handler 0.1.0", "substrate-primitives 0.1.0", "substrate-trie 0.4.0", - "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2603,11 +2603,11 @@ dependencies = [ name = "substrate-trie" version = "0.4.0" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2887,21 +2887,21 @@ dependencies = [ [[package]] name = "trie-db" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trie-root" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3182,7 +3182,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" "checksum generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fceb69994e330afed50c93524be68c42fa898c2d9fd4ee8da03bd7363acd26f2" -"checksum hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b03501f6e1a2a97f1618879aba3156f14ca2847faa530c4e28859638bd11483" +"checksum hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07463834729d0ce8d475e7dd6d302e407093ad9a9c02d77eb07fb74b5373829d" "checksum hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5c13dbac3cc50684760f54af18545c9e80fb75e93a3e586d71ebdc13138f6a4" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" @@ -3229,7 +3229,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" -"checksum memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94da53143d45f6bad3753f532e56ad57a6a26c0ca6881794583310c7cb4c885f" +"checksum memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3dd87d4d64f7b86d8804bbb419f8ecb187cb8f40a50e91c72848075c604ba88d" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "83c2dda19c01176e8e7148f7bdb88bbdf215a8db0641f89fc40e4b81736aeda5" "checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" @@ -3359,8 +3359,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" "checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" -"checksum trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7319e28ca295f27359d944a682f7f65b419158bf1590c92cadc0000258d788" -"checksum trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3c6fef2705af3258ec46a7e22286090394a44216201a1cf7d04b78db825e543" +"checksum trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f23230c31251bdbdba89cd9caa0cbe2aa9e4aa5f92a80e6eb6296bb290e9146" +"checksum trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e45632ecaf2b8b4a40b5208383cd659b4e66f58ccd40086467a4614b45781430" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" "checksum twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "555cd4909480122bbbf21e34faac4cb08a171f324775670447ed116726c474af" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" From 7831e18d366e923bd61da768eec56694e26936bb Mon Sep 17 00:00:00 2001 From: arkpar Date: Thu, 28 Mar 2019 17:20:18 +0100 Subject: [PATCH 7/8] Bumped runtime version --- core/executor/wasm/Cargo.lock | 14 ++--- core/test-runtime/wasm/Cargo.lock | 48 +++++++++--------- .../substrate_test_runtime.compact.wasm | Bin 59673 -> 59699 bytes node-template/runtime/wasm/Cargo.lock | 14 ++--- node/runtime/src/lib.rs | 4 +- node/runtime/wasm/Cargo.lock | 48 +++++++++--------- .../release/node_runtime.compact.wasm | Bin 929214 -> 929870 bytes 7 files changed, 64 insertions(+), 64 deletions(-) diff --git a/core/executor/wasm/Cargo.lock b/core/executor/wasm/Cargo.lock index 8fa99afc3bf46..d7ff3a8d2350a 100644 --- a/core/executor/wasm/Cargo.lock +++ b/core/executor/wasm/Cargo.lock @@ -28,12 +28,12 @@ dependencies = [ [[package]] name = "hash-db" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -150,7 +150,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "sr-io" version = "0.1.0" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 0.1.0", @@ -184,8 +184,8 @@ name = "substrate-primitives" version = "0.1.0" dependencies = [ "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -230,8 +230,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "90492c5858dd7d2e78691cfb89f90d273a2800fc11d98f60786e5d87e2f83781" "checksum crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c240f247c278fa08a6d4820a6a222bfc6e0d999e51ba67be94f44c905b2161f2" "checksum fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a557e80084b05c32b455963ff565a9de6f2866da023d6671705c6aff6f65e01c" -"checksum hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b03501f6e1a2a97f1618879aba3156f14ca2847faa530c4e28859638bd11483" -"checksum hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5c13dbac3cc50684760f54af18545c9e80fb75e93a3e586d71ebdc13138f6a4" +"checksum hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07463834729d0ce8d475e7dd6d302e407093ad9a9c02d77eb07fb74b5373829d" +"checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" "checksum impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2050d823639fbeae26b2b5ba09aca8907793117324858070ade0673c49f793b" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" "checksum parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "21c9c3a1623c71ed83964ff28cac6126e178920f7646d32c337eacb9152b2907" diff --git a/core/test-runtime/wasm/Cargo.lock b/core/test-runtime/wasm/Cargo.lock index d8eda0e88eba0..771ffe97e3deb 100644 --- a/core/test-runtime/wasm/Cargo.lock +++ b/core/test-runtime/wasm/Cargo.lock @@ -611,12 +611,12 @@ dependencies = [ [[package]] name = "hash-db" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1153,10 +1153,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memory-db" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2019,7 +2019,7 @@ name = "sr-io" version = "0.1.0" dependencies = [ "environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2255,7 +2255,7 @@ dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", @@ -2369,8 +2369,8 @@ dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2404,7 +2404,7 @@ dependencies = [ name = "substrate-state-machine" version = "0.1.0" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2413,8 +2413,8 @@ dependencies = [ "substrate-panic-handler 0.1.0", "substrate-primitives 0.1.0", "substrate-trie 0.4.0", - "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2469,11 +2469,11 @@ dependencies = [ name = "substrate-trie" version = "0.4.0" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2753,21 +2753,21 @@ dependencies = [ [[package]] name = "trie-db" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trie-root" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3048,8 +3048,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" "checksum generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fceb69994e330afed50c93524be68c42fa898c2d9fd4ee8da03bd7363acd26f2" -"checksum hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b03501f6e1a2a97f1618879aba3156f14ca2847faa530c4e28859638bd11483" -"checksum hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5c13dbac3cc50684760f54af18545c9e80fb75e93a3e586d71ebdc13138f6a4" +"checksum hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07463834729d0ce8d475e7dd6d302e407093ad9a9c02d77eb07fb74b5373829d" +"checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" @@ -3095,7 +3095,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" -"checksum memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94da53143d45f6bad3753f532e56ad57a6a26c0ca6881794583310c7cb4c885f" +"checksum memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3dd87d4d64f7b86d8804bbb419f8ecb187cb8f40a50e91c72848075c604ba88d" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "83c2dda19c01176e8e7148f7bdb88bbdf215a8db0641f89fc40e4b81736aeda5" "checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" @@ -3225,8 +3225,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" "checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" -"checksum trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7319e28ca295f27359d944a682f7f65b419158bf1590c92cadc0000258d788" -"checksum trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3c6fef2705af3258ec46a7e22286090394a44216201a1cf7d04b78db825e543" +"checksum trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f23230c31251bdbdba89cd9caa0cbe2aa9e4aa5f92a80e6eb6296bb290e9146" +"checksum trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e45632ecaf2b8b4a40b5208383cd659b4e66f58ccd40086467a4614b45781430" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" "checksum twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "555cd4909480122bbbf21e34faac4cb08a171f324775670447ed116726c474af" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" diff --git a/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index a7de97ffb9e649e474fabdee7525fa30f3df5715..05aaae7f3de9552ec1003cdbde7c42ab8c0249a1 100644 GIT binary patch delta 8555 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 delta 8425 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 diff --git a/node-template/runtime/wasm/Cargo.lock b/node-template/runtime/wasm/Cargo.lock index ee04b1ee9f40d..6db886a520434 100644 --- a/node-template/runtime/wasm/Cargo.lock +++ b/node-template/runtime/wasm/Cargo.lock @@ -616,7 +616,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2535,7 +2535,7 @@ dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2578,7 +2578,7 @@ dependencies = [ "substrate-panic-handler 0.1.0", "substrate-primitives 0.1.0", "substrate-trie 0.4.0", - "trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2606,7 +2606,7 @@ dependencies = [ "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2887,7 +2887,7 @@ dependencies = [ [[package]] name = "trie-db" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3183,7 +3183,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" "checksum generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fceb69994e330afed50c93524be68c42fa898c2d9fd4ee8da03bd7363acd26f2" "checksum hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07463834729d0ce8d475e7dd6d302e407093ad9a9c02d77eb07fb74b5373829d" -"checksum hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5c13dbac3cc50684760f54af18545c9e80fb75e93a3e586d71ebdc13138f6a4" +"checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" @@ -3359,7 +3359,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" "checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" -"checksum trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f23230c31251bdbdba89cd9caa0cbe2aa9e4aa5f92a80e6eb6296bb290e9146" +"checksum trie-db 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "843af112ba3a8c919cd961edf3cac9272353f5e277ad8678c7023fa70e5c0e2d" "checksum trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e45632ecaf2b8b4a40b5208383cd659b4e66f58ccd40086467a4614b45781430" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" "checksum twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "555cd4909480122bbbf21e34faac4cb08a171f324775670447ed116726c474af" diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index b6d47385728cb..a97f8d2dd44fe 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -58,8 +58,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("node"), impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, - spec_version: 46, - impl_version: 46, + spec_version: 47, + impl_version: 47, apis: RUNTIME_API_VERSIONS, }; diff --git a/node/runtime/wasm/Cargo.lock b/node/runtime/wasm/Cargo.lock index 4bc3dcf6da941..74f37ced853d8 100644 --- a/node/runtime/wasm/Cargo.lock +++ b/node/runtime/wasm/Cargo.lock @@ -611,12 +611,12 @@ dependencies = [ [[package]] name = "hash-db" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1153,10 +1153,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memory-db" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2087,7 +2087,7 @@ name = "sr-io" version = "0.1.0" dependencies = [ "environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2565,7 +2565,7 @@ dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", @@ -2690,8 +2690,8 @@ dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2725,7 +2725,7 @@ dependencies = [ name = "substrate-state-machine" version = "0.1.0" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2734,8 +2734,8 @@ dependencies = [ "substrate-panic-handler 0.1.0", "substrate-primitives 0.1.0", "substrate-trie 0.4.0", - "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2759,11 +2759,11 @@ dependencies = [ name = "substrate-trie" version = "0.4.0" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3043,21 +3043,21 @@ dependencies = [ [[package]] name = "trie-db" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trie-root" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3338,8 +3338,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" "checksum generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fceb69994e330afed50c93524be68c42fa898c2d9fd4ee8da03bd7363acd26f2" -"checksum hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b03501f6e1a2a97f1618879aba3156f14ca2847faa530c4e28859638bd11483" -"checksum hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5c13dbac3cc50684760f54af18545c9e80fb75e93a3e586d71ebdc13138f6a4" +"checksum hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07463834729d0ce8d475e7dd6d302e407093ad9a9c02d77eb07fb74b5373829d" +"checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" @@ -3385,7 +3385,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" -"checksum memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94da53143d45f6bad3753f532e56ad57a6a26c0ca6881794583310c7cb4c885f" +"checksum memory-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3dd87d4d64f7b86d8804bbb419f8ecb187cb8f40a50e91c72848075c604ba88d" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "83c2dda19c01176e8e7148f7bdb88bbdf215a8db0641f89fc40e4b81736aeda5" "checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" @@ -3516,8 +3516,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" "checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" -"checksum trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7319e28ca295f27359d944a682f7f65b419158bf1590c92cadc0000258d788" -"checksum trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3c6fef2705af3258ec46a7e22286090394a44216201a1cf7d04b78db825e543" +"checksum trie-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f23230c31251bdbdba89cd9caa0cbe2aa9e4aa5f92a80e6eb6296bb290e9146" +"checksum trie-root 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e45632ecaf2b8b4a40b5208383cd659b4e66f58ccd40086467a4614b45781430" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" "checksum twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "555cd4909480122bbbf21e34faac4cb08a171f324775670447ed116726c474af" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" diff --git a/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm b/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm index 4ff22ed0e8b90eaee3dd8496bc6f33c763cad3b3..27db195d19fb5dd9cea13165406b949273f192fd 100644 GIT binary patch delta 74953 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 delta 74847 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 Date: Thu, 28 Mar 2019 17:29:24 +0100 Subject: [PATCH 8/8] Bumped runtime version again --- node/runtime/src/lib.rs | 4 ++-- .../release/node_runtime.compact.wasm | Bin 931526 -> 931526 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 1631803002e41..ad2f2696ca459 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -58,8 +58,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("node"), impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, - spec_version: 47, - impl_version: 47, + spec_version: 48, + impl_version: 48, apis: RUNTIME_API_VERSIONS, }; diff --git a/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm b/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm index 4501196cbc475f69727563e9a60899891b673c1a..9fda4b0ebeab01aac30bd857e2487990cc042a20 100644 GIT binary patch delta 58 zcmX^1*5cS(i-s1)7N!>F7M2#)7Pc1l7LF~Pcgq+Jrr#^$oW*F+URllw#9Tnk4a7X# KE6aI(_X7Z=!4_cv delta 58 zcmX^1*5cS(i-s1)7N!>F7M2#)7Pc1l7LF~Pcgq;{r{62%oW-c$URllw#9Tnk4a7X# KE6aI(_X7Z=j22%2