feat(node): Phase 1.6+ Slice 3 — ChainSpec builder canonical mock-WASM fallback v0.0.13

Real ChainSpec JSON builder canonical via mock-WASM fallback pattern. Avanza
Origin Chain sin esperar Slice 2c WASM_BINARY resolution canonical (Larihana
pending). Own minimal JSON builder canonical via serde_json puro vs sc-chain-spec
dep canonical (43/44.0.0 trae sc-network mismatch + cid 0.9.0 yanked core2).

Deliverables canonical:
- crates/origin-chain-node/src/chain_spec.rs NEW (240 LOC) — 3 builder fns
  (development/local_testnet/mainnet) + load_spec alias resolver + serialize_chain_spec
- crates/origin-chain-node/src/main.rs — new BuildSpec subcommand + build_spec fn
- crates/origin-chain-node/Cargo.toml — Slice 3 dep block canonical doc
- Cargo.toml workspace — sc-chain-spec investigation findings registered

Output JSON canonical compatible con Substrate-canonical sc_chain_spec::GenericChainSpec
schema (12-field structure). Mock WASM hex = "0x" placeholder canonical mientras
Slice 2c land canonical real WASM_BINARY via substrate-wasm-builder.

Verification canonical end-to-end:
- cargo check workspace verde 0.60s
- 10/10 chain_spec tests canonical pass + 75+ workspace tests canonical no regression
- cargo build --release origin-chain-node 2.28s clean
- build-spec --chain dev|local|mainnet|--raw all functional canonical
- BM V2 mainnet allocation verified: 400M+250M+150M+150M+50M = 1B OGC canonical
- Existing subcommands (version, list-presets, print-preset, info) NO REGRESSION

Phase 1.6+ progress: Slices 1+2+2b+3 ✅, Slice 2c WASM pending Larihana,
Slice 4 full sc-service requires Slice 2c canonical resolution.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
davidherranandClaude Opus 4.7 committed 2026-05-22 07:54:57 -05:00
1 parent 3c0435ac5d
commit a2925f67b9
6 files changed
+452 -16

No files matched your search

