From 6b8af76c48d80242ed07c4cedea152fc0d001de4 Mon Sep 17 00:00:00 2001 From: jolestar Date: Tue, 11 Jun 2024 16:19:43 +0800 Subject: [PATCH] [genesis] Include genesis static file in binary and reset testnet, prepare release v0.5.4 (#1863) * [genesis] Include genesis static file in binary * temporary disable sdk build * [cargo]Connfig project version at workspace * [genesis]Reset test network genesis --- .github/workflows/check_build_test.yml | 12 +- Cargo.lock | 98 ++++++------ Cargo.toml | 1 + crates/data_verify/Cargo.toml | 2 +- crates/rooch-benchmarks/Cargo.toml | 12 +- crates/rooch-config/Cargo.toml | 12 +- crates/rooch-da/Cargo.toml | 12 +- crates/rooch-db/Cargo.toml | 2 +- crates/rooch-db/src/lib.rs | 20 +-- crates/rooch-executor/Cargo.toml | 2 +- crates/rooch-faucet/Cargo.toml | 2 +- crates/rooch-framework-tests/Cargo.toml | 2 +- .../rooch-framework-tests/src/binding_test.rs | 4 +- crates/rooch-genesis/Cargo.toml | 4 +- crates/rooch-genesis/README.md | 8 + crates/rooch-genesis/released/test | Bin 0 -> 259875 bytes crates/rooch-genesis/src/lib.rs | 143 ++++++++++++------ crates/rooch-genesis/src/main.rs | 36 +++++ crates/rooch-indexer/Cargo.toml | 2 +- .../rooch-integration-test-runner/Cargo.toml | 2 +- crates/rooch-key/Cargo.toml | 2 +- crates/rooch-open-rpc-macros/Cargo.toml | 2 +- crates/rooch-open-rpc-spec-builder/Cargo.toml | 2 +- crates/rooch-open-rpc-spec/Cargo.toml | 2 +- .../rooch-open-rpc-spec/schemas/openrpc.json | 2 +- crates/rooch-open-rpc/Cargo.toml | 2 +- crates/rooch-pipeline-processor/Cargo.toml | 2 +- crates/rooch-proposer/Cargo.toml | 2 +- crates/rooch-relayer/Cargo.toml | 2 +- crates/rooch-rpc-api/Cargo.toml | 2 +- crates/rooch-rpc-client/Cargo.toml | 12 +- crates/rooch-rpc-server/Cargo.toml | 2 +- crates/rooch-rpc-server/src/lib.rs | 26 ++-- crates/rooch-sequencer/Cargo.toml | 2 +- .../rooch-sequencer/tests/test_sequencer.rs | 3 +- crates/rooch-store/Cargo.toml | 2 +- .../rooch-test-transaction-builder/Cargo.toml | 2 +- crates/rooch-types/Cargo.toml | 2 +- crates/rooch-types/src/error.rs | 2 +- crates/rooch-types/src/framework/chain_id.rs | 10 +- crates/rooch-types/src/genesis_config.rs | 7 +- crates/rooch/Cargo.toml | 2 +- .../src/commands/genesis/commands/init.rs | 5 +- .../src/commands/statedb/commands/export.rs | 10 +- .../commands/statedb/commands/genesis_utxo.rs | 4 +- .../src/commands/statedb/commands/import.rs | 7 +- crates/testsuite/Cargo.toml | 3 +- frameworks/bitcoin-move/Cargo.toml | 2 +- frameworks/framework-builder/Cargo.toml | 2 +- frameworks/framework-release/Cargo.toml | 2 +- .../framework-release/released/1/stdlib | Bin 119540 -> 119639 bytes frameworks/framework-types/Cargo.toml | 2 +- frameworks/moveos-stdlib/Cargo.toml | 2 +- frameworks/rooch-framework/Cargo.toml | 2 +- moveos/metrics/Cargo.toml | 2 +- moveos/moveos-commons/accumulator/Cargo.toml | 12 +- .../moveos-commons/moveos-common/Cargo.toml | 12 +- .../timeout-join-handler/Cargo.toml | 12 +- moveos/moveos-compiler/Cargo.toml | 12 +- moveos/moveos-config/Cargo.toml | 12 +- moveos/moveos-object-runtime/Cargo.toml | 2 +- moveos/moveos-store/Cargo.toml | 2 +- moveos/moveos-types/Cargo.toml | 2 +- moveos/moveos-types/src/genesis_info.rs | 26 +++- moveos/moveos-verifier/Cargo.toml | 12 +- moveos/moveos-wasm/Cargo.toml | 12 +- moveos/moveos/Cargo.toml | 2 +- moveos/raw-store/Cargo.toml | 2 +- moveos/smt/Cargo.toml | 2 +- 69 files changed, 425 insertions(+), 208 deletions(-) create mode 100644 crates/rooch-genesis/README.md create mode 100644 crates/rooch-genesis/released/test create mode 100644 crates/rooch-genesis/src/main.rs diff --git a/.github/workflows/check_build_test.yml b/.github/workflows/check_build_test.yml index fc18a59b20..67017e7be9 100644 --- a/.github/workflows/check_build_test.yml +++ b/.github/workflows/check_build_test.yml @@ -92,14 +92,14 @@ jobs: run: pnpm lint continue-on-error: true timeout-minutes: 15 - - name: Build SDK - run: pnpm rooch-sdk build + # - name: Build SDK + # run: pnpm rooch-sdk build # - name: Test SDK # run: pnpm rooch-sdk test - - name: Build SDK KIT - run: pnpm rooch-sdk-kit build - - name: Build Dashboard - run: pnpm dashboard build + # - name: Build SDK KIT + # run: pnpm rooch-sdk-kit build + # - name: Build Dashboard + # run: pnpm dashboard build - uses: CatChen/check-git-status-action@v1 with: diff --git a/Cargo.lock b/Cargo.lock index 384e98d846..f71c1935f1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,7 +14,7 @@ dependencies = [ [[package]] name = "accumulator" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "bcs-ext", @@ -930,7 +930,7 @@ dependencies = [ [[package]] name = "bitcoin-move" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "bcs", @@ -2553,7 +2553,7 @@ dependencies = [ [[package]] name = "data-verify" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "bcs", @@ -3779,7 +3779,7 @@ dependencies = [ [[package]] name = "framework-builder" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "bcs", @@ -3821,7 +3821,7 @@ dependencies = [ [[package]] name = "framework-release" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "bcs", @@ -3844,7 +3844,7 @@ dependencies = [ [[package]] name = "framework-types" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "clap 4.5.4", @@ -5651,7 +5651,7 @@ dependencies = [ [[package]] name = "metrics" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "futures", @@ -6414,7 +6414,7 @@ dependencies = [ [[package]] name = "moveos" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "backtrace", @@ -6467,7 +6467,7 @@ dependencies = [ [[package]] name = "moveos-common" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "bcs", @@ -6479,7 +6479,7 @@ dependencies = [ [[package]] name = "moveos-compiler" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "move-binary-format", @@ -6493,7 +6493,7 @@ dependencies = [ [[package]] name = "moveos-config" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "clap 4.5.4", @@ -6510,7 +6510,7 @@ dependencies = [ [[package]] name = "moveos-object-runtime" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "better_any", @@ -6546,7 +6546,7 @@ dependencies = [ [[package]] name = "moveos-stdlib" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "bech32 0.11.0", @@ -6594,7 +6594,7 @@ dependencies = [ [[package]] name = "moveos-store" -version = "0.5.0" +version = "0.5.4" dependencies = [ "accumulator", "anyhow", @@ -6623,7 +6623,7 @@ dependencies = [ [[package]] name = "moveos-types" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "bcs", @@ -6652,7 +6652,7 @@ dependencies = [ [[package]] name = "moveos-verifier" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "bcs", @@ -6679,7 +6679,7 @@ dependencies = [ [[package]] name = "moveos-wasm" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "ciborium", @@ -8389,7 +8389,7 @@ dependencies = [ [[package]] name = "raw-store" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "async-trait", @@ -8876,7 +8876,7 @@ dependencies = [ [[package]] name = "rooch" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "async-trait", @@ -8954,7 +8954,7 @@ dependencies = [ [[package]] name = "rooch-benchmarks" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "async-trait", @@ -9026,7 +9026,7 @@ dependencies = [ [[package]] name = "rooch-config" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "clap 4.5.4", @@ -9052,7 +9052,7 @@ dependencies = [ [[package]] name = "rooch-da" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "async-trait", @@ -9073,7 +9073,7 @@ dependencies = [ [[package]] name = "rooch-db" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "bcs", @@ -9098,7 +9098,7 @@ dependencies = [ [[package]] name = "rooch-executor" -version = "0.5.0" +version = "0.5.4" dependencies = [ "accumulator", "anyhow", @@ -9140,7 +9140,7 @@ dependencies = [ [[package]] name = "rooch-faucet" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "async-trait", @@ -9174,7 +9174,7 @@ dependencies = [ [[package]] name = "rooch-framework" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "bcs", @@ -9212,7 +9212,7 @@ dependencies = [ [[package]] name = "rooch-framework-tests" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "bcs", @@ -9268,18 +9268,20 @@ dependencies = [ [[package]] name = "rooch-genesis" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "bcs", "better_any", "bitcoin-move", + "clap 4.5.4", "coerce", "fastcrypto", "framework-builder", "framework-release", "futures", "hex", + "include_dir", "linked-hash-map", "move-binary-format", "move-bytecode-utils", @@ -9317,7 +9319,7 @@ dependencies = [ [[package]] name = "rooch-indexer" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "async-trait", @@ -9363,7 +9365,7 @@ dependencies = [ [[package]] name = "rooch-integration-test-runner" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "bcs", @@ -9405,7 +9407,7 @@ dependencies = [ [[package]] name = "rooch-key" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "argon2", @@ -9437,7 +9439,7 @@ dependencies = [ [[package]] name = "rooch-open-rpc" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "bcs", @@ -9454,7 +9456,7 @@ dependencies = [ [[package]] name = "rooch-open-rpc-macros" -version = "0.5.0" +version = "0.5.4" dependencies = [ "derive-syn-parse", "itertools 0.10.5", @@ -9466,7 +9468,7 @@ dependencies = [ [[package]] name = "rooch-open-rpc-spec" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "bcs", @@ -9487,7 +9489,7 @@ dependencies = [ [[package]] name = "rooch-open-rpc-spec-builder" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "bcs", @@ -9507,7 +9509,7 @@ dependencies = [ [[package]] name = "rooch-pipeline-processor" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "async-trait", @@ -9545,7 +9547,7 @@ dependencies = [ [[package]] name = "rooch-proposer" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "async-trait", @@ -9578,7 +9580,7 @@ dependencies = [ [[package]] name = "rooch-relayer" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "async-trait", @@ -9622,7 +9624,7 @@ dependencies = [ [[package]] name = "rooch-rpc-api" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "async-trait", @@ -9666,7 +9668,7 @@ dependencies = [ [[package]] name = "rooch-rpc-client" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "bcs", @@ -9696,7 +9698,7 @@ dependencies = [ [[package]] name = "rooch-rpc-server" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "async-trait", @@ -9755,7 +9757,7 @@ dependencies = [ [[package]] name = "rooch-sequencer" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "async-trait", @@ -9793,7 +9795,7 @@ dependencies = [ [[package]] name = "rooch-store" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "bcs", @@ -9815,7 +9817,7 @@ dependencies = [ [[package]] name = "rooch-test-transaction-builder" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "bcs", @@ -9851,7 +9853,7 @@ dependencies = [ [[package]] name = "rooch-types" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "argon2", @@ -11011,7 +11013,7 @@ checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" [[package]] name = "smt" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "backtrace", @@ -11523,7 +11525,7 @@ dependencies = [ [[package]] name = "testsuite" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "assert_cmd", @@ -11646,7 +11648,7 @@ dependencies = [ [[package]] name = "timeout-join-handler" -version = "0.5.0" +version = "0.5.4" dependencies = [ "anyhow", "thiserror", diff --git a/Cargo.toml b/Cargo.toml index eca7f4f9e7..d2da2e52ce 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -68,6 +68,7 @@ license = "Apache-2.0" publish = false repository = "https://github.com/rooch-network/rooch" rust-version = "1.77.1" +version = "0.5.4" [workspace.dependencies] diff --git a/crates/data_verify/Cargo.toml b/crates/data_verify/Cargo.toml index c7007a0c0c..ad20c4b233 100644 --- a/crates/data_verify/Cargo.toml +++ b/crates/data_verify/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "data-verify" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-benchmarks/Cargo.toml b/crates/rooch-benchmarks/Cargo.toml index 5dd4ba6d01..e79e1acb4f 100644 --- a/crates/rooch-benchmarks/Cargo.toml +++ b/crates/rooch-benchmarks/Cargo.toml @@ -1,7 +1,15 @@ [package] name = "rooch-benchmarks" -version = "0.5.0" -edition = "2021" + +# Workspace inherited keys +version = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } +rust-version = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/crates/rooch-config/Cargo.toml b/crates/rooch-config/Cargo.toml index c19ce9cb44..d184bd1252 100644 --- a/crates/rooch-config/Cargo.toml +++ b/crates/rooch-config/Cargo.toml @@ -1,7 +1,15 @@ [package] name = "rooch-config" -version = "0.5.0" -edition = "2021" + +# Workspace inherited keys +version = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } +rust-version = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/crates/rooch-da/Cargo.toml b/crates/rooch-da/Cargo.toml index 60c76325e8..bd01aabcaf 100644 --- a/crates/rooch-da/Cargo.toml +++ b/crates/rooch-da/Cargo.toml @@ -1,7 +1,15 @@ [package] name = "rooch-da" -version = "0.5.0" -edition = "2021" + +# Workspace inherited keys +version = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } +rust-version = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/crates/rooch-db/Cargo.toml b/crates/rooch-db/Cargo.toml index d397a04734..3adcc47bf3 100644 --- a/crates/rooch-db/Cargo.toml +++ b/crates/rooch-db/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-db" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-db/src/lib.rs b/crates/rooch-db/src/lib.rs index 5f7f142f99..428cdbfd34 100644 --- a/crates/rooch-db/src/lib.rs +++ b/crates/rooch-db/src/lib.rs @@ -2,9 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 use anyhow::Result; -use log::info; use moveos_store::MoveOSStore; -use moveos_types::moveos_std::object::{ObjectEntity, Root}; +use moveos_types::moveos_std::object::RootObjectEntity; use raw_store::{rocks::RocksDB, StoreInstance}; use rooch_config::store_config::StoreConfig; use rooch_indexer::{indexer_reader::IndexerReader, IndexerStore}; @@ -16,7 +15,6 @@ pub struct RoochDB { pub rooch_store: RoochStore, pub indexer_store: IndexerStore, pub indexer_reader: IndexerReader, - pub root: ObjectEntity, } impl RoochDB { @@ -46,21 +44,17 @@ impl RoochDB { let indexer_store = IndexerStore::new(indexer_store_dir.clone())?; let indexer_reader = IndexerReader::new(indexer_store_dir)?; - let startup_info = moveos_store.config_store.get_startup_info()?; - - if let Some(ref startup_info) = startup_info { - info!("Load startup info {:?}", startup_info); - } - let root = startup_info - .map(|s| s.into_root_object()) - .unwrap_or(ObjectEntity::genesis_root_object()); - Ok(Self { moveos_store, rooch_store, indexer_store, indexer_reader, - root, }) } + + pub fn latest_root(&self) -> Result> { + let startup_info = self.moveos_store.config_store.get_startup_info()?; + + Ok(startup_info.map(|s| s.into_root_object())) + } } diff --git a/crates/rooch-executor/Cargo.toml b/crates/rooch-executor/Cargo.toml index 9f5bc97fc4..b42049ecf4 100644 --- a/crates/rooch-executor/Cargo.toml +++ b/crates/rooch-executor/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-executor" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-faucet/Cargo.toml b/crates/rooch-faucet/Cargo.toml index a455fd8d01..c0653c4cbb 100644 --- a/crates/rooch-faucet/Cargo.toml +++ b/crates/rooch-faucet/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-faucet" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-framework-tests/Cargo.toml b/crates/rooch-framework-tests/Cargo.toml index 5821059062..f18d01fd93 100644 --- a/crates/rooch-framework-tests/Cargo.toml +++ b/crates/rooch-framework-tests/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-framework-tests" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-framework-tests/src/binding_test.rs b/crates/rooch-framework-tests/src/binding_test.rs index 139fdc68cf..8c1cd5f366 100644 --- a/crates/rooch-framework-tests/src/binding_test.rs +++ b/crates/rooch-framework-tests/src/binding_test.rs @@ -61,8 +61,8 @@ impl RustBindingTest { network.set_sequencer_account(sequencer.clone()); - let genesis = RoochGenesis::build(network)?; - let root = genesis.init_genesis(&rooch_db)?; + let genesis = RoochGenesis::load_or_init(network, &rooch_db)?; + let root = genesis.genesis_root().clone(); let executor = ExecutorActor::new( root.clone(), diff --git a/crates/rooch-genesis/Cargo.toml b/crates/rooch-genesis/Cargo.toml index d0a2552262..2738eb53d7 100644 --- a/crates/rooch-genesis/Cargo.toml +++ b/crates/rooch-genesis/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-genesis" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } @@ -17,6 +17,7 @@ rust-version = { workspace = true } anyhow = { workspace = true } bcs = { workspace = true } better_any = { workspace = true } +clap = { features = [ "derive", ], workspace = true } fastcrypto = { workspace = true } linked-hash-map = { workspace = true } once_cell = { workspace = true } @@ -30,6 +31,7 @@ tracing-subscriber = { workspace = true } coerce = { workspace = true } tokio = { features = ["full"], workspace = true } futures = { workspace = true } +include_dir = { workspace = true } move-binary-format = { workspace = true } diff --git a/crates/rooch-genesis/README.md b/crates/rooch-genesis/README.md new file mode 100644 index 0000000000..63a001b2ca --- /dev/null +++ b/crates/rooch-genesis/README.md @@ -0,0 +1,8 @@ +# Rooch genesis + + +## Release genesis for network + +```bash +cargo run --package rooch-genesis -- -n test +``` \ No newline at end of file diff --git a/crates/rooch-genesis/released/test b/crates/rooch-genesis/released/test new file mode 100644 index 0000000000000000000000000000000000000000..7b5f4a78c4264e81346b218569ef0e46ccc91223 GIT binary patch literal 259875 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

nSQD$A&T4-{H(eF7Z&gBA)EBE&ms^CaVTI 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 tU5fafkaNTM3 = Lazy::new(|| { RoochGenesis::build(network).expect("build rooch genesis failed") }); +pub(crate) const STATIC_GENESIS_DIR: Dir = include_dir!("released"); + +pub fn load_genesis_from_binary(chain_id: BuiltinChainID) -> Result> { + STATIC_GENESIS_DIR + .get_file(chain_id.chain_name()) + .map(|f| { + let genesis = RoochGenesis::decode(f.contents())?; + Ok(genesis) + }) + .transpose() +} + +pub fn release_dir() -> PathBuf { + path_in_crate("released") +} + +pub fn genesis_file(chain_id: BuiltinChainID) -> PathBuf { + release_dir().join(chain_id.chain_name()) +} + pub struct FrameworksGasParameters { pub max_gas_amount: u64, pub vm_gas_params: VMGasParameters, @@ -135,23 +157,11 @@ pub struct RoochGenesis { pub genesis_moveos_tx: MoveOSTransaction, } -pub enum BuildOption { - Fresh, - Release, -} - impl RoochGenesis { pub fn build(network: RoochNetwork) -> Result { - Self::build_with_option(network, BuildOption::Release) - } - - pub fn build_with_option(network: RoochNetwork, option: BuildOption) -> Result { let genesis_config = network.genesis_config; - let stdlib = match option { - BuildOption::Fresh => Self::build_stdlib()?, - BuildOption::Release => Self::load_stdlib(genesis_config.stdlib_version)?, - }; + let stdlib = Self::load_stdlib(genesis_config.stdlib_version)?; let genesis_ctx = rooch_types::framework::genesis::GenesisContext::new( network.chain_id.id, @@ -208,6 +218,15 @@ impl RoochGenesis { }) } + /// Load the genesis from binary, if not exist, build the genesis, only support the builtin chain id + pub fn load(chain_id: BuiltinChainID) -> Result { + let genesis = load_genesis_from_binary(chain_id)?; + match genesis { + Some(genesis) => Ok(genesis), + None => Self::build(RoochNetwork::builtin(chain_id)), + } + } + pub fn genesis_tx(&self) -> RoochTransaction { self.genesis_tx.clone() } @@ -217,11 +236,7 @@ impl RoochGenesis { } pub fn genesis_hash(&self) -> H256 { - h256::sha3_256_of( - bcs::to_bytes(&self) - .expect("genesis txs bcs to_bytes should success") - .as_slice(), - ) + h256::sha3_256_of(self.encode().as_slice()) } pub fn genesis_root(&self) -> &RootObjectEntity { @@ -232,37 +247,52 @@ impl RoochGenesis { GenesisInfo { genesis_package_hash: self.genesis_hash(), root: self.genesis_root().clone(), + genesis_bin: self.encode(), } } - pub fn check_genesis(&self, config_store: &ConfigDBStore) -> Result<()> { - let genesis_info_result = config_store.get_genesis(); - match genesis_info_result { - Ok(Some(genesis_info_from_store)) => { - let genesis_info_from_binary = self.genesis_info(); - - // We need to check the genesis package hash and genesis state root hash - // because the same genesis package may generate different state root hash when the Move VM is upgraded - if genesis_info_from_store != genesis_info_from_binary { - return Err(GenesisError::GenesisVersionMismatch { - from_store: Box::new(genesis_info_from_store), - from_binary: Box::new(genesis_info_from_binary), + /// Load the genesis from the rooch db, if not exist, build and init the genesis + pub fn load_or_init(network: RoochNetwork, rooch_db: &RoochDB) -> Result { + let genesis_info = rooch_db.moveos_store.get_config_store().get_genesis()?; + match genesis_info { + Some(genesis_info_from_store) => { + //if the chain_id is builtin, we should check the genesis version between the store and the binary + if let Some(builtin_id) = network.chain_id.to_builtin() { + let genesis_from_binary = Self::load(builtin_id)?; + let genesis_info_from_binary = genesis_from_binary.genesis_info(); + if genesis_info_from_store != genesis_info_from_binary { + return Err(GenesisError::GenesisVersionMismatch { + from_store: Box::new(genesis_info_from_store), + from_binary: Box::new(genesis_info_from_binary), + } + .into()); } - .into()); } + Self::decode(&genesis_info_from_store.genesis_bin) } - Err(e) => return Err(GenesisError::GenesisLoadFailure(e.to_string()).into()), - Ok(None) => { - return Err(GenesisError::GenesisNotExist( - "genesis hash from store is none".to_string(), - ) - .into()) + None => { + //if the chain_id is builtin, we should load the released genesis from binary + let genesis = if let Some(builtin_id) = network.chain_id.to_builtin() { + Self::load(builtin_id)? + } else { + Self::build(network)? + }; + genesis.init_genesis(rooch_db)?; + Ok(genesis) } } - Ok(()) } pub fn init_genesis(&self, rooch_db: &RoochDB) -> Result { + ensure!( + rooch_db + .moveos_store + .get_config_store() + .get_genesis()? + .is_none(), + "Genesis already initialized" + ); + //we load the gas parameter from genesis binary, avoid the code change affect the genesis result let genesis_gas_parameter = FrameworksGasParameters::load_from_gas_entries( self.initial_gas_config.max_gas_amount, @@ -354,7 +384,8 @@ impl RoochGenesis { .indexer_store .update_object_states(indexer_object_state_changes)?; - let genesis_info = GenesisInfo::new(self.genesis_hash(), inited_root.clone()); + let genesis_info = + GenesisInfo::new(self.genesis_hash(), inited_root.clone(), self.encode()); rooch_db .moveos_store .get_config_store() @@ -370,6 +401,14 @@ impl RoochGenesis { framework_release::load_stdlib(stdlib_version) } + pub fn decode(bytes: &[u8]) -> Result { + bcs::from_bytes(bytes).map_err(Into::into) + } + + pub fn encode(&self) -> Vec { + bcs::to_bytes(self).expect("RoochGenesis bcs::to_bytes should success") + } + pub fn load_from>(genesis_file: P) -> Result { let genesis_package = bcs::from_bytes(&std::fs::read(genesis_file)?)?; Ok(genesis_package) @@ -384,9 +423,18 @@ impl RoochGenesis { } } +pub(crate) fn path_in_crate(relative: S) -> PathBuf +where + S: AsRef, +{ + let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + path.push(relative); + path +} + #[cfg(test)] mod tests { - use crate::{BuildOption, FrameworksGasParameters}; + use super::*; use move_core_types::identifier::Identifier; use move_core_types::language_storage::ModuleId; use move_core_types::resolver::ModuleResolver; @@ -404,8 +452,8 @@ mod tests { "genesis init test case for network: {:?}", network.chain_id.id ); - let genesis = super::RoochGenesis::build_with_option(network.clone(), BuildOption::Release) - .expect("build rooch genesis failed"); + let genesis = + super::RoochGenesis::build(network.clone()).expect("build rooch genesis failed"); let opt = RoochOpt::new_with_temp_store().expect("create rooch opt failed"); let rooch_db = RoochDB::init(&opt.store_config()).expect("init rooch db failed"); @@ -483,4 +531,11 @@ mod tests { genesis_init_test_case(RoochNetwork::test()); genesis_init_test_case(RoochNetwork::main()); } + + #[test] + fn test_genesis_load_from_binary() { + assert!(load_genesis_from_binary(BuiltinChainID::Test) + .unwrap() + .is_some()); + } } diff --git a/crates/rooch-genesis/src/main.rs b/crates/rooch-genesis/src/main.rs new file mode 100644 index 0000000000..8a232881ce --- /dev/null +++ b/crates/rooch-genesis/src/main.rs @@ -0,0 +1,36 @@ +// Copyright (c) RoochNetwork +// SPDX-License-Identifier: Apache-2.0 + +use anyhow::{bail, Result}; +use clap::Parser; +use rooch_genesis::{genesis_file, RoochGenesis}; +use rooch_types::rooch_network::{BuiltinChainID, RoochNetwork}; +use tracing::info; + +#[derive(Parser)] +#[clap(name = "genesis-release", author = "The Rooch Core Contributors")] +struct GenesisOpts { + /// The builtin chain id for the genesis + #[clap(long, short = 'n', default_value = "test")] + chain_id: BuiltinChainID, +} + +fn main() -> Result<()> { + let _ = tracing_subscriber::fmt::try_init(); + let opts: GenesisOpts = GenesisOpts::parse(); + match &opts.chain_id { + BuiltinChainID::Test | BuiltinChainID::Main => {} + _ => { + bail!( + "chain_id {:?} is not supported, only support release test and main", + opts.chain_id + ); + } + } + info!("start to build genesis for chain: {:?}", opts.chain_id); + let network: RoochNetwork = RoochNetwork::builtin(opts.chain_id); + let genesis = RoochGenesis::build(network)?; + let genesis_file = genesis_file(opts.chain_id); + genesis.save_to(genesis_file)?; + Ok(()) +} diff --git a/crates/rooch-indexer/Cargo.toml b/crates/rooch-indexer/Cargo.toml index f769f04a87..80088f607f 100644 --- a/crates/rooch-indexer/Cargo.toml +++ b/crates/rooch-indexer/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-indexer" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-integration-test-runner/Cargo.toml b/crates/rooch-integration-test-runner/Cargo.toml index b898654cef..75707271b5 100644 --- a/crates/rooch-integration-test-runner/Cargo.toml +++ b/crates/rooch-integration-test-runner/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-integration-test-runner" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-key/Cargo.toml b/crates/rooch-key/Cargo.toml index 85ed20b953..a4dcc90b15 100644 --- a/crates/rooch-key/Cargo.toml +++ b/crates/rooch-key/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-key" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-open-rpc-macros/Cargo.toml b/crates/rooch-open-rpc-macros/Cargo.toml index 0575cd70b2..32cf8f3e25 100644 --- a/crates/rooch-open-rpc-macros/Cargo.toml +++ b/crates/rooch-open-rpc-macros/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-open-rpc-macros" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-open-rpc-spec-builder/Cargo.toml b/crates/rooch-open-rpc-spec-builder/Cargo.toml index 36a2299a29..719d35e7c6 100644 --- a/crates/rooch-open-rpc-spec-builder/Cargo.toml +++ b/crates/rooch-open-rpc-spec-builder/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-open-rpc-spec-builder" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-open-rpc-spec/Cargo.toml b/crates/rooch-open-rpc-spec/Cargo.toml index 53cceb0ecb..97a5b7a260 100644 --- a/crates/rooch-open-rpc-spec/Cargo.toml +++ b/crates/rooch-open-rpc-spec/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-open-rpc-spec" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-open-rpc-spec/schemas/openrpc.json b/crates/rooch-open-rpc-spec/schemas/openrpc.json index 3b791e4f4c..5f93b0f98d 100644 --- a/crates/rooch-open-rpc-spec/schemas/openrpc.json +++ b/crates/rooch-open-rpc-spec/schemas/openrpc.json @@ -12,7 +12,7 @@ "name": "Apache-2.0", "url": "https://raw.githubusercontent.com/rooch-network/rooch/main/LICENSE" }, - "version": "0.5.0" + "version": "0.5.4" }, "methods": [ { diff --git a/crates/rooch-open-rpc/Cargo.toml b/crates/rooch-open-rpc/Cargo.toml index 265f91389e..e5981b9fba 100644 --- a/crates/rooch-open-rpc/Cargo.toml +++ b/crates/rooch-open-rpc/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-open-rpc" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-pipeline-processor/Cargo.toml b/crates/rooch-pipeline-processor/Cargo.toml index e93022c4d8..692a7215c8 100644 --- a/crates/rooch-pipeline-processor/Cargo.toml +++ b/crates/rooch-pipeline-processor/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-pipeline-processor" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-proposer/Cargo.toml b/crates/rooch-proposer/Cargo.toml index dfdcce639a..10f5dbd524 100644 --- a/crates/rooch-proposer/Cargo.toml +++ b/crates/rooch-proposer/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-proposer" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-relayer/Cargo.toml b/crates/rooch-relayer/Cargo.toml index 8aaed4b8d8..2f7df85252 100644 --- a/crates/rooch-relayer/Cargo.toml +++ b/crates/rooch-relayer/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-relayer" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-rpc-api/Cargo.toml b/crates/rooch-rpc-api/Cargo.toml index fd42e59db9..2ee7ac72ec 100644 --- a/crates/rooch-rpc-api/Cargo.toml +++ b/crates/rooch-rpc-api/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-rpc-api" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-rpc-client/Cargo.toml b/crates/rooch-rpc-client/Cargo.toml index 83334e6308..5e4171163f 100644 --- a/crates/rooch-rpc-client/Cargo.toml +++ b/crates/rooch-rpc-client/Cargo.toml @@ -1,7 +1,15 @@ [package] name = "rooch-rpc-client" -version = "0.5.0" -edition = "2021" + +# Workspace inherited keys +version = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } +rust-version = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/crates/rooch-rpc-server/Cargo.toml b/crates/rooch-rpc-server/Cargo.toml index 177ebdd14b..cdb3485189 100644 --- a/crates/rooch-rpc-server/Cargo.toml +++ b/crates/rooch-rpc-server/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-rpc-server" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-rpc-server/src/lib.rs b/crates/rooch-rpc-server/src/lib.rs index b2bd77122a..306129622d 100644 --- a/crates/rooch-rpc-server/src/lib.rs +++ b/crates/rooch-rpc-server/src/lib.rs @@ -126,7 +126,7 @@ impl RpcModuleBuilder { // Start json-rpc server pub async fn start_server(opt: RoochOpt, server_opt: ServerOpt) -> Result { - let active_env = server_opt.get_active_env(); + let chain_name = opt.chain_id().chain_name(); match run_start_server(opt, server_opt).await { Ok(server_handle) => Ok(server_handle), Err(e) => match e.downcast::() { @@ -134,7 +134,7 @@ pub async fn start_server(opt: RoochOpt, server_opt: ServerOpt) -> Result Result Result Result root, + None => genesis.genesis_root().clone(), + }; + info!( + "The latest Root object state root: {:?}, size: {}", + root.state_root(), + root.size + ); let executor_actor = ExecutorActor::new(root.clone(), moveos_store.clone(), rooch_store.clone())?; diff --git a/crates/rooch-sequencer/Cargo.toml b/crates/rooch-sequencer/Cargo.toml index f258b84584..a9b3e44dc7 100644 --- a/crates/rooch-sequencer/Cargo.toml +++ b/crates/rooch-sequencer/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-sequencer" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-sequencer/tests/test_sequencer.rs b/crates/rooch-sequencer/tests/test_sequencer.rs index c50cc66fef..7a6156d547 100644 --- a/crates/rooch-sequencer/tests/test_sequencer.rs +++ b/crates/rooch-sequencer/tests/test_sequencer.rs @@ -15,8 +15,7 @@ use rooch_types::{ fn init_rooch_db(opt: &RoochOpt) -> Result { let rooch_db = RoochDB::init(opt.store_config())?; let network = opt.network(); - let genesis = RoochGenesis::build(network)?; - genesis.init_genesis(&rooch_db)?; + let genesis = RoochGenesis::load_or_init(network, &rooch_db)?; Ok(rooch_db) } diff --git a/crates/rooch-store/Cargo.toml b/crates/rooch-store/Cargo.toml index cfe65df99f..642f3c13c9 100644 --- a/crates/rooch-store/Cargo.toml +++ b/crates/rooch-store/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-store" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-test-transaction-builder/Cargo.toml b/crates/rooch-test-transaction-builder/Cargo.toml index 092f91a76e..50b4c797b5 100644 --- a/crates/rooch-test-transaction-builder/Cargo.toml +++ b/crates/rooch-test-transaction-builder/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-test-transaction-builder" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-types/Cargo.toml b/crates/rooch-types/Cargo.toml index 822a954951..1b4a109fd1 100644 --- a/crates/rooch-types/Cargo.toml +++ b/crates/rooch-types/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-types" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch-types/src/error.rs b/crates/rooch-types/src/error.rs index a5b5589b44..7ad4b19396 100644 --- a/crates/rooch-types/src/error.rs +++ b/crates/rooch-types/src/error.rs @@ -156,7 +156,7 @@ impl From for RoochError { #[derive(Debug, Error, Eq, PartialEq)] pub enum GenesisError { - #[error("Genesis version mismatch: from store({from_store:?}), from binary({from_binary:?}).")] + #[error("Genesis version mismatch: from store({from_store}), from binary({from_binary}).")] GenesisVersionMismatch { from_store: Box, from_binary: Box, diff --git a/crates/rooch-types/src/framework/chain_id.rs b/crates/rooch-types/src/framework/chain_id.rs index 51167299ae..123d7937d6 100644 --- a/crates/rooch-types/src/framework/chain_id.rs +++ b/crates/rooch-types/src/framework/chain_id.rs @@ -3,7 +3,7 @@ use std::str::FromStr; -use crate::addresses::ROOCH_FRAMEWORK_ADDRESS; +use crate::{addresses::ROOCH_FRAMEWORK_ADDRESS, rooch_network::BuiltinChainID}; use anyhow::Result; use move_core_types::{account_address::AccountAddress, ident_str, identifier::IdentStr}; use moveos_types::{ @@ -37,6 +37,14 @@ impl ChainID { pub fn chain_id_object_id() -> ObjectID { object::named_object_id(&Self::struct_tag()) } + + pub fn is_builtin(&self) -> bool { + self.to_builtin().is_some() + } + + pub fn to_builtin(&self) -> Option { + BuiltinChainID::try_from(self.id).ok() + } } impl std::fmt::Display for ChainID { diff --git a/crates/rooch-types/src/genesis_config.rs b/crates/rooch-types/src/genesis_config.rs index fa29b54ae5..3c18e6390a 100644 --- a/crates/rooch-types/src/genesis_config.rs +++ b/crates/rooch-types/src/genesis_config.rs @@ -88,12 +88,11 @@ pub static G_DEV_CONFIG: Lazy = Lazy::new(|| GenesisConfig { }); pub static G_TEST_CONFIG: Lazy = Lazy::new(|| { - // curl -sSL "https://mempool.space/testnet/api/block/000000008dfa22c53891f9a7b48a75ae8a523dec558873b061a321fd03a93bac" - + //curl -sSL https://mempool.space/testnet/api/block/$(curl -sSL https://mempool.space/testnet/api/blocks/tip/hash) GenesisConfig { bitcoin_network: crate::bitcoin::network::Network::Testnet.to_num(), - bitcoin_block_height: 2819132, - timestamp: 1717208620000, + bitcoin_block_height: 2820883, + timestamp: 17180946540000, sequencer_account: BitcoinAddress::from_str( "bcrt1p56tdhxkcpc5xvdurfnufn9lkkywsh0gxttv5ktkvlezj0t23nasqawwrla", ) diff --git a/crates/rooch/Cargo.toml b/crates/rooch/Cargo.toml index 4b0aa36e8b..0e059f3120 100644 --- a/crates/rooch/Cargo.toml +++ b/crates/rooch/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/crates/rooch/src/commands/genesis/commands/init.rs b/crates/rooch/src/commands/genesis/commands/init.rs index 7603dce1de..8b73ec1775 100644 --- a/crates/rooch/src/commands/genesis/commands/init.rs +++ b/crates/rooch/src/commands/genesis/commands/init.rs @@ -33,12 +33,11 @@ impl InitCommand { let store_config = opt.store_config(); let rooch_db = RoochDB::init(store_config)?; let network = opt.network(); - let genesis = RoochGenesis::build(network)?; - let root = genesis.init_genesis(&rooch_db)?; + let genesis = RoochGenesis::load_or_init(network, &rooch_db)?; println!( "Genesis statedb initialized at {:?} successfully, state_root: {:?}", opt.base().data_dir(), - root.state_root() + genesis.genesis_root().state_root() ); Ok(()) } diff --git a/crates/rooch/src/commands/statedb/commands/export.rs b/crates/rooch/src/commands/statedb/commands/export.rs index 8dcc413b20..cd16c5ef64 100644 --- a/crates/rooch/src/commands/statedb/commands/export.rs +++ b/crates/rooch/src/commands/statedb/commands/export.rs @@ -160,8 +160,12 @@ impl ExportCommand { println!("Start statedb export task, batch_size: {:?}", BATCH_SIZE); let opt = RoochOpt::new_with_default(self.base_data_dir, self.chain_id, None)?; let rooch_db = RoochDB::init(opt.store_config())?; - - println!("root object: {:?}", rooch_db.root); + let root = rooch_db.latest_root()?.ok_or_else(|| { + RoochError::from(anyhow::Error::msg( + "The statedb is empty, please init genesis first.", + )) + })?; + println!("root object: {:?}", root); let mut _start_time = SystemTime::now(); let file_name = self.output.display().to_string(); @@ -172,7 +176,7 @@ impl ExportCommand { })?; let root_state_root = self .state_root - .unwrap_or(H256::from(rooch_db.root.state_root.into_bytes())); + .unwrap_or(H256::from(root.state_root.into_bytes())); let mode = ExportMode::try_from(self.mode.unwrap_or(ExportMode::Genesis.to_num()))?; match mode { diff --git a/crates/rooch/src/commands/statedb/commands/genesis_utxo.rs b/crates/rooch/src/commands/statedb/commands/genesis_utxo.rs index 2c5d57dcde..9d0a3a66b4 100644 --- a/crates/rooch/src/commands/statedb/commands/genesis_utxo.rs +++ b/crates/rooch/src/commands/statedb/commands/genesis_utxo.rs @@ -103,7 +103,7 @@ impl GenesisUTXOCommand { let opt = RoochOpt::new_with_default(self.base_data_dir, self.chain_id, None).unwrap(); let rooch_db = RoochDB::init(opt.store_config()).unwrap(); - let (root, moveos_store) = (rooch_db.root, rooch_db.moveos_store); + let root = rooch_db.latest_root().unwrap().unwrap(); let utxo_store_id = BitcoinUTXOStore::object_id(); let address_mapping_id = RoochToBitcoinAddressMapping::object_id(); @@ -119,7 +119,7 @@ impl GenesisUTXOCommand { "rooch to bitcoin address_mapping_id: {:?}", address_mapping_id ); - (root, moveos_store, start_time) + (root, rooch_db.moveos_store, start_time) } } diff --git a/crates/rooch/src/commands/statedb/commands/import.rs b/crates/rooch/src/commands/statedb/commands/import.rs index e45aa07e3f..e94f460911 100644 --- a/crates/rooch/src/commands/statedb/commands/import.rs +++ b/crates/rooch/src/commands/statedb/commands/import.rs @@ -15,6 +15,7 @@ use moveos_types::state::{KeyState, State}; use moveos_types::state_resolver::StatelessResolver; use rooch_config::{RoochOpt, R_OPT_NET_HELP}; use rooch_db::RoochDB; +use rooch_genesis::RoochGenesis; use rooch_types::error::{RoochError, RoochResult}; use rooch_types::rooch_network::RoochChainID; use serde::{Deserialize, Serialize}; @@ -83,15 +84,15 @@ impl ImportCommand { let opt = RoochOpt::new_with_default(self.base_data_dir, self.chain_id, None).unwrap(); let rooch_db = RoochDB::init(opt.store_config()).unwrap(); - let (root, moveos_store) = (rooch_db.root, rooch_db.moveos_store); - + let genesis = RoochGenesis::load_or_init(opt.network(), &rooch_db).unwrap(); + let root = genesis.genesis_root().clone(); println!( "task progress started at {}, batch_size: {}", datetime, self.batch_size.unwrap() ); println!("root object: {:?}", root); - (root, moveos_store, start_time) + (root, rooch_db.moveos_store, start_time) } } diff --git a/crates/testsuite/Cargo.toml b/crates/testsuite/Cargo.toml index 7925f66059..9811c68694 100644 --- a/crates/testsuite/Cargo.toml +++ b/crates/testsuite/Cargo.toml @@ -1,7 +1,8 @@ [package] name = "testsuite" -version = "0.5.0" +# Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } license = { workspace = true } diff --git a/frameworks/bitcoin-move/Cargo.toml b/frameworks/bitcoin-move/Cargo.toml index effaa3de07..fafa39696d 100644 --- a/frameworks/bitcoin-move/Cargo.toml +++ b/frameworks/bitcoin-move/Cargo.toml @@ -1,9 +1,9 @@ [package] #Bitcoin Move framework name = "bitcoin-move" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/frameworks/framework-builder/Cargo.toml b/frameworks/framework-builder/Cargo.toml index 845738f5b3..2b2fafefd3 100644 --- a/frameworks/framework-builder/Cargo.toml +++ b/frameworks/framework-builder/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "framework-builder" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/frameworks/framework-release/Cargo.toml b/frameworks/framework-release/Cargo.toml index 6f8e98d01f..baf86251d4 100644 --- a/frameworks/framework-release/Cargo.toml +++ b/frameworks/framework-release/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "framework-release" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/frameworks/framework-release/released/1/stdlib b/frameworks/framework-release/released/1/stdlib index 5cc0bcf122f42b55ce69ebe051be7d417e11be35..51cd721475f904063f5cbb6ecfc6fcc995f2399f 100644 GIT binary patch delta 1262 zcmY*ZNpBoQ6s~$z)m>dxz0`OXyT>ygd%Q2>u|0O$aYF3GHaQ{%q1>zp#s?%EY2pLQ zW!MgIZX`IMAP!D2CK$;Aj@-EB77!Br0VGav=hawjrPk}O-mABL^}7E!@qc{me|`Fh zj^|%IdWDW(&`&Gg)<>n!Mt{>DA;eHpfI^+MzXJX%Y={rpd(8jX`$ft>qiye-SgG&h z#5{{X5aCZnh<`5TcTQS#EPv-@wND92!-$Y-fMPVpZH=O+8{9T%Lddwq?L+}Za|m^l zfM}{%BHnC;GRe3lOL|wA(BN$)Xt>r|LU`RN_zN^5 z@&@J>+wBq&JF9C%-lT?zTN|j`z0x7D*UAv?Z(@}%UPb8L-n!zd~GhBPe*FQoz+gqte5lWk9TX#*NjRk1QpD? zgpyNA9fW-LNj}feD#0lNKpi+h1YnOGoJT-{!SR6P&z_VgDf6U|Tn!#62H^obC52#@ zO2sb5KEFf#=+$2L-f=g7{q&X}9rn82huw>l)Awoq``JhmANTGZJvi+44!Un1caL7n z-}<4N-#(jC!SVfr!`}Ue-J|@Cv$uWk0UEo#y#D3+jcFw)&>0F&;7AcFG|^N;M!?O3 z7}CU+ZN+i}3KA00j5c_pA;wd?CO1#h%{UXloh#2E^D-Xn(g*W8a#|WSY-pkx9$eGO`w1Uue|(kG!em0$pjHnVOz#Gp)t}($B1Dq%^WS& z0YA%D1_pV>bDoKnP(hQwBql?%*D*Tu_tuRUf%a~ej8gqrX~SEZXEDF7aAS)mQYwmU zTkJ<+q_Ya&R}}Rt*|1$xvDR7@Ez#mXRSPkuW2z+#Il7RS%aMuQxQtLJVsn(c%gRz1 VH2N+7`ycl1-ShA6p3_g7e*ufkin9O! delta 1154 zcmZWo&2L*p5Z{^IecrdbZ|$`m`}re@6WjTYlelTSZJ>2Za>zLnNC*ibH6Sh(N_yZH zC=zF+cijQ)_2t}+rOKLF=m04u{_1sPf+}XoAMEVfrXdyd!;ViD0=R+{>zo@ zr^P=+@}h#pmz8Y)bO4jtqtoGW!dNpV(E?zsZAhB}$Jlg{uALHz8BexZB&}PnuxM@q zxZB;7BgJ2B>JI(ImO*+9U_F8!(Kh9lF>`2~s$3jj*of`qBtlt*qYRhWEbWtBy*PONc7=sRFo zba#Vba zGt-~#^jiH^FYTxG*3w{Qy*6AMZkS;;`|a_L1IZ)9L4i~PAlrMA-A769P(j)`W)jL#wcO8% zg63XPPHxbb{5%#xu*FFS+e=pFj~X9~qsqU!(5Pisq|zp^yW|%vPlVw+6@w8`XFq=H zj~$k%#^pEuBajZaD^@vrlV7w2Yc2IdgXIIm^S3wiTU^Fa^~+(x?dY-XmwK9y=EioL3FQTV@+SN6$2weB1ZYemu;fsw_M^^l`YCWXPpi;v8RE2gHZSD z+8J%)s%J*#<&ICyO4%_EOc8zFCK^OOeJ_g4K}Z411Ot&zCNw@dzxv_)3NE^T1LARi Ai2wiq diff --git a/frameworks/framework-types/Cargo.toml b/frameworks/framework-types/Cargo.toml index 59ba05fae8..4f90228c9e 100644 --- a/frameworks/framework-types/Cargo.toml +++ b/frameworks/framework-types/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "framework-types" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/frameworks/moveos-stdlib/Cargo.toml b/frameworks/moveos-stdlib/Cargo.toml index 132a9e9377..7cc4d17b7c 100644 --- a/frameworks/moveos-stdlib/Cargo.toml +++ b/frameworks/moveos-stdlib/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "moveos-stdlib" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/frameworks/rooch-framework/Cargo.toml b/frameworks/rooch-framework/Cargo.toml index 68e1281820..33a8574f5a 100644 --- a/frameworks/rooch-framework/Cargo.toml +++ b/frameworks/rooch-framework/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rooch-framework" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/moveos/metrics/Cargo.toml b/moveos/metrics/Cargo.toml index f8d978eaec..473643e806 100644 --- a/moveos/metrics/Cargo.toml +++ b/moveos/metrics/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "metrics" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/moveos/moveos-commons/accumulator/Cargo.toml b/moveos/moveos-commons/accumulator/Cargo.toml index 8db2140640..8c1e0c8841 100644 --- a/moveos/moveos-commons/accumulator/Cargo.toml +++ b/moveos/moveos-commons/accumulator/Cargo.toml @@ -1,7 +1,15 @@ [package] name = "accumulator" -version = "0.5.0" -edition = "2021" + +# Workspace inherited keys +version = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } +rust-version = { workspace = true } [dependencies] anyhow = { workspace = true } diff --git a/moveos/moveos-commons/moveos-common/Cargo.toml b/moveos/moveos-commons/moveos-common/Cargo.toml index 194322babb..acabec2767 100644 --- a/moveos/moveos-commons/moveos-common/Cargo.toml +++ b/moveos/moveos-commons/moveos-common/Cargo.toml @@ -1,7 +1,15 @@ [package] name = "moveos-common" -version = "0.5.0" -edition = "2021" + +# Workspace inherited keys +version = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } +rust-version = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/moveos/moveos-commons/timeout-join-handler/Cargo.toml b/moveos/moveos-commons/timeout-join-handler/Cargo.toml index 5750920c5e..fe06efb02e 100644 --- a/moveos/moveos-commons/timeout-join-handler/Cargo.toml +++ b/moveos/moveos-commons/timeout-join-handler/Cargo.toml @@ -1,7 +1,15 @@ [package] name = "timeout-join-handler" -version = "0.5.0" -edition = "2021" + +# Workspace inherited keys +version = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } +rust-version = { workspace = true } [dependencies] thiserror = { workspace = true } diff --git a/moveos/moveos-compiler/Cargo.toml b/moveos/moveos-compiler/Cargo.toml index f1f705cbf7..19f9e00477 100644 --- a/moveos/moveos-compiler/Cargo.toml +++ b/moveos/moveos-compiler/Cargo.toml @@ -1,7 +1,15 @@ [package] name = "moveos-compiler" -version = "0.5.0" -edition = "2021" + +# Workspace inherited keys +version = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } +rust-version = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/moveos/moveos-config/Cargo.toml b/moveos/moveos-config/Cargo.toml index 888fcc030a..cc80e1aec0 100644 --- a/moveos/moveos-config/Cargo.toml +++ b/moveos/moveos-config/Cargo.toml @@ -1,7 +1,15 @@ [package] name = "moveos-config" -version = "0.5.0" -edition = "2021" + +# Workspace inherited keys +version = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } +rust-version = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/moveos/moveos-object-runtime/Cargo.toml b/moveos/moveos-object-runtime/Cargo.toml index 4da3a275ca..2e4a35cf72 100644 --- a/moveos/moveos-object-runtime/Cargo.toml +++ b/moveos/moveos-object-runtime/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "moveos-object-runtime" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/moveos/moveos-store/Cargo.toml b/moveos/moveos-store/Cargo.toml index 2e4c0bd9ba..0609bfef26 100644 --- a/moveos/moveos-store/Cargo.toml +++ b/moveos/moveos-store/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "moveos-store" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/moveos/moveos-types/Cargo.toml b/moveos/moveos-types/Cargo.toml index 5748b4453c..7f1a4bdac6 100644 --- a/moveos/moveos-types/Cargo.toml +++ b/moveos/moveos-types/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "moveos-types" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/moveos/moveos-types/src/genesis_info.rs b/moveos/moveos-types/src/genesis_info.rs index c71cf5198e..6d8cbe691f 100644 --- a/moveos/moveos-types/src/genesis_info.rs +++ b/moveos/moveos-types/src/genesis_info.rs @@ -5,31 +5,47 @@ use crate::moveos_std::object::RootObjectEntity; use primitive_types::H256; use serde::{Deserialize, Serialize}; use std::fmt; -use std::fmt::Debug; -#[derive(Eq, PartialEq, Deserialize, Serialize, Clone, Debug)] +#[derive(Eq, PartialEq, Deserialize, Serialize, Clone)] pub struct GenesisInfo { /// genesis package hash pub genesis_package_hash: H256, /// lastest state root hash pub root: RootObjectEntity, + /// genesis binary + pub genesis_bin: Vec, +} + +impl fmt::Debug for GenesisInfo { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "GenesisInfo {{ genesis_package_hash: {:?}, state_root_hash: {:?}, size: {} }}", + self.genesis_package_hash, + self.root.state_root(), + self.root.size + ) + } } impl fmt::Display for GenesisInfo { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, - "GenesisInfo {{ genesis_package_hash: {}, state_root_hash: {}, size: {} }}", - self.genesis_package_hash, self.root.state_root, self.root.size + "GenesisInfo {{ genesis_package_hash: {:?}, state_root_hash: {:?}, size: {} }}", + self.genesis_package_hash, + self.root.state_root(), + self.root.size ) } } impl GenesisInfo { - pub fn new(genesis_package_hash: H256, root: RootObjectEntity) -> Self { + pub fn new(genesis_package_hash: H256, root: RootObjectEntity, genesis_bin: Vec) -> Self { GenesisInfo { genesis_package_hash, root, + genesis_bin, } } } diff --git a/moveos/moveos-verifier/Cargo.toml b/moveos/moveos-verifier/Cargo.toml index cf41c970fe..01cac68a7e 100644 --- a/moveos/moveos-verifier/Cargo.toml +++ b/moveos/moveos-verifier/Cargo.toml @@ -1,7 +1,15 @@ [package] name = "moveos-verifier" -version = "0.5.0" -edition = "2021" + +# Workspace inherited keys +version = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } +rust-version = { workspace = true } [dependencies] anyhow = { workspace = true } diff --git a/moveos/moveos-wasm/Cargo.toml b/moveos/moveos-wasm/Cargo.toml index 18b6f52f9d..e0eefc853f 100644 --- a/moveos/moveos-wasm/Cargo.toml +++ b/moveos/moveos-wasm/Cargo.toml @@ -1,7 +1,15 @@ [package] name = "moveos-wasm" -version = "0.5.0" -edition = "2021" + +# Workspace inherited keys +version = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } +rust-version = { workspace = true } [dependencies] serde = { workspace = true } diff --git a/moveos/moveos/Cargo.toml b/moveos/moveos/Cargo.toml index dc7a4cdda3..3cf07be3cd 100644 --- a/moveos/moveos/Cargo.toml +++ b/moveos/moveos/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "moveos" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/moveos/raw-store/Cargo.toml b/moveos/raw-store/Cargo.toml index 465fe050e5..4545c07d9e 100644 --- a/moveos/raw-store/Cargo.toml +++ b/moveos/raw-store/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "raw-store" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/moveos/smt/Cargo.toml b/moveos/smt/Cargo.toml index bcaeb24e49..a508172bcb 100644 --- a/moveos/smt/Cargo.toml +++ b/moveos/smt/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "smt" -version = "0.5.0" # Workspace inherited keys +version = { workspace = true } authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true }