Files
arkhe-origin-chain/crates/origin-chain-node/src/main.rs
T
davidherranandClaude Opus 4.6 8a24a86ee6 feat(node): Phase 1.6+ Slice 1 — origin-chain-node CLI canonical v0.0.10
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>
2026-05-20 21:10:39 -05:00

175 lines
7.6 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//! # 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");
}