Light friendly storage tracking: changes trie + extending over ranges (#628)

* changes_trie

* changs_trie: continue

* changes_trie: adding tests

* fixed TODO

* removed obsolete ExtrinsicChanges

* encodable ChangesTrieConfiguration

* removed polkadot fle

* fixed grumbles

* ext_storage_changes_root returns u32

* moved changes trie root to digest

* removed commented code

* read storage values from native code

* fixed grumbles

* fixed grumbles

* missing comma
This commit is contained in:
Svyatoslav Nikolsky
2018-09-18 10:14:41 +03:00
committed by Gav Wood
parent 24479cd7f5
commit 7fa337afbc
64 changed files with 3130 additions and 788 deletions
+14 -7
View File
@@ -30,7 +30,7 @@ pub extern crate parity_codec as codec;
// re-export hashing functions.
pub use primitives::{blake2_256, twox_128, twox_256, ed25519};
pub use primitives::Blake2Hasher;
pub use primitives::{Blake2Hasher, RlpCodec};
// Switch to this after PoC-3
// pub use primitives::BlakeHasher;
pub use substrate_state_machine::{Externalities, TestExternalities};
@@ -104,6 +104,13 @@ pub fn storage_root() -> H256 {
).unwrap_or(H256::new())
}
/// "Commit" all existing operations and get the resultant storage change root.
pub fn storage_changes_root(block: u64) -> Option<H256> {
ext::with(|ext|
ext.storage_changes_root(block)
).unwrap_or(None)
}
/// A trie root formed from the enumerated items.
pub fn enumerated_trie_root<H>(serialised_values: &[&[u8]]) -> H::Out
where
@@ -210,7 +217,7 @@ mod std_tests {
#[test]
fn storage_works() {
let mut t = TestExternalities::<Blake2Hasher>::new();
let mut t = TestExternalities::<Blake2Hasher, RlpCodec>::default();
assert!(with_externalities(&mut t, || {
assert_eq!(storage(b"hello"), None);
set_storage(b"hello", b"world");
@@ -220,7 +227,7 @@ mod std_tests {
true
}));
t = map![b"foo".to_vec() => b"bar".to_vec()];
t = TestExternalities::new(map![b"foo".to_vec() => b"bar".to_vec()]);
assert!(!with_externalities(&mut t, || {
assert_eq!(storage(b"hello"), None);
@@ -231,9 +238,9 @@ mod std_tests {
#[test]
fn read_storage_works() {
let mut t: TestExternalities<Blake2Hasher> = map![
let mut t = TestExternalities::<Blake2Hasher, RlpCodec>::new(map![
b":test".to_vec() => b"\x0b\0\0\0Hello world".to_vec()
];
]);
with_externalities(&mut t, || {
let mut v = [0u8; 4];
@@ -247,12 +254,12 @@ mod std_tests {
#[test]
fn clear_prefix_works() {
let mut t: TestExternalities<Blake2Hasher> = map![
let mut t = TestExternalities::<Blake2Hasher, RlpCodec>::new(map![
b":a".to_vec() => b"\x0b\0\0\0Hello world".to_vec(),
b":abcd".to_vec() => b"\x0b\0\0\0Hello world".to_vec(),
b":abc".to_vec() => b"\x0b\0\0\0Hello world".to_vec(),
b":abdd".to_vec() => b"\x0b\0\0\0Hello world".to_vec()
];
]);
with_externalities(&mut t, || {
clear_prefix(b":abc");
+15
View File
@@ -64,6 +64,7 @@ extern "C" {
fn ext_get_allocated_storage(key_data: *const u8, key_len: u32, written_out: *mut u32) -> *mut u8;
fn ext_get_storage_into(key_data: *const u8, key_len: u32, value_data: *mut u8, value_len: u32, value_offset: u32) -> u32;
fn ext_storage_root(result: *mut u8);
fn ext_storage_changes_root(block: u64, result: *mut u8) -> u32;
fn ext_blake2_256_enumerated_trie_root(values_data: *const u8, lens_data: *const u32, lens_len: u32, result: *mut u8);
fn ext_chain_id() -> u64;
fn ext_blake2_256(data: *const u8, len: u32, out: *mut u8);
@@ -170,6 +171,20 @@ pub fn storage_root() -> [u8; 32] {
result
}
/// The current storage' changes root.
pub fn storage_changes_root(block: u64) -> Option<[u8; 32]> {
let mut result: [u8; 32] = Default::default();
let is_set = unsafe {
ext_storage_changes_root(block, result.as_mut_ptr())
};
if is_set != 0 {
Some(result)
} else {
None
}
}
/// A trie root calculated from enumerated values.
pub fn enumerated_trie_root<H: Hasher + ExternTrieCrypto>(values: &[&[u8]]) -> [u8; 32] {
H::enumerated_trie_root(values)