Remove BlockNumber <-> u64 conversions from light-client related code (#2666)

* Remove As usage from CHT

* Remove As usage from CHT (continue)

* Restrict BN <-> int conversions in CT

* more BN <-> u64 conversions removed

* upd spec_version

* Apply suggestions from code review

Co-Authored-By: Gavin Wood <github@gavwood.com>

* Apply suggestions from code review

Co-Authored-By: Gavin Wood <github@gavwood.com>

* more grumbles

* fix last grumbles + compilation

* too long lines

* too long lines
This commit is contained in:
Svyatoslav Nikolsky
2019-05-28 16:07:16 +03:00
committed by Gavin Wood
parent 25b88f1a1f
commit 549d9e1da1
41 changed files with 1087 additions and 654 deletions
+34 -30
View File
@@ -19,7 +19,7 @@
use std::{error, fmt, cmp::Ord};
use log::warn;
use crate::backend::Backend;
use crate::changes_trie::{AnchorBlockId, Storage as ChangesTrieStorage, compute_changes_trie_root};
use crate::changes_trie::{Storage as ChangesTrieStorage, compute_changes_trie_root};
use crate::{Externalities, OverlayedChanges, OffchainExt, ChildStorageKey};
use hash_db::Hasher;
use primitives::storage::well_known_keys::is_child_storage_key;
@@ -57,10 +57,9 @@ impl<B: error::Error, E: error::Error> error::Error for Error<B, E> {
}
/// Wraps a read-only backend, call executor, and current overlayed changes.
pub struct Ext<'a, H, B, T, O>
pub struct Ext<'a, H, N, B, T, O>
where
H: Hasher,
B: 'a + Backend<H>,
{
/// The overlayed changes to write to.
@@ -78,20 +77,23 @@ where
/// This differs from `storage_transaction` behavior, because the moment when
/// `storage_changes_root` is called matters + we need to remember additional
/// data at this moment (block number).
changes_trie_transaction: Option<(u64, MemoryDB<H>, H::Out)>,
changes_trie_transaction: Option<(MemoryDB<H>, H::Out)>,
/// Additional externalities for offchain workers.
///
/// If None, some methods from the trait might not supported.
offchain_externalities: Option<&'a mut O>,
/// Dummy usage of N arg.
_phantom: ::std::marker::PhantomData<N>,
}
impl<'a, H, B, T, O> Ext<'a, H, B, T, O>
impl<'a, H, N, B, T, O> Ext<'a, H, N, B, T, O>
where
H: Hasher,
B: 'a + Backend<H>,
T: 'a + ChangesTrieStorage<H>,
T: 'a + ChangesTrieStorage<H, N>,
O: 'a + OffchainExt,
H::Out: Ord,
H::Out: Ord + 'static,
N: crate::changes_trie::BlockNumber,
{
/// Create a new `Ext` from overlayed changes and read-only backend
pub fn new(
@@ -107,6 +109,7 @@ where
changes_trie_storage,
changes_trie_transaction: None,
offchain_externalities,
_phantom: Default::default(),
}
}
@@ -118,7 +121,7 @@ where
self.storage_transaction
.expect("storage_transaction always set after calling storage root; qed"),
self.changes_trie_transaction
.map(|(_, tx, _)| tx),
.map(|(tx, _)| tx),
);
(
@@ -137,13 +140,13 @@ where
}
#[cfg(test)]
impl<'a, H, B, T, O> Ext<'a, H, B, T, O>
impl<'a, H, N, B, T, O> Ext<'a, H, N, B, T, O>
where
H: Hasher,
B: 'a + Backend<H>,
T: 'a + ChangesTrieStorage<H>,
T: 'a + ChangesTrieStorage<H, N>,
O: 'a + OffchainExt,
N: crate::changes_trie::BlockNumber,
{
pub fn storage_pairs(&self) -> Vec<(Vec<u8>, Vec<u8>)> {
use std::collections::HashMap;
@@ -159,13 +162,14 @@ where
}
}
impl<'a, B, T, H, O> Externalities<H> for Ext<'a, H, B, T, O>
impl<'a, B, T, H, N, O> Externalities<H> for Ext<'a, H, N, B, T, O>
where
H: Hasher,
B: 'a + Backend<H>,
T: 'a + ChangesTrieStorage<H>,
T: 'a + ChangesTrieStorage<H, N>,
O: 'a + OffchainExt,
H::Out: Ord,
H::Out: Ord + 'static,
N: crate::changes_trie::BlockNumber,
{
fn storage(&self, key: &[u8]) -> Option<Vec<u8>> {
let _guard = panic_handler::AbortGuard::new(true);
@@ -313,14 +317,14 @@ where
}
}
fn storage_changes_root(&mut self, parent: H::Out, parent_num: u64) -> Option<H::Out> {
fn storage_changes_root(&mut self, parent_hash: H::Out) -> Result<Option<H::Out>, ()> {
let _guard = panic_handler::AbortGuard::new(true);
let root_and_tx = compute_changes_trie_root::<_, T, H>(
let root_and_tx = compute_changes_trie_root::<_, T, H, N>(
self.backend,
self.changes_trie_storage.clone(),
self.overlay,
&AnchorBlockId { hash: parent, number: parent_num },
);
parent_hash,
)?;
let root_and_tx = root_and_tx.map(|(root, changes)| {
let mut calculated_root = Default::default();
let mut mdb = MemoryDB::default();
@@ -331,11 +335,11 @@ where
}
}
(parent_num + 1, mdb, root)
(mdb, root)
});
let root = root_and_tx.as_ref().map(|(_, _, root)| root.clone());
let root = root_and_tx.as_ref().map(|(_, root)| root.clone());
self.changes_trie_transaction = root_and_tx;
root
Ok(root)
}
fn submit_extrinsic(&mut self, extrinsic: Vec<u8>) -> Result<(), ()> {
@@ -363,8 +367,8 @@ mod tests {
use super::*;
type TestBackend = InMemory<Blake2Hasher>;
type TestChangesTrieStorage = InMemoryChangesTrieStorage<Blake2Hasher>;
type TestExt<'a> = Ext<'a, Blake2Hasher, TestBackend, TestChangesTrieStorage, crate::NeverOffchainExt>;
type TestChangesTrieStorage = InMemoryChangesTrieStorage<Blake2Hasher, u64>;
type TestExt<'a> = Ext<'a, Blake2Hasher, u64, TestBackend, TestChangesTrieStorage, crate::NeverOffchainExt>;
fn prepare_overlay_with_changes() -> OverlayedChanges {
OverlayedChanges {
@@ -391,26 +395,26 @@ mod tests {
let mut overlay = prepare_overlay_with_changes();
let backend = TestBackend::default();
let mut ext = TestExt::new(&mut overlay, &backend, None, None);
assert_eq!(ext.storage_changes_root(Default::default(), 100), None);
assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), None);
}
#[test]
fn storage_changes_root_is_none_when_extrinsic_changes_are_none() {
let mut overlay = prepare_overlay_with_changes();
overlay.changes_trie_config = None;
let storage = TestChangesTrieStorage::new();
let storage = TestChangesTrieStorage::with_blocks(vec![(100, Default::default())]);
let backend = TestBackend::default();
let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None);
assert_eq!(ext.storage_changes_root(Default::default(), 100), None);
assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), None);
}
#[test]
fn storage_changes_root_is_some_when_extrinsic_changes_are_non_empty() {
let mut overlay = prepare_overlay_with_changes();
let storage = TestChangesTrieStorage::new();
let storage = TestChangesTrieStorage::with_blocks(vec![(99, Default::default())]);
let backend = TestBackend::default();
let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None);
assert_eq!(ext.storage_changes_root(Default::default(), 99),
assert_eq!(ext.storage_changes_root(Default::default()).unwrap(),
Some(hex!("5b829920b9c8d554a19ee2a1ba593c4f2ee6fc32822d083e04236d693e8358d5").into()));
}
@@ -418,10 +422,10 @@ mod tests {
fn storage_changes_root_is_some_when_extrinsic_changes_are_empty() {
let mut overlay = prepare_overlay_with_changes();
overlay.prospective.top.get_mut(&vec![1]).unwrap().value = None;
let storage = TestChangesTrieStorage::new();
let storage = TestChangesTrieStorage::with_blocks(vec![(99, Default::default())]);
let backend = TestBackend::default();
let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None);
assert_eq!(ext.storage_changes_root(Default::default(), 99),
assert_eq!(ext.storage_changes_root(Default::default()).unwrap(),
Some(hex!("bcf494e41e29a15c9ae5caa053fe3cb8b446ee3e02a254efbdec7a19235b76e4").into()));
}
}