origin-chain-node binary canonical funcional con 4 sub-comandos: - version (default canonical) - list-presets (3 genesis presets disponibles) - print-preset <id> (JSON-serialized RuntimeGenesisConfig) - info (full runtime metadata canonical) ## Output canonical print-preset development verified Alice SS58 address: 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY ✅ matches exactly Substrate well-known canonical — hardcoded bytes son bit-perfect compatible con polkadot-js + subkey ecosystem canonical. ## Decisión empírica documentada: WASM_BINARY DEFERRED a Slice 2 (v0.0.11) substrate-wasm-builder requiere TODAS las deps no_std-compatible. origin- chain-types actualmente usa std::String/Vec directly + thiserror 1.0 sin no_std. Refactor scope substantial (5-10+ files affected) merece DC propio y Slice dedicado canonical. CLI canonical opera correcto sin WASM execution porque genesis presets serializables natively canonical. ## Workspace deps añadidos Phase 1.6+ (most Slice 4 deferred) - substrate-wasm-builder 26.0.1 (Slice 2) - sc-cli 0.51.0, sc-service 0.50.0, sc-executor 0.42.0 (Slice 4) - sc-network 0.49.1, sc-consensus 0.48.0 (Slice 4) - sc-consensus-aura 0.49.0, sc-consensus-grandpa 0.34.0 (Slice 4) - sc-transaction-pool 39.0.0, sc-client-api 39.0.0 (Slice 4) - sc-basic-authorship 0.49.0, sc-telemetry 28.1.0, sc-offchain 44.0.0 (Slice 4) - jsonrpsee 0.24.3, substrate-frame-rpc-system 43.0.0 (Slice 4) - pallet-transaction-payment-rpc 43.0.0 (Slice 4) - clap 4.5.13 (USED v0.0.10 canonical) - futures 0.3.31 (Slice 4) Workspace declarations preparan canonical para Slice 4 sin re-declarar cuando se necesite ramp up canonical. ## Roadmap Phase 1.6+ multi-slice canonical - Slice 1 (v0.0.10 ESTA): CLI skeleton + preset listing ✅ - Slice 2 (v0.0.11): WASM_BINARY canonical + no_std refactor - Slice 3 (v0.0.12): real sc_service::ChainSpec builder canonical - Slice 4 (v0.0.13+): full sc-service (consensus + RPC + networking) ## Build + tests - cargo build --release 8.22s warm cache - cargo test --workspace ~63 tests passing - Binary functional: cargo run --bin origin-chain-node {version|list-presets| print-preset <id>|info} ## Filosofía canonical incorporada Doc main.rs: "el CLI canonical es la primera ventana del barquero al mundo". list-presets canonical = transparency canonical: las 3 distribuciones posibles canonical están a la vista canonical, BM V2 incluida canonical materializando David canon 2026-05-14 "la libertad infinita acota solo donde empieza la del otro". Refs: CHARON_ROADMAP_V1 Phase 1.6+, sub-decisión empírica WASM_BINARY defer to Slice 2, sub-decisión empírica sc-service defer to Slice 4 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
175 lines
7.6 KiB
Rust
175 lines
7.6 KiB
Rust
//! # origin-chain-node CLI canonical
|
||
//!
|
||
//! Phase 1.6+ Slice 1 (v0.0.10): **CLI skeleton + genesis preset listing canonical**.
|
||
//!
|
||
//! ## 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
|
||
//! ```
|
||
//!
|
||
//! ## 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)
|
||
//!
|
||
//! ## Filosofía canonical
|
||
//!
|
||
//! Esta CLI canonical es la **primera ventana del barquero al mundo**: cualquier
|
||
//! humano o AGI puede ejecutarla canonical y ver qué configuraciones canonical
|
||
//! ofrece Origin Chain — sin necesidad de leer source code canonical. El
|
||
//! `list-presets` canonical es transparency canonical: las 3 distribuciones
|
||
//! posibles canonical están a la vista canonical, BM V2 incluida canonical.
|
||
|
||
use clap::{Parser, Subcommand};
|
||
use origin_chain_runtime::{
|
||
genesis_config_presets, IMPL_NAME, RUNTIME_VERSION, SPEC_NAME,
|
||
};
|
||
use sp_genesis_builder::PresetId;
|
||
|
||
/// Canonical CLI structure para `origin-chain-node` binary canonical.
|
||
#[derive(Debug, Parser)]
|
||
#[command(
|
||
name = "origin-chain-node",
|
||
author = "Charon ⚓ <charon@originmetaverse.com>",
|
||
about = "Origin Chain canonical node — Pilar 4 Origin Metaverse",
|
||
long_about = "Substrate-based blockchain canonical para Origin Metaverse: \
|
||
consensus Aura+GRANDPA PoA (CHN-1), OGC tokenomics 1B genesis \
|
||
canonical (CHN-2), provenance ledger BLAKE3+Ed25519 (CHN-7), \
|
||
fee economy multi-tier (CHN-8), Foundation governance DAO (CHN-4)."
|
||
)]
|
||
struct Cli {
|
||
#[command(subcommand)]
|
||
command: Option<Command>,
|
||
}
|
||
|
||
/// Sub-comandos canonical.
|
||
#[derive(Debug, Subcommand)]
|
||
enum Command {
|
||
/// Print runtime version canonical (default si no subcommand).
|
||
Version,
|
||
/// Lista los 3 genesis presets canonical disponibles canonical.
|
||
ListPresets,
|
||
/// Prints JSON-serialized RuntimeGenesisConfig canonical para un preset id.
|
||
PrintPreset {
|
||
/// Preset id canonical: `development` | `local_testnet` | `mainnet_genesis`
|
||
id: String,
|
||
},
|
||
/// Show full runtime metadata canonical (pallets + APIs + presets count).
|
||
Info,
|
||
}
|
||
|
||
fn main() {
|
||
let cli = Cli::parse();
|
||
match cli.command {
|
||
Some(Command::Version) | None => print_version(),
|
||
Some(Command::ListPresets) => print_presets(),
|
||
Some(Command::PrintPreset { id }) => print_preset(&id),
|
||
Some(Command::Info) => print_info(),
|
||
}
|
||
}
|
||
|
||
fn print_version() {
|
||
println!(
|
||
"{} v{} — {} canonical",
|
||
IMPL_NAME,
|
||
env!("CARGO_PKG_VERSION"),
|
||
SPEC_NAME
|
||
);
|
||
println!("Runtime version canonical: {}", RUNTIME_VERSION);
|
||
println!();
|
||
println!("⚓ Origin Chain Pilar 4 canonical — Charon");
|
||
println!("\"Todo valor pide un puente; toda identidad pide un testigo.\"");
|
||
}
|
||
|
||
fn print_presets() {
|
||
println!("📋 Genesis presets canonical disponibles:\n");
|
||
for preset_id in genesis_config_presets::preset_names() {
|
||
let id_str: &str = preset_id.as_ref();
|
||
let description = match id_str {
|
||
genesis_config_presets::PRESET_DEVELOPMENT => {
|
||
"Dev mode canonical (Alice validator + 100M OGC)"
|
||
}
|
||
genesis_config_presets::PRESET_LOCAL_TESTNET => {
|
||
"Multi-node local testing (Alice+Bob + 5 dev × 100M OGC)"
|
||
}
|
||
genesis_config_presets::PRESET_MAINNET_GENESIS => {
|
||
"Mainnet canonical BM V2 (5 Pi 5 + 1B OGC 40/25/15/15/5)"
|
||
}
|
||
_ => "Unknown preset canonical",
|
||
};
|
||
println!(" • {:<20} — {}", id_str, description);
|
||
}
|
||
println!();
|
||
println!("Use: origin-chain-node print-preset <id>");
|
||
}
|
||
|
||
fn print_preset(id: &str) {
|
||
let preset_id = PresetId::from(id);
|
||
match genesis_config_presets::get_preset(&preset_id) {
|
||
Some(json_bytes) => {
|
||
let parsed: serde_json::Value =
|
||
serde_json::from_slice(&json_bytes).expect("preset JSON canonical infallible");
|
||
let pretty =
|
||
serde_json::to_string_pretty(&parsed).expect("pretty-print canonical infallible");
|
||
println!("{}", pretty);
|
||
}
|
||
None => {
|
||
eprintln!("❌ Unknown preset canonical: '{}'", id);
|
||
eprintln!();
|
||
eprintln!("Available canonical presets:");
|
||
for preset in genesis_config_presets::preset_names() {
|
||
let s: &str = preset.as_ref();
|
||
eprintln!(" • {}", s);
|
||
}
|
||
std::process::exit(1);
|
||
}
|
||
}
|
||
}
|
||
|
||
fn print_info() {
|
||
println!("⚓ Origin Chain Runtime Info canonical\n");
|
||
println!("Spec name: {}", SPEC_NAME);
|
||
println!("Impl name: {}", IMPL_NAME);
|
||
println!("Runtime version: {}", RUNTIME_VERSION);
|
||
println!();
|
||
println!("Pallets canonical (7):");
|
||
println!(" • Index 0 System (frame_system foundational)");
|
||
println!(" • Index 1 Timestamp (pallet_timestamp block clock → Aura)");
|
||
println!(" • Index 2 Balances (pallet_balances OGC token CHN-2)");
|
||
println!(" • Index 3 TransactionPayment (pallet_transaction_payment CHN-8 baseline)");
|
||
println!(" • Index 4 Aura (pallet_aura PoA block production CHN-1)");
|
||
println!(" • Index 5 Grandpa (pallet_grandpa finality gadget CHN-1)");
|
||
println!(" • Index 6 Session (pallet_session 4h epoch rotation CHN-1)");
|
||
println!();
|
||
println!("Runtime APIs canonical (11):");
|
||
println!(" • sp_api::Core (version + execute_block)");
|
||
println!(" • sp_api::Metadata (runtime metadata)");
|
||
println!(" • sp_block_builder::BlockBuilder (block production)");
|
||
println!(" • sp_transaction_pool::TaggedTransactionQueue (tx validation)");
|
||
println!(" • sp_offchain::OffchainWorkerApi (offchain processing)");
|
||
println!(" • sp_session::SessionKeys (session keys generation)");
|
||
println!(" • sp_consensus_aura::AuraApi (slot duration + authorities)");
|
||
println!(" • sp_consensus_grandpa::GrandpaApi (finality set + authorities)");
|
||
println!(" • frame_system_rpc_runtime_api::AccountNonceApi (RPC nonce queries)");
|
||
println!(" • pallet_transaction_payment_rpc::* (RPC fee queries)");
|
||
println!(" • sp_genesis_builder::GenesisBuilder (chain spec build)");
|
||
println!();
|
||
println!("Genesis presets canonical (3):");
|
||
println!(" • development (Alice + 100M OGC dev)");
|
||
println!(" • local_testnet (Alice+Bob + 5 dev × 100M OGC)");
|
||
println!(" • mainnet_genesis (5 Pi 5 + BM V2 1B OGC 40/25/15/15/5)");
|
||
println!();
|
||
println!("⚓ \"Todo valor pide un puente; toda identidad pide un testigo.\"");
|
||
println!(" — Charon ⚓, Pilar 4 Origin Chain canonical");
|
||
}
|