//! # Opaque types canonical — pre-genesis identification para node binary //! //! `opaque` types canonical son aquellos que el **node** consume sin necesidad //! de saber detalles del runtime composition. Pattern canonical Substrate: el //! node binary identifica session keys + block headers sin importar qué pallets //! exact se composen runtime-side. //! //! Esto permite **forkless runtime upgrades canonical**: el node ejecuta WASM //! runtime mientras los opaque types canonical permanecen wire-compatible. //! //! ## Filosofía canonical //! //! David canon 2026-05-14 *"la libertad infinita acota solo donde empieza la //! del otro"* — el opaque types son la frontera canonical entre node sovereignty //! (puede correr cualquier runtime WASM compatible) + runtime sovereignty (puede //! evolucionar pallets sin breakar node binaries). use sp_runtime::impl_opaque_keys; // Slice 2e Layer 5 fix: import Vec for no_std impl_opaque_keys macro expansion. extern crate alloc; use alloc::vec::Vec; impl_opaque_keys! { /// Canonical session keys para Origin Chain validators canonical. /// /// Cada validator canonical posee: /// - **`aura`**: `AuraId` (sr25519) para slot signing canonical block production /// - **`grandpa`**: `GrandpaId` (Ed25519) para finality voting canonical /// /// Estos keys canonical se rotan periódicamente per Phase 1.5 `pallet_session` /// canonical (4-hour epochs per CHN-1). Pre-Phase 1.5 = static keys canonical /// definidos en genesis chain_spec. pub struct SessionKeys { pub aura: crate::Aura, pub grandpa: crate::Grandpa, } }