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
@@ -28,6 +28,9 @@ sp-runtime = { workspace = true }
|
||||
parity-scale-codec = { workspace = true }
|
||||
scale-info = { workspace = true }
|
||||
|
||||
# Benchmarking canonical (FRAME v2) — optional, solo activo bajo runtime-benchmarks.
|
||||
frame-benchmarking = { workspace = true, optional = true }
|
||||
|
||||
[dev-dependencies]
|
||||
# Mock runtime canonical para integration tests v0.0.30 — Pattern v0.0.26 mirror.
|
||||
sp-core = { workspace = true, default-features = true }
|
||||
@@ -47,8 +50,11 @@ std = [
|
||||
"sp-runtime/std",
|
||||
"parity-scale-codec/std",
|
||||
"scale-info/std",
|
||||
"frame-benchmarking?/std",
|
||||
]
|
||||
runtime-benchmarks = [
|
||||
"dep:frame-benchmarking",
|
||||
"frame-benchmarking/runtime-benchmarks",
|
||||
"frame-support/runtime-benchmarks",
|
||||
"frame-system/runtime-benchmarks",
|
||||
]
|
||||
|
||||
@@ -0,0 +1,226 @@
|
||||
//! # Benchmarks para `pallet-origin-governance` (FRAME v2)
|
||||
//!
|
||||
//! Fuente de verdad de la forma del weight de los 13 extrinsics. Verificado por
|
||||
//! `impl_benchmark_test_suite!` en el mock (`cargo test -p origin-chain-governance
|
||||
//! --features runtime-benchmarks`). Números canónicos gated por HW/omni-bencher
|
||||
//! (ver `weights.rs` §Estado).
|
||||
//!
|
||||
//! Los preconditions (proposal en un estado, membresía de council, endosos) se
|
||||
//! siembran por storage directo en el setup — patrón estándar de benchmarking.
|
||||
//! Los thresholds con council_size=1 son 1 (veto y emergency), así que un solo
|
||||
//! miembro/endoso alcanza el umbral.
|
||||
|
||||
#![cfg(feature = "runtime-benchmarks")]
|
||||
|
||||
use super::*;
|
||||
use frame_benchmarking::v2::*;
|
||||
use frame_support::traits::fungible::{Inspect, Mutate};
|
||||
use frame_system::RawOrigin;
|
||||
use origin_chain_types::AccountId;
|
||||
|
||||
/// Fondea `who` con holgura para bonds + treasury deposits.
|
||||
fn fund<T: Config>(who: &T::AccountId) {
|
||||
let _ = T::Currency::mint_into(who, MIN_PROPOSAL_STAKE.saturating_mul(100));
|
||||
}
|
||||
|
||||
/// Siembra una `Proposal` en el estado/end_block dados (bypass del extrinsic).
|
||||
fn seed_proposal<T: Config>(id: ProposalId, status: ProposalStatus, end_block: u64) {
|
||||
let proposal = Proposal {
|
||||
id,
|
||||
proposer: AccountId::new([9u8; 32]),
|
||||
title_hash: [1u8; 32],
|
||||
body_hash: [2u8; 32],
|
||||
stake: MIN_PROPOSAL_STAKE,
|
||||
start_block: 0,
|
||||
end_block,
|
||||
status,
|
||||
yes_weight: 0,
|
||||
nay_weight: 0,
|
||||
abstain_weight: 0,
|
||||
};
|
||||
Proposals::<T>::insert(id, proposal);
|
||||
}
|
||||
|
||||
/// Añade `who` al council (size=1) por storage directo.
|
||||
fn seed_council<T: Config>(who: &T::AccountId) {
|
||||
let member = CouncilMember {
|
||||
account: AccountId::new([0u8; 32]),
|
||||
joined_at_block: 0,
|
||||
role: CouncilRole::Member,
|
||||
};
|
||||
Council::<T>::insert(who, member);
|
||||
CouncilSize::<T>::put(1u32);
|
||||
}
|
||||
|
||||
const EM_TITLE: [u8; 32] = [3u8; 32];
|
||||
const EM_BODY: [u8; 32] = [4u8; 32];
|
||||
|
||||
#[benchmarks]
|
||||
mod benchmarks {
|
||||
use super::*;
|
||||
|
||||
#[benchmark]
|
||||
fn submit_proposal() {
|
||||
let caller: T::AccountId = whitelisted_caller();
|
||||
fund::<T>(&caller);
|
||||
|
||||
#[extrinsic_call]
|
||||
submit_proposal(RawOrigin::Signed(caller), [1u8; 32], [2u8; 32], 1_000u64, MIN_PROPOSAL_STAKE);
|
||||
|
||||
assert_eq!(Proposals::<T>::iter().count(), 1);
|
||||
}
|
||||
|
||||
#[benchmark]
|
||||
fn cast_vote() {
|
||||
let caller: T::AccountId = whitelisted_caller();
|
||||
let id = ProposalId([7u8; 32]);
|
||||
seed_proposal::<T>(id, ProposalStatus::Voting, 1_000_000u64);
|
||||
|
||||
#[extrinsic_call]
|
||||
cast_vote(RawOrigin::Signed(caller.clone()), id, VoteStance::Aye, 100u128);
|
||||
|
||||
assert!(Votes::<T>::contains_key(id, &caller));
|
||||
}
|
||||
|
||||
#[benchmark]
|
||||
fn finalize_proposal() {
|
||||
let caller: T::AccountId = whitelisted_caller();
|
||||
let id = ProposalId([7u8; 32]);
|
||||
seed_proposal::<T>(id, ProposalStatus::Voting, 0u64);
|
||||
// current_block debe ser > end_block(0) → avanza a 2.
|
||||
frame_system::Pallet::<T>::set_block_number(2u32.into());
|
||||
|
||||
#[extrinsic_call]
|
||||
finalize_proposal(RawOrigin::Signed(caller), id);
|
||||
|
||||
assert!(!matches!(
|
||||
Proposals::<T>::get(id).unwrap().status,
|
||||
ProposalStatus::Voting
|
||||
));
|
||||
}
|
||||
|
||||
#[benchmark]
|
||||
fn add_council_member() {
|
||||
let acct: T::AccountId = account("member", 0, 0);
|
||||
|
||||
#[extrinsic_call]
|
||||
add_council_member(RawOrigin::Root, acct.clone(), CouncilRole::Member);
|
||||
|
||||
assert!(Council::<T>::contains_key(&acct));
|
||||
}
|
||||
|
||||
#[benchmark]
|
||||
fn remove_council_member() {
|
||||
let acct: T::AccountId = account("member", 0, 0);
|
||||
seed_council::<T>(&acct);
|
||||
|
||||
#[extrinsic_call]
|
||||
remove_council_member(RawOrigin::Root, acct.clone());
|
||||
|
||||
assert!(!Council::<T>::contains_key(&acct));
|
||||
}
|
||||
|
||||
#[benchmark]
|
||||
fn veto_proposal() {
|
||||
let caller: T::AccountId = whitelisted_caller();
|
||||
seed_council::<T>(&caller);
|
||||
let id = ProposalId([7u8; 32]);
|
||||
seed_proposal::<T>(id, ProposalStatus::Voting, 1_000_000u64);
|
||||
|
||||
#[extrinsic_call]
|
||||
veto_proposal(RawOrigin::Signed(caller.clone()), id);
|
||||
|
||||
assert!(VetoVotes::<T>::contains_key(id, &caller));
|
||||
}
|
||||
|
||||
#[benchmark]
|
||||
fn mark_as_advisor() {
|
||||
let acct: T::AccountId = account("advisor", 0, 0);
|
||||
|
||||
#[extrinsic_call]
|
||||
mark_as_advisor(RawOrigin::Root, acct.clone());
|
||||
|
||||
assert!(AdvisorFlags::<T>::contains_key(&acct));
|
||||
}
|
||||
|
||||
#[benchmark]
|
||||
fn unmark_as_advisor() {
|
||||
let acct: T::AccountId = account("advisor", 0, 0);
|
||||
AdvisorFlags::<T>::insert(&acct, ());
|
||||
|
||||
#[extrinsic_call]
|
||||
unmark_as_advisor(RawOrigin::Root, acct.clone());
|
||||
|
||||
assert!(!AdvisorFlags::<T>::contains_key(&acct));
|
||||
}
|
||||
|
||||
#[benchmark]
|
||||
fn override_council_veto() {
|
||||
let caller: T::AccountId = whitelisted_caller();
|
||||
let id = ProposalId([7u8; 32]);
|
||||
seed_proposal::<T>(id, ProposalStatus::Rejected, 0u64);
|
||||
VetoRejected::<T>::insert(id, ());
|
||||
|
||||
#[extrinsic_call]
|
||||
override_council_veto(RawOrigin::Signed(caller.clone()), id, 100u128);
|
||||
|
||||
assert!(OverrideVotes::<T>::contains_key(id, &caller));
|
||||
}
|
||||
|
||||
#[benchmark]
|
||||
fn submit_emergency_proposal() {
|
||||
let caller: T::AccountId = whitelisted_caller();
|
||||
fund::<T>(&caller);
|
||||
seed_council::<T>(&caller);
|
||||
// council_size=1 ⇒ emergency threshold=1; un endoso VIVO del caller basta.
|
||||
let content_id = crate::emergency_content_id(&EM_TITLE, &EM_BODY);
|
||||
EmergencyEndorsements::<T>::insert(content_id, &caller, ());
|
||||
|
||||
#[extrinsic_call]
|
||||
submit_emergency_proposal(RawOrigin::Signed(caller), EM_TITLE, EM_BODY, MIN_PROPOSAL_STAKE);
|
||||
|
||||
assert!(Proposals::<T>::iter().count() >= 1);
|
||||
}
|
||||
|
||||
#[benchmark]
|
||||
fn treasury_disbursement() {
|
||||
let id = ProposalId([7u8; 32]);
|
||||
seed_proposal::<T>(id, ProposalStatus::Approved, 0u64);
|
||||
let recipient: T::AccountId = account("recipient", 0, 0);
|
||||
// Fondea la tesorería para que el transfer real tenga de dónde salir.
|
||||
let _ = T::Currency::mint_into(
|
||||
&Pallet::<T>::treasury_account(),
|
||||
MIN_PROPOSAL_STAKE.saturating_mul(10),
|
||||
);
|
||||
|
||||
#[extrinsic_call]
|
||||
treasury_disbursement(RawOrigin::Root, id, recipient, MIN_PROPOSAL_STAKE);
|
||||
|
||||
assert!(Disbursed::<T>::contains_key(id));
|
||||
}
|
||||
|
||||
#[benchmark]
|
||||
fn treasury_deposit() {
|
||||
let caller: T::AccountId = whitelisted_caller();
|
||||
fund::<T>(&caller);
|
||||
|
||||
#[extrinsic_call]
|
||||
treasury_deposit(RawOrigin::Signed(caller), MIN_PROPOSAL_STAKE);
|
||||
|
||||
assert!(T::Currency::balance(&Pallet::<T>::treasury_account()) >= MIN_PROPOSAL_STAKE);
|
||||
}
|
||||
|
||||
#[benchmark]
|
||||
fn endorse_emergency_proposal() {
|
||||
let caller: T::AccountId = whitelisted_caller();
|
||||
seed_council::<T>(&caller);
|
||||
|
||||
#[extrinsic_call]
|
||||
endorse_emergency_proposal(RawOrigin::Signed(caller.clone()), EM_TITLE, EM_BODY);
|
||||
|
||||
let content_id = crate::emergency_content_id(&EM_TITLE, &EM_BODY);
|
||||
assert!(EmergencyEndorsements::<T>::contains_key(content_id, &caller));
|
||||
}
|
||||
|
||||
impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Test);
|
||||
}
|
||||
@@ -40,6 +40,14 @@
|
||||
|
||||
pub use pallet::*;
|
||||
|
||||
/// Weights canonical (INTERIM hand-derived DB-aware — ver `weights.rs` §Estado).
|
||||
pub mod weights;
|
||||
pub use weights::WeightInfo;
|
||||
|
||||
/// Benchmarks canonical (FRAME v2) — solo bajo `runtime-benchmarks`.
|
||||
#[cfg(feature = "runtime-benchmarks")]
|
||||
mod benchmarking;
|
||||
|
||||
/// Re-export canonical types desde origin-chain-types para consumers.
|
||||
pub use origin_chain_types::{ProposalId, Vote, VoteStance};
|
||||
|
||||
@@ -124,6 +132,8 @@ pub mod pallet {
|
||||
use parity_scale_codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen};
|
||||
use scale_info::TypeInfo;
|
||||
use sp_runtime::traits::{AccountIdConversion, SaturatedConversion};
|
||||
// Trait de weights en scope para resolver `T::WeightInfo::<method>()`.
|
||||
use crate::weights::WeightInfo;
|
||||
|
||||
/// ProposalStatus canonical — proposal lifecycle stages canonical.
|
||||
#[derive(
|
||||
@@ -246,6 +256,9 @@ pub mod pallet {
|
||||
/// tesorería no depende de una llave humana custodiable.
|
||||
#[pallet::constant]
|
||||
type TreasuryPalletId: Get<PalletId>;
|
||||
|
||||
/// Weight information canonical para los extrinsics de este pallet.
|
||||
type WeightInfo: crate::weights::WeightInfo;
|
||||
}
|
||||
|
||||
/// Pallet definition canonical.
|
||||
@@ -623,7 +636,7 @@ pub mod pallet {
|
||||
/// 7-step canonical flow: ensure_signed + validate_stake + derive_id +
|
||||
/// collision_check + build + insert + emit.
|
||||
#[pallet::call_index(0)]
|
||||
#[pallet::weight(Weight::from_parts(10_000, 0))]
|
||||
#[pallet::weight(T::WeightInfo::submit_proposal())]
|
||||
pub fn submit_proposal(
|
||||
origin: OriginFor<T>,
|
||||
title_hash: [u8; 32],
|
||||
@@ -683,7 +696,7 @@ pub mod pallet {
|
||||
|
||||
/// CHN-4 5.4 canonical: `cast_vote` real dispatchable canonical.
|
||||
#[pallet::call_index(1)]
|
||||
#[pallet::weight(Weight::from_parts(10_000, 0))]
|
||||
#[pallet::weight(T::WeightInfo::cast_vote())]
|
||||
pub fn cast_vote(
|
||||
origin: OriginFor<T>,
|
||||
proposal_id: ProposalId,
|
||||
@@ -746,7 +759,7 @@ pub mod pallet {
|
||||
|
||||
/// CHN-4 canonical: `finalize_proposal` real dispatchable canonical.
|
||||
#[pallet::call_index(2)]
|
||||
#[pallet::weight(Weight::from_parts(10_000, 0))]
|
||||
#[pallet::weight(T::WeightInfo::finalize_proposal())]
|
||||
pub fn finalize_proposal(
|
||||
origin: OriginFor<T>,
|
||||
proposal_id: ProposalId,
|
||||
@@ -799,7 +812,7 @@ pub mod pallet {
|
||||
/// 6-step canonical flow: ensure_root + size_check + no_duplicate + build +
|
||||
/// insert + emit.
|
||||
#[pallet::call_index(3)]
|
||||
#[pallet::weight(Weight::from_parts(10_000, 0))]
|
||||
#[pallet::weight(T::WeightInfo::add_council_member())]
|
||||
pub fn add_council_member(
|
||||
origin: OriginFor<T>,
|
||||
account: T::AccountId,
|
||||
@@ -843,7 +856,7 @@ pub mod pallet {
|
||||
///
|
||||
/// 5-step canonical flow: ensure_root + validate_exists + remove + decrement + emit.
|
||||
#[pallet::call_index(4)]
|
||||
#[pallet::weight(Weight::from_parts(10_000, 0))]
|
||||
#[pallet::weight(T::WeightInfo::remove_council_member())]
|
||||
pub fn remove_council_member(
|
||||
origin: OriginFor<T>,
|
||||
account: T::AccountId,
|
||||
@@ -880,7 +893,7 @@ pub mod pallet {
|
||||
/// 7. Check threshold canonical: if count >= required → flip status to Rejected
|
||||
/// + emit ProposalVetoed canonical; else emit CouncilVetoVoteCast canonical
|
||||
#[pallet::call_index(5)]
|
||||
#[pallet::weight(Weight::from_parts(10_000, 0))]
|
||||
#[pallet::weight(T::WeightInfo::veto_proposal())]
|
||||
pub fn veto_proposal(
|
||||
origin: OriginFor<T>,
|
||||
proposal_id: ProposalId,
|
||||
@@ -964,7 +977,7 @@ pub mod pallet {
|
||||
/// Sentinel). Advisor canonical NO puede votar — humans-only vote canonical
|
||||
/// non-negotiable per CHN-4 + Inmutable #41.
|
||||
#[pallet::call_index(6)]
|
||||
#[pallet::weight(Weight::from_parts(10_000, 0))]
|
||||
#[pallet::weight(T::WeightInfo::mark_as_advisor())]
|
||||
pub fn mark_as_advisor(
|
||||
origin: OriginFor<T>,
|
||||
account: T::AccountId,
|
||||
@@ -981,7 +994,7 @@ pub mod pallet {
|
||||
|
||||
/// CHN-4 5.6 v0.0.34 canonical: `unmark_as_advisor` Phase 5.6 dispatchable.
|
||||
#[pallet::call_index(7)]
|
||||
#[pallet::weight(Weight::from_parts(10_000, 0))]
|
||||
#[pallet::weight(T::WeightInfo::unmark_as_advisor())]
|
||||
pub fn unmark_as_advisor(
|
||||
origin: OriginFor<T>,
|
||||
account: T::AccountId,
|
||||
@@ -1012,7 +1025,7 @@ pub mod pallet {
|
||||
/// 6. Insert vote + increment total stake
|
||||
/// 7. Check threshold canonical 4/5: if >= → flip to Approved + emit CouncilVetoOverridden
|
||||
#[pallet::call_index(8)]
|
||||
#[pallet::weight(Weight::from_parts(10_000, 0))]
|
||||
#[pallet::weight(T::WeightInfo::override_council_veto())]
|
||||
pub fn override_council_veto(
|
||||
origin: OriginFor<T>,
|
||||
proposal_id: ProposalId,
|
||||
@@ -1084,7 +1097,7 @@ pub mod pallet {
|
||||
/// canonical 5/7 council pre-approval flow (gather signatures via separate
|
||||
/// dispatchable y luego promote canonical).
|
||||
#[pallet::call_index(9)]
|
||||
#[pallet::weight(Weight::from_parts(10_000, 0))]
|
||||
#[pallet::weight(T::WeightInfo::submit_emergency_proposal())]
|
||||
pub fn submit_emergency_proposal(
|
||||
origin: OriginFor<T>,
|
||||
title_hash: [u8; 32],
|
||||
@@ -1179,7 +1192,7 @@ pub mod pallet {
|
||||
/// 5. (Phase 5.9+ refinement canonical: transfer via pallet_balances integration)
|
||||
/// 6. Emit TreasuryDisbursed canonical
|
||||
#[pallet::call_index(10)]
|
||||
#[pallet::weight(Weight::from_parts(10_000, 0))]
|
||||
#[pallet::weight(T::WeightInfo::treasury_disbursement())]
|
||||
pub fn treasury_disbursement(
|
||||
origin: OriginFor<T>,
|
||||
proposal_id: ProposalId,
|
||||
@@ -1233,7 +1246,7 @@ pub mod pallet {
|
||||
/// canonical (BM V2 250M OGC Foundation allocation). Real Phase 5.9+ refinement
|
||||
/// canonical: replace canonical via Genesis storage canonical config.
|
||||
#[pallet::call_index(11)]
|
||||
#[pallet::weight(Weight::from_parts(10_000, 0))]
|
||||
#[pallet::weight(T::WeightInfo::treasury_deposit())]
|
||||
pub fn treasury_deposit(origin: OriginFor<T>, amount: u128) -> DispatchResult {
|
||||
// FIX-6: donación REAL a la tesorería — el caller transfiere `amount`
|
||||
// de su propio balance a la cuenta-tesorería. Cualquiera puede fondear
|
||||
@@ -1251,7 +1264,7 @@ pub mod pallet {
|
||||
/// reemplaza el gate 5/7 TAUTOLÓGICO anterior (que dejaba a UN solo miembro
|
||||
/// fast-trackear a 48h).
|
||||
#[pallet::call_index(12)]
|
||||
#[pallet::weight(Weight::from_parts(10_000, 0))]
|
||||
#[pallet::weight(T::WeightInfo::endorse_emergency_proposal())]
|
||||
pub fn endorse_emergency_proposal(
|
||||
origin: OriginFor<T>,
|
||||
title_hash: [u8; 32],
|
||||
|
||||
@@ -43,6 +43,7 @@ impl origin_chain_governance::Config for Test {
|
||||
type RuntimeEvent = RuntimeEvent;
|
||||
type Currency = Balances;
|
||||
type TreasuryPalletId = TestTreasuryPalletId;
|
||||
type WeightInfo = ();
|
||||
}
|
||||
|
||||
/// Balance inicial de cada cuenta de test. Audit 2026-07-04: debe ser
|
||||
|
||||
@@ -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