diff --git a/Cargo.lock b/Cargo.lock index 4b70d4118b84d..18d30e8ce4640 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. [[package]] name = "MacTypes-sys" version = "1.3.0" diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index 64b6b63d9bde5..b8452c790ea9f 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -608,7 +608,8 @@ impl Backend { }; trace!(target: "db", "Canonicalize block #{} ({:?})", new_canonical, hash); - let commit = self.storage.state_db.canonicalize_block(&hash); + let commit = self.storage.state_db.canonicalize_block(&hash) + .map_err(|e: state_db::Error| client::error::Error::from(format!("State database error: {:?}", e)))?; apply_state_commit(transaction, commit); }; @@ -641,7 +642,8 @@ impl Backend { let lookup_key = ::utils::number_and_hash_to_lookup_key(f_num, f_hash.clone()); transaction.put(columns::META, meta_keys::FINALIZED_BLOCK, &lookup_key); - let commit = self.storage.state_db.canonicalize_block(&f_hash); + let commit = self.storage.state_db.canonicalize_block(&f_hash) + .map_err(|e: state_db::Error| client::error::Error::from(format!("State database error: {:?}", e)))?; apply_state_commit(transaction, commit); // read config from genesis, since it is readonly atm @@ -654,67 +656,11 @@ impl Backend { Ok(()) } -} - -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); - } - for key in commit.data.deleted.into_iter() { - transaction.delete(columns::STATE, &key[..]); - } - for (key, val) in commit.meta.inserted.into_iter() { - transaction.put(columns::STATE_META, &key[..], &val); - } - for key in commit.meta.deleted.into_iter() { - transaction.delete(columns::STATE_META, &key[..]); - } -} - -impl client::backend::AuxStore for Backend where Block: BlockT { - fn insert_aux< - 'a, - 'b: 'a, - 'c: 'a, - I: IntoIterator, - D: IntoIterator, - >(&self, insert: I, delete: D) -> client::error::Result<()> { - let mut transaction = DBTransaction::new(); - for (k, v) in insert { - transaction.put(columns::AUX, k, v); - } - for k in delete { - transaction.delete(columns::AUX, k); - } - self.storage.db.write(transaction).map_err(db_err)?; - Ok(()) - } - - fn get_aux(&self, key: &[u8]) -> Result>, client::error::Error> { - Ok(self.storage.db.get(columns::AUX, key).map(|r| r.map(|v| v.to_vec())).map_err(db_err)?) - } -} - -impl client::backend::Backend for Backend where Block: BlockT { - type BlockImportOperation = BlockImportOperation; - type Blockchain = BlockchainDb; - type State = CachingState; - type ChangesTrieStorage = DbChangesTrieStorage; - fn begin_operation(&self, block: BlockId) -> Result { - let state = self.state_at(block)?; - Ok(BlockImportOperation { - pending_block: None, - old_state: state, - db_updates: MemoryDB::default(), - storage_updates: Default::default(), - changes_trie_updates: MemoryDB::default(), - aux_ops: Vec::new(), - }) - } - - fn commit_operation(&self, mut operation: Self::BlockImportOperation) + fn try_commit_operation(&self, mut operation: BlockImportOperation) -> Result<(), client::error::Error> + where + Block: BlockT, { let mut transaction = DBTransaction::new(); operation.apply_aux(&mut transaction); @@ -747,7 +693,7 @@ impl client::backend::Backend for Backend whe retracted.push(r.hash.clone()); if r.hash == meta.finalized_hash { warn!("Potential safety failure: reverting finalized block {:?}", - (&r.number, &r.hash)); + (&r.number, &r.hash)); return Err(::client::error::ErrorKind::NotInFinalizedChain.into()); } @@ -812,22 +758,27 @@ impl client::backend::Backend for Backend whe let commit = self.storage.state_db.insert_block(&hash, number_u64, &pending_block.header.parent_hash(), changeset) .map_err(|e: state_db::Error| client::error::Error::from(format!("State database error: {:?}", e)))?; apply_state_commit(&mut transaction, commit); - self.changes_tries_storage.commit(&mut transaction, operation.changes_trie_updates); let finalized = match pending_block.leaf_state { NewBlockState::Final => true, _ => false, }; + let header = &pending_block.header; + let is_best = pending_block.leaf_state.is_best(); + let changes_trie_updates = operation.changes_trie_updates; + + + self.changes_tries_storage.commit(&mut transaction, changes_trie_updates); + if finalized { // TODO: ensure best chain contains this block. self.note_finalized(&mut transaction, &pending_block.header, hash)?; } else { // canonicalize blocks which are old enough, regardless of finality. - self.force_delayed_canonicalize(&mut transaction, hash, *pending_block.header.number())? + self.force_delayed_canonicalize(&mut transaction, hash, *header.number())? } - let is_best = pending_block.leaf_state.is_best(); debug!(target: "db", "DB Commit {:?} ({}), best = {}", hash, number, is_best); { @@ -849,7 +800,7 @@ impl client::backend::Backend for Backend whe self.blockchain.update_meta( hash.clone(), number.clone(), - pending_block.leaf_state.is_best(), + is_best, finalized, ); @@ -865,31 +816,114 @@ impl client::backend::Backend for Backend whe } Ok(()) } +} + +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); + } + for key in commit.data.deleted.into_iter() { + transaction.delete(columns::STATE, &key[..]); + } + for (key, val) in commit.meta.inserted.into_iter() { + transaction.put(columns::STATE_META, &key[..], &val); + } + for key in commit.meta.deleted.into_iter() { + transaction.delete(columns::STATE_META, &key[..]); + } +} + +impl client::backend::AuxStore for Backend where Block: BlockT { + fn insert_aux< + 'a, + 'b: 'a, + 'c: 'a, + I: IntoIterator, + D: IntoIterator, + >(&self, insert: I, delete: D) -> client::error::Result<()> { + let mut transaction = DBTransaction::new(); + for (k, v) in insert { + transaction.put(columns::AUX, k, v); + } + for k in delete { + transaction.delete(columns::AUX, k); + } + self.storage.db.write(transaction).map_err(db_err)?; + Ok(()) + } + + fn get_aux(&self, key: &[u8]) -> Result>, client::error::Error> { + Ok(self.storage.db.get(columns::AUX, key).map(|r| r.map(|v| v.to_vec())).map_err(db_err)?) + } +} + +impl client::backend::Backend for Backend where Block: BlockT { + type BlockImportOperation = BlockImportOperation; + type Blockchain = BlockchainDb; + type State = CachingState; + type ChangesTrieStorage = DbChangesTrieStorage; + + fn begin_operation(&self, block: BlockId) -> Result { + let state = self.state_at(block)?; + Ok(BlockImportOperation { + pending_block: None, + old_state: state, + db_updates: MemoryDB::default(), + storage_updates: Default::default(), + changes_trie_updates: MemoryDB::default(), + aux_ops: Vec::new(), + }) + } + + fn commit_operation(&self, operation: Self::BlockImportOperation) + -> Result<(), client::error::Error> + { + match self.try_commit_operation(operation) { + Ok(_) => { + self.storage.state_db.apply_pending(); + Ok(()) + }, + e @ Err(_) => { + self.storage.state_db.revert_pending(); + e + } + } + } fn finalize_block(&self, block: BlockId, justification: Option) -> Result<(), client::error::Error> { use runtime_primitives::traits::Header; - if let Some(header) = ::client::blockchain::HeaderBackend::header(&self.blockchain, block)? { - let mut transaction = DBTransaction::new(); - // TODO: ensure best chain contains this block. - let hash = header.hash(); - self.note_finalized(&mut transaction, &header, hash.clone())?; - if let Some(justification) = justification { - let number = header.number().clone(); - transaction.put( - columns::JUSTIFICATION, - &::utils::number_and_hash_to_lookup_key(number, hash.clone()), - &justification.encode(), - ); + let commit = || { + if let Some(header) = ::client::blockchain::HeaderBackend::header(&self.blockchain, block)? { + let mut transaction = DBTransaction::new(); + // TODO: ensure best chain contains this block. + let hash = header.hash(); + self.note_finalized(&mut transaction, &header, hash.clone())?; + if let Some(justification) = justification { + let number = header.number().clone(); + transaction.put( + columns::JUSTIFICATION, + &::utils::number_and_hash_to_lookup_key(number, hash.clone()), + &justification.encode(), + ); + } + self.storage.db.write(transaction).map_err(db_err)?; + self.blockchain.update_meta(hash, header.number().clone(), false, true); + Ok(()) + } else { + Err(client::error::ErrorKind::UnknownBlock(format!("Cannot finalize block {:?}", block)).into()) + } + }; + match commit() { + Ok(()) => self.storage.state_db.apply_pending(), + e @ Err(_) => { + self.storage.state_db.revert_pending(); + return e; } - self.storage.db.write(transaction).map_err(db_err)?; - self.blockchain.update_meta(hash, header.number().clone(), false, true); - Ok(()) - } else { - Err(client::error::ErrorKind::UnknownBlock(format!("Cannot finalize block {:?}", block)).into()) } + Ok(()) } fn changes_trie_storage(&self) -> Option<&Self::ChangesTrieStorage> { diff --git a/core/executor/wasm/Cargo.lock b/core/executor/wasm/Cargo.lock index 933a8fc20ec09..6047767b11ac8 100644 --- a/core/executor/wasm/Cargo.lock +++ b/core/executor/wasm/Cargo.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. [[package]] name = "arrayvec" version = "0.4.7" @@ -11,11 +13,6 @@ name = "byteorder" version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "crunchy" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "crunchy" version = "0.2.1" @@ -32,14 +29,14 @@ dependencies = [ [[package]] name = "hash-db" version = "0.9.0" -source = "git+https://github.com/paritytech/trie#e61df32342920f602a9d8d71caa5117c779d3ff1" +source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.9.0" -source = "git+https://github.com/paritytech/trie#e61df32342920f602a9d8d71caa5117c779d3ff1" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -144,7 +141,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "sr-io" version = "0.1.0" dependencies = [ - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.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", @@ -178,8 +175,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.9.0 (git+https://github.com/paritytech/trie)", - "hash256-std-hasher 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -216,11 +213,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" "checksum byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "90492c5858dd7d2e78691cfb89f90d273a2800fc11d98f60786e5d87e2f83781" -"checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" "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.9.0 (git+https://github.com/paritytech/trie)" = "" -"checksum hash256-std-hasher 0.9.0 (git+https://github.com/paritytech/trie)" = "" +"checksum hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc5ec43724866bbc8337e09cab4d4b5f9fdbbe589f04bdc8bfda906a639ad338" +"checksum hash256-std-hasher 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5fc2d94c8e127b205b3caf6fd3013fb5e5b314234bb0b9bea6588c52fddbb82b" "checksum impl-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9c88568d828291c50eed30cd7fb9f8e688ad0013620186fa3e777b9f206c79f2" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" "checksum parity-codec 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e7b6a1290fe78aa6bbb5f3338ecede3062687a98b9e40cd1dbcaa47261d44097" diff --git a/core/executor/wasm/build.sh b/core/executor/wasm/build.sh index ecd7b67540873..256089ab076ec 100755 --- a/core/executor/wasm/build.sh +++ b/core/executor/wasm/build.sh @@ -6,7 +6,7 @@ if cargo --version | grep -q "nightly"; then else CARGO_CMD="cargo +nightly" fi -$CARGO_CMD build --target=wasm32-unknown-unknown --release +RUSTFLAGS="-C link-arg=--export-table" $CARGO_CMD build --target=wasm32-unknown-unknown --release for i in test do wasm-gc target/wasm32-unknown-unknown/release/runtime_$i.wasm target/wasm32-unknown-unknown/release/runtime_$i.compact.wasm diff --git a/core/state-db/src/lib.rs b/core/state-db/src/lib.rs index 51fffa1f2dce4..3a92f4eafaa5d 100644 --- a/core/state-db/src/lib.rs +++ b/core/state-db/src/lib.rs @@ -78,8 +78,12 @@ pub enum Error { Db(E), /// `Codec` decoding error. Decoding, - /// NonCanonical error. - NonCanonical, + /// Trying to canonicalize invalid block. + InvalidBlock, + /// Trying to insert block with invalid number. + InvalidBlockNumber, + /// Trying to insert block with unknown parent. + InvalidParent, } impl fmt::Debug for Error { @@ -87,7 +91,9 @@ impl fmt::Debug for Error { match self { Error::Db(e) => e.fmt(f), Error::Decoding => write!(f, "Error decoding slicable value"), - Error::NonCanonical => write!(f, "Error processing non-canonical data"), + Error::InvalidBlock => write!(f, "Trying to canonicalize invalid block"), + Error::InvalidBlockNumber => write!(f, "Trying to insert block with invalid number"), + Error::InvalidParent => write!(f, "Trying to insert block with unknown parent"), } } } @@ -211,27 +217,25 @@ impl StateDbSync { } } - pub fn canonicalize_block(&mut self, hash: &BlockHash) -> CommitSet { - // clear the temporary overlay from the previous canonicalization. - self.non_canonical.clear_overlay(); + pub fn canonicalize_block(&mut self, hash: &BlockHash) -> Result, Error> { let mut commit = match self.mode { PruningMode::ArchiveAll => { CommitSet::default() }, PruningMode::ArchiveCanonical => { - let mut commit = self.non_canonical.canonicalize(hash); + let mut commit = self.non_canonical.canonicalize(hash)?; commit.data.deleted.clear(); commit }, PruningMode::Constrained(_) => { - self.non_canonical.canonicalize(hash) + self.non_canonical.canonicalize(hash)? }, }; if let Some(ref mut pruning) = self.pruning { pruning.note_canonical(hash, &mut commit); } self.prune(&mut commit); - commit + Ok(commit) } pub fn best_canonical(&self) -> u64 { @@ -290,6 +294,20 @@ impl StateDbSync { } db.get(key).map_err(|e| Error::Db(e)) } + + pub fn apply_pending(&mut self) { + self.non_canonical.apply_pending(); + if let Some(pruning) = &mut self.pruning { + pruning.apply_pending(); + } + } + + pub fn revert_pending(&mut self) { + if let Some(pruning) = &mut self.pruning { + pruning.revert_pending(); + } + self.non_canonical.revert_pending(); + } } /// State DB maintenance. See module description. @@ -312,7 +330,7 @@ impl StateDb { } /// Finalize a previously inserted block. - pub fn canonicalize_block(&self, hash: &BlockHash) -> CommitSet { + pub fn canonicalize_block(&self, hash: &BlockHash) -> Result, Error> { self.db.write().canonicalize_block(hash) } @@ -347,6 +365,16 @@ impl StateDb { pub fn is_pruned(&self, number: u64) -> bool { return self.db.read().is_pruned(number) } + + /// Apply all pending changes + pub fn apply_pending(&self) { + self.db.write().apply_pending(); + } + + /// Revert all pending changes + pub fn revert_pending(&self) { + self.db.write().revert_pending(); + } } #[cfg(test)] @@ -400,7 +428,9 @@ mod tests { ) .unwrap(), ); - db.commit(&state_db.canonicalize_block(&H256::from_low_u64_be(1))); + state_db.apply_pending(); + db.commit(&state_db.canonicalize_block::(&H256::from_low_u64_be(1)).unwrap()); + state_db.apply_pending(); db.commit( &state_db .insert_block::( @@ -411,8 +441,11 @@ mod tests { ) .unwrap(), ); - db.commit(&state_db.canonicalize_block(&H256::from_low_u64_be(21))); - db.commit(&state_db.canonicalize_block(&H256::from_low_u64_be(3))); + state_db.apply_pending(); + db.commit(&state_db.canonicalize_block::(&H256::from_low_u64_be(21)).unwrap()); + state_db.apply_pending(); + db.commit(&state_db.canonicalize_block::(&H256::from_low_u64_be(3)).unwrap()); + state_db.apply_pending(); (db, state_db) } diff --git a/core/state-db/src/noncanonical.rs b/core/state-db/src/noncanonical.rs index b1d34c09ad3ab..e1859604f027e 100644 --- a/core/state-db/src/noncanonical.rs +++ b/core/state-db/src/noncanonical.rs @@ -17,8 +17,8 @@ //! Canonicalization window. //! Maintains trees of block overlays and allows discarding trees/roots //! The overlays are added in `insert` and removed in `canonicalize`. -//! Last canonicalized overlay is kept in memory until next call to `canonicalize` or -//! `clear_overlay` +//! All pending changes are kept in memory until next call to `apply_pending` or +//! `revert_pending` use std::fmt; use std::collections::{HashMap, VecDeque}; @@ -33,7 +33,8 @@ pub struct NonCanonicalOverlay { last_canonicalized: Option<(BlockHash, u64)>, levels: VecDeque>>, parents: HashMap, - last_canonicalized_overlay: HashMap, + pending_canonicalizations: Vec, + pending_insertions: Vec, } #[derive(Encode, Decode)] @@ -107,39 +108,45 @@ impl NonCanonicalOverlay { last_canonicalized, levels, parents, - last_canonicalized_overlay: Default::default(), + pending_canonicalizations: Default::default(), + pending_insertions: Default::default(), }) } /// Insert a new block into the overlay. If inserted on the second level or lover expects parent to be present in the window. pub fn insert(&mut self, hash: &BlockHash, number: u64, parent_hash: &BlockHash, changeset: ChangeSet) -> Result, Error> { let mut commit = CommitSet::default(); + let front_block_number = self.pending_front_block_number(); if self.levels.is_empty() && self.last_canonicalized.is_none() { if number < 1 { - return Err(Error::NonCanonical); + return Err(Error::InvalidBlockNumber); } // assume that parent was canonicalized let last_canonicalized = (parent_hash.clone(), number - 1); commit.meta.inserted.push((to_meta_key(LAST_CANONICAL, &()), last_canonicalized.encode())); self.last_canonicalized = Some(last_canonicalized); } else if self.last_canonicalized.is_some() { - if number < self.front_block_number() || number >= self.front_block_number() + self.levels.len() as u64 + 1 { - return Err(Error::NonCanonical); + if number < front_block_number || number >= front_block_number + self.levels.len() as u64 + 1 { + trace!(target: "state-db", "Failed to insert block {}, current is {} .. {})", + number, + front_block_number, + front_block_number + self.levels.len() as u64, + ); + return Err(Error::InvalidBlockNumber); } // check for valid parent if inserting on second level or higher - if number == self.front_block_number() { + if number == front_block_number { if !self.last_canonicalized.as_ref().map_or(false, |&(ref h, n)| h == parent_hash && n == number - 1) { - return Err(Error::NonCanonical); + return Err(Error::InvalidParent); } } else if !self.parents.contains_key(&parent_hash) { - return Err(Error::NonCanonical); + return Err(Error::InvalidParent); } } - let level = if self.levels.is_empty() || number == self.front_block_number() + self.levels.len() as u64 { + let level = if self.levels.is_empty() || number == front_block_number + self.levels.len() as u64 { self.levels.push_back(Vec::new()); self.levels.back_mut().expect("can't be empty after insertion; qed") } else { - let front_block_number = self.front_block_number(); self.levels.get_mut((number - front_block_number) as usize) .expect("number is [front_block_number .. front_block_number + levels.len()) is asserted in precondition; qed") }; @@ -164,85 +171,118 @@ impl NonCanonicalOverlay { trace!(target: "state-db", "Inserted uncanonicalized changeset {}.{} ({} inserted, {} deleted)", number, index, journal_record.inserted.len(), journal_record.deleted.len()); let journal_record = journal_record.encode(); commit.meta.inserted.push((journal_key, journal_record)); + self.pending_insertions.push(hash.clone()); Ok(commit) } - fn discard( - levels: &mut [Vec>], + fn discard_descendants( + levels: &mut VecDeque>>, + index: usize, parents: &mut HashMap, - discarded_journals: &mut Vec>, - number: u64, hash: &BlockHash, ) { - if let Some((level, sublevels)) = levels.split_first_mut() { + let mut discarded = Vec::new(); + if let Some(level) = levels.get_mut(index) { level.retain(|ref overlay| { let parent = parents.get(&overlay.hash).expect("there is a parent entry for each entry in levels; qed").clone(); if parent == *hash { parents.remove(&overlay.hash); - discarded_journals.push(overlay.journal_key.clone()); - Self::discard(sublevels, parents, discarded_journals, number + 1, &overlay.hash); + discarded.push(overlay.hash.clone()); false } else { true } }); } + for hash in discarded.into_iter() { + Self::discard_descendants(levels, index + 1, parents, &hash); + } + } + + fn discard_journals(&self, level_index: usize, discarded_journals: &mut Vec>, hash: &BlockHash) { + if let Some(level) = self.levels.get(level_index) { + level.iter().for_each(|overlay| { + let parent = self.parents.get(&overlay.hash).expect("there is a parent entry for each entry in levels; qed").clone(); + if parent == *hash { + discarded_journals.push(overlay.journal_key.clone()); + self.discard_journals(level_index + 1, discarded_journals, &overlay.hash); + } + }); + } } fn front_block_number(&self) -> u64 { self.last_canonicalized.as_ref().map(|&(_, n)| n + 1).unwrap_or(0) } - pub fn last_canonicalized_block_number(&self) -> u64 { - self.last_canonicalized.as_ref().map(|&(_, n)| n).unwrap_or(0) + fn pending_front_block_number(&self) -> u64 { + self.last_canonicalized + .as_ref() + .map(|&(_, n)| n + 1 + self.pending_canonicalizations.len() as u64) + .unwrap_or(0) } - /// This may be called when the last finalization commit was applied to the database. - pub fn clear_overlay(&mut self) { - self.last_canonicalized_overlay.clear(); + pub fn last_canonicalized_block_number(&self) -> u64 { + self.last_canonicalized.as_ref().map(|&(_, n)| n).unwrap_or(0) } /// Select a top-level root and canonicalized it. Discards all sibling subtrees and the root. /// Returns a set of changes that need to be added to the DB. - pub fn canonicalize(&mut self, hash: &BlockHash) -> CommitSet { + pub fn canonicalize(&mut self, hash: &BlockHash) -> Result, Error> { trace!(target: "state-db", "Canonicalizing {:?}", hash); - let level = self.levels.pop_front().expect("no blocks to canonicalize"); - let index = level.iter().position(|overlay| overlay.hash == *hash) - .expect("attempting to canonicalize unknown block"); + let level = self.levels.get(self.pending_canonicalizations.len()).ok_or_else(|| Error::InvalidBlock)?; + let index = level + .iter() + .position(|overlay| overlay.hash == *hash) + .ok_or_else(|| Error::InvalidBlock)?; let mut commit = CommitSet::default(); let mut discarded_journals = Vec::new(); for (i, overlay) in level.into_iter().enumerate() { - self.parents.remove(&overlay.hash); if i == index { - self.last_canonicalized_overlay = overlay.values; // that's the one we need to canonicalize - commit.data.inserted = self.last_canonicalized_overlay.iter().map(|(k, v)| (k.clone(), v.clone())).collect(); - commit.data.deleted = overlay.deleted; + commit.data.inserted = overlay.values.iter().map(|(k, v)| (k.clone(), v.clone())).collect(); + commit.data.deleted = overlay.deleted.clone(); } else { - // TODO: borrow checker won't allow us to split out mutable references - // required for recursive processing. A more efficient implementation - // that does not require converting to vector is possible - let mut vec: Vec<_> = self.levels.drain(..).collect(); - Self::discard(&mut vec, &mut self.parents, &mut discarded_journals, 0, &overlay.hash); - self.levels.extend(vec.into_iter()); + self.discard_journals(self.pending_canonicalizations.len() + 1, &mut discarded_journals, &overlay.hash); } - // cleanup journal entry - discarded_journals.push(overlay.journal_key); + discarded_journals.push(overlay.journal_key.clone()); } commit.meta.deleted.append(&mut discarded_journals); - let last_canonicalized = (hash.clone(), self.front_block_number()); - commit.meta.inserted.push((to_meta_key(LAST_CANONICAL, &()), last_canonicalized.encode())); - self.last_canonicalized = Some(last_canonicalized); - trace!(target: "state-db", "Discarded {} records", commit.meta.deleted.len()); - commit + let canonicalized = (hash.clone(), self.front_block_number() + self.pending_canonicalizations.len() as u64); + commit.meta.inserted.push((to_meta_key(LAST_CANONICAL, &()), canonicalized.encode())); + trace!(target: "state-db", "Discarding {} records", commit.meta.deleted.len()); + self.pending_canonicalizations.push(hash.clone()); + Ok(commit) + } + + fn apply_canonicalizations(&mut self) { + let last = self.pending_canonicalizations.last().cloned(); + let count = self.pending_canonicalizations.len() as u64; + for hash in self.pending_canonicalizations.drain(..) { + trace!(target: "state-db", "Post canonicalizing {:?}", hash); + let level = self.levels.pop_front().expect("Hash validity is checked in `canonicalize`"); + let index = level + .iter() + .position(|overlay| overlay.hash == hash) + .expect("Hash validity is checked in `canonicalize`"); + + // discard unfinalized overlays + for (i, overlay) in level.into_iter().enumerate() { + self.parents.remove(&overlay.hash); + if i != index { + Self::discard_descendants(&mut self.levels, 0, &mut self.parents, &overlay.hash); + } + } + } + if let Some(hash) = last { + let last_canonicalized = (hash, self.last_canonicalized_block_number() + count); + self.last_canonicalized = Some(last_canonicalized); + } } /// Get a value from the node overlay. This searches in every existing changeset. pub fn get(&self, key: &Key) -> Option { - if let Some(value) = self.last_canonicalized_overlay.get(&key) { - return Some(value.clone()); - } for level in self.levels.iter() { for overlay in level.iter() { if let Some(value) = overlay.values.get(&key) { @@ -264,12 +304,42 @@ impl NonCanonicalOverlay { commit }) } + + fn revert_insertions(&mut self) { + self.pending_insertions.reverse(); + for hash in self.pending_insertions.drain(..) { + self.parents.remove(&hash); + // find a level. When iterating insertions backwards the hash is always last in the level. + let level_index = + self.levels.iter().position(|level| + level.last().expect("Hash is added in `insert` in reverse order").hash == hash) + .expect("Hash is added in insert"); + + self.levels[level_index].pop(); + if self.levels[level_index].is_empty() { + debug_assert_eq!(level_index, self.levels.len() - 1); + self.levels.pop_back(); + } + } + } + + /// Apply all pending changes + pub fn apply_pending(&mut self) { + self.apply_canonicalizations(); + self.pending_insertions.clear(); + } + + /// Revert all pending changes + pub fn revert_pending(&mut self) { + self.pending_canonicalizations.clear(); + self.revert_insertions(); + } } #[cfg(test)] mod tests { use std::io; - use super::NonCanonicalOverlay; + use super::{NonCanonicalOverlay, to_journal_key}; use {ChangeSet}; use primitives::H256; use test::{make_db, make_changeset}; @@ -292,7 +362,7 @@ mod tests { fn canonicalize_empty_panics() { let db = make_db(&[]); let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); - overlay.canonicalize(&H256::default()); + overlay.canonicalize::(&H256::default()).unwrap(); } #[test] @@ -336,7 +406,7 @@ mod tests { let db = make_db(&[]); let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); overlay.insert::(&h1, 1, &H256::default(), ChangeSet::default()).unwrap(); - overlay.canonicalize(&h2); + overlay.canonicalize::(&h2).unwrap(); } #[test] @@ -351,7 +421,7 @@ mod tests { assert_eq!(insertion.meta.inserted.len(), 2); assert_eq!(insertion.meta.deleted.len(), 0); db.commit(&insertion); - let finalization = overlay.canonicalize(&h1); + let finalization = overlay.canonicalize::(&h1).unwrap(); assert_eq!(finalization.data.inserted.len(), changeset.inserted.len()); assert_eq!(finalization.data.deleted.len(), changeset.deleted.len()); assert_eq!(finalization.meta.inserted.len(), 1); @@ -384,7 +454,8 @@ mod tests { let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); db.commit(&overlay.insert::(&h1, 10, &H256::default(), make_changeset(&[3, 4], &[2])).unwrap()); db.commit(&overlay.insert::(&h2, 11, &h1, make_changeset(&[5], &[3])).unwrap()); - db.commit(&overlay.canonicalize(&h1)); + db.commit(&overlay.canonicalize::(&h1).unwrap()); + overlay.apply_pending(); assert_eq!(overlay.levels.len(), 1); let overlay2 = NonCanonicalOverlay::::new(&db).unwrap(); @@ -408,15 +479,17 @@ mod tests { assert!(contains(&overlay, 5)); assert_eq!(overlay.levels.len(), 2); assert_eq!(overlay.parents.len(), 2); - db.commit(&overlay.canonicalize(&h1)); + db.commit(&overlay.canonicalize::(&h1).unwrap()); + assert!(contains(&overlay, 5)); + assert_eq!(overlay.levels.len(), 2); + assert_eq!(overlay.parents.len(), 2); + overlay.apply_pending(); assert_eq!(overlay.levels.len(), 1); assert_eq!(overlay.parents.len(), 1); - assert!(contains(&overlay, 5)); - overlay.clear_overlay(); assert!(!contains(&overlay, 5)); assert!(contains(&overlay, 7)); - db.commit(&overlay.canonicalize(&h2)); - overlay.clear_overlay(); + db.commit(&overlay.canonicalize::(&h2).unwrap()); + overlay.apply_pending(); assert_eq!(overlay.levels.len(), 0); assert_eq!(overlay.parents.len(), 0); assert!(db.data_eq(&make_db(&[1, 4, 6, 7, 8]))); @@ -425,6 +498,7 @@ mod tests { #[test] fn complex_tree() { + use crate::MetaDb; let mut db = make_db(&[]); // - 1 - 1_1 - 1_1_1 @@ -485,8 +559,8 @@ mod tests { assert_eq!(overlay.last_canonicalized, overlay2.last_canonicalized); // canonicalize 1. 2 and all its children should be discarded - db.commit(&overlay.canonicalize(&h_1)); - overlay.clear_overlay(); + db.commit(&overlay.canonicalize::(&h_1).unwrap()); + overlay.apply_pending(); assert_eq!(overlay.levels.len(), 2); assert_eq!(overlay.parents.len(), 6); assert!(!contains(&overlay, 1)); @@ -495,10 +569,17 @@ mod tests { assert!(!contains(&overlay, 22)); assert!(!contains(&overlay, 211)); assert!(contains(&overlay, 111)); + assert!(!contains(&overlay, 211)); + // check that journals are deleted + assert!(db.get_meta(&to_journal_key(1, 0)).unwrap().is_none()); + assert!(db.get_meta(&to_journal_key(1, 1)).unwrap().is_none()); + assert!(db.get_meta(&to_journal_key(2, 1)).unwrap().is_some()); + assert!(db.get_meta(&to_journal_key(2, 2)).unwrap().is_none()); + assert!(db.get_meta(&to_journal_key(2, 3)).unwrap().is_none()); // canonicalize 1_2. 1_1 and all its children should be discarded - db.commit(&overlay.canonicalize(&h_1_2)); - overlay.clear_overlay(); + db.commit(&overlay.canonicalize::(&h_1_2).unwrap()); + overlay.apply_pending(); assert_eq!(overlay.levels.len(), 1); assert_eq!(overlay.parents.len(), 3); assert!(!contains(&overlay, 11)); @@ -508,8 +589,8 @@ mod tests { assert!(contains(&overlay, 123)); // canonicalize 1_2_2 - db.commit(&overlay.canonicalize(&h_1_2_2)); - overlay.clear_overlay(); + db.commit(&overlay.canonicalize::(&h_1_2_2).unwrap()); + overlay.apply_pending(); assert_eq!(overlay.levels.len(), 0); assert_eq!(overlay.parents.len(), 0); assert!(db.data_eq(&make_db(&[1, 12, 122]))); @@ -538,5 +619,29 @@ mod tests { assert!(overlay.revert_one().is_none()); } + #[test] + fn revert_pending_insertion() { + let h1 = H256::random(); + let h2_1 = H256::random(); + let h2_2 = H256::random(); + let db = make_db(&[]); + let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); + let changeset1 = make_changeset(&[5, 6], &[2]); + let changeset2 = make_changeset(&[7, 8], &[5, 3]); + let changeset3 = make_changeset(&[9], &[]); + overlay.insert::(&h1, 1, &H256::default(), changeset1).unwrap(); + assert!(contains(&overlay, 5)); + overlay.insert::(&h2_1, 2, &h1, changeset2).unwrap(); + overlay.insert::(&h2_2, 2, &h1, changeset3).unwrap(); + assert!(contains(&overlay, 7)); + assert!(contains(&overlay, 5)); + assert!(contains(&overlay, 9)); + assert_eq!(overlay.levels.len(), 2); + assert_eq!(overlay.parents.len(), 3); + overlay.revert_pending(); + assert!(!contains(&overlay, 5)); + assert_eq!(overlay.levels.len(), 0); + assert_eq!(overlay.parents.len(), 0); + } } diff --git a/core/state-db/src/pruning.rs b/core/state-db/src/pruning.rs index 91f2b9db91311..028f6a0deed65 100644 --- a/core/state-db/src/pruning.rs +++ b/core/state-db/src/pruning.rs @@ -23,6 +23,7 @@ //! The changes are journaled in the DB. use std::collections::{HashMap, HashSet, VecDeque}; +use std::mem; use codec::{Encode, Decode}; use {CommitSet, Error, MetaDb, to_meta_key, Hash}; @@ -34,6 +35,8 @@ pub struct RefWindow { death_rows: VecDeque>, death_index: HashMap, pending_number: u64, + pending_records: Vec<(u64, JournalRecord)>, + pending_prunings: usize, } #[derive(Debug, PartialEq, Eq)] @@ -67,6 +70,8 @@ impl RefWindow { death_rows: Default::default(), death_index: Default::default(), pending_number: pending_number, + pending_records: Default::default(), + pending_prunings: 0, }; // read the journal trace!(target: "state-db", "Reading pruning journal. Pending #{}", pending_number); @@ -108,11 +113,11 @@ impl RefWindow { } pub fn window_size(&self) -> u64 { - self.death_rows.len() as u64 + (self.death_rows.len() + self.pending_records.len() - self.pending_prunings) as u64 } pub fn next_hash(&self) -> Option { - self.death_rows.front().map(|r| r.hash.clone()) + self.death_rows.get(self.pending_prunings).map(|r| r.hash.clone()) } pub fn mem_used(&self) -> usize { @@ -120,20 +125,28 @@ impl RefWindow { } pub fn pending(&self) -> u64 { - self.pending_number + self.pending_number + self.pending_prunings as u64 } /// Prune next block. Expects at least one block in the window. Adds changes to `commit`. pub fn prune_one(&mut self, commit: &mut CommitSet) { - let pruned = self.death_rows.pop_front().expect("prune_one is only called with a non-empty window"); - trace!(target: "state-db", "Pruning {:?} ({} deleted)", pruned.hash, pruned.deleted.len()); - for k in pruned.deleted.iter() { - self.death_index.remove(&k); + if let Some(pruned) = self.death_rows.get(self.pending_prunings) { + trace!(target: "state-db", "Pruning {:?} ({} deleted)", pruned.hash, pruned.deleted.len()); + let index = self.pending_number + self.pending_prunings as u64; + commit.data.deleted.extend(pruned.deleted.iter().cloned()); + 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"); } - commit.data.deleted.extend(pruned.deleted.into_iter()); - commit.meta.inserted.push((to_meta_key(LAST_PRUNED, &()), self.pending_number.encode())); - commit.meta.deleted.push(pruned.journal_key); - self.pending_number += 1; } /// Add a change set to the window. Creates a journal record and pushes it to `commit` @@ -146,11 +159,34 @@ impl RefWindow { inserted, deleted, }; - let block = self.pending_number + self.window_size(); + let block = self.pending_number + self.window_size() 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)); + } + + /// 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); + } + 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()); + for k in pruned.deleted.iter() { + self.death_index.remove(&k); + } + self.pending_number += 1; + } + self.pending_prunings = 0; + } - self.import(hash, journal_key, journal_record.inserted.into_iter(), journal_record.deleted); + /// Revert all pending changes + pub fn revert_pending(&mut self) { + self.pending_records.clear(); + self.pending_prunings = 0; } } @@ -178,12 +214,16 @@ mod tests { } #[test] - #[should_panic] - fn prune_empty_panics() { + fn prune_empty() { let db = make_db(&[]); let mut pruning: RefWindow = RefWindow::new(&db).unwrap(); let mut commit = CommitSet::default(); pruning.prune_one(&mut commit); + assert_eq!(pruning.pending_number, 0); + assert!(pruning.death_rows.is_empty()); + assert!(pruning.death_index.is_empty()); + assert!(pruning.pending_prunings == 0); + assert!(pruning.pending_records.is_empty()); } #[test] @@ -194,6 +234,7 @@ mod tests { let h = H256::random(); pruning.note_canonical(&h, &mut commit); db.commit(&commit); + pruning.apply_pending(); assert!(commit.data.deleted.is_empty()); assert_eq!(pruning.death_rows.len(), 1); assert_eq!(pruning.death_index.len(), 2); @@ -203,6 +244,7 @@ mod tests { let mut commit = CommitSet::default(); pruning.prune_one(&mut commit); db.commit(&commit); + pruning.apply_pending(); assert!(db.data_eq(&make_db(&[2, 4, 5]))); assert!(pruning.death_rows.is_empty()); assert!(pruning.death_index.is_empty()); @@ -219,6 +261,7 @@ mod tests { let mut commit = make_commit(&[5], &[2]); pruning.note_canonical(&H256::random(), &mut commit); db.commit(&commit); + pruning.apply_pending(); assert!(db.data_eq(&make_db(&[1, 2, 3, 4, 5]))); check_journal(&pruning, &db); @@ -226,10 +269,12 @@ mod tests { let mut commit = CommitSet::default(); pruning.prune_one(&mut commit); db.commit(&commit); + pruning.apply_pending(); assert!(db.data_eq(&make_db(&[2, 3, 4, 5]))); let mut commit = CommitSet::default(); pruning.prune_one(&mut commit); db.commit(&commit); + pruning.apply_pending(); assert!(db.data_eq(&make_db(&[3, 4, 5]))); assert_eq!(pruning.pending_number, 2); } @@ -248,6 +293,7 @@ mod tests { pruning.note_canonical(&H256::random(), &mut commit); db.commit(&commit); assert!(db.data_eq(&make_db(&[1, 2, 3]))); + pruning.apply_pending(); check_journal(&pruning, &db); @@ -262,6 +308,7 @@ mod tests { 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); } } diff --git a/core/state-db/src/test.rs b/core/state-db/src/test.rs index 487a5c641d1fe..ac78e71a067b8 100644 --- a/core/state-db/src/test.rs +++ b/core/state-db/src/test.rs @@ -46,6 +46,7 @@ impl HashDb for TestDb { impl TestDb { pub fn commit(&mut self, commit: &CommitSet) { self.data.extend(commit.data.inserted.iter().cloned()); + self.meta.extend(commit.meta.inserted.iter().cloned()); for k in commit.data.deleted.iter() { self.data.remove(k); } diff --git a/core/test-runtime/wasm/Cargo.lock b/core/test-runtime/wasm/Cargo.lock index dd3ee2fea3b12..0a6a69b17ef7f 100644 --- a/core/test-runtime/wasm/Cargo.lock +++ b/core/test-runtime/wasm/Cargo.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. [[package]] name = "arrayvec" version = "0.4.8" @@ -128,11 +130,6 @@ dependencies = [ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "crunchy" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "crunchy" version = "0.2.1" @@ -212,14 +209,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash-db" version = "0.9.0" -source = "git+https://github.com/paritytech/trie#2616db2a2529098949e5d39aa06dd4e502a9e5f7" +source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.9.0" -source = "git+https://github.com/paritytech/trie#2616db2a2529098949e5d39aa06dd4e502a9e5f7" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -345,14 +342,6 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "log" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "log" version = "0.4.6" @@ -391,10 +380,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memory-db" -version = "0.9.0" -source = "git+https://github.com/paritytech/trie#2616db2a2529098949e5d39aa06dd4e502a9e5f7" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -897,7 +886,7 @@ name = "sr-io" version = "0.1.0" dependencies = [ "environmental 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.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", @@ -933,6 +922,7 @@ dependencies = [ name = "sr-version" version = "0.1.0" dependencies = [ + "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1017,7 +1007,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.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.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.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", @@ -1104,8 +1094,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.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", - "hash256-std-hasher 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1133,7 +1123,7 @@ dependencies = [ name = "substrate-state-machine" version = "0.1.0" dependencies = [ - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.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.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1141,8 +1131,8 @@ dependencies = [ "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", "substrate-trie 0.4.0", - "trie-db 0.9.0 (git+https://github.com/paritytech/trie)", - "trie-root 0.9.0 (git+https://github.com/paritytech/trie)", + "trie-db 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1191,11 +1181,11 @@ dependencies = [ name = "substrate-trie" version = "0.4.0" dependencies = [ - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", - "memory-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.9.0 (git+https://github.com/paritytech/trie)", - "trie-root 0.9.0 (git+https://github.com/paritytech/trie)", + "trie-db 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1398,21 +1388,21 @@ dependencies = [ [[package]] name = "trie-db" -version = "0.9.0" -source = "git+https://github.com/paritytech/trie#2616db2a2529098949e5d39aa06dd4e502a9e5f7" +version = "0.9.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)", - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.9.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.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trie-root" -version = "0.9.0" -source = "git+https://github.com/paritytech/trie#2616db2a2529098949e5d39aa06dd4e502a9e5f7" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1569,7 +1559,6 @@ dependencies = [ "checksum crossbeam-deque 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4fe1b6f945f824c7a25afe44f62e25d714c0cc523f8e99d8db5cd1026e1269d3" "checksum crossbeam-epoch 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2449aaa4ec7ef96e5fb24db16024b935df718e9ae1cec0a1e68feeca2efca7b8" "checksum crossbeam-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e07fc155212827475223f0bcfae57e945e694fc90950ddf3f6695bbfd5555c72" -"checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" "checksum crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c240f247c278fa08a6d4820a6a222bfc6e0d999e51ba67be94f44c905b2161f2" "checksum elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88d4851b005ef16de812ea9acdb7bece2f0a40dd86c07b85631d7dafa54537bb" "checksum environmental 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db746025e3ea695bfa0ae744dbacd5fcfc8db51b9760cf8bd0ab69708bb93c49" @@ -1581,8 +1570,8 @@ dependencies = [ "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" -"checksum hash-db 0.9.0 (git+https://github.com/paritytech/trie)" = "" -"checksum hash256-std-hasher 0.9.0 (git+https://github.com/paritytech/trie)" = "" +"checksum hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc5ec43724866bbc8337e09cab4d4b5f9fdbbe589f04bdc8bfda906a639ad338" +"checksum hash256-std-hasher 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5fc2d94c8e127b205b3caf6fd3013fb5e5b314234bb0b9bea6588c52fddbb82b" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4da5f0e01bd8a71a224a4eedecaacfcabda388dbb7a80faf04d3514287572d95" "checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" @@ -1600,13 +1589,12 @@ dependencies = [ "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" "checksum libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)" = "10923947f84a519a45c8fefb7dd1b3e8c08747993381adee176d7a82b4195311" "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" -"checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" "checksum mashup 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f2d82b34c7fb11bb41719465c060589e291d505ca4735ea30016a91f6fc79c3b" "checksum mashup-impl 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "aa607bfb674b4efb310512527d64266b065de3f894fc52f84efcbf7eaa5965fb" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" -"checksum memory-db 0.9.0 (git+https://github.com/paritytech/trie)" = "" +"checksum memory-db 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c0c940ff365f921ac747e7a009d8f9688105acf956f3fbb7fd967920737e935d" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" "checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" @@ -1684,8 +1672,8 @@ dependencies = [ "checksum tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "4f37f0111d76cc5da132fe9bc0590b9b9cfd079bc7e75ac3846278430a299ff8" "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" "checksum tokio-uds 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "99ce87382f6c1a24b513a72c048b2c8efe66cb5161c9061d00bee510f08dc168" -"checksum trie-db 0.9.0 (git+https://github.com/paritytech/trie)" = "" -"checksum trie-root 0.9.0 (git+https://github.com/paritytech/trie)" = "" +"checksum trie-db 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9ec6ceb1ad749359cedcf6fa95d7b5104acf70e871e2416e71cabcc3a8b2dbb8" +"checksum trie-root 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6294c313431d8bd2dda88db3a57550c4911dd6f7f0e8be6001e23c1e6cbdcf1b" "checksum twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "555cd4909480122bbbf21e34faac4cb08a171f324775670447ed116726c474af" "checksum uint 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "082df6964410f6aa929a61ddfafc997e4f32c62c22490e439ac351cec827f436" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" diff --git a/core/test-runtime/wasm/build.sh b/core/test-runtime/wasm/build.sh index 24a0d162dad2b..45317edcfeb47 100755 --- a/core/test-runtime/wasm/build.sh +++ b/core/test-runtime/wasm/build.sh @@ -6,7 +6,7 @@ if cargo --version | grep -q "nightly"; then else CARGO_CMD="cargo +nightly" fi -$CARGO_CMD build --target=wasm32-unknown-unknown --release +RUSTFLAGS="-C link-arg=--export-table" $CARGO_CMD build --target=wasm32-unknown-unknown --release for i in substrate_test_runtime do wasm-gc target/wasm32-unknown-unknown/release/$i.wasm target/wasm32-unknown-unknown/release/$i.compact.wasm 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 991bf00699648..ca69d9ea8b2aa 100644 Binary files a/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm and b/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm differ diff --git a/node/runtime/wasm/Cargo.lock b/node/runtime/wasm/Cargo.lock index 0b5a12e7b0d98..3978bedb5b5bb 100644 --- a/node/runtime/wasm/Cargo.lock +++ b/node/runtime/wasm/Cargo.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. [[package]] name = "arrayvec" version = "0.4.8" @@ -128,11 +130,6 @@ dependencies = [ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "crunchy" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "crunchy" version = "0.2.1" @@ -212,14 +209,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash-db" version = "0.9.0" -source = "git+https://github.com/paritytech/trie#2616db2a2529098949e5d39aa06dd4e502a9e5f7" +source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.9.0" -source = "git+https://github.com/paritytech/trie#2616db2a2529098949e5d39aa06dd4e502a9e5f7" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -345,14 +342,6 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "log" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "log" version = "0.4.6" @@ -391,10 +380,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memory-db" -version = "0.9.0" -source = "git+https://github.com/paritytech/trie#2616db2a2529098949e5d39aa06dd4e502a9e5f7" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -978,7 +967,7 @@ name = "sr-io" version = "0.1.0" dependencies = [ "environmental 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.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", @@ -1025,6 +1014,7 @@ dependencies = [ name = "sr-version" version = "0.1.0" dependencies = [ + "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1395,7 +1385,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.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.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.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", @@ -1494,8 +1484,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.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", - "hash256-std-hasher 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1523,7 +1513,7 @@ dependencies = [ name = "substrate-state-machine" version = "0.1.0" dependencies = [ - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.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.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1531,8 +1521,8 @@ dependencies = [ "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", "substrate-trie 0.4.0", - "trie-db 0.9.0 (git+https://github.com/paritytech/trie)", - "trie-root 0.9.0 (git+https://github.com/paritytech/trie)", + "trie-db 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1553,11 +1543,11 @@ dependencies = [ name = "substrate-trie" version = "0.4.0" dependencies = [ - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", - "memory-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-db 0.9.0 (git+https://github.com/paritytech/trie)", - "trie-root 0.9.0 (git+https://github.com/paritytech/trie)", + "trie-db 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-root 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1760,21 +1750,21 @@ dependencies = [ [[package]] name = "trie-db" -version = "0.9.0" -source = "git+https://github.com/paritytech/trie#2616db2a2529098949e5d39aa06dd4e502a9e5f7" +version = "0.9.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)", - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.9.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.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trie-root" -version = "0.9.0" -source = "git+https://github.com/paritytech/trie#2616db2a2529098949e5d39aa06dd4e502a9e5f7" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1931,7 +1921,6 @@ dependencies = [ "checksum crossbeam-deque 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4fe1b6f945f824c7a25afe44f62e25d714c0cc523f8e99d8db5cd1026e1269d3" "checksum crossbeam-epoch 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2449aaa4ec7ef96e5fb24db16024b935df718e9ae1cec0a1e68feeca2efca7b8" "checksum crossbeam-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e07fc155212827475223f0bcfae57e945e694fc90950ddf3f6695bbfd5555c72" -"checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" "checksum crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c240f247c278fa08a6d4820a6a222bfc6e0d999e51ba67be94f44c905b2161f2" "checksum elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88d4851b005ef16de812ea9acdb7bece2f0a40dd86c07b85631d7dafa54537bb" "checksum environmental 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db746025e3ea695bfa0ae744dbacd5fcfc8db51b9760cf8bd0ab69708bb93c49" @@ -1943,8 +1932,8 @@ dependencies = [ "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" -"checksum hash-db 0.9.0 (git+https://github.com/paritytech/trie)" = "" -"checksum hash256-std-hasher 0.9.0 (git+https://github.com/paritytech/trie)" = "" +"checksum hash-db 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc5ec43724866bbc8337e09cab4d4b5f9fdbbe589f04bdc8bfda906a639ad338" +"checksum hash256-std-hasher 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5fc2d94c8e127b205b3caf6fd3013fb5e5b314234bb0b9bea6588c52fddbb82b" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4da5f0e01bd8a71a224a4eedecaacfcabda388dbb7a80faf04d3514287572d95" "checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" @@ -1962,13 +1951,12 @@ dependencies = [ "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" "checksum libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)" = "10923947f84a519a45c8fefb7dd1b3e8c08747993381adee176d7a82b4195311" "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" -"checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" "checksum mashup 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f2d82b34c7fb11bb41719465c060589e291d505ca4735ea30016a91f6fc79c3b" "checksum mashup-impl 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "aa607bfb674b4efb310512527d64266b065de3f894fc52f84efcbf7eaa5965fb" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" -"checksum memory-db 0.9.0 (git+https://github.com/paritytech/trie)" = "" +"checksum memory-db 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c0c940ff365f921ac747e7a009d8f9688105acf956f3fbb7fd967920737e935d" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" "checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" @@ -2049,8 +2037,8 @@ dependencies = [ "checksum tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "4f37f0111d76cc5da132fe9bc0590b9b9cfd079bc7e75ac3846278430a299ff8" "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" "checksum tokio-uds 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "99ce87382f6c1a24b513a72c048b2c8efe66cb5161c9061d00bee510f08dc168" -"checksum trie-db 0.9.0 (git+https://github.com/paritytech/trie)" = "" -"checksum trie-root 0.9.0 (git+https://github.com/paritytech/trie)" = "" +"checksum trie-db 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9ec6ceb1ad749359cedcf6fa95d7b5104acf70e871e2416e71cabcc3a8b2dbb8" +"checksum trie-root 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6294c313431d8bd2dda88db3a57550c4911dd6f7f0e8be6001e23c1e6cbdcf1b" "checksum twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "555cd4909480122bbbf21e34faac4cb08a171f324775670447ed116726c474af" "checksum uint 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "082df6964410f6aa929a61ddfafc997e4f32c62c22490e439ac351cec827f436" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" diff --git a/node/runtime/wasm/build.sh b/node/runtime/wasm/build.sh index 8cabead3fa539..b10d2628ae6ea 100755 --- a/node/runtime/wasm/build.sh +++ b/node/runtime/wasm/build.sh @@ -6,7 +6,7 @@ if cargo --version | grep -q "nightly"; then else CARGO_CMD="cargo +nightly" fi -$CARGO_CMD build --target=wasm32-unknown-unknown --release +RUSTFLAGS="-C link-arg=--export-table" $CARGO_CMD build --target=wasm32-unknown-unknown --release for i in node_runtime do wasm-gc target/wasm32-unknown-unknown/release/$i.wasm target/wasm32-unknown-unknown/release/$i.compact.wasm 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 cc77de34eb99e..5a68071a09395 100644 Binary files a/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm and b/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm differ