diff --git a/Cargo.lock b/Cargo.lock index 543ab4428..e6bb4df13 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -794,6 +794,7 @@ dependencies = [ "log4rs", "malan-runtime", "pallet-im-online", + "parity-scale-codec", "parking_lot 0.11.2", "sc-authority-discovery", "sc-basic-authorship", @@ -802,6 +803,7 @@ dependencies = [ "sc-client-api", "sc-consensus", "sc-consensus-babe", + "sc-consensus-epochs", "sc-consensus-slots", "sc-executor", "sc-finality-grandpa", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 8a9ef9656..1ef30ca37 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -16,7 +16,7 @@ parking_lot = "0.11.1" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" clap = { version = "3.0", features = ["derive"] } - +codec = { package = "parity-scale-codec", version = "3.0.0" } # Substrate client sc-authority-discovery = { git = "https://github.com/chainx-org/substrate", branch = "polkadot-v0.9.18-fix2" } sc-basic-authorship = { git = "https://github.com/chainx-org/substrate", branch = "polkadot-v0.9.18-fix2" } @@ -24,6 +24,7 @@ sc-chain-spec = { git = "https://github.com/chainx-org/substrate", branch = "pol sc-client-api = { git = "https://github.com/chainx-org/substrate", branch = "polkadot-v0.9.18-fix2" } sc-consensus = { git = "https://github.com/chainx-org/substrate", branch = "polkadot-v0.9.18-fix2" } sc-consensus-babe = { git = "https://github.com/chainx-org/substrate", branch = "polkadot-v0.9.18-fix2" } +sc-consensus-epochs = { git = "https://github.com/chainx-org/substrate", branch = "polkadot-v0.9.18-fix2" } sc-consensus-slots = { git = "https://github.com/chainx-org/substrate", branch = "polkadot-v0.9.18-fix2" } sc-executor = { git = "https://github.com/chainx-org/substrate", branch = "polkadot-v0.9.18-fix2" } sc-finality-grandpa = { git = "https://github.com/chainx-org/substrate", branch = "polkadot-v0.9.18-fix2" } diff --git a/cli/src/cli.rs b/cli/src/cli.rs index 8cdbff3c3..f9ea4297d 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -1,6 +1,12 @@ // Copyright 2019-2023 ChainX Project Authors. Licensed under GPL-3.0. -use sc_cli::{CliConfiguration, KeySubcommand, SignCmd, VanityCmd, VerifyCmd}; +use sc_cli::{ + CliConfiguration, KeySubcommand, PruningParams, Result, SharedParams, SignCmd, SubstrateCli, + VanityCmd, VerifyCmd, +}; +use sc_client_api::AuxStore; + +use chainx_service::new_partial; #[derive(Debug, clap::Parser)] pub struct Cli { @@ -58,6 +64,123 @@ pub enum Subcommand { /// Revert the chain to a previous state. Revert(sc_cli::RevertCmd), + + /// Dump or override babe epoch change config + #[clap(subcommand)] + FixBabeEpoch(FixEpochSubCommand), +} + +#[derive(Debug, clap::Subcommand)] +pub enum FixEpochSubCommand { + /// Dump current babe epoch change config + Dump(FixEpochDumpCommand), + /// Override current babe epoch change config by the specified raw config data(bytes) + Override(FixEpochOverrideommand), +} + +impl FixEpochSubCommand { + /// Run the command + pub fn run(&self, cli: &C) -> Result<()> { + match self { + FixEpochSubCommand::Dump(cmd) => cmd.run(cli), + FixEpochSubCommand::Override(cmd) => cmd.run(cli), + } + } +} + +#[derive(Debug, clap::Parser)] +pub struct FixEpochDumpCommand { + #[allow(missing_docs)] + #[clap(flatten)] + pub shared_params: SharedParams, + + #[allow(missing_docs)] + #[clap(flatten)] + pub pruning_params: PruningParams, +} +const BABE_EPOCH_CHANGES_KEY: &[u8] = b"babe_epoch_changes"; +use codec::{Decode, Encode}; +use sc_consensus_babe::Epoch; +use sc_consensus_epochs::EpochChangesFor; + +impl FixEpochDumpCommand { + pub fn run(&self, cli: &C) -> Result<()> { + let runner = cli.create_runner(self)?; + runner.sync_run(|mut config| { + let components = new_partial::< + chainx_runtime::RuntimeApi, + chainx_executor::ChainXExecutor, + >(&mut config)?; + let client = components.client; + let bytes = client + .get_aux(BABE_EPOCH_CHANGES_KEY) + .expect("Access DB should success") + .expect("value must exist"); + let hex_str = hex::encode(&bytes); + println!("{}", hex_str); + let epoch: EpochChangesFor = + codec::Decode::decode(&mut &bytes[..]).expect("Decode must success"); + println!("epoch: {:?}", epoch); + Ok(()) + }) + } +} + +#[derive(Debug, clap::Parser)] +pub struct FixEpochOverrideommand { + #[allow(missing_docs)] + #[clap(flatten)] + pub shared_params: SharedParams, + + #[allow(missing_docs)] + #[clap(flatten)] + pub pruning_params: PruningParams, + + #[clap(long)] + pub bytes: String, +} + +impl FixEpochOverrideommand { + pub fn run(&self, cli: &C) -> Result<()> { + let runner = cli.create_runner(self)?; + runner.sync_run(|mut config| { + let components = new_partial::< + chainx_runtime::RuntimeApi, + chainx_executor::ChainXExecutor, + >(&mut config)?; + let client = components.client; + + let bytes = hex::decode(&self.bytes).expect("require hex string without 0x"); + let epoch: EpochChangesFor = + Decode::decode(&mut &bytes[..]).expect("Decode must success"); + println!("epoch: {:?}", epoch); + + client + .insert_aux(&[(BABE_EPOCH_CHANGES_KEY, &epoch.encode()[..])], &[]) + .expect("Insert to db must success"); + Ok(()) + }) + } +} + +impl CliConfiguration for FixEpochDumpCommand { + fn shared_params(&self) -> &SharedParams { + &self.shared_params + } + + fn pruning_params(&self) -> Option<&PruningParams> { + Some(&self.pruning_params) + } +} + +impl CliConfiguration for FixEpochOverrideommand { + fn shared_params(&self) -> &SharedParams { + &self.shared_params + } + + fn pruning_params(&self) -> Option<&PruningParams> { + Some(&self.pruning_params) + } } #[allow(missing_docs)] diff --git a/cli/src/command.rs b/cli/src/command.rs index cdbb32a78..a206bd379 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -417,5 +417,6 @@ pub fn run() -> sc_cli::Result<()> { Some(Subcommand::TryRuntime) => Err("TryRuntime wasn't enabled when building the node. \ You can enable it with `--features try-runtime`." .into()), + Some(Subcommand::FixBabeEpoch(cmd)) => cmd.run(&cli), } } diff --git a/cli/src/res/12363395-epoch-change.data b/cli/src/res/12363395-epoch-change.data new file mode 100644 index 000000000..c335aa9dc --- /dev/null +++ b/cli/src/res/12363395-epoch-change.data @@ -0,0 +1 @@ +040b4eb44384c71c3676f846f426d4ad562d9aa119412692e09378ebe72385f9c57aa6bc00014fcfeb100000000081cfeb100000000004eac5f887ca6f1981c440b145f02aa9df02343da060cb96f43d0e4a61a126d0f17da6bc000181cfeb1000000000b3cfeb10000000000403dc3400a2d4d74fb8027a3e239c0071f1eb844925647f1824ab54f038a2c9347fa6bc0001b3cfeb1000000000e5cfeb10000000000864266cf80ad4c34a760b6696f8a586f46ffa7cb9f5cc06c08a2ad5997d70374e83a6bc000117d0eb100000000049d0eb1000000000007dea6c250122e4361577c7f6a7237923efaefa1d0c83945135dd050f0cd72e2483a6bc000149d0eb10000000007bd0eb100000000000001403dc3400a2d4d74fb8027a3e239c0071f1eb844925647f1824ab54f038a2c9347fa6bc000151cb030000000000b3cfeb1000000000320000000000000054464a78ec0b6e44452c18f1fd363d32cd5e591d18d0e0a2fbb6935b246f9954090100000000000000660098bd0806bb14799ce6dae47bcf8fe0d84b82dcb866191f3b3a591e01ff5101000000000000001ac6ee27ae8f7a5fb2cd583a47db9ece87cd7fb293cfaeb89ad7d403eff15c310100000000000000fce5dc578c6238a8b1c8e183d13045df12201f4ed75073df46f7bbe37313f63f01000000000000000a3c94b756f731d2d15307089261b3cb01cbc49baf99eaeeea4f60c35490401401000000000000008a41f26c1f500154911c5c3fd2d7e9b0c14df1e45ba407d378d21706de389f01010000000000000028341fb93b8d0316c8c8fb3424e46bc46610c4a932e1f03f7981a5edf61d19730100000000000000ba0b904bba1e15a05b378314df9051e826dd4df358eeb121fd0ffbb061d37d790100000000000000a86a00d7f0bca3c1ad2e4174b1a0b80a6f60582cf1a4aa7efa748f5469f6611c0100000000000000a2aa9967d116996fb0ee520fa429e34efcc6fe6f7053c46926aa501bee67851001000000000000004a62842365cf18207eecfba694f06d8160626bede884403a28d9bfdb3644251f0100000000000000c81021b75d78268756fbbfbf37a58c7f5cf97c99e293491d45cf99b80eaabf6201000000000000008848b514fdb737ef7cb354973adb8d10e416d10507452e09835bab838d957b5d01000000000000007a06704178ca1fd6faabf1f96eeb54406e42f34e3141508fcf3f892810ebd56f0100000000000000d60eaa868ac564334d25d5a7e77b066f1e2a9358481730c89d2f5410328b94620100000000000000308e5fb23958eed9b61aa25c1abbd4c857e7daa4489510dbd5d1e05e4d052d3c01000000000000006688f8f55c804cdade75a3635ec8f42d72399debdc93c8351ed29d20ddb79e0d0100000000000000b2793e5b19b7489dfbeb48084fce4eca3c6d1e1a64db96981e7935167ea6162201000000000000001a2ac756e8e480804a1cb4cb2cd1553074ecefb62cd0bcd1ae289b662386cf0e010000000000000068f7b28f333ffbd225925e30147c7dd4348bcf924fd0d19acf46550ba81b914301000000000000004ed310064cf382434fccce1318eb5d636166044d66e433ffd9797da4c85bc15501000000000000006df228ffb96a9d6c2c7078b879be329cd5f714c3375588d4ad43c0e67626df1f01000000000000000400000000000000020b4eb44384c71c3676f846f426d4ad562d9aa119412692e09378ebe72385f9c57aa6bc00014fcb0300000000004fcfeb1000000000320000000000000054464a78ec0b6e44452c18f1fd363d32cd5e591d18d0e0a2fbb6935b246f9954090100000000000000660098bd0806bb14799ce6dae47bcf8fe0d84b82dcb866191f3b3a591e01ff5101000000000000001ac6ee27ae8f7a5fb2cd583a47db9ece87cd7fb293cfaeb89ad7d403eff15c310100000000000000fce5dc578c6238a8b1c8e183d13045df12201f4ed75073df46f7bbe37313f63f01000000000000000a3c94b756f731d2d15307089261b3cb01cbc49baf99eaeeea4f60c35490401401000000000000008a41f26c1f500154911c5c3fd2d7e9b0c14df1e45ba407d378d21706de389f01010000000000000028341fb93b8d0316c8c8fb3424e46bc46610c4a932e1f03f7981a5edf61d19730100000000000000ba0b904bba1e15a05b378314df9051e826dd4df358eeb121fd0ffbb061d37d790100000000000000a86a00d7f0bca3c1ad2e4174b1a0b80a6f60582cf1a4aa7efa748f5469f6611c0100000000000000a2aa9967d116996fb0ee520fa429e34efcc6fe6f7053c46926aa501bee67851001000000000000004a62842365cf18207eecfba694f06d8160626bede884403a28d9bfdb3644251f0100000000000000c81021b75d78268756fbbfbf37a58c7f5cf97c99e293491d45cf99b80eaabf6201000000000000008848b514fdb737ef7cb354973adb8d10e416d10507452e09835bab838d957b5d01000000000000007a06704178ca1fd6faabf1f96eeb54406e42f34e3141508fcf3f892810ebd56f0100000000000000d60eaa868ac564334d25d5a7e77b066f1e2a9358481730c89d2f5410328b94620100000000000000308e5fb23958eed9b61aa25c1abbd4c857e7daa4489510dbd5d1e05e4d052d3c01000000000000006688f8f55c804cdade75a3635ec8f42d72399debdc93c8351ed29d20ddb79e0d0100000000000000b2793e5b19b7489dfbeb48084fce4eca3c6d1e1a64db96981e7935167ea6162201000000000000001a2ac756e8e480804a1cb4cb2cd1553074ecefb62cd0bcd1ae289b662386cf0e010000000000000068f7b28f333ffbd225925e30147c7dd4348bcf924fd0d19acf46550ba81b914301000000000000004ed310064cf382434fccce1318eb5d636166044d66e433ffd9797da4c85bc1550100000000000000a1a7d603a390952aee0b388b1272985edaef90c4d27e49e2dd6335390ccf0ad9010000000000000004000000000000000264266cf80ad4c34a760b6696f8a586f46ffa7cb9f5cc06c08a2ad5997d70374e83a6bc000153cb03000000000017d0eb1000000000320000000000000054464a78ec0b6e44452c18f1fd363d32cd5e591d18d0e0a2fbb6935b246f9954090100000000000000660098bd0806bb14799ce6dae47bcf8fe0d84b82dcb866191f3b3a591e01ff5101000000000000001ac6ee27ae8f7a5fb2cd583a47db9ece87cd7fb293cfaeb89ad7d403eff15c310100000000000000fce5dc578c6238a8b1c8e183d13045df12201f4ed75073df46f7bbe37313f63f01000000000000000a3c94b756f731d2d15307089261b3cb01cbc49baf99eaeeea4f60c35490401401000000000000008a41f26c1f500154911c5c3fd2d7e9b0c14df1e45ba407d378d21706de389f01010000000000000028341fb93b8d0316c8c8fb3424e46bc46610c4a932e1f03f7981a5edf61d19730100000000000000ba0b904bba1e15a05b378314df9051e826dd4df358eeb121fd0ffbb061d37d790100000000000000a86a00d7f0bca3c1ad2e4174b1a0b80a6f60582cf1a4aa7efa748f5469f6611c0100000000000000a2aa9967d116996fb0ee520fa429e34efcc6fe6f7053c46926aa501bee67851001000000000000004a62842365cf18207eecfba694f06d8160626bede884403a28d9bfdb3644251f0100000000000000c81021b75d78268756fbbfbf37a58c7f5cf97c99e293491d45cf99b80eaabf6201000000000000008848b514fdb737ef7cb354973adb8d10e416d10507452e09835bab838d957b5d01000000000000007a06704178ca1fd6faabf1f96eeb54406e42f34e3141508fcf3f892810ebd56f0100000000000000d60eaa868ac564334d25d5a7e77b066f1e2a9358481730c89d2f5410328b94620100000000000000308e5fb23958eed9b61aa25c1abbd4c857e7daa4489510dbd5d1e05e4d052d3c01000000000000006688f8f55c804cdade75a3635ec8f42d72399debdc93c8351ed29d20ddb79e0d0100000000000000b2793e5b19b7489dfbeb48084fce4eca3c6d1e1a64db96981e7935167ea6162201000000000000001a2ac756e8e480804a1cb4cb2cd1553074ecefb62cd0bcd1ae289b662386cf0e010000000000000068f7b28f333ffbd225925e30147c7dd4348bcf924fd0d19acf46550ba81b914301000000000000004ed310064cf382434fccce1318eb5d636166044d66e433ffd9797da4c85bc15501000000000000006ac937cbd361714716328f5c575719a84be46a1970c09cf52e0f9201bb0d043d01000000000000000400000000000000027dea6c250122e4361577c7f6a7237923efaefa1d0c83945135dd050f0cd72e2483a6bc000154cb03000000000049d0eb1000000000320000000000000054464a78ec0b6e44452c18f1fd363d32cd5e591d18d0e0a2fbb6935b246f9954090100000000000000660098bd0806bb14799ce6dae47bcf8fe0d84b82dcb866191f3b3a591e01ff5101000000000000001ac6ee27ae8f7a5fb2cd583a47db9ece87cd7fb293cfaeb89ad7d403eff15c310100000000000000fce5dc578c6238a8b1c8e183d13045df12201f4ed75073df46f7bbe37313f63f01000000000000000a3c94b756f731d2d15307089261b3cb01cbc49baf99eaeeea4f60c35490401401000000000000008a41f26c1f500154911c5c3fd2d7e9b0c14df1e45ba407d378d21706de389f01010000000000000028341fb93b8d0316c8c8fb3424e46bc46610c4a932e1f03f7981a5edf61d19730100000000000000ba0b904bba1e15a05b378314df9051e826dd4df358eeb121fd0ffbb061d37d790100000000000000a86a00d7f0bca3c1ad2e4174b1a0b80a6f60582cf1a4aa7efa748f5469f6611c0100000000000000a2aa9967d116996fb0ee520fa429e34efcc6fe6f7053c46926aa501bee67851001000000000000004a62842365cf18207eecfba694f06d8160626bede884403a28d9bfdb3644251f0100000000000000c81021b75d78268756fbbfbf37a58c7f5cf97c99e293491d45cf99b80eaabf6201000000000000008848b514fdb737ef7cb354973adb8d10e416d10507452e09835bab838d957b5d01000000000000007a06704178ca1fd6faabf1f96eeb54406e42f34e3141508fcf3f892810ebd56f0100000000000000d60eaa868ac564334d25d5a7e77b066f1e2a9358481730c89d2f5410328b94620100000000000000308e5fb23958eed9b61aa25c1abbd4c857e7daa4489510dbd5d1e05e4d052d3c01000000000000006688f8f55c804cdade75a3635ec8f42d72399debdc93c8351ed29d20ddb79e0d0100000000000000b2793e5b19b7489dfbeb48084fce4eca3c6d1e1a64db96981e7935167ea6162201000000000000001a2ac756e8e480804a1cb4cb2cd1553074ecefb62cd0bcd1ae289b662386cf0e010000000000000068f7b28f333ffbd225925e30147c7dd4348bcf924fd0d19acf46550ba81b914301000000000000004ed310064cf382434fccce1318eb5d636166044d66e433ffd9797da4c85bc15501000000000000006ac937cbd361714716328f5c575719a84be46a1970c09cf52e0f9201bb0d043d0100000000000000040000000000000002eac5f887ca6f1981c440b145f02aa9df02343da060cb96f43d0e4a61a126d0f17da6bc000150cb03000000000081cfeb1000000000320000000000000054464a78ec0b6e44452c18f1fd363d32cd5e591d18d0e0a2fbb6935b246f9954090100000000000000660098bd0806bb14799ce6dae47bcf8fe0d84b82dcb866191f3b3a591e01ff5101000000000000001ac6ee27ae8f7a5fb2cd583a47db9ece87cd7fb293cfaeb89ad7d403eff15c310100000000000000fce5dc578c6238a8b1c8e183d13045df12201f4ed75073df46f7bbe37313f63f01000000000000000a3c94b756f731d2d15307089261b3cb01cbc49baf99eaeeea4f60c35490401401000000000000008a41f26c1f500154911c5c3fd2d7e9b0c14df1e45ba407d378d21706de389f01010000000000000028341fb93b8d0316c8c8fb3424e46bc46610c4a932e1f03f7981a5edf61d19730100000000000000ba0b904bba1e15a05b378314df9051e826dd4df358eeb121fd0ffbb061d37d790100000000000000a86a00d7f0bca3c1ad2e4174b1a0b80a6f60582cf1a4aa7efa748f5469f6611c0100000000000000a2aa9967d116996fb0ee520fa429e34efcc6fe6f7053c46926aa501bee67851001000000000000004a62842365cf18207eecfba694f06d8160626bede884403a28d9bfdb3644251f0100000000000000c81021b75d78268756fbbfbf37a58c7f5cf97c99e293491d45cf99b80eaabf6201000000000000008848b514fdb737ef7cb354973adb8d10e416d10507452e09835bab838d957b5d01000000000000007a06704178ca1fd6faabf1f96eeb54406e42f34e3141508fcf3f892810ebd56f0100000000000000d60eaa868ac564334d25d5a7e77b066f1e2a9358481730c89d2f5410328b94620100000000000000308e5fb23958eed9b61aa25c1abbd4c857e7daa4489510dbd5d1e05e4d052d3c01000000000000006688f8f55c804cdade75a3635ec8f42d72399debdc93c8351ed29d20ddb79e0d0100000000000000b2793e5b19b7489dfbeb48084fce4eca3c6d1e1a64db96981e7935167ea6162201000000000000001a2ac756e8e480804a1cb4cb2cd1553074ecefb62cd0bcd1ae289b662386cf0e010000000000000068f7b28f333ffbd225925e30147c7dd4348bcf924fd0d19acf46550ba81b914301000000000000004ed310064cf382434fccce1318eb5d636166044d66e433ffd9797da4c85bc15501000000000000009e56b37432553198ef85892a789c75a40d03399e1bc912a0a4801775c092442b010000000000000004000000000000000200 \ No newline at end of file