mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-15 03:21:06 +00:00
Pruning changes trie without digests (#952)
* pruning changes tries without digests * u64::max_value()
This commit is contained in:
committed by
Gav Wood
parent
5b28147d27
commit
6f9a505fba
Generated
+12
-5
@@ -1661,6 +1661,11 @@ dependencies = [
|
|||||||
"rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nan-preserving-float"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "native-tls"
|
name = "native-tls"
|
||||||
version = "0.2.2"
|
version = "0.2.2"
|
||||||
@@ -2604,7 +2609,7 @@ dependencies = [
|
|||||||
"sr-std 0.1.0",
|
"sr-std 0.1.0",
|
||||||
"substrate-primitives 0.1.0",
|
"substrate-primitives 0.1.0",
|
||||||
"wabt 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"wabt 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -3172,7 +3177,7 @@ dependencies = [
|
|||||||
"substrate-state-machine 0.1.0",
|
"substrate-state-machine 0.1.0",
|
||||||
"substrate-trie 0.4.0",
|
"substrate-trie 0.4.0",
|
||||||
"wabt 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"wabt 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -3308,7 +3313,7 @@ dependencies = [
|
|||||||
"twox-hash 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"twox-hash 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"uint 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"uint 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -4151,11 +4156,12 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasmi"
|
name = "wasmi"
|
||||||
version = "0.4.2"
|
version = "0.4.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"nan-preserving-float 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -4467,6 +4473,7 @@ dependencies = [
|
|||||||
"checksum multihash 0.8.1-pre (git+https://github.com/libp2p/rust-libp2p?rev=d961e656a74d1bab5366d371a06f9e10d5f4a6c5)" = "<none>"
|
"checksum multihash 0.8.1-pre (git+https://github.com/libp2p/rust-libp2p?rev=d961e656a74d1bab5366d371a06f9e10d5f4a6c5)" = "<none>"
|
||||||
"checksum multistream-select 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=d961e656a74d1bab5366d371a06f9e10d5f4a6c5)" = "<none>"
|
"checksum multistream-select 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=d961e656a74d1bab5366d371a06f9e10d5f4a6c5)" = "<none>"
|
||||||
"checksum names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef320dab323286b50fb5cdda23f61c796a72a89998ab565ca32525c5c556f2da"
|
"checksum names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef320dab323286b50fb5cdda23f61c796a72a89998ab565ca32525c5c556f2da"
|
||||||
|
"checksum nan-preserving-float 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34d4f00fcc2f4c9efa8cc971db0da9e28290e28e97af47585e48691ef10ff31f"
|
||||||
"checksum native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff8e08de0070bbf4c31f452ea2a70db092f36f6f2e4d897adf5674477d488fb2"
|
"checksum native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff8e08de0070bbf4c31f452ea2a70db092f36f6f2e4d897adf5674477d488fb2"
|
||||||
"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88"
|
"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88"
|
||||||
"checksum nix 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d37e713a259ff641624b6cb20e3b12b2952313ba36b6823c0f16e6cfd9e5de17"
|
"checksum nix 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d37e713a259ff641624b6cb20e3b12b2952313ba36b6823c0f16e6cfd9e5de17"
|
||||||
@@ -4643,7 +4650,7 @@ dependencies = [
|
|||||||
"checksum wabt 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "182ae543249ccf2705f324d233891c1176fca142e137b55ba43d9dbfe93f18a2"
|
"checksum wabt 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "182ae543249ccf2705f324d233891c1176fca142e137b55ba43d9dbfe93f18a2"
|
||||||
"checksum wabt-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ca77c6b934a2b32618941b2f565aac43b8cb7141378c3b4fba4d8fcdcd57da3"
|
"checksum wabt-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ca77c6b934a2b32618941b2f565aac43b8cb7141378c3b4fba4d8fcdcd57da3"
|
||||||
"checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3"
|
"checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3"
|
||||||
"checksum wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8a60b9508cff2b7c27ed41200dd668806280740fadc8c88440e9c88625e84f1a"
|
"checksum wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d184c4b7081f30316f74f8d73c197314dcb56ea7af9323522b42a2fa9cb19453"
|
||||||
"checksum websocket 0.21.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c9faed2bff8af2ea6b9f8b917d3d00b467583f6781fe3def174a9e33c879703"
|
"checksum websocket 0.21.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c9faed2bff8af2ea6b9f8b917d3d00b467583f6781fe3def174a9e33c879703"
|
||||||
"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
|
"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
|
||||||
"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0"
|
"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0"
|
||||||
|
|||||||
@@ -1277,63 +1277,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn changes_trie_storage_works_with_forks() {
|
fn changes_tries_with_digest_are_pruned_on_finalization() {
|
||||||
let backend = Backend::<Block>::new_test(1000, 100);
|
|
||||||
|
|
||||||
let changes0 = vec![(b"k0".to_vec(), b"v0".to_vec())];
|
|
||||||
let changes1 = vec![(b"k1".to_vec(), b"v1".to_vec())];
|
|
||||||
let changes2 = vec![(b"k2".to_vec(), b"v2".to_vec())];
|
|
||||||
let block0 = insert_header(&backend, 0, Default::default(), changes0.clone(), Default::default());
|
|
||||||
let block1 = insert_header(&backend, 1, block0, changes1.clone(), Default::default());
|
|
||||||
let block2 = insert_header(&backend, 2, block1, changes2.clone(), Default::default());
|
|
||||||
|
|
||||||
let changes2_1_0 = vec![(b"k3".to_vec(), b"v3".to_vec())];
|
|
||||||
let changes2_1_1 = vec![(b"k4".to_vec(), b"v4".to_vec())];
|
|
||||||
let block2_1_0 = insert_header(&backend, 3, block2, changes2_1_0.clone(), Default::default());
|
|
||||||
let block2_1_1 = insert_header(&backend, 4, block2_1_0, changes2_1_1.clone(), Default::default());
|
|
||||||
|
|
||||||
let changes2_2_0 = vec![(b"k5".to_vec(), b"v5".to_vec())];
|
|
||||||
let changes2_2_1 = vec![(b"k6".to_vec(), b"v6".to_vec())];
|
|
||||||
let block2_2_0 = insert_header(&backend, 3, block2, changes2_2_0.clone(), Default::default());
|
|
||||||
let block2_2_1 = insert_header(&backend, 4, block2_2_0, changes2_2_1.clone(), Default::default());
|
|
||||||
|
|
||||||
// finalize block1
|
|
||||||
backend.changes_tries_storage.meta.write().finalized_number = 1;
|
|
||||||
|
|
||||||
// branch1: when asking for finalized block hash
|
|
||||||
let (changes1_root, _) = prepare_changes(changes1);
|
|
||||||
let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block2_1_1, number: 4 };
|
|
||||||
assert_eq!(backend.changes_tries_storage.root(&anchor, 1), Ok(Some(changes1_root)));
|
|
||||||
|
|
||||||
// branch2: when asking for finalized block hash
|
|
||||||
let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block2_2_1, number: 4 };
|
|
||||||
assert_eq!(backend.changes_tries_storage.root(&anchor, 1), Ok(Some(changes1_root)));
|
|
||||||
|
|
||||||
// branch1: when asking for non-finalized block hash (search by traversal)
|
|
||||||
let (changes2_1_0_root, _) = prepare_changes(changes2_1_0);
|
|
||||||
let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block2_1_1, number: 4 };
|
|
||||||
assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_1_0_root)));
|
|
||||||
|
|
||||||
// branch2: when asking for non-finalized block hash (search using canonicalized hint)
|
|
||||||
let (changes2_2_0_root, _) = prepare_changes(changes2_2_0);
|
|
||||||
let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block2_2_1, number: 4 };
|
|
||||||
assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_2_0_root)));
|
|
||||||
|
|
||||||
// finalize first block of branch2 (block2_2_0)
|
|
||||||
backend.changes_tries_storage.meta.write().finalized_number = 3;
|
|
||||||
|
|
||||||
// branch2: when asking for finalized block of this branch
|
|
||||||
assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_2_0_root)));
|
|
||||||
|
|
||||||
// branch1: when asking for finalized block of other branch
|
|
||||||
// => result is incorrect (returned for the block of branch1), but this is expected,
|
|
||||||
// because the other fork is abandoned (forked before finalized header)
|
|
||||||
let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block2_1_1, number: 4 };
|
|
||||||
assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_2_0_root)));
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn changes_tries_are_pruned_on_finalization() {
|
|
||||||
let mut backend = Backend::<Block>::new_test(1000, 100);
|
let mut backend = Backend::<Block>::new_test(1000, 100);
|
||||||
backend.changes_tries_storage.meta.write().finalized_number = 1000;
|
backend.changes_tries_storage.meta.write().finalized_number = 1000;
|
||||||
backend.changes_tries_storage.min_blocks_to_keep = Some(8);
|
backend.changes_tries_storage.min_blocks_to_keep = Some(8);
|
||||||
@@ -1410,6 +1354,108 @@ mod tests {
|
|||||||
assert!(backend.changes_tries_storage.get(&root12).unwrap().is_some());
|
assert!(backend.changes_tries_storage.get(&root12).unwrap().is_some());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn changes_tries_without_digest_are_pruned_on_finalization() {
|
||||||
|
let mut backend = Backend::<Block>::new_test(1000, 100);
|
||||||
|
backend.changes_tries_storage.min_blocks_to_keep = Some(4);
|
||||||
|
let config = ChangesTrieConfiguration {
|
||||||
|
digest_interval: 0,
|
||||||
|
digest_levels: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
// insert some blocks
|
||||||
|
let block0 = insert_header(&backend, 0, Default::default(), vec![(b"key_at_0".to_vec(), b"val_at_0".to_vec())], Default::default());
|
||||||
|
let block1 = insert_header(&backend, 1, block0, vec![(b"key_at_1".to_vec(), b"val_at_1".to_vec())], Default::default());
|
||||||
|
let block2 = insert_header(&backend, 2, block1, vec![(b"key_at_2".to_vec(), b"val_at_2".to_vec())], Default::default());
|
||||||
|
let block3 = insert_header(&backend, 3, block2, vec![(b"key_at_3".to_vec(), b"val_at_3".to_vec())], Default::default());
|
||||||
|
let block4 = insert_header(&backend, 4, block3, vec![(b"key_at_4".to_vec(), b"val_at_4".to_vec())], Default::default());
|
||||||
|
let block5 = insert_header(&backend, 5, block4, vec![(b"key_at_5".to_vec(), b"val_at_5".to_vec())], Default::default());
|
||||||
|
let block6 = insert_header(&backend, 6, block5, vec![(b"key_at_6".to_vec(), b"val_at_6".to_vec())], Default::default());
|
||||||
|
|
||||||
|
// check that roots of all tries are in the columns::CHANGES_TRIE
|
||||||
|
let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block6, number: 6 };
|
||||||
|
fn read_changes_trie_root(backend: &Backend<Block>, num: u64) -> H256 {
|
||||||
|
backend.blockchain().header(BlockId::Number(num)).unwrap().unwrap().digest().logs().iter()
|
||||||
|
.find(|i| i.as_changes_trie_root().is_some()).unwrap().as_changes_trie_root().unwrap().clone()
|
||||||
|
}
|
||||||
|
let root1 = read_changes_trie_root(&backend, 1); assert_eq!(backend.changes_tries_storage.root(&anchor, 1).unwrap(), Some(root1));
|
||||||
|
let root2 = read_changes_trie_root(&backend, 2); assert_eq!(backend.changes_tries_storage.root(&anchor, 2).unwrap(), Some(root2));
|
||||||
|
let root3 = read_changes_trie_root(&backend, 3); assert_eq!(backend.changes_tries_storage.root(&anchor, 3).unwrap(), Some(root3));
|
||||||
|
let root4 = read_changes_trie_root(&backend, 4); assert_eq!(backend.changes_tries_storage.root(&anchor, 4).unwrap(), Some(root4));
|
||||||
|
let root5 = read_changes_trie_root(&backend, 5); assert_eq!(backend.changes_tries_storage.root(&anchor, 5).unwrap(), Some(root5));
|
||||||
|
let root6 = read_changes_trie_root(&backend, 6); assert_eq!(backend.changes_tries_storage.root(&anchor, 6).unwrap(), Some(root6));
|
||||||
|
|
||||||
|
// now simulate finalization of block#5, causing prune of trie at #1
|
||||||
|
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());
|
||||||
|
|
||||||
|
// 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());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn changes_trie_storage_works_with_forks() {
|
||||||
|
let backend = Backend::<Block>::new_test(1000, 100);
|
||||||
|
|
||||||
|
let changes0 = vec![(b"k0".to_vec(), b"v0".to_vec())];
|
||||||
|
let changes1 = vec![(b"k1".to_vec(), b"v1".to_vec())];
|
||||||
|
let changes2 = vec![(b"k2".to_vec(), b"v2".to_vec())];
|
||||||
|
let block0 = insert_header(&backend, 0, Default::default(), changes0.clone(), Default::default());
|
||||||
|
let block1 = insert_header(&backend, 1, block0, changes1.clone(), Default::default());
|
||||||
|
let block2 = insert_header(&backend, 2, block1, changes2.clone(), Default::default());
|
||||||
|
|
||||||
|
let changes2_1_0 = vec![(b"k3".to_vec(), b"v3".to_vec())];
|
||||||
|
let changes2_1_1 = vec![(b"k4".to_vec(), b"v4".to_vec())];
|
||||||
|
let block2_1_0 = insert_header(&backend, 3, block2, changes2_1_0.clone(), Default::default());
|
||||||
|
let block2_1_1 = insert_header(&backend, 4, block2_1_0, changes2_1_1.clone(), Default::default());
|
||||||
|
|
||||||
|
let changes2_2_0 = vec![(b"k5".to_vec(), b"v5".to_vec())];
|
||||||
|
let changes2_2_1 = vec![(b"k6".to_vec(), b"v6".to_vec())];
|
||||||
|
let block2_2_0 = insert_header(&backend, 3, block2, changes2_2_0.clone(), Default::default());
|
||||||
|
let block2_2_1 = insert_header(&backend, 4, block2_2_0, changes2_2_1.clone(), Default::default());
|
||||||
|
|
||||||
|
// finalize block1
|
||||||
|
backend.changes_tries_storage.meta.write().finalized_number = 1;
|
||||||
|
|
||||||
|
// branch1: when asking for finalized block hash
|
||||||
|
let (changes1_root, _) = prepare_changes(changes1);
|
||||||
|
let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block2_1_1, number: 4 };
|
||||||
|
assert_eq!(backend.changes_tries_storage.root(&anchor, 1), Ok(Some(changes1_root)));
|
||||||
|
|
||||||
|
// branch2: when asking for finalized block hash
|
||||||
|
let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block2_2_1, number: 4 };
|
||||||
|
assert_eq!(backend.changes_tries_storage.root(&anchor, 1), Ok(Some(changes1_root)));
|
||||||
|
|
||||||
|
// branch1: when asking for non-finalized block hash (search by traversal)
|
||||||
|
let (changes2_1_0_root, _) = prepare_changes(changes2_1_0);
|
||||||
|
let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block2_1_1, number: 4 };
|
||||||
|
assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_1_0_root)));
|
||||||
|
|
||||||
|
// branch2: when asking for non-finalized block hash (search using canonicalized hint)
|
||||||
|
let (changes2_2_0_root, _) = prepare_changes(changes2_2_0);
|
||||||
|
let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block2_2_1, number: 4 };
|
||||||
|
assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_2_0_root)));
|
||||||
|
|
||||||
|
// finalize first block of branch2 (block2_2_0)
|
||||||
|
backend.changes_tries_storage.meta.write().finalized_number = 3;
|
||||||
|
|
||||||
|
// branch2: when asking for finalized block of this branch
|
||||||
|
assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_2_0_root)));
|
||||||
|
|
||||||
|
// branch1: when asking for finalized block of other branch
|
||||||
|
// => result is incorrect (returned for the block of branch1), but this is expected,
|
||||||
|
// because the other fork is abandoned (forked before finalized header)
|
||||||
|
let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block2_1_1, number: 4 };
|
||||||
|
assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_2_0_root)));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn tree_route_works() {
|
fn tree_route_works() {
|
||||||
let backend = Backend::<Block>::new_test(1000, 100);
|
let backend = Backend::<Block>::new_test(1000, 100);
|
||||||
|
|||||||
@@ -465,20 +465,14 @@ macro_rules! impl_runtime_apis {
|
|||||||
)*
|
)*
|
||||||
}
|
}
|
||||||
impl_runtime_apis! {
|
impl_runtime_apis! {
|
||||||
@EXTEND_FUNCTIONS
|
|
||||||
$runtime;
|
$runtime;
|
||||||
;
|
$( $fn_name ( $( $arg_name: $arg_ty ),* ); )*;
|
||||||
$trait_name;
|
|
||||||
$( $( $generic ),* )*;
|
|
||||||
{ $( $fn_name ( $( $arg_name: $arg_ty ),* ); )* }
|
|
||||||
$( $rest )*
|
$( $rest )*
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
(
|
(
|
||||||
$runtime:ident;
|
$runtime:ident;
|
||||||
$( $trait_name_parsed:ident $( < $( $parsed_generic:ident ),* > )*::$fn_name_parsed:ident (
|
$( $fn_name_parsed:ident ( $( $arg_name_parsed:ident : $arg_ty_parsed:ty ),* ); )*;
|
||||||
$( $arg_name_parsed:ident : $arg_ty_parsed:ty ),* );
|
|
||||||
)*;
|
|
||||||
impl $trait_name:ident $( < $( $generic:ident ),* > )* for $runtime_ignore:ident {
|
impl $trait_name:ident $( < $( $generic:ident ),* > )* for $runtime_ignore:ident {
|
||||||
$(
|
$(
|
||||||
fn $fn_name:ident ( $( $arg_name:ident : $arg_ty:ty ),* ) $( -> $return_ty:ty )* {
|
fn $fn_name:ident ( $( $arg_name:ident : $arg_ty:ty ),* ) $( -> $return_ty:ty )* {
|
||||||
@@ -496,73 +490,15 @@ macro_rules! impl_runtime_apis {
|
|||||||
)*
|
)*
|
||||||
}
|
}
|
||||||
impl_runtime_apis! {
|
impl_runtime_apis! {
|
||||||
@EXTEND_FUNCTIONS
|
|
||||||
$runtime;
|
$runtime;
|
||||||
$(
|
$( $fn_name_parsed ( $( $arg_name_parsed: $arg_ty_parsed ),* ); )*
|
||||||
$trait_name_parsed $( < $( $parsed_generic ),* > )*
|
$( $fn_name ( $( $arg_name: $arg_ty ),* ); )*;
|
||||||
::$fn_name_parsed ( $( $arg_name_parsed: $arg_ty_parsed ),* );
|
|
||||||
)*;
|
|
||||||
$trait_name;
|
|
||||||
$( $( $generic ),* )*;
|
|
||||||
{ $( $fn_name ( $( $arg_name: $arg_ty ),* ); )* }
|
|
||||||
$( $rest )*
|
|
||||||
}
|
|
||||||
};
|
|
||||||
(@EXTEND_FUNCTIONS
|
|
||||||
$runtime:ident;
|
|
||||||
$( $trait_name_parsed:ident $( < $( $parsed_generic:ident ),* > )*::$fn_name_parsed:ident (
|
|
||||||
$( $arg_name_parsed:ident : $arg_ty_parsed:ty ),* );
|
|
||||||
)*;
|
|
||||||
$trait_name:ident;
|
|
||||||
$( $generic:ident ),*;
|
|
||||||
{
|
|
||||||
$fn_name_extend:ident ( $( $arg_name_extend:ident : $arg_ty_extend:ty ),* );
|
|
||||||
$( $extend_rest:tt )*
|
|
||||||
}
|
|
||||||
$( $rest:tt )*
|
|
||||||
) => {
|
|
||||||
impl_runtime_apis! {
|
|
||||||
@EXTEND_FUNCTIONS
|
|
||||||
$runtime;
|
|
||||||
$(
|
|
||||||
$trait_name_parsed $( < $( $parsed_generic ),* > )*
|
|
||||||
::$fn_name_parsed ( $( $arg_name_parsed: $arg_ty_parsed ),* );
|
|
||||||
)*
|
|
||||||
$trait_name < $( $generic ),* >
|
|
||||||
::$fn_name_extend ( $( $arg_name_extend: $arg_ty_extend ),* );;
|
|
||||||
$trait_name;
|
|
||||||
$( $generic ),*;
|
|
||||||
{
|
|
||||||
$( $extend_rest )*
|
|
||||||
}
|
|
||||||
$( $rest )*
|
|
||||||
}
|
|
||||||
};
|
|
||||||
(@EXTEND_FUNCTIONS
|
|
||||||
$runtime:ident;
|
|
||||||
$( $trait_name_parsed:ident $( < $( $parsed_generic:ident ),* > )*::$fn_name_parsed:ident (
|
|
||||||
$( $arg_name_parsed:ident : $arg_ty_parsed:ty ),* );
|
|
||||||
)*;
|
|
||||||
$trait_name:ident;
|
|
||||||
$( $generic:ident ),*;
|
|
||||||
{}
|
|
||||||
$( $rest:tt )*
|
|
||||||
) => {
|
|
||||||
impl_runtime_apis! {
|
|
||||||
$runtime;
|
|
||||||
$(
|
|
||||||
$trait_name_parsed $( < $( $parsed_generic ),* > )*
|
|
||||||
::$fn_name_parsed ( $( $arg_name_parsed: $arg_ty_parsed ),* );
|
|
||||||
)*;
|
|
||||||
$( $rest )*
|
$( $rest )*
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
(
|
(
|
||||||
$runtime:ident;
|
$runtime:ident;
|
||||||
$(
|
$( $fn_name:ident ( $( $arg_name:ident : $arg_ty:ty ),* ); )*;
|
||||||
$trait_name:ident $( < $( $generic:ident ),* > )*
|
|
||||||
::$fn_name:ident ( $( $arg_name:ident : $arg_ty:ty ),* );
|
|
||||||
)*;
|
|
||||||
) => {
|
) => {
|
||||||
pub mod api {
|
pub mod api {
|
||||||
use super::*;
|
use super::*;
|
||||||
@@ -575,7 +511,6 @@ macro_rules! impl_runtime_apis {
|
|||||||
Some({impl_runtime_apis! {
|
Some({impl_runtime_apis! {
|
||||||
@GENERATE_IMPL_CALL
|
@GENERATE_IMPL_CALL
|
||||||
$runtime;
|
$runtime;
|
||||||
$trait_name $( < $( $generic ),* > )*;
|
|
||||||
$fn_name;
|
$fn_name;
|
||||||
$( $arg_name : $arg_ty ),*;
|
$( $arg_name : $arg_ty ),*;
|
||||||
data;
|
data;
|
||||||
@@ -601,7 +536,6 @@ macro_rules! impl_runtime_apis {
|
|||||||
let output = { impl_runtime_apis! {
|
let output = { impl_runtime_apis! {
|
||||||
@GENERATE_IMPL_CALL
|
@GENERATE_IMPL_CALL
|
||||||
$runtime;
|
$runtime;
|
||||||
$trait_name $( < $( $generic ),* > )*;
|
|
||||||
$fn_name;
|
$fn_name;
|
||||||
$( $arg_name : $arg_ty ),*;
|
$( $arg_name : $arg_ty ),*;
|
||||||
input;
|
input;
|
||||||
@@ -619,7 +553,6 @@ macro_rules! impl_runtime_apis {
|
|||||||
};
|
};
|
||||||
(@GENERATE_IMPL_CALL
|
(@GENERATE_IMPL_CALL
|
||||||
$runtime:ident;
|
$runtime:ident;
|
||||||
$trait_name:ident $( < $( $generic:ident ),* > )*;
|
|
||||||
$fn_name:ident;
|
$fn_name:ident;
|
||||||
$arg_name:ident : $arg_ty:ty;
|
$arg_name:ident : $arg_ty:ty;
|
||||||
$input:ident;
|
$input:ident;
|
||||||
@@ -629,12 +562,11 @@ macro_rules! impl_runtime_apis {
|
|||||||
None => panic!("Bad input data provided to {}", stringify!($fn_name)),
|
None => panic!("Bad input data provided to {}", stringify!($fn_name)),
|
||||||
};
|
};
|
||||||
|
|
||||||
let output = <$runtime as $trait_name $( < $( $generic ),* > )*>::$fn_name($arg_name);
|
let output = $runtime::$fn_name($arg_name);
|
||||||
$crate::runtime_api::Encode::encode(&output)
|
$crate::runtime_api::Encode::encode(&output)
|
||||||
};
|
};
|
||||||
(@GENERATE_IMPL_CALL
|
(@GENERATE_IMPL_CALL
|
||||||
$runtime:ident;
|
$runtime:ident;
|
||||||
$trait_name:ident $( < $( $generic:ident ),* > )*;
|
|
||||||
$fn_name:ident;
|
$fn_name:ident;
|
||||||
$( $arg_name:ident : $arg_ty:ty ),*;
|
$( $arg_name:ident : $arg_ty:ty ),*;
|
||||||
$input:ident;
|
$input:ident;
|
||||||
@@ -644,7 +576,7 @@ macro_rules! impl_runtime_apis {
|
|||||||
None => panic!("Bad input data provided to {}", stringify!($fn_name)),
|
None => panic!("Bad input data provided to {}", stringify!($fn_name)),
|
||||||
};
|
};
|
||||||
|
|
||||||
let output = <$runtime as $trait_name $( < $( $generic ),* > )*>::$fn_name($( $arg_name ),*);
|
let output = $runtime::$fn_name($( $arg_name ),*);
|
||||||
$crate::runtime_api::Encode::encode(&output)
|
$crate::runtime_api::Encode::encode(&output)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -286,6 +286,7 @@ enum CheckedHeader<H> {
|
|||||||
Checked(H, u64, ed25519::Signature),
|
Checked(H, u64, ed25519::Signature),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// check a header has been signed by the right key. If the slot is too far in the future, an error will be returned.
|
/// check a header has been signed by the right key. If the slot is too far in the future, an error will be returned.
|
||||||
/// if it's successful, returns the pre-header, the slot number, and the signat.
|
/// if it's successful, returns the pre-header, the slot number, and the signat.
|
||||||
//
|
//
|
||||||
@@ -327,37 +328,15 @@ fn check_header<B: Block>(slot_now: u64, mut header: B::Header, hash: B::Hash, a
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Extra verification for Aura blocks.
|
|
||||||
pub trait ExtraVerification<B: Block>: Send + Sync {
|
|
||||||
/// Future that resolves when the block is verified or fails with error if not.
|
|
||||||
type Verified: IntoFuture<Item=(),Error=String>;
|
|
||||||
|
|
||||||
/// Do additional verification for this block.
|
|
||||||
fn verify(&self, header: &B::Header, body: Option<&[B::Extrinsic]>) -> Self::Verified;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// No-op extra verification.
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
|
||||||
pub struct NothingExtra;
|
|
||||||
|
|
||||||
impl<B: Block> ExtraVerification<B> for NothingExtra {
|
|
||||||
type Verified = Result<(), String>;
|
|
||||||
|
|
||||||
fn verify(&self, _: &B::Header, _: Option<&[B::Extrinsic]>) -> Self::Verified {
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// A verifier for Aura blocks.
|
/// A verifier for Aura blocks.
|
||||||
pub struct AuraVerifier<C, E> {
|
pub struct AuraVerifier<C> {
|
||||||
config: Config,
|
config: Config,
|
||||||
client: Arc<C>,
|
client: Arc<C>,
|
||||||
extra: E,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<B: Block, C, E> Verifier<B> for AuraVerifier<C, E> where
|
impl<B: Block, C> Verifier<B> for AuraVerifier<C> where
|
||||||
C: Authorities<B> + BlockImport<B> + Send + Sync,
|
C: Authorities<B> + BlockImport<B> + Send + Sync,
|
||||||
DigestItemFor<B>: CompatibleDigestItem,
|
DigestItemFor<B>: CompatibleDigestItem,
|
||||||
E: ExtraVerification<B>,
|
|
||||||
{
|
{
|
||||||
fn verify(
|
fn verify(
|
||||||
&self,
|
&self,
|
||||||
@@ -373,8 +352,6 @@ impl<B: Block, C, E> Verifier<B> for AuraVerifier<C, E> where
|
|||||||
let authorities = self.client.authorities(&BlockId::Hash(parent_hash))
|
let authorities = self.client.authorities(&BlockId::Hash(parent_hash))
|
||||||
.map_err(|e| format!("Could not fetch authorities at {:?}: {:?}", parent_hash, e))?;
|
.map_err(|e| format!("Could not fetch authorities at {:?}: {:?}", parent_hash, e))?;
|
||||||
|
|
||||||
let extra_verification = self.extra.verify(&header, body.as_ref().map(|x| &x[..]));
|
|
||||||
|
|
||||||
// we add one to allow for some small drift.
|
// we add one to allow for some small drift.
|
||||||
// FIXME: in the future, alter this queue to allow deferring of headers
|
// FIXME: in the future, alter this queue to allow deferring of headers
|
||||||
// https://github.com/paritytech/substrate/issues/1019
|
// https://github.com/paritytech/substrate/issues/1019
|
||||||
@@ -385,7 +362,6 @@ impl<B: Block, C, E> Verifier<B> for AuraVerifier<C, E> where
|
|||||||
|
|
||||||
debug!(target: "aura", "Checked {:?}; importing.", pre_header);
|
debug!(target: "aura", "Checked {:?}; importing.", pre_header);
|
||||||
|
|
||||||
extra_verification.into_future().wait()?;
|
|
||||||
let import_block = ImportBlock {
|
let import_block = ImportBlock {
|
||||||
origin,
|
origin,
|
||||||
header: pre_header,
|
header: pre_header,
|
||||||
@@ -408,19 +384,20 @@ impl<B: Block, C, E> Verifier<B> for AuraVerifier<C, E> where
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// The Aura import queue type.
|
/// The Aura import queue type.
|
||||||
pub type AuraImportQueue<B, C, E> = BasicQueue<B, AuraVerifier<C, E>>;
|
pub type AuraImportQueue<B, C> = BasicQueue<B, AuraVerifier<C>>;
|
||||||
|
|
||||||
/// Start an import queue for the Aura consensus algorithm.
|
/// Start an import queue for the Aura consensus algorithm.
|
||||||
pub fn import_queue<B, C, E>(config: Config, client: Arc<C>, extra: E) -> AuraImportQueue<B, C, E> where
|
pub fn import_queue<B, C>(config: Config, client: Arc<C>) -> AuraImportQueue<B, C> where
|
||||||
B: Block,
|
B: Block,
|
||||||
C: Authorities<B> + BlockImport<B,Error=client::error::Error> + Send + Sync,
|
C: Authorities<B> + BlockImport<B,Error=client::error::Error> + Send + Sync,
|
||||||
DigestItemFor<B>: CompatibleDigestItem,
|
DigestItemFor<B>: CompatibleDigestItem,
|
||||||
E: ExtraVerification<B>,
|
|
||||||
{
|
{
|
||||||
let verifier = Arc::new(AuraVerifier { config, client: client.clone(), extra, });
|
let verifier = Arc::new(AuraVerifier { config, client: client.clone() });
|
||||||
BasicQueue::new(verifier, client)
|
BasicQueue::new(verifier, client)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
@@ -466,12 +443,12 @@ mod tests {
|
|||||||
const TEST_ROUTING_INTERVAL: Duration = Duration::from_millis(50);
|
const TEST_ROUTING_INTERVAL: Duration = Duration::from_millis(50);
|
||||||
|
|
||||||
pub struct AuraTestNet {
|
pub struct AuraTestNet {
|
||||||
peers: Vec<Arc<Peer<AuraVerifier<PeersClient, NothingExtra>, ()>>>,
|
peers: Vec<Arc<Peer<AuraVerifier<PeersClient>, ()>>>,
|
||||||
started: bool
|
started: bool
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TestNetFactory for AuraTestNet {
|
impl TestNetFactory for AuraTestNet {
|
||||||
type Verifier = AuraVerifier<PeersClient, NothingExtra>;
|
type Verifier = AuraVerifier<PeersClient>;
|
||||||
type PeerData = ();
|
type PeerData = ();
|
||||||
|
|
||||||
/// Create new test network with peers and given config.
|
/// Create new test network with peers and given config.
|
||||||
@@ -486,7 +463,7 @@ mod tests {
|
|||||||
-> Arc<Self::Verifier>
|
-> Arc<Self::Verifier>
|
||||||
{
|
{
|
||||||
let config = Config { local_key: None, slot_duration: SLOT_DURATION };
|
let config = Config { local_key: None, slot_duration: SLOT_DURATION };
|
||||||
Arc::new(AuraVerifier { client, config, extra: NothingExtra })
|
Arc::new(AuraVerifier { client, config })
|
||||||
}
|
}
|
||||||
|
|
||||||
fn peer(&self, i: usize) -> &Peer<Self::Verifier, ()> {
|
fn peer(&self, i: usize) -> &Peer<Self::Verifier, ()> {
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ substrate-state-machine = { path = "../state-machine" }
|
|||||||
sr-version = { path = "../sr-version" }
|
sr-version = { path = "../sr-version" }
|
||||||
serde = "1.0"
|
serde = "1.0"
|
||||||
serde_derive = "1.0"
|
serde_derive = "1.0"
|
||||||
wasmi = { version = "0.4.2" }
|
wasmi = { version = "0.4.1" }
|
||||||
byteorder = "1.1"
|
byteorder = "1.1"
|
||||||
lazy_static = "1.0"
|
lazy_static = "1.0"
|
||||||
parking_lot = "*"
|
parking_lot = "*"
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ serde_derive = { version = "1.0", optional = true }
|
|||||||
uint = { version = "0.5.0-beta", default-features = false }
|
uint = { version = "0.5.0-beta", default-features = false }
|
||||||
twox-hash = { version = "1.1.0", optional = true }
|
twox-hash = { version = "1.1.0", optional = true }
|
||||||
byteorder = { version = "1.1", default-features = false }
|
byteorder = { version = "1.1", default-features = false }
|
||||||
wasmi = { version = "0.4.2", optional = true }
|
wasmi = { version = "0.4.1", optional = true }
|
||||||
hash-db = { git = "https://github.com/paritytech/trie", default-features = false }
|
hash-db = { git = "https://github.com/paritytech/trie", default-features = false }
|
||||||
hash256-std-hasher = { git = "https://github.com/paritytech/trie", default-features = false }
|
hash256-std-hasher = { git = "https://github.com/paritytech/trie", default-features = false }
|
||||||
ring = { version = "0.12", optional = true }
|
ring = { version = "0.12", optional = true }
|
||||||
|
|||||||
@@ -42,6 +42,25 @@ impl ChangesTrieConfiguration {
|
|||||||
&& block % self.digest_interval == 0
|
&& block % self.digest_interval == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns max digest interval. One if digests are not created at all.
|
||||||
|
/// Returns ::std::u64::MAX instead of panic in the case of overflow.
|
||||||
|
pub fn max_digest_interval(&self) -> u64 {
|
||||||
|
if !self.is_digest_build_enabled() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: use saturating_pow when available
|
||||||
|
let mut max_digest_interval = self.digest_interval;
|
||||||
|
for _ in 1..self.digest_levels {
|
||||||
|
max_digest_interval = match max_digest_interval.checked_mul(self.digest_interval) {
|
||||||
|
Some(max_digest_interval) => max_digest_interval,
|
||||||
|
None => return u64::max_value(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
max_digest_interval
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns Some if digest must be built at given block number.
|
/// Returns Some if digest must be built at given block number.
|
||||||
/// The tuple is:
|
/// The tuple is:
|
||||||
/// (
|
/// (
|
||||||
@@ -124,4 +143,12 @@ mod tests {
|
|||||||
assert_eq!(config(8, 4).digest_level_at_block(4096), Some((4, 4096, 512)));
|
assert_eq!(config(8, 4).digest_level_at_block(4096), Some((4, 4096, 512)));
|
||||||
assert_eq!(config(8, 4).digest_level_at_block(4112), Some((1, 8, 1)));
|
assert_eq!(config(8, 4).digest_level_at_block(4112), Some((1, 8, 1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn max_digest_interval_works() {
|
||||||
|
assert_eq!(config(0, 0).max_digest_interval(), 1);
|
||||||
|
assert_eq!(config(2, 2).max_digest_interval(), 4);
|
||||||
|
assert_eq!(config(8, 4).max_digest_interval(), 4096);
|
||||||
|
assert_eq!(config(::std::u64::MAX, 1024).max_digest_interval(), ::std::u64::MAX);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ build = "build.rs"
|
|||||||
rustc_version = "0.2"
|
rustc_version = "0.2"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
wasmi = { version = "0.4.2", optional = true }
|
wasmi = { version = "0.4.1", optional = true }
|
||||||
substrate-primitives = { path = "../primitives", default-features = false }
|
substrate-primitives = { path = "../primitives", default-features = false }
|
||||||
sr-std = { path = "../sr-std", default-features = false }
|
sr-std = { path = "../sr-std", default-features = false }
|
||||||
parity-codec = { version = "2.1", default-features = false }
|
parity-codec = { version = "2.1", default-features = false }
|
||||||
|
|||||||
@@ -39,15 +39,8 @@ pub fn prune<S: Storage<H>, H: Hasher, F: FnMut(H::Out)>(
|
|||||||
where
|
where
|
||||||
H::Out: HeapSizeOf,
|
H::Out: HeapSizeOf,
|
||||||
{
|
{
|
||||||
// we only CAN prune at block where max-level-digest is created
|
|
||||||
let digest_interval = match config.digest_level_at_block(current_block.number) {
|
|
||||||
Some((digest_level, digest_interval, _)) if digest_level == config.digest_levels =>
|
|
||||||
digest_interval,
|
|
||||||
_ => return,
|
|
||||||
};
|
|
||||||
|
|
||||||
// select range for pruning
|
// select range for pruning
|
||||||
let (first, last) = match pruning_range(min_blocks_to_keep, current_block.number, digest_interval) {
|
let (first, last) = match pruning_range(config, min_blocks_to_keep, current_block.number) {
|
||||||
Some((first, last)) => (first, last),
|
Some((first, last)) => (first, last),
|
||||||
None => return,
|
None => return,
|
||||||
};
|
};
|
||||||
@@ -85,16 +78,34 @@ pub fn prune<S: Storage<H>, H: Hasher, F: FnMut(H::Out)>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Select blocks range (inclusive from both ends) for pruning changes tries in.
|
/// Select blocks range (inclusive from both ends) for pruning changes tries in.
|
||||||
fn pruning_range(min_blocks_to_keep: u64, block: u64, max_digest_interval: u64) -> Option<(u64, u64)> {
|
fn pruning_range(config: &Configuration, min_blocks_to_keep: u64, block: u64) -> Option<(u64, u64)> {
|
||||||
// compute maximal number of high-level digests to keep
|
// compute number of changes tries we actually want to keep
|
||||||
let max_digest_intervals_to_keep = max_digest_intervals_to_keep(min_blocks_to_keep, max_digest_interval);
|
let (prune_interval, blocks_to_keep) = if config.is_digest_build_enabled() {
|
||||||
|
// we only CAN prune at block where max-level-digest is created
|
||||||
|
let max_digest_interval = match config.digest_level_at_block(block) {
|
||||||
|
Some((digest_level, digest_interval, _)) if digest_level == config.digest_levels =>
|
||||||
|
digest_interval,
|
||||||
|
_ => return None,
|
||||||
|
};
|
||||||
|
|
||||||
// number of blocks BEFORE current block where changes tries are not pruned
|
// compute maximal number of high-level digests to keep
|
||||||
let blocks_to_keep = max_digest_intervals_to_keep.checked_mul(max_digest_interval);
|
let max_digest_intervals_to_keep = max_digest_intervals_to_keep(min_blocks_to_keep, max_digest_interval);
|
||||||
|
|
||||||
|
// number of blocks BEFORE current block where changes tries are not pruned
|
||||||
|
(
|
||||||
|
max_digest_interval,
|
||||||
|
max_digest_intervals_to_keep.checked_mul(max_digest_interval)
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
(
|
||||||
|
1,
|
||||||
|
Some(min_blocks_to_keep)
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
// last block for which changes trie is pruned
|
// last block for which changes trie is pruned
|
||||||
let last_block_to_prune = blocks_to_keep.and_then(|b| block.checked_sub(b));
|
let last_block_to_prune = blocks_to_keep.and_then(|b| block.checked_sub(b));
|
||||||
let first_block_to_prune = last_block_to_prune.clone().and_then(|b| b.checked_sub(max_digest_interval));
|
let first_block_to_prune = last_block_to_prune.clone().and_then(|b| b.checked_sub(prune_interval));
|
||||||
|
|
||||||
last_block_to_prune
|
last_block_to_prune
|
||||||
.and_then(|last| first_block_to_prune.map(|first| (first + 1, last)))
|
.and_then(|last| first_block_to_prune.map(|first| (first + 1, last)))
|
||||||
@@ -129,6 +140,13 @@ mod tests {
|
|||||||
use changes_trie::storage::InMemoryStorage;
|
use changes_trie::storage::InMemoryStorage;
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
fn config(interval: u64, levels: u32) -> Configuration {
|
||||||
|
Configuration {
|
||||||
|
digest_interval: interval,
|
||||||
|
digest_levels: levels,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn prune_by_collect<S: Storage<H>, H: Hasher>(
|
fn prune_by_collect<S: Storage<H>, H: Hasher>(
|
||||||
config: &Configuration,
|
config: &Configuration,
|
||||||
storage: &S,
|
storage: &S,
|
||||||
@@ -144,7 +162,6 @@ mod tests {
|
|||||||
pruned_trie_nodes
|
pruned_trie_nodes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn prune_works() {
|
fn prune_works() {
|
||||||
fn prepare_storage() -> InMemoryStorage<Blake2Hasher> {
|
fn prepare_storage() -> InMemoryStorage<Blake2Hasher> {
|
||||||
@@ -213,24 +230,34 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn pruning_range_works() {
|
fn pruning_range_works() {
|
||||||
assert_eq!(pruning_range(2, 0, 100), None);
|
// DIGESTS ARE NOT CREATED + NO TRIES ARE PRUNED
|
||||||
assert_eq!(pruning_range(2, 30, 100), None);
|
assert_eq!(pruning_range(&config(10, 0), 2, 2), None);
|
||||||
assert_eq!(pruning_range(::std::u64::MAX, 1024, 1), None);
|
|
||||||
assert_eq!(pruning_range(1, 1024, ::std::u64::MAX), None);
|
// DIGESTS ARE NOT CREATED + SOME TRIES ARE PRUNED
|
||||||
assert_eq!(pruning_range(::std::u64::MAX, 1024, ::std::u64::MAX), None);
|
assert_eq!(pruning_range(&config(10, 0), 100, 110), Some((10, 10)));
|
||||||
assert_eq!(pruning_range(1024, 512, 512), None);
|
assert_eq!(pruning_range(&config(10, 0), 100, 210), Some((110, 110)));
|
||||||
assert_eq!(pruning_range(1024, 1024, 512), None);
|
|
||||||
|
// DIGESTS ARE CREATED + NO TRIES ARE PRUNED
|
||||||
|
|
||||||
|
assert_eq!(pruning_range(&config(10, 2), 2, 0), None);
|
||||||
|
assert_eq!(pruning_range(&config(10, 2), 30, 100), None);
|
||||||
|
assert_eq!(pruning_range(&config(::std::u64::MAX, 2), 1, 1024), None);
|
||||||
|
assert_eq!(pruning_range(&config(::std::u64::MAX, 2), ::std::u64::MAX, 1024), None);
|
||||||
|
assert_eq!(pruning_range(&config(32, 2), 2048, 512), None);
|
||||||
|
assert_eq!(pruning_range(&config(32, 2), 2048, 1024), None);
|
||||||
|
|
||||||
|
// DIGESTS ARE CREATED + SOME TRIES ARE PRUNED
|
||||||
|
|
||||||
// when we do not want to keep any highest-level-digests
|
// when we do not want to keep any highest-level-digests
|
||||||
// (system forces to keep at least one)
|
// (system forces to keep at least one)
|
||||||
assert_eq!(pruning_range(0, 32, 16), Some((1, 16)));
|
assert_eq!(pruning_range(&config(4, 2), 0, 32), Some((1, 16)));
|
||||||
assert_eq!(pruning_range(0, 64, 16), Some((33, 48)));
|
assert_eq!(pruning_range(&config(4, 2), 0, 64), Some((33, 48)));
|
||||||
// when we want to keep 1 (last) highest-level-digest
|
// when we want to keep 1 (last) highest-level-digest
|
||||||
assert_eq!(pruning_range(16, 32, 16), Some((1, 16)));
|
assert_eq!(pruning_range(&config(4, 2), 16, 32), Some((1, 16)));
|
||||||
assert_eq!(pruning_range(16, 64, 16), Some((33, 48)));
|
assert_eq!(pruning_range(&config(4, 2), 16, 64), Some((33, 48)));
|
||||||
// when we want to keep 1 (last) + 1 additional level digests
|
// when we want to keep 1 (last) + 1 additional level digests
|
||||||
assert_eq!(pruning_range(1024, 1536, 512), Some((1, 512)));
|
assert_eq!(pruning_range(&config(32, 2), 4096, 5120), Some((1, 1024)));
|
||||||
assert_eq!(pruning_range(1024, 2048, 512), Some((513, 1024)));
|
assert_eq!(pruning_range(&config(32, 2), 4096, 6144), Some((1025, 2048)));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
+11
-4
@@ -472,6 +472,11 @@ dependencies = [
|
|||||||
"ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nan-preserving-float"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "net2"
|
name = "net2"
|
||||||
version = "0.2.33"
|
version = "0.2.33"
|
||||||
@@ -980,7 +985,7 @@ dependencies = [
|
|||||||
"substrate-serializer 0.1.0",
|
"substrate-serializer 0.1.0",
|
||||||
"substrate-state-machine 0.1.0",
|
"substrate-state-machine 0.1.0",
|
||||||
"substrate-trie 0.4.0",
|
"substrate-trie 0.4.0",
|
||||||
"wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1014,7 +1019,7 @@ dependencies = [
|
|||||||
"twox-hash 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"twox-hash 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"uint 0.5.0-beta.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"uint 0.5.0-beta.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1374,11 +1379,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasmi"
|
name = "wasmi"
|
||||||
version = "0.4.2"
|
version = "0.4.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"nan-preserving-float 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -1501,6 +1507,7 @@ dependencies = [
|
|||||||
"checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40"
|
"checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40"
|
||||||
"checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125"
|
"checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125"
|
||||||
"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
|
"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
|
||||||
|
"checksum nan-preserving-float 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34d4f00fcc2f4c9efa8cc971db0da9e28290e28e97af47585e48691ef10ff31f"
|
||||||
"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88"
|
"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88"
|
||||||
"checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2"
|
"checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2"
|
||||||
"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea"
|
"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea"
|
||||||
@@ -1579,7 +1586,7 @@ dependencies = [
|
|||||||
"checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d"
|
"checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d"
|
||||||
"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
|
"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
|
||||||
"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
|
"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
|
||||||
"checksum wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8a60b9508cff2b7c27ed41200dd668806280740fadc8c88440e9c88625e84f1a"
|
"checksum wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d184c4b7081f30316f74f8d73c197314dcb56ea7af9323522b42a2fa9cb19453"
|
||||||
"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
|
"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
|
||||||
"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0"
|
"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0"
|
||||||
"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
|
"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
|
||||||
|
|||||||
BIN
Binary file not shown.
@@ -59,7 +59,6 @@ fn staging_testnet_config_genesis() -> GenesisConfig {
|
|||||||
consensus: Some(ConsensusConfig {
|
consensus: Some(ConsensusConfig {
|
||||||
code: include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm").to_vec(), // TODO change
|
code: include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm").to_vec(), // TODO change
|
||||||
authorities: initial_authorities.clone(),
|
authorities: initial_authorities.clone(),
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
system: None,
|
system: None,
|
||||||
balances: Some(BalancesConfig {
|
balances: Some(BalancesConfig {
|
||||||
@@ -70,12 +69,10 @@ fn staging_testnet_config_genesis() -> GenesisConfig {
|
|||||||
transfer_fee: 1 * CENTS,
|
transfer_fee: 1 * CENTS,
|
||||||
creation_fee: 1 * CENTS,
|
creation_fee: 1 * CENTS,
|
||||||
reclaim_rebate: 1 * CENTS,
|
reclaim_rebate: 1 * CENTS,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
session: Some(SessionConfig {
|
session: Some(SessionConfig {
|
||||||
validators: initial_authorities.iter().cloned().map(Into::into).collect(),
|
validators: initial_authorities.iter().cloned().map(Into::into).collect(),
|
||||||
session_length: 5 * MINUTES,
|
session_length: 5 * MINUTES,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
staking: Some(StakingConfig {
|
staking: Some(StakingConfig {
|
||||||
current_era: 0,
|
current_era: 0,
|
||||||
@@ -89,13 +86,11 @@ fn staging_testnet_config_genesis() -> GenesisConfig {
|
|||||||
bonding_duration: 1 * DAYS,
|
bonding_duration: 1 * DAYS,
|
||||||
offline_slash_grace: 4,
|
offline_slash_grace: 4,
|
||||||
minimum_validator_count: 4,
|
minimum_validator_count: 4,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
democracy: Some(DemocracyConfig {
|
democracy: Some(DemocracyConfig {
|
||||||
launch_period: 5 * MINUTES, // 1 day per public referendum
|
launch_period: 5 * MINUTES, // 1 day per public referendum
|
||||||
voting_period: 5 * MINUTES, // 3 days to discuss & vote on an active referendum
|
voting_period: 5 * MINUTES, // 3 days to discuss & vote on an active referendum
|
||||||
minimum_deposit: 50 * DOLLARS, // 12000 as the minimum deposit for a referendum
|
minimum_deposit: 50 * DOLLARS, // 12000 as the minimum deposit for a referendum
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
council_seats: Some(CouncilSeatsConfig {
|
council_seats: Some(CouncilSeatsConfig {
|
||||||
active_council: vec![],
|
active_council: vec![],
|
||||||
@@ -108,23 +103,19 @@ fn staging_testnet_config_genesis() -> GenesisConfig {
|
|||||||
term_duration: 28 * DAYS,
|
term_duration: 28 * DAYS,
|
||||||
desired_seats: 0,
|
desired_seats: 0,
|
||||||
inactive_grace_period: 1, // one additional vote should go by before an inactive voter can be reaped.
|
inactive_grace_period: 1, // one additional vote should go by before an inactive voter can be reaped.
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
council_voting: Some(CouncilVotingConfig {
|
council_voting: Some(CouncilVotingConfig {
|
||||||
cooloff_period: 4 * DAYS,
|
cooloff_period: 4 * DAYS,
|
||||||
voting_period: 1 * DAYS,
|
voting_period: 1 * DAYS,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
timestamp: Some(TimestampConfig {
|
timestamp: Some(TimestampConfig {
|
||||||
period: SECS_PER_BLOCK,
|
period: SECS_PER_BLOCK,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
treasury: Some(TreasuryConfig {
|
treasury: Some(TreasuryConfig {
|
||||||
proposal_bond: Permill::from_percent(5),
|
proposal_bond: Permill::from_percent(5),
|
||||||
proposal_bond_minimum: 1 * DOLLARS,
|
proposal_bond_minimum: 1 * DOLLARS,
|
||||||
spend_period: 1 * DAYS,
|
spend_period: 1 * DAYS,
|
||||||
burn: Permill::from_percent(50),
|
burn: Permill::from_percent(50),
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
contract: Some(ContractConfig {
|
contract: Some(ContractConfig {
|
||||||
contract_fee: 1 * CENTS,
|
contract_fee: 1 * CENTS,
|
||||||
@@ -134,11 +125,9 @@ fn staging_testnet_config_genesis() -> GenesisConfig {
|
|||||||
max_depth: 1024,
|
max_depth: 1024,
|
||||||
block_gas_limit: 10_000_000,
|
block_gas_limit: 10_000_000,
|
||||||
current_schedule: Default::default(),
|
current_schedule: Default::default(),
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
upgrade_key: Some(UpgradeKeyConfig {
|
upgrade_key: Some(UpgradeKeyConfig {
|
||||||
key: endowed_accounts[0].clone(),
|
key: endowed_accounts[0].clone(),
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -186,7 +175,6 @@ pub fn testnet_genesis(
|
|||||||
consensus: Some(ConsensusConfig {
|
consensus: Some(ConsensusConfig {
|
||||||
code: include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm").to_vec(),
|
code: include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm").to_vec(),
|
||||||
authorities: initial_authorities.clone(),
|
authorities: initial_authorities.clone(),
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
system: None,
|
system: None,
|
||||||
balances: Some(BalancesConfig {
|
balances: Some(BalancesConfig {
|
||||||
@@ -197,12 +185,10 @@ pub fn testnet_genesis(
|
|||||||
creation_fee: 0,
|
creation_fee: 0,
|
||||||
reclaim_rebate: 0,
|
reclaim_rebate: 0,
|
||||||
balances: endowed_accounts.iter().map(|&k| (k.into(), (1 << 60))).collect(),
|
balances: endowed_accounts.iter().map(|&k| (k.into(), (1 << 60))).collect(),
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
session: Some(SessionConfig {
|
session: Some(SessionConfig {
|
||||||
validators: initial_authorities.iter().cloned().map(Into::into).collect(),
|
validators: initial_authorities.iter().cloned().map(Into::into).collect(),
|
||||||
session_length: 10,
|
session_length: 10,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
staking: Some(StakingConfig {
|
staking: Some(StakingConfig {
|
||||||
current_era: 0,
|
current_era: 0,
|
||||||
@@ -216,13 +202,11 @@ pub fn testnet_genesis(
|
|||||||
current_offline_slash: 0,
|
current_offline_slash: 0,
|
||||||
current_session_reward: 0,
|
current_session_reward: 0,
|
||||||
offline_slash_grace: 0,
|
offline_slash_grace: 0,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
democracy: Some(DemocracyConfig {
|
democracy: Some(DemocracyConfig {
|
||||||
launch_period: 9,
|
launch_period: 9,
|
||||||
voting_period: 18,
|
voting_period: 18,
|
||||||
minimum_deposit: 10,
|
minimum_deposit: 10,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
council_seats: Some(CouncilSeatsConfig {
|
council_seats: Some(CouncilSeatsConfig {
|
||||||
active_council: endowed_accounts.iter()
|
active_council: endowed_accounts.iter()
|
||||||
@@ -237,23 +221,19 @@ pub fn testnet_genesis(
|
|||||||
term_duration: 1000000,
|
term_duration: 1000000,
|
||||||
desired_seats: (endowed_accounts.len() - initial_authorities.len()) as u32,
|
desired_seats: (endowed_accounts.len() - initial_authorities.len()) as u32,
|
||||||
inactive_grace_period: 1,
|
inactive_grace_period: 1,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
council_voting: Some(CouncilVotingConfig {
|
council_voting: Some(CouncilVotingConfig {
|
||||||
cooloff_period: 75,
|
cooloff_period: 75,
|
||||||
voting_period: 20,
|
voting_period: 20,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
timestamp: Some(TimestampConfig {
|
timestamp: Some(TimestampConfig {
|
||||||
period: 5, // 5 second block time.
|
period: 5, // 5 second block time.
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
treasury: Some(TreasuryConfig {
|
treasury: Some(TreasuryConfig {
|
||||||
proposal_bond: Permill::from_percent(5),
|
proposal_bond: Permill::from_percent(5),
|
||||||
proposal_bond_minimum: 1_000_000,
|
proposal_bond_minimum: 1_000_000,
|
||||||
spend_period: 12 * 60 * 24,
|
spend_period: 12 * 60 * 24,
|
||||||
burn: Permill::from_percent(50),
|
burn: Permill::from_percent(50),
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
contract: Some(ContractConfig {
|
contract: Some(ContractConfig {
|
||||||
contract_fee: 21,
|
contract_fee: 21,
|
||||||
@@ -263,11 +243,9 @@ pub fn testnet_genesis(
|
|||||||
max_depth: 1024,
|
max_depth: 1024,
|
||||||
block_gas_limit: 10_000_000,
|
block_gas_limit: 10_000_000,
|
||||||
current_schedule: Default::default(),
|
current_schedule: Default::default(),
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
upgrade_key: Some(UpgradeKeyConfig {
|
upgrade_key: Some(UpgradeKeyConfig {
|
||||||
key: upgrade_key,
|
key: upgrade_key,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -311,7 +289,7 @@ mod tests {
|
|||||||
|
|
||||||
fn local_testnet_genesis_instant() -> GenesisConfig {
|
fn local_testnet_genesis_instant() -> GenesisConfig {
|
||||||
let mut genesis = local_testnet_genesis();
|
let mut genesis = local_testnet_genesis();
|
||||||
genesis.timestamp = Some(TimestampConfig { period: 0, _genesis_phantom_data: Default::default() });
|
genesis.timestamp = Some(TimestampConfig { period: 0 });
|
||||||
genesis
|
genesis
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ use substrate_service::{
|
|||||||
Roles, TaskExecutor,
|
Roles, TaskExecutor,
|
||||||
};
|
};
|
||||||
use node_executor;
|
use node_executor;
|
||||||
use consensus::{import_queue, start_aura, Config as AuraConfig, AuraImportQueue, NothingExtra};
|
use consensus::{import_queue, start_aura, Config as AuraConfig, AuraImportQueue};
|
||||||
use client;
|
use client;
|
||||||
|
|
||||||
const AURA_SLOT_DURATION: u64 = 6;
|
const AURA_SLOT_DURATION: u64 = 6;
|
||||||
@@ -79,25 +79,17 @@ construct_service_factory! {
|
|||||||
},
|
},
|
||||||
LightService = LightComponents<Self>
|
LightService = LightComponents<Self>
|
||||||
{ |config, executor| <LightComponents<Factory>>::new(config, executor) },
|
{ |config, executor| <LightComponents<Factory>>::new(config, executor) },
|
||||||
FullImportQueue = AuraImportQueue<Self::Block, FullClient<Self>, NothingExtra>
|
FullImportQueue = AuraImportQueue<Self::Block, FullClient<Self>>
|
||||||
{ |config, client| Ok(import_queue(
|
{ |config, client| Ok(import_queue(AuraConfig {
|
||||||
AuraConfig {
|
local_key: None,
|
||||||
|
slot_duration: 5
|
||||||
|
}, client)) },
|
||||||
|
LightImportQueue = AuraImportQueue<Self::Block, LightClient<Self>>
|
||||||
|
{ |config, client| Ok(
|
||||||
|
import_queue(AuraConfig {
|
||||||
local_key: None,
|
local_key: None,
|
||||||
slot_duration: 5
|
slot_duration: 5
|
||||||
},
|
}, client))
|
||||||
client,
|
|
||||||
NothingExtra,
|
|
||||||
))
|
|
||||||
},
|
|
||||||
LightImportQueue = AuraImportQueue<Self::Block, LightClient<Self>, NothingExtra>
|
|
||||||
{ |config, client| Ok(import_queue(
|
|
||||||
AuraConfig {
|
|
||||||
local_key: None,
|
|
||||||
slot_duration: 5
|
|
||||||
},
|
|
||||||
client,
|
|
||||||
NothingExtra,
|
|
||||||
))
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,3 @@ srml-timestamp = { path = "../../srml/timestamp" }
|
|||||||
srml-treasury = { path = "../../srml/treasury" }
|
srml-treasury = { path = "../../srml/treasury" }
|
||||||
srml-contract = { path = "../../srml/contract" }
|
srml-contract = { path = "../../srml/contract" }
|
||||||
wabt = "0.4"
|
wabt = "0.4"
|
||||||
|
|
||||||
[features]
|
|
||||||
benchmarks = []
|
|
||||||
|
|||||||
@@ -17,14 +17,10 @@
|
|||||||
//! A `CodeExecutor` specialisation which uses natively compiled runtime when the wasm to be
|
//! A `CodeExecutor` specialisation which uses natively compiled runtime when the wasm to be
|
||||||
//! executed is equivalent to the natively compiled code.
|
//! executed is equivalent to the natively compiled code.
|
||||||
|
|
||||||
#![cfg_attr(feature = "benchmarks", feature(test))]
|
|
||||||
|
|
||||||
extern crate node_runtime;
|
extern crate node_runtime;
|
||||||
#[macro_use] extern crate substrate_executor;
|
#[macro_use] extern crate substrate_executor;
|
||||||
#[cfg_attr(test, macro_use)] extern crate substrate_primitives as primitives;
|
#[cfg_attr(test, macro_use)] extern crate substrate_primitives as primitives;
|
||||||
|
|
||||||
#[cfg(feature = "benchmarks")] extern crate test;
|
|
||||||
|
|
||||||
#[cfg(test)] extern crate substrate_keyring as keyring;
|
#[cfg(test)] extern crate substrate_keyring as keyring;
|
||||||
#[cfg(test)] extern crate sr_primitives as runtime_primitives;
|
#[cfg(test)] extern crate sr_primitives as runtime_primitives;
|
||||||
#[cfg(test)] extern crate srml_support as runtime_support;
|
#[cfg(test)] extern crate srml_support as runtime_support;
|
||||||
@@ -234,12 +230,10 @@ mod tests {
|
|||||||
transfer_fee: 0,
|
transfer_fee: 0,
|
||||||
creation_fee: 0,
|
creation_fee: 0,
|
||||||
reclaim_rebate: 0,
|
reclaim_rebate: 0,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
session: Some(SessionConfig {
|
session: Some(SessionConfig {
|
||||||
session_length: 2,
|
session_length: 2,
|
||||||
validators: vec![One.to_raw_public().into(), Two.to_raw_public().into(), three],
|
validators: vec![One.to_raw_public().into(), Two.to_raw_public().into(), three],
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
staking: Some(StakingConfig {
|
staking: Some(StakingConfig {
|
||||||
sessions_per_era: 2,
|
sessions_per_era: 2,
|
||||||
@@ -253,7 +247,6 @@ mod tests {
|
|||||||
current_offline_slash: 0,
|
current_offline_slash: 0,
|
||||||
current_session_reward: 0,
|
current_session_reward: 0,
|
||||||
offline_slash_grace: 0,
|
offline_slash_grace: 0,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}),
|
}),
|
||||||
democracy: Some(Default::default()),
|
democracy: Some(Default::default()),
|
||||||
council_seats: Some(Default::default()),
|
council_seats: Some(Default::default()),
|
||||||
@@ -751,19 +744,4 @@ mod tests {
|
|||||||
|
|
||||||
assert!(t.storage_changes_root(Default::default(), 0).is_some());
|
assert!(t.storage_changes_root(Default::default(), 0).is_some());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "benchmarks")]
|
|
||||||
mod benches {
|
|
||||||
use super::*;
|
|
||||||
use test::Bencher;
|
|
||||||
|
|
||||||
#[bench]
|
|
||||||
fn wasm_execute_block(b: &mut Bencher) {
|
|
||||||
b.iter(|| {
|
|
||||||
let mut t = new_test_ext(false);
|
|
||||||
WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "execute_block", &block1(false).0).unwrap();
|
|
||||||
WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "execute_block", &block2().0).unwrap();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
+12
-5
@@ -472,6 +472,11 @@ dependencies = [
|
|||||||
"ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nan-preserving-float"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "net2"
|
name = "net2"
|
||||||
version = "0.2.33"
|
version = "0.2.33"
|
||||||
@@ -934,7 +939,7 @@ dependencies = [
|
|||||||
"rustc_version 0.2.3 (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",
|
"sr-std 0.1.0",
|
||||||
"substrate-primitives 0.1.0",
|
"substrate-primitives 0.1.0",
|
||||||
"wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1265,7 +1270,7 @@ dependencies = [
|
|||||||
"substrate-serializer 0.1.0",
|
"substrate-serializer 0.1.0",
|
||||||
"substrate-state-machine 0.1.0",
|
"substrate-state-machine 0.1.0",
|
||||||
"substrate-trie 0.4.0",
|
"substrate-trie 0.4.0",
|
||||||
"wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1311,7 +1316,7 @@ dependencies = [
|
|||||||
"twox-hash 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"twox-hash 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"uint 0.5.0-beta.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"uint 0.5.0-beta.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1654,11 +1659,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasmi"
|
name = "wasmi"
|
||||||
version = "0.4.2"
|
version = "0.4.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"nan-preserving-float 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -1781,6 +1787,7 @@ dependencies = [
|
|||||||
"checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40"
|
"checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40"
|
||||||
"checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125"
|
"checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125"
|
||||||
"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
|
"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
|
||||||
|
"checksum nan-preserving-float 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34d4f00fcc2f4c9efa8cc971db0da9e28290e28e97af47585e48691ef10ff31f"
|
||||||
"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88"
|
"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88"
|
||||||
"checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2"
|
"checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2"
|
||||||
"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea"
|
"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea"
|
||||||
@@ -1861,7 +1868,7 @@ dependencies = [
|
|||||||
"checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d"
|
"checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d"
|
||||||
"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
|
"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
|
||||||
"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
|
"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
|
||||||
"checksum wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8a60b9508cff2b7c27ed41200dd668806280740fadc8c88440e9c88625e84f1a"
|
"checksum wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d184c4b7081f30316f74f8d73c197314dcb56ea7af9323522b42a2fa9cb19453"
|
||||||
"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
|
"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
|
||||||
"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0"
|
"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0"
|
||||||
"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
|
"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
|
||||||
|
|||||||
BIN
Binary file not shown.
@@ -104,7 +104,6 @@ impl ExtBuilder {
|
|||||||
transfer_fee: self.transfer_fee,
|
transfer_fee: self.transfer_fee,
|
||||||
creation_fee: self.creation_fee,
|
creation_fee: self.creation_fee,
|
||||||
reclaim_rebate: 0,
|
reclaim_rebate: 0,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage().unwrap().0);
|
}.build_storage().unwrap().0);
|
||||||
t.into()
|
t.into()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,7 +54,6 @@ pub fn new_test_ext(authorities: Vec<u64>) -> runtime_io::TestExternalities<Blak
|
|||||||
t.extend(GenesisConfig::<Test>{
|
t.extend(GenesisConfig::<Test>{
|
||||||
code: vec![],
|
code: vec![],
|
||||||
authorities,
|
authorities,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage().unwrap().0);
|
}.build_storage().unwrap().0);
|
||||||
t.into()
|
t.into()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,7 +131,6 @@ impl ExtBuilder {
|
|||||||
transfer_fee: self.transfer_fee,
|
transfer_fee: self.transfer_fee,
|
||||||
creation_fee: self.creation_fee,
|
creation_fee: self.creation_fee,
|
||||||
reclaim_rebate: 0,
|
reclaim_rebate: 0,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage()
|
}.build_storage()
|
||||||
.unwrap().0,
|
.unwrap().0,
|
||||||
);
|
);
|
||||||
@@ -144,7 +143,6 @@ impl ExtBuilder {
|
|||||||
max_depth: 100,
|
max_depth: 100,
|
||||||
block_gas_limit: self.block_gas_limit,
|
block_gas_limit: self.block_gas_limit,
|
||||||
current_schedule: Default::default(),
|
current_schedule: Default::default(),
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage()
|
}.build_storage()
|
||||||
.unwrap().0,
|
.unwrap().0,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -122,13 +122,11 @@ mod tests {
|
|||||||
transfer_fee: 0,
|
transfer_fee: 0,
|
||||||
creation_fee: 0,
|
creation_fee: 0,
|
||||||
reclaim_rebate: 0,
|
reclaim_rebate: 0,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage().unwrap().0);
|
}.build_storage().unwrap().0);
|
||||||
t.extend(democracy::GenesisConfig::<Test>{
|
t.extend(democracy::GenesisConfig::<Test>{
|
||||||
launch_period: 1,
|
launch_period: 1,
|
||||||
voting_period: 3,
|
voting_period: 3,
|
||||||
minimum_deposit: 1,
|
minimum_deposit: 1,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage().unwrap().0);
|
}.build_storage().unwrap().0);
|
||||||
t.extend(seats::GenesisConfig::<Test> {
|
t.extend(seats::GenesisConfig::<Test> {
|
||||||
candidacy_bond: 9,
|
candidacy_bond: 9,
|
||||||
@@ -145,12 +143,10 @@ mod tests {
|
|||||||
presentation_duration: 2,
|
presentation_duration: 2,
|
||||||
desired_seats: 2,
|
desired_seats: 2,
|
||||||
term_duration: 5,
|
term_duration: 5,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage().unwrap().0);
|
}.build_storage().unwrap().0);
|
||||||
t.extend(voting::GenesisConfig::<Test> {
|
t.extend(voting::GenesisConfig::<Test> {
|
||||||
cooloff_period: 2,
|
cooloff_period: 2,
|
||||||
voting_period: 1,
|
voting_period: 1,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage().unwrap().0);
|
}.build_storage().unwrap().0);
|
||||||
runtime_io::TestExternalities::new(t)
|
runtime_io::TestExternalities::new(t)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -358,13 +358,11 @@ mod tests {
|
|||||||
transfer_fee: 0,
|
transfer_fee: 0,
|
||||||
creation_fee: 0,
|
creation_fee: 0,
|
||||||
reclaim_rebate: 0,
|
reclaim_rebate: 0,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage().unwrap().0);
|
}.build_storage().unwrap().0);
|
||||||
t.extend(GenesisConfig::<Test>{
|
t.extend(GenesisConfig::<Test>{
|
||||||
launch_period: 1,
|
launch_period: 1,
|
||||||
voting_period: 1,
|
voting_period: 1,
|
||||||
minimum_deposit: 1,
|
minimum_deposit: 1,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage().unwrap().0);
|
}.build_storage().unwrap().0);
|
||||||
runtime_io::TestExternalities::new(t)
|
runtime_io::TestExternalities::new(t)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -313,7 +313,6 @@ mod tests {
|
|||||||
t.extend(GenesisConfig::<Test>{
|
t.extend(GenesisConfig::<Test>{
|
||||||
dummy: 42,
|
dummy: 42,
|
||||||
foo: 24,
|
foo: 24,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage().unwrap().0);
|
}.build_storage().unwrap().0);
|
||||||
t.into()
|
t.into()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -327,7 +327,6 @@ mod tests {
|
|||||||
transfer_fee: 0,
|
transfer_fee: 0,
|
||||||
creation_fee: 0,
|
creation_fee: 0,
|
||||||
reclaim_rebate: 0,
|
reclaim_rebate: 0,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage().unwrap().0);
|
}.build_storage().unwrap().0);
|
||||||
let xt = primitives::testing::TestXt(Some(1), 0, Call::transfer(2.into(), 69.into()));
|
let xt = primitives::testing::TestXt(Some(1), 0, Call::transfer(2.into(), 69.into()));
|
||||||
let mut t = runtime_io::TestExternalities::<Blake2Hasher>::new(t);
|
let mut t = runtime_io::TestExternalities::<Blake2Hasher>::new(t);
|
||||||
|
|||||||
@@ -270,16 +270,13 @@ mod tests {
|
|||||||
t.extend(consensus::GenesisConfig::<Test>{
|
t.extend(consensus::GenesisConfig::<Test>{
|
||||||
code: vec![],
|
code: vec![],
|
||||||
authorities: vec![1, 2, 3],
|
authorities: vec![1, 2, 3],
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage().unwrap().0);
|
}.build_storage().unwrap().0);
|
||||||
t.extend(timestamp::GenesisConfig::<Test>{
|
t.extend(timestamp::GenesisConfig::<Test>{
|
||||||
period: 5,
|
period: 5,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage().unwrap().0);
|
}.build_storage().unwrap().0);
|
||||||
t.extend(GenesisConfig::<Test>{
|
t.extend(GenesisConfig::<Test>{
|
||||||
session_length: 2,
|
session_length: 2,
|
||||||
validators: vec![1, 2, 3],
|
validators: vec![1, 2, 3],
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage().unwrap().0);
|
}.build_storage().unwrap().0);
|
||||||
runtime_io::TestExternalities::new(t)
|
runtime_io::TestExternalities::new(t)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,12 +88,10 @@ pub fn new_test_ext(
|
|||||||
t.extend(consensus::GenesisConfig::<Test>{
|
t.extend(consensus::GenesisConfig::<Test>{
|
||||||
code: vec![],
|
code: vec![],
|
||||||
authorities: vec![],
|
authorities: vec![],
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage().unwrap().0);
|
}.build_storage().unwrap().0);
|
||||||
t.extend(session::GenesisConfig::<Test>{
|
t.extend(session::GenesisConfig::<Test>{
|
||||||
session_length,
|
session_length,
|
||||||
validators: vec![10, 20],
|
validators: vec![10, 20],
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage().unwrap().0);
|
}.build_storage().unwrap().0);
|
||||||
t.extend(balances::GenesisConfig::<Test>{
|
t.extend(balances::GenesisConfig::<Test>{
|
||||||
balances: if monied {
|
balances: if monied {
|
||||||
@@ -111,7 +109,6 @@ pub fn new_test_ext(
|
|||||||
transfer_fee: 0,
|
transfer_fee: 0,
|
||||||
creation_fee: 0,
|
creation_fee: 0,
|
||||||
reclaim_rebate: 0,
|
reclaim_rebate: 0,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage().unwrap().0);
|
}.build_storage().unwrap().0);
|
||||||
t.extend(GenesisConfig::<Test>{
|
t.extend(GenesisConfig::<Test>{
|
||||||
sessions_per_era,
|
sessions_per_era,
|
||||||
@@ -125,11 +122,9 @@ pub fn new_test_ext(
|
|||||||
current_session_reward: reward,
|
current_session_reward: reward,
|
||||||
current_offline_slash: 20,
|
current_offline_slash: 20,
|
||||||
offline_slash_grace: 0,
|
offline_slash_grace: 0,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage().unwrap().0);
|
}.build_storage().unwrap().0);
|
||||||
t.extend(timestamp::GenesisConfig::<Test>{
|
t.extend(timestamp::GenesisConfig::<Test>{
|
||||||
period: 5,
|
period: 5
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage().unwrap().0);
|
}.build_storage().unwrap().0);
|
||||||
runtime_io::TestExternalities::new(t)
|
runtime_io::TestExternalities::new(t)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -627,8 +627,6 @@ macro_rules! __generate_genesis_config {
|
|||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
pub struct GenesisConfig<$traitinstance: $traittype> {
|
pub struct GenesisConfig<$traitinstance: $traittype> {
|
||||||
#[serde(skip)]
|
|
||||||
pub _genesis_phantom_data: $crate::storage::generator::PhantomData<$traitinstance>,
|
|
||||||
$(pub $fieldname : $fieldtype ,)*
|
$(pub $fieldname : $fieldtype ,)*
|
||||||
$( $(#[$attr])* pub $extrafieldname : $extrafieldty ,)*
|
$( $(#[$attr])* pub $extrafieldname : $extrafieldty ,)*
|
||||||
}
|
}
|
||||||
@@ -637,7 +635,6 @@ macro_rules! __generate_genesis_config {
|
|||||||
impl<$traitinstance: $traittype> Default for GenesisConfig<$traitinstance> {
|
impl<$traitinstance: $traittype> Default for GenesisConfig<$traitinstance> {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
GenesisConfig {
|
GenesisConfig {
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
$($fieldname : $fielddefault ,)*
|
$($fieldname : $fielddefault ,)*
|
||||||
$($extrafieldname : $extrafielddefault ,)*
|
$($extrafieldname : $extrafielddefault ,)*
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -201,6 +201,7 @@ decl_storage! {
|
|||||||
}
|
}
|
||||||
add_extra_genesis {
|
add_extra_genesis {
|
||||||
config(changes_trie_config): Option<ChangesTrieConfiguration>;
|
config(changes_trie_config): Option<ChangesTrieConfiguration>;
|
||||||
|
config(_phantom): ::std::marker::PhantomData<T>;
|
||||||
|
|
||||||
build(|storage: &mut primitives::StorageMap, _: &mut primitives::ChildrenStorageMap, config: &GenesisConfig<T>| {
|
build(|storage: &mut primitives::StorageMap, _: &mut primitives::ChildrenStorageMap, config: &GenesisConfig<T>| {
|
||||||
use codec::Encode;
|
use codec::Encode;
|
||||||
|
|||||||
@@ -211,10 +211,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn timestamp_works() {
|
fn timestamp_works() {
|
||||||
let mut t = system::GenesisConfig::<Test>::default().build_storage().unwrap().0;
|
let mut t = system::GenesisConfig::<Test>::default().build_storage().unwrap().0;
|
||||||
t.extend(GenesisConfig::<Test> {
|
t.extend(GenesisConfig::<Test> { period: 0 }.build_storage().unwrap().0);
|
||||||
period: 5,
|
|
||||||
_genesis_phantom_data: Default::default()
|
|
||||||
}.build_storage().unwrap().0);
|
|
||||||
|
|
||||||
with_externalities(&mut TestExternalities::new(t), || {
|
with_externalities(&mut TestExternalities::new(t), || {
|
||||||
Timestamp::set_timestamp(42);
|
Timestamp::set_timestamp(42);
|
||||||
@@ -227,10 +224,7 @@ mod tests {
|
|||||||
#[should_panic(expected = "Timestamp must be updated only once in the block")]
|
#[should_panic(expected = "Timestamp must be updated only once in the block")]
|
||||||
fn double_timestamp_should_fail() {
|
fn double_timestamp_should_fail() {
|
||||||
let mut t = system::GenesisConfig::<Test>::default().build_storage().unwrap().0;
|
let mut t = system::GenesisConfig::<Test>::default().build_storage().unwrap().0;
|
||||||
t.extend(GenesisConfig::<Test> {
|
t.extend(GenesisConfig::<Test> { period: 5 }.build_storage().unwrap().0);
|
||||||
period: 5,
|
|
||||||
_genesis_phantom_data: Default::default()
|
|
||||||
}.build_storage().unwrap().0);
|
|
||||||
|
|
||||||
with_externalities(&mut TestExternalities::new(t), || {
|
with_externalities(&mut TestExternalities::new(t), || {
|
||||||
Timestamp::set_timestamp(42);
|
Timestamp::set_timestamp(42);
|
||||||
@@ -243,10 +237,7 @@ mod tests {
|
|||||||
#[should_panic(expected = "Timestamp must increment by at least <BlockPeriod> between sequential blocks")]
|
#[should_panic(expected = "Timestamp must increment by at least <BlockPeriod> between sequential blocks")]
|
||||||
fn block_period_is_enforced() {
|
fn block_period_is_enforced() {
|
||||||
let mut t = system::GenesisConfig::<Test>::default().build_storage().unwrap().0;
|
let mut t = system::GenesisConfig::<Test>::default().build_storage().unwrap().0;
|
||||||
t.extend(GenesisConfig::<Test> {
|
t.extend(GenesisConfig::<Test> { period: 5 }.build_storage().unwrap().0);
|
||||||
period: 5,
|
|
||||||
_genesis_phantom_data: Default::default()
|
|
||||||
}.build_storage().unwrap().0);
|
|
||||||
|
|
||||||
with_externalities(&mut TestExternalities::new(t), || {
|
with_externalities(&mut TestExternalities::new(t), || {
|
||||||
Timestamp::set_timestamp(42);
|
Timestamp::set_timestamp(42);
|
||||||
|
|||||||
@@ -330,14 +330,12 @@ mod tests {
|
|||||||
creation_fee: 0,
|
creation_fee: 0,
|
||||||
existential_deposit: 0,
|
existential_deposit: 0,
|
||||||
reclaim_rebate: 0,
|
reclaim_rebate: 0,
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage().unwrap().0);
|
}.build_storage().unwrap().0);
|
||||||
t.extend(GenesisConfig::<Test>{
|
t.extend(GenesisConfig::<Test>{
|
||||||
proposal_bond: Permill::from_percent(5),
|
proposal_bond: Permill::from_percent(5),
|
||||||
proposal_bond_minimum: 1,
|
proposal_bond_minimum: 1,
|
||||||
spend_period: 2,
|
spend_period: 2,
|
||||||
burn: Permill::from_percent(50),
|
burn: Permill::from_percent(50),
|
||||||
_genesis_phantom_data: Default::default(),
|
|
||||||
}.build_storage().unwrap().0);
|
}.build_storage().unwrap().0);
|
||||||
t.into()
|
t.into()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user