diff --git a/Cargo.lock b/Cargo.lock index bf59bff9..e62edb02 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7353,7 +7353,6 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "hex-literal", - "orbinum-signature-api", "orbinum-zk-verifier", "pallet-account-mapping", "pallet-account-mapping-runtime-api", @@ -7400,18 +7399,6 @@ dependencies = [ "substrate-wasm-builder", ] -[[package]] -name = "orbinum-signature-api" -version = "0.1.0" -dependencies = [ - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-core", - "sp-runtime", - "sp-std", -] - [[package]] name = "orbinum-zk-circuits" version = "0.2.3" diff --git a/Cargo.toml b/Cargo.toml index 9b275a90..2d3c752f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,7 +26,6 @@ members = [ "frame/account-mapping/runtime-api", "frame/account-mapping/rpc", "frame/evm/precompile/account-mapping", - "frame/signature-api", "client/api", "client/consensus", "client/rpc-core", @@ -227,7 +226,6 @@ orbinum-zk-core = { path = "primitives/zk-core", default-features = false } orbinum-zk-verifier = { path = "primitives/zk-verifier", default-features = false } # Frontier FRAME -orbinum-signature-api = { path = "frame/signature-api", default-features = false } pallet-account-mapping = { path = "frame/account-mapping", default-features = false } pallet-account-mapping-rpc = { path = "frame/account-mapping/rpc" } pallet-account-mapping-runtime-api = { path = "frame/account-mapping/runtime-api", default-features = false } diff --git a/frame/signature-api/Cargo.toml b/frame/signature-api/Cargo.toml deleted file mode 100644 index ea7a2ff6..00000000 --- a/frame/signature-api/Cargo.toml +++ /dev/null @@ -1,28 +0,0 @@ -[package] -name = "orbinum-signature-api" -version = "0.1.0" -authors.workspace = true -edition.workspace = true -repository.workspace = true -homepage.workspace = true -license = "GPL-3.0-or-later" -description = "RuntimeAPI para consultar y validar firmas MultiSignature en Orbinum" - -[dependencies] -parity-scale-codec = { version = "3.6", default-features = false, features = ["derive"] } -scale-info = { version = "2.11", default-features = false, features = ["derive"] } -sp-api = { git = "https://github.com/paritytech/polkadot-sdk", branch = "stable2506", default-features = false } -sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "stable2506", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "stable2506", default-features = false } -sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "stable2506", default-features = false } - -[features] -default = ["std"] -std = [ - "parity-scale-codec/std", - "scale-info/std", - "sp-api/std", - "sp-core/std", - "sp-runtime/std", - "sp-std/std", -] diff --git a/frame/signature-api/src/lib.rs b/frame/signature-api/src/lib.rs deleted file mode 100644 index d821b8ef..00000000 --- a/frame/signature-api/src/lib.rs +++ /dev/null @@ -1,67 +0,0 @@ -//! # Orbinum Signature RuntimeAPI -//! -//! Defines the `SignatureApi` trait so clients can query which signature types -//! the runtime supports and validate signatures without executing extrinsics. -//! -//! ## Usage from TypeScript (polkadot.js) -//! -//! ```typescript -//! // Available types -//! const types = await api.call.signatureApi.getSupportedSignatureTypes(); -//! -//! // Validate a signature -//! const valid = await api.call.signatureApi.validateSignature(sig, msg, signer); -//! ``` - -#![cfg_attr(not(feature = "std"), no_std)] - -extern crate alloc; - -use alloc::vec::Vec; -use parity_scale_codec::{Decode, Encode}; -use scale_info::TypeInfo; - -/// Signature variants supported by the Orbinum runtime. -/// -/// - `Sr25519`: native Substrate signature (recommended for Substrate accounts) -/// - `Ed25519`: ed25519 signature (legacy, supported for compatibility) -/// - `Ecdsa`: ECDSA signature with 33-byte compressed public key (Ethereum-compatible) -#[derive(Debug, Clone, Copy, PartialEq, Eq, Encode, Decode, TypeInfo)] -pub enum SignatureType { - /// Native Substrate signature: 32-byte public key, 64-byte signature. - Sr25519 = 0, - /// Ed25519 signature: 32-byte public key, 64-byte signature. - Ed25519 = 1, - /// Substrate ECDSA signature: 33-byte compressed public key, 65-byte signature. - Ecdsa = 2, -} - -sp_api::decl_runtime_apis! { - /// Runtime API for querying and validating MultiSignature signatures. - /// - /// This API allows clients to: - /// 1. Discover which signature types the runtime accepts. - /// 2. Validate a signature without building or submitting an extrinsic. - pub trait SignatureApi { - /// Returns the signature types supported by this runtime. - /// - /// The order indicates preference: the first entry is the recommended - /// type for Substrate-native accounts. - fn get_supported_signature_types() -> Vec; - - /// Validates a `MultiSignature` against a message and an `AccountId32`. - /// - /// Returns `true` if the signature is cryptographically valid for the - /// given `signer`. Does not modify state or consume fees. - /// - /// # Parameters - /// - `signature`: the signature serialized as SCALE-encoded `MultiSignature` - /// - `message`: the original message (raw bytes, no prefix) - /// - `signer`: the expected signer's `AccountId32` - fn validate_signature( - signature: sp_runtime::MultiSignature, - message: Vec, - signer: sp_core::crypto::AccountId32, - ) -> bool; - } -} diff --git a/template/runtime/Cargo.toml b/template/runtime/Cargo.toml index 4a6e65ba..371efc91 100644 --- a/template/runtime/Cargo.toml +++ b/template/runtime/Cargo.toml @@ -71,7 +71,6 @@ pallet-evm-precompile-sha3fips-benchmarking = { workspace = true } pallet-evm-precompile-simple = { workspace = true } # Orbinum Privacy -orbinum-signature-api = { workspace = true } orbinum-zk-verifier = { workspace = true, default-features = false } pallet-shielded-pool = { workspace = true } pallet-shielded-pool-runtime-api = { workspace = true } @@ -149,7 +148,6 @@ std = [ "pallet-evm-precompile-curve25519-benchmarking/std", "pallet-evm-precompile-account-mapping/std", # Orbinum Privacy - "orbinum-signature-api/std", "pallet-zk-verifier/std", "pallet-shielded-pool/std", "pallet-shielded-pool/poseidon-native", diff --git a/template/runtime/src/lib.rs b/template/runtime/src/lib.rs index c6d34050..b0afb41c 100644 --- a/template/runtime/src/lib.rs +++ b/template/runtime/src/lib.rs @@ -1257,27 +1257,6 @@ impl_runtime_apis! { } } - // SignatureApi RuntimeAPI implementation - impl orbinum_signature_api::SignatureApi for Runtime { - fn get_supported_signature_types() -> alloc::vec::Vec { - // Sr25519 primero: tipo preferido para cuentas Substrate-nativas. - // Ecdsa segundo: para cuentas derivadas de claves Ethereum. - alloc::vec![ - orbinum_signature_api::SignatureType::Sr25519, - orbinum_signature_api::SignatureType::Ecdsa, - ] - } - - fn validate_signature( - signature: sp_runtime::MultiSignature, - message: alloc::vec::Vec, - signer: sp_core::crypto::AccountId32, - ) -> bool { - use sp_runtime::traits::Verify; - signature.verify(message.as_slice(), &signer) - } - } - #[cfg(feature = "runtime-benchmarks")] impl frame_benchmarking::Benchmark for Runtime { fn benchmark_metadata(extra: bool) -> ( diff --git a/template/runtime/src/runtime_tests.rs b/template/runtime/src/runtime_tests.rs index c03c6148..9605c120 100644 --- a/template/runtime/src/runtime_tests.rs +++ b/template/runtime/src/runtime_tests.rs @@ -274,16 +274,10 @@ fn multisignature_variants_have_correct_byte_sizes() { } fn api_validate_signature(signature: MultiSignature, message: &[u8], signer: &AccountId) -> bool { + use sp_runtime::traits::Verify; signature.verify(message, signer) } -fn api_get_supported_types() -> alloc::vec::Vec { - alloc::vec![ - orbinum_signature_api::SignatureType::Sr25519, - orbinum_signature_api::SignatureType::Ecdsa, - ] -} - fn sr25519_account(derivation: &str) -> (sr25519::Pair, AccountId) { let pair = sr25519::Pair::from_string(derivation, None).unwrap(); let account: AccountId = MultiSigner::from(pair.public()).into_account(); @@ -296,91 +290,6 @@ fn ecdsa_account(derivation: &str) -> (ecdsa::Pair, AccountId) { (pair, account) } -#[test] -fn signature_api_returns_sr25519_and_ecdsa() { - use orbinum_signature_api::SignatureType; - let types = api_get_supported_types(); - assert!(types.contains(&SignatureType::Sr25519)); - assert!(types.contains(&SignatureType::Ecdsa)); - assert_eq!(types.len(), 2, "Only Sr25519 and Ecdsa must be registered"); -} - -#[test] -fn signature_api_sr25519_is_first_preferred_type() { - use orbinum_signature_api::SignatureType; - let types = api_get_supported_types(); - assert_eq!( - types[0], - SignatureType::Sr25519, - "Sr25519 must be the first type (preferred)" - ); -} - -#[test] -fn signature_type_scale_discriminants_are_stable() { - use orbinum_signature_api::SignatureType; - use scale_codec::Encode; - assert_eq!(SignatureType::Sr25519.encode(), vec![0u8]); - assert_eq!(SignatureType::Ed25519.encode(), vec![1u8]); - assert_eq!(SignatureType::Ecdsa.encode(), vec![2u8]); -} - -#[test] -fn signature_api_validate_sr25519_valid_signature() { - let (pair, account) = sr25519_account("//Alice"); - let msg = b"orbinum-signature-api-test"; - let multi_sig = MultiSignature::Sr25519(pair.sign(msg)); - assert!(api_validate_signature(multi_sig, msg, &account)); -} - -#[test] -fn signature_api_validate_ecdsa_valid_signature() { - let (pair, account) = ecdsa_account("//Alice"); - let msg = b"orbinum-signature-api-test"; - let multi_sig = MultiSignature::Ecdsa(pair.sign(msg)); - assert!(api_validate_signature(multi_sig, msg, &account)); -} - -#[test] -fn signature_api_validate_wrong_signer_rejected() { - let (alice, _) = sr25519_account("//Alice"); - let (_, bob_account) = sr25519_account("//Bob"); - let msg = b"test-message"; - let multi_sig = MultiSignature::Sr25519(alice.sign(msg)); - assert!(!api_validate_signature(multi_sig, msg, &bob_account)); -} - -#[test] -fn signature_api_validate_wrong_message_rejected() { - let (pair, account) = sr25519_account("//Alice"); - let signed_msg = b"original-message"; - let wrong_msg = b"modified-message"; - let multi_sig = MultiSignature::Sr25519(pair.sign(signed_msg)); - assert!(!api_validate_signature(multi_sig, wrong_msg, &account)); -} - -#[test] -fn signature_api_validate_corrupted_signature_rejected() { - let (pair, account) = sr25519_account("//Alice"); - let msg = b"test-message"; - let mut raw_sig = pair.sign(msg); - raw_sig.0[0] ^= 0xFF; - raw_sig.0[1] ^= 0xFF; - let multi_sig = MultiSignature::Sr25519(raw_sig); - assert!(!api_validate_signature(multi_sig, msg, &account)); -} - -#[test] -fn signature_api_validate_wrong_signature_type_rejected() { - let (sr_pair, sr_account) = sr25519_account("//Alice"); - let msg = b"cross-type-test"; - let sr_raw = sr_pair.sign(msg); - let mut ecdsa_bytes = [0u8; 65]; - ecdsa_bytes[..64].copy_from_slice(&sr_raw.0[..64]); - let multi_sig = MultiSignature::Ecdsa(ecdsa::Signature::from_raw(ecdsa_bytes)); - assert!(!api_validate_signature(multi_sig, msg, &sr_account)); -} - #[test] fn check_nonce_signed_extension_is_constructable() { let _: frame_system::CheckNonce;