feat(bench): maquinaria FRAME v2 de benchmarking para los 5 pallets custom (RV 8→9)
Los 19 extrinsics de provenance/fees/agent-identity/emission/governance pasan de weights placeholder `from_parts(10_000, 0)` (proof_size=0, sin contar reads/writes de DB — vector de DoS real) a weights INTERIM hand-derived DB-aware vía el trait `WeightInfo`. Cierra el mispricing de DoS en TODOS los extrinsics del chain. Cada pallet gana: - weights.rs: trait WeightInfo + SubstrateWeight<T> (DB-aware vía T::DbWeight) + impl () - benchmarking.rs: benchmarks FRAME v2, VERIFICADOS por impl_benchmark_test_suite! (19 benchmarks ejecutan+pasan en los mocks — cargo test --features runtime-benchmarks) - Config: `type WeightInfo` + swap de los `#[pallet::weight]` Runtime: - define_benchmarks! con los 5 pallets + runtime API Benchmark (inerte sin la feature) - WeightInfo cableado a SubstrateWeight<Runtime> en cada Config - RUNTIME_VERSION 8→9 (weights = consenso-relevante: fee + llenado de bloque; las firmas de los extrinsics NO cambian ⇒ TRANSACTION_VERSION intacto) 3 bugs latentes cerrados (territorio virgen — el runtime NUNCA se compiló con runtime-benchmarks; las dimensiones nuevas cazan lo que no se había visto): - pallet-grandpa/try-runtime mal ubicado en la feature runtime-benchmarks (copy-paste erróneo: features ortogonales; NUNCA activaba los benchmarks de grandpa) - feature runtime-benchmarks incompleta → E0046 en OriginFeeAdapter (métodos benchmark-gated de OnChargeTransaction) + pallet-staking (StakingUnchecked::migrate_to_direct_staker); ahora lista TODOS los pallets como un runtime de producción Substrate - pallet-revive/runtime-benchmarks omitido a propósito (fixtures RISC-V/PolkaVM indisponibles; ReviveApi deferred, no benchmarkeado) emission: mock extraído del `mod tests` inline a `pub mod mock` (reuso del test-suite, sin duplicar el scaffold; los 15 tests existentes + el benchmark verdes). GATED (documentado en el §Estado de cada weights.rs): la generación de números CANÓNICOS por CLI requiere el node sc-service o omni-bencher+WASM (ambos bloqueados hace sesiones). Los weights interinos son DB-aware/DoS-safe y regenerables de forma mecánica cuando aterrice el HW de referencia (Pi5/VPS) — benchmarking.rs es la fuente de verdad de la FORMA. Verificado: 5 test-suites de pallet verdes (con y sin runtime-benchmarks) + runtime compila en ambos modos + workspace sin regresión + 40 tests de runtime (incl. v9). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
1 parent
0d56e0bcbf
commit
c7fc6a88fc
29 files changed
+1206
-121
No files matched your search
@@ -0,0 +1,103 @@
|
||||
//! # Weights para `pallet-origin-governance`
|
||||
//!
|
||||
//! ## Estado: INTERIM hand-derived (DB-aware, DoS-safe) — pendiente regeneración HW
|
||||
//!
|
||||
//! Ver `origin-chain-provenance/src/weights.rs` §Estado para el racional completo.
|
||||
//! Los 13 extrinsics tenían `Weight::from_parts(10_000, 0)` (proof_size=0, sin
|
||||
//! contar DB) → DoS. Aquí cada uno se cuesta con `T::DbWeight` sobre los reads/writes
|
||||
//! REALES contados del código (incluyendo los `iter_prefix`/`clear_prefix` acotados
|
||||
//! por el council ≤ 7). `benchmarking.rs` es la fuente de verdad de la forma.
|
||||
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(clippy::unnecessary_cast)]
|
||||
|
||||
use core::marker::PhantomData;
|
||||
use frame_support::{traits::Get, weights::constants::RocksDbWeight, weights::Weight};
|
||||
|
||||
/// Compute floor conservador para la lógica de cada extrinsic (hashing blake2,
|
||||
/// aritmética de umbrales, build de structs). Los que hashean content/proposal id
|
||||
/// (submit_*, endorse) llevan un poco más vía el propio conteo de reads.
|
||||
const COMPUTE: u64 = 12_000_000;
|
||||
|
||||
/// Trait de weights para los 13 extrinsics de `pallet-origin-governance`.
|
||||
pub trait WeightInfo {
|
||||
/// `submit_proposal` — contains_key + bond transfer + 2 inserts.
|
||||
fn submit_proposal() -> Weight;
|
||||
/// `cast_vote` — advisor/proposal/vote reads + 2 inserts.
|
||||
fn cast_vote() -> Weight;
|
||||
/// `finalize_proposal` — proposal read/write + release bond.
|
||||
fn finalize_proposal() -> Weight;
|
||||
/// `add_council_member` — size/dup reads + 2 writes.
|
||||
fn add_council_member() -> Weight;
|
||||
/// `remove_council_member` — exists read + remove + size write.
|
||||
fn remove_council_member() -> Weight;
|
||||
/// `veto_proposal` — council iter (≤7) + threshold flip path.
|
||||
fn veto_proposal() -> Weight;
|
||||
/// `mark_as_advisor` — 1 read + 1 write.
|
||||
fn mark_as_advisor() -> Weight;
|
||||
/// `unmark_as_advisor` — 1 read + 1 write.
|
||||
fn unmark_as_advisor() -> Weight;
|
||||
/// `override_council_veto` — proposal/veto/advisor reads + vote inserts.
|
||||
fn override_council_veto() -> Weight;
|
||||
/// `submit_emergency_proposal` — endorsement iter (≤7) + bond + clear_prefix.
|
||||
fn submit_emergency_proposal() -> Weight;
|
||||
/// `treasury_disbursement` — proposal read + single-use + transfer.
|
||||
fn treasury_disbursement() -> Weight;
|
||||
/// `treasury_deposit` — transfer only.
|
||||
fn treasury_deposit() -> Weight;
|
||||
/// `endorse_emergency_proposal` — council iter (≤7) + insert.
|
||||
fn endorse_emergency_proposal() -> Weight;
|
||||
}
|
||||
|
||||
macro_rules! w {
|
||||
($r:expr, $w:expr) => {
|
||||
Weight::from_parts(COMPUTE, 0)
|
||||
.saturating_add(T::DbWeight::get().reads($r as u64))
|
||||
.saturating_add(T::DbWeight::get().writes($w as u64))
|
||||
};
|
||||
}
|
||||
|
||||
/// Weights parametrizados por el `DbWeight` del runtime.
|
||||
pub struct SubstrateWeight<T>(PhantomData<T>);
|
||||
|
||||
impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
|
||||
fn submit_proposal() -> Weight { w!(3, 4) }
|
||||
fn cast_vote() -> Weight { w!(4, 2) }
|
||||
fn finalize_proposal() -> Weight { w!(3, 4) }
|
||||
fn add_council_member() -> Weight { w!(3, 2) }
|
||||
fn remove_council_member() -> Weight { w!(2, 2) }
|
||||
fn veto_proposal() -> Weight { w!(10, 4) }
|
||||
fn mark_as_advisor() -> Weight { w!(1, 1) }
|
||||
fn unmark_as_advisor() -> Weight { w!(1, 1) }
|
||||
fn override_council_veto() -> Weight { w!(5, 3) }
|
||||
fn submit_emergency_proposal() -> Weight { w!(12, 11) }
|
||||
fn treasury_disbursement() -> Weight { w!(4, 3) }
|
||||
fn treasury_deposit() -> Weight { w!(2, 2) }
|
||||
fn endorse_emergency_proposal() -> Weight { w!(10, 1) }
|
||||
}
|
||||
|
||||
macro_rules! wnop {
|
||||
($r:expr, $w:expr) => {
|
||||
Weight::from_parts(COMPUTE, 0)
|
||||
.saturating_add(RocksDbWeight::get().reads($r as u64))
|
||||
.saturating_add(RocksDbWeight::get().writes($w as u64))
|
||||
};
|
||||
}
|
||||
|
||||
/// Impl no-op para mocks / tests.
|
||||
impl WeightInfo for () {
|
||||
fn submit_proposal() -> Weight { wnop!(3, 4) }
|
||||
fn cast_vote() -> Weight { wnop!(4, 2) }
|
||||
fn finalize_proposal() -> Weight { wnop!(3, 4) }
|
||||
fn add_council_member() -> Weight { wnop!(3, 2) }
|
||||
fn remove_council_member() -> Weight { wnop!(2, 2) }
|
||||
fn veto_proposal() -> Weight { wnop!(10, 4) }
|
||||
fn mark_as_advisor() -> Weight { wnop!(1, 1) }
|
||||
fn unmark_as_advisor() -> Weight { wnop!(1, 1) }
|
||||
fn override_council_veto() -> Weight { wnop!(5, 3) }
|
||||
fn submit_emergency_proposal() -> Weight { wnop!(12, 11) }
|
||||
fn treasury_disbursement() -> Weight { wnop!(4, 3) }
|
||||
fn treasury_deposit() -> Weight { wnop!(2, 2) }
|
||||
fn endorse_emergency_proposal() -> Weight { wnop!(10, 1) }
|
||||
}
|
||||
Reference in new issue
Block a user