Skip to content

Commit 28d8fa9

Browse files
kianenigmachemegui1117JoshOrndorffbkchr
authored andcommitted
Trie version migration pallet (paritytech#10073)
* starting * Updated from other branch. * setting flag * flag in storage struct * fix flagging to access and insert. * added todo to fix * also missing serialize meta to storage proof * extract meta. * Isolate old trie layout. * failing test that requires storing in meta when old hash scheme is used. * old hash compatibility * Db migrate. * runing tests with both states when interesting. * fix chain spec test with serde default. * export state (missing trie function). * Pending using new branch, lacking genericity on layout resolution. * extract and set global meta * Update to branch 4 * fix iterator with root flag (no longer insert node). * fix trie root hashing of root * complete basic backend. * Remove old_hash meta from proof that do not use inner_hashing. * fix trie test for empty (force layout on empty deltas). * Root update fix. * debug on meta * Use trie key iteration that do not include value in proofs. * switch default test ext to use inner hash. * small integration test, and fix tx cache mgmt in ext. test failing * Proof scenario at state-machine level. * trace for db upgrade * try different param * act more like iter_from. * Bigger batches. * Update trie dependency. * drafting codec changes and refact * before removing unused branch no value alt hashing. more work todo rename all flag var to alt_hash, and remove extrinsic replace by storage query at every storage_root call. * alt hashing only for branch with value. * fix trie tests * Hash of value include the encoded size. * removing fields(broken) * fix trie_stream to also include value length in inner hash. * triedbmut only using alt type if inner hashing. * trie_stream to also only use alt hashing type when actually alt hashing. * Refactor meta state, logic should work with change of trie treshold. * Remove NoMeta variant. * Remove state_hashed trigger specific functions. * pending switching to using threshold, new storage root api does not make much sense. * refactoring to use state from backend (not possible payload changes). * Applying from previous state * Remove default from storage, genesis need a special build. * rem empty space * Catch problem: when using triedb with default: we should not revert nodes: otherwhise thing as trie codec cannot decode-encode without changing state. * fix compilation * Right logic to avoid switch on reencode when default layout. * Clean up some todos * remove trie meta from root upstream * update upstream and fix benches. * split some long lines. * UPdate trie crate to work with new design. * Finish update to refactored upstream. * update to latest triedb changes. * Clean up. * fix executor test. * rust fmt from master. * rust format. * rustfmt * fix * start host function driven versioning * update state-machine part * still need access to state version from runtime * state hash in mem: wrong * direction likely correct, but passing call to code exec for genesis init seem awkward. * state version serialize in runtime, wrong approach, just initialize it with no threshold for core api < 4 seems more proper. * stateversion from runtime version (core api >= 4). * update trie, fix tests * unused import * clean some TODOs * Require RuntimeVersionOf for executor * use RuntimeVersionOf to resolve genesis state version. * update runtime version test * fix state-machine tests * TODO * Use runtime version from storage wasm with fast sync. * rustfmt * fmt * fix test * revert useless changes. * clean some unused changes * fmt * removing useless trait function. * remove remaining reference to state_hash * fix some imports * Follow chain state version management. * trie update, fix and constant threshold for trie layouts. * update deps * Update to latest trie pr changes. * fix benches * Verify proof requires right layout. * update trie_root * Update trie deps to latest * Update to latest trie versioning * Removing patch * update lock * extrinsic for sc-service-test using layout v0. * Adding RuntimeVersionOf to CallExecutor works. * fmt * error when resolving version and no wasm in storage. * use existing utils to instantiate runtime code. * migration pallet * Patch to delay runtime switch. * Revert "Patch to delay runtime switch." This reverts commit d35f273. * fix test * fix child migration calls. * useless closure * remove remaining state_hash variables. * Fix and add more tests * Remove outdated comment * useless inner hash * fmt * remote tests * finally ksm works * batches are broken * clean the benchmarks * Apply suggestions from code review Co-authored-by: Guillaume Thiolliere <[email protected]> * Apply suggestions from code review Co-authored-by: Guillaume Thiolliere <[email protected]> * Update frame/state-trie-migration/src/lib.rs Co-authored-by: Joshy Orndorff <[email protected]> * Update frame/state-trie-migration/src/lib.rs * brand new version * fix build * Update frame/state-trie-migration/src/lib.rs Co-authored-by: Guillaume Thiolliere <[email protected]> * Update frame/state-trie-migration/src/lib.rs Co-authored-by: Guillaume Thiolliere <[email protected]> * Update primitives/storage/src/lib.rs Co-authored-by: cheme <[email protected]> * Update frame/state-trie-migration/src/lib.rs Co-authored-by: cheme <[email protected]> * Update frame/state-trie-migration/src/lib.rs Co-authored-by: cheme <[email protected]> * fmt and opt-in feature to apply state change. * feature gate core version, use new test feature for node and test node * Use a 'State' api version instead of Core one. * fix merge of test function * use blake macro. * Fix state api (require declaring the api in runtime). * Opt out feature, fix macro for io to select a given version instead of latest. * run test nodes on new state. * fix * new test structure * new testing stuff from emeric * Add commit_all, still not working * Fix all tests * add comment * we have PoV tracking baby * document stuff, but proof size is still wrong * FUCK YEAH * a big batch of review comments * add more tests * tweak test * update config * some remote-ext stuff * delete some of the old stuff * sync more files with master to minimize the diff * Fix all tests * make signed migration a bit more relaxed * add witness check to signed submissions * allow custom migration to also go above limit * Fix these pesky tests * ==== removal of the unsigned stuff ==== * Make all tests work again * separate the tests from the logic so it can be reused easier * fix overall build * Update frame/state-trie-migration/src/lib.rs Co-authored-by: cheme <[email protected]> * Update frame/state-trie-migration/src/lib.rs Co-authored-by: cheme <[email protected]> * Slightly better termination * some final tweaks * Fix tests * Restrict access to signed migrations * address most of the review comments * fix defensive * New simplified code * Fix weights * fmt * Update frame/state-trie-migration/src/lib.rs Co-authored-by: Bastian Köcher <[email protected]> * make the tests correctly fail * Fix build * Fix build * try and fix the benchmarks * fix build * Fix cargo file * Fix runtime deposit * make rustdoc happy * cargo run --quiet --profile=production --features=runtime-benchmarks --manifest-path=bin/node/cli/Cargo.toml -- benchmark --chain=dev --steps=50 --repeat=20 --pallet=pallet_state_trie_migration --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --output=./frame/state-trie-migration/src/weights.rs --template=./.maintain/frame-weight-template.hbs Co-authored-by: cheme <[email protected]> Co-authored-by: Guillaume Thiolliere <[email protected]> Co-authored-by: Joshy Orndorff <[email protected]> Co-authored-by: Bastian Köcher <[email protected]> Co-authored-by: Parity Bot <[email protected]>
1 parent 05398e8 commit 28d8fa9

File tree

16 files changed

+1954
-41
lines changed

16 files changed

+1954
-41
lines changed

Cargo.lock

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bin/node/runtime/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ pallet-session = { version = "4.0.0-dev", features = [ "historical" ], path = ".
8787
pallet-session-benchmarking = { version = "4.0.0-dev", path = "../../../frame/session/benchmarking", default-features = false, optional = true }
8888
pallet-staking = { version = "4.0.0-dev", default-features = false, path = "../../../frame/staking" }
8989
pallet-staking-reward-curve = { version = "4.0.0-dev", default-features = false, path = "../../../frame/staking/reward-curve" }
90+
pallet-state-trie-migration = { version = "4.0.0-dev", default-features = false, path = "../../../frame/state-trie-migration" }
9091
pallet-scheduler = { version = "4.0.0-dev", default-features = false, path = "../../../frame/scheduler" }
9192
pallet-society = { version = "4.0.0-dev", default-features = false, path = "../../../frame/society" }
9293
pallet-sudo = { version = "4.0.0-dev", default-features = false, path = "../../../frame/sudo" }
@@ -153,6 +154,7 @@ std = [
153154
"sp-runtime/std",
154155
"sp-staking/std",
155156
"pallet-staking/std",
157+
"pallet-state-trie-migration/std",
156158
"sp-session/std",
157159
"pallet-sudo/std",
158160
"frame-support/std",
@@ -214,6 +216,7 @@ runtime-benchmarks = [
214216
"pallet-session-benchmarking",
215217
"pallet-society/runtime-benchmarks",
216218
"pallet-staking/runtime-benchmarks",
219+
"pallet-state-trie-migration/runtime-benchmarks",
217220
"pallet-timestamp/runtime-benchmarks",
218221
"pallet-tips/runtime-benchmarks",
219222
"pallet-transaction-storage/runtime-benchmarks",
@@ -261,6 +264,7 @@ try-runtime = [
261264
"pallet-session/try-runtime",
262265
"pallet-society/try-runtime",
263266
"pallet-staking/try-runtime",
267+
"pallet-state-trie-migration/try-runtime",
264268
"pallet-sudo/try-runtime",
265269
"pallet-timestamp/try-runtime",
266270
"pallet-tips/try-runtime",

bin/node/runtime/src/lib.rs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ use frame_support::{
3939
};
4040
use frame_system::{
4141
limits::{BlockLength, BlockWeights},
42-
EnsureRoot,
42+
EnsureRoot, EnsureSigned,
4343
};
4444
pub use node_primitives::{AccountId, Signature};
4545
use node_primitives::{AccountIndex, Balance, BlockNumber, Hash, Index, Moment};
@@ -1367,6 +1367,28 @@ impl pallet_whitelist::Config for Runtime {
13671367
type WeightInfo = pallet_whitelist::weights::SubstrateWeight<Runtime>;
13681368
}
13691369

1370+
parameter_types! {
1371+
pub const SignedMigrationMaxLimits: pallet_state_trie_migration::MigrationLimits =
1372+
pallet_state_trie_migration::MigrationLimits { size: 1024 * 1024 / 2, item: 512 };
1373+
pub const MigrationSignedDepositPerItem: Balance = 1 * CENTS;
1374+
pub const MigrationSignedDepositBase: Balance = 20 * DOLLARS;
1375+
}
1376+
1377+
impl pallet_state_trie_migration::Config for Runtime {
1378+
type Event = Event;
1379+
type ControlOrigin = EnsureRoot<AccountId>;
1380+
type Currency = Balances;
1381+
type SignedDepositPerItem = MigrationSignedDepositPerItem;
1382+
type SignedDepositBase = MigrationSignedDepositBase;
1383+
type SignedMigrationMaxLimits = SignedMigrationMaxLimits;
1384+
// Warning: this is not advised, as it might allow the chain to be temporarily DOS-ed.
1385+
// Preferably, if the chain's governance/maintenance team is planning on using a specific
1386+
// account for the migration, put it here to make sure only that account can trigger the signed
1387+
// migrations.
1388+
type SignedFilter = EnsureSigned<Self::AccountId>;
1389+
type WeightInfo = ();
1390+
}
1391+
13701392
construct_runtime!(
13711393
pub enum Runtime where
13721394
Block = Block,
@@ -1418,6 +1440,7 @@ construct_runtime!(
14181440
Uniques: pallet_uniques,
14191441
TransactionStorage: pallet_transaction_storage,
14201442
BagsList: pallet_bags_list,
1443+
StateTrieMigration: pallet_state_trie_migration,
14211444
ChildBounties: pallet_child_bounties,
14221445
Referenda: pallet_referenda,
14231446
ConvictionVoting: pallet_conviction_voting,
@@ -1512,6 +1535,7 @@ mod benches {
15121535
[pallet_scheduler, Scheduler]
15131536
[pallet_session, SessionBench::<Runtime>]
15141537
[pallet_staking, Staking]
1538+
[pallet_state_trie_migration, StateTrieMigration]
15151539
[frame_system, SystemBench::<Runtime>]
15161540
[pallet_timestamp, Timestamp]
15171541
[pallet_tips, Tips]

frame/bags-list/remote-tests/src/migration.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@ pub async fn execute<Runtime: RuntimeT, Block: BlockT + DeserializeOwned>(
3434
.mode(Mode::Online(OnlineConfig {
3535
transport: ws_url.to_string().into(),
3636
pallets: vec![pallet_staking::Pallet::<Runtime>::name().to_string()],
37-
at: None,
38-
state_snapshot: None,
37+
..Default::default()
3938
}))
4039
.build()
4140
.await

frame/bags-list/remote-tests/src/sanity_check.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ pub async fn execute<Runtime: crate::RuntimeT, Block: BlockT + DeserializeOwned>
3535
.mode(Mode::Online(OnlineConfig {
3636
transport: ws_url.to_string().into(),
3737
pallets: vec![pallet_bags_list::Pallet::<Runtime>::name().to_string()],
38-
at: None,
39-
state_snapshot: None,
38+
..Default::default()
4039
}))
4140
.inject_hashed_prefix(&<pallet_staking::Bonded<Runtime>>::prefix_hash())
4241
.inject_hashed_prefix(&<pallet_staking::Ledger<Runtime>>::prefix_hash())

frame/bags-list/remote-tests/src/snapshot.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ pub async fn execute<Runtime: crate::RuntimeT, Block: BlockT + DeserializeOwned>
3535
// is bags-list.
3636
pallets: vec![pallet_bags_list::Pallet::<Runtime>::name().to_string()],
3737
at: None,
38-
state_snapshot: None,
38+
..Default::default()
3939
}))
4040
.inject_hashed_prefix(&<pallet_staking::Bonded<Runtime>>::prefix_hash())
4141
.inject_hashed_prefix(&<pallet_staking::Ledger<Runtime>>::prefix_hash())
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
[package]
2+
name = "pallet-state-trie-migration"
3+
version = "4.0.0-dev"
4+
authors = ["Parity Technologies <[email protected]>"]
5+
edition = "2021"
6+
license = "Apache-2.0"
7+
homepage = "https://substrate.dev"
8+
repository = "https://github.com/paritytech/substrate/"
9+
description = "FRAME pallet migration of trie"
10+
readme = "README.md"
11+
12+
[package.metadata.docs.rs]
13+
targets = ["x86_64-unknown-linux-gnu"]
14+
15+
[dependencies]
16+
scale-info = { version = "2.0.1", default-features = false, features = ["derive"] }
17+
codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false }
18+
log = { version = "0.4.14", default-features = false }
19+
20+
sp-std = { default-features = false, path = "../../primitives/std" }
21+
sp-io = { default-features = false, path = "../../primitives/io" }
22+
sp-core = { default-features = false, path = "../../primitives/core" }
23+
sp-runtime = { default-features = false, path = "../../primitives/runtime" }
24+
25+
frame-support = { default-features = false, path = "../support" }
26+
frame-system = { default-features = false, path = "../system" }
27+
frame-benchmarking = { default-features = false, path = "../benchmarking", optional = true }
28+
29+
serde = { version = "1.0.133", optional = true }
30+
thousands = { version = "0.2.0", optional = true }
31+
remote-externalities = { path = "../../utils/frame/remote-externalities", optional = true }
32+
zstd = { version = "0.9.0", optional = true }
33+
34+
[dev-dependencies]
35+
pallet-balances = { path = "../balances" }
36+
parking_lot = "0.12.0"
37+
sp-tracing = { path = "../../primitives/tracing" }
38+
tokio = { version = "1.10", features = ["macros"] }
39+
40+
[features]
41+
default = ["std"]
42+
std = [
43+
"log/std",
44+
"scale-info/std",
45+
"codec/std",
46+
"frame-benchmarking/std",
47+
"frame-support/std",
48+
"frame-system/std",
49+
"sp-core/std",
50+
"sp-io/std",
51+
"sp-runtime/std",
52+
"sp-std/std"
53+
]
54+
runtime-benchmarks = ["frame-benchmarking"]
55+
try-runtime = ["frame-support/try-runtime"]
56+
57+
remote-test = [ "std", "zstd", "serde", "thousands", "remote-externalities" ]

0 commit comments

Comments
 (0)