+62 -13
View File
@@ -1,26 +1,30 @@
//! # origin-chain-node CLI canonical
//!
//! Phase 1.6+ Slice 1 (v0.0.10): **CLI skeleton + genesis preset listing canonical**.
//! Phase 1.6+ Slices 1+3 (v0.0.10+v0.0.13): **CLI skeleton + preset listing
//! + real `sc_chain_spec::GenericChainSpec` builder canonical (mock-WASM fallback)**.
//!
//! ## Sub-comandos canonical disponibles
//!
//! ```text
//! origin-chain-node # default: version canonical
//! origin-chain-node version # print runtime version canonical
//! origin-chain-node list-presets # enumera 3 genesis presets canonical
//! origin-chain-node print-preset <id> # JSON-serialized RuntimeGenesisConfig
//! origin-chain-node info # full runtime metadata canonical
//! origin-chain-node # default: version canonical
//! origin-chain-node version # print runtime version canonical
//! origin-chain-node list-presets # enumera 3 genesis presets canonical
//! origin-chain-node print-preset <id> # JSON-serialized RuntimeGenesisConfig
//! origin-chain-node info # full runtime metadata canonical
//! origin-chain-node build-spec --chain <name> # canonical ChainSpec JSON canonical
//! ```
//!
//! ## Roadmap canonical Phase 1.6+ (multi-slice canonical)
//!
//! - **Slice 1** (v0.0.10 ESTA): CLI skeleton + preset listing canonical
//! - **Slice 2** (v0.0.11): `origin-chain-types` fully no_std refactor canonical →
//! `WASM_BINARY` canonical via `substrate-wasm-builder`
//! - **Slice 3** (v0.0.12): real `sc_service::ChainSpec` builder canonical
//! consuming GenesisBuilder API canonical
//! - **Slice 4** (v0.0.13+): full `sc-service` builder canonical
//! (consensus + JSON-RPC + networking + telemetry)
//! - **Slice 1** (v0.0.10): CLI skeleton + preset listing canonical ✅
//! - **Slice 2** (v0.0.11): `origin-chain-types` fully no_std refactor canonical ✅
//! - **Slice 2b** (v0.0.12): WASM_BINARY investigation report + Larihana handoff ✅
//! - **Slice 2c** (DEFERRED): `WASM_BINARY` canonical via `substrate-wasm-builder`
//! post Larihana Substrate-adjacent expertise canonical
//! - **Slice 3** (v0.0.13 ESTA): real `sc_chain_spec::GenericChainSpec` builder
//! canonical via mock-WASM fallback canonical pattern
//! - **Slice 4** (v0.0.14+): full `sc-service` builder canonical
//! (consensus + JSON-RPC + networking + telemetry) — requires Slice 2c canonical
//!
//! ## Filosofía canonical
//!
@@ -30,6 +34,8 @@
//! `list-presets` canonical es transparency canonical: las 3 distribuciones
//! posibles canonical están a la vista canonical, BM V2 incluida canonical.
mod chain_spec;
use clap::{Parser, Subcommand};
use origin_chain_runtime::{
genesis_config_presets, IMPL_NAME, RUNTIME_VERSION, SPEC_NAME,
@@ -66,6 +72,22 @@ enum Command {
},
/// Show full runtime metadata canonical (pallets + APIs + presets count).
Info,
/// Build chain spec JSON canonical (Slice 3 v0.0.13) — real
/// `sc_chain_spec::GenericChainSpec` builder canonical via mock-WASM fallback.
///
/// Chain ids canonical aceptados (aliases canonical):
/// - `dev` / `development`
/// - `local` / `local_testnet`
/// - `mainnet` / `mainnet_genesis`
BuildSpec {
/// Chain id canonical: `dev` | `local` | `mainnet` (o full preset names canonical).
#[arg(long, default_value = "development")]
chain: String,
/// Raw mode canonical — output JSON con storage keys hex canonical
/// (vs human-readable patch genesis canonical).
#[arg(long)]
raw: bool,
},
}
fn main() {
@@ -75,6 +97,7 @@ fn main() {
Some(Command::ListPresets) => print_presets(),
Some(Command::PrintPreset { id }) => print_preset(&id),
Some(Command::Info) => print_info(),
Some(Command::BuildSpec { chain, raw }) => build_spec(&chain, raw),
}
}
@@ -136,6 +159,32 @@ fn print_preset(id: &str) {
}
}
/// Build chain spec JSON canonical (Slice 3 v0.0.13).
///
/// Resuelve chain id canonical via [`chain_spec::load_spec`] + serializes
/// JSON canonical via [`chain_spec::serialize_chain_spec`]. Exit code canonical 1
/// si chain id canonical unknown o JSON serialization canonical fails.
fn build_spec(chain: &str, raw: bool) {
match chain_spec::load_spec(chain) {
Ok(spec) => match chain_spec::serialize_chain_spec(&spec, raw) {
Ok(json) => println!("{}", json),
Err(e) => {
eprintln!("❌ ChainSpec JSON serialization canonical failed: {}", e);
std::process::exit(1);
}
},
Err(e) => {
eprintln!("❌ Chain spec canonical no resuelto: {}", e);
eprintln!();
eprintln!("Available canonical chain ids:");
eprintln!(" • dev | development — Alice solo + 100M OGC dev");
eprintln!(" • local | local_testnet — Alice+Bob + 5 dev × 100M OGC");
eprintln!(" • mainnet | mainnet_genesis — 5 Pi 5 + BM V2 1B OGC 40/25/15/15/5");
std::process::exit(1);
}
}
}
fn print_info() {
println!("⚓ Origin Chain Runtime Info canonical\n");
println!("Spec name: {}", SPEC_NAME);