//! # Weights para `pallet-origin-provenance` //! //! ## Estado: INTERIM hand-derived (DB-aware, DoS-safe) — pendiente regeneración HW //! //! Estos weights son **derivados a mano de forma conservadora**, NO autogenerados //! por `frame-benchmarking-cli` sobre hardware de referencia todavía. La razón es //! infraestructural, no de diseño: generar los números canónicos requiere ejecutar //! el loop `benchmark pallet`, que necesita **o** el node `sc-service` real //! (bloqueado por el mismatch de API sc-*/sp-consensus del tag stable2509-3, ver //! `main.rs` §BLOQUEO) **o** `frame-omni-bencher` sobre el `WASM_BINARY` (gated tras //! la feature `wasm-build`). Cuando cualquiera de los dos aterrice (VPS / HW de //! referencia Pi5), regenerar es mecánico: los benchmarks de `benchmarking.rs` son //! la **fuente de verdad de la forma** y sobrescribirán estos números. //! //! ## Por qué esto ya es una mejora de seguridad REAL //! //! Los placeholders anteriores eran `Weight::from_parts(10_000, 0)`: **proof_size = 0 //! y sin contabilizar reads/writes de DB**. Eso es un vector de DoS — un atacante //! llama extrinsics que tocan varias entradas de storage pagando casi nada, y el //! `proof_size = 0` miente al block-builder sobre el peso PoV. Estos weights usan //! `T::DbWeight` (RocksDbWeight en el runtime), que puebla **tanto ref_time como //! proof_size** por cada read/write real contado del código — cerrando el hueco. //! //! El componente `from_parts(N, 0)` fijo cubre el compute (decode postcard, verify //! Ed25519, hashing) con holgura conservadora; el `DbWeight` cubre el storage. #![allow(unused_parens)] #![allow(unused_imports)] #![allow(clippy::unnecessary_cast)] use core::marker::PhantomData; use frame_support::{traits::Get, weights::constants::RocksDbWeight, weights::Weight}; /// Trait de weights para los extrinsics de `pallet-origin-provenance`. pub trait WeightInfo { /// Peso de `attest_asset` — decode postcard + 3-4 reads + verify Ed25519 + 1 write. fn attest_asset() -> Weight; /// Peso de `register_validator` (Root) — 1 write. fn register_validator() -> Weight; /// Peso de `revoke_validator` (Root) — 1 write (remove). fn revoke_validator() -> Weight; } /// Weights para `pallet-origin-provenance` parametrizados por el `DbWeight` del runtime. /// /// Se usa en el runtime como `SubstrateWeight` → los reads/writes se cuestan /// con el `RocksDbWeight` real de la cadena, no con constantes hardcodeadas. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { fn attest_asset() -> Weight { // Compute conservador: decode postcard (~115 bytes) + Ed25519 verify // (dominante, ~50µs en HW de referencia) + BLAKE-hashing del dominio. // Storage: contains_key(Attestations) + get(AuthorizedValidators) + // block_hash(0) + block_number = 4 reads; insert(Attestations) = 1 write. Weight::from_parts(50_000_000, 0) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } fn register_validator() -> Weight { // ensure_root (in-memory) + insert(AuthorizedValidators) = 1 write. Weight::from_parts(8_000_000, 0).saturating_add(T::DbWeight::get().writes(1_u64)) } fn revoke_validator() -> Weight { // ensure_root (in-memory) + remove(AuthorizedValidators) = 1 write. Weight::from_parts(8_000_000, 0).saturating_add(T::DbWeight::get().writes(1_u64)) } } /// Impl no-op para mocks / tests — usa `RocksDbWeight` directo (no requiere `T`). impl WeightInfo for () { fn attest_asset() -> Weight { Weight::from_parts(50_000_000, 0) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } fn register_validator() -> Weight { Weight::from_parts(8_000_000, 0).saturating_add(RocksDbWeight::get().writes(1_u64)) } fn revoke_validator() -> Weight { Weight::from_parts(8_000_000, 0).saturating_add(RocksDbWeight::get().writes(1_u64)) } }