feat(gobierno): spec 19, el quorum es el 10 % de lo que puede votar

Decision de David, 2026-10-29: «Si, del 10 % de lo que puede votar».

Que puede votar:
- Es la emision vigente menos el saldo que nadie puede votar ni recuperar: el pool de emision,
  el de subsidios y el vault de gobierno (cuentas_sin_llave en configs.rs).
- Los bonds (og/props) y los depositos de pallet-revive NO se restan, porque vuelven enteros a
  una cuenta con llave. La revision adversaria de spec 19 lo demostro con sonda: restarlos
  dejaba bajar el quorum un 14 % en el genesis de mainnet, aparcando un bond en una propuesta
  de relleno y recuperandolo despues.

Efecto:
- En mainnet el quorum pasa de ~100M a ~35,1M OGC (10 % de 351M).
- En la testnet de la casa apenas cambia.
- Las propuestas abiertas conservan el quorum que guardaron al crearse.

Pruebas:
- quorums_del_runtime clasifica cada cuenta de pallet por su nombre.
- aparcar_un_bond_no_baja_el_quorum reproduce la sonda con la configuracion real.
- toda_cuenta_de_pallet_con_saldo_esta_clasificada vigila las cuentas modl del genesis.
- 10 contrafactuales en rojo.
- El E2E (paso 2b) descubre las cuentas de pallet recorriendo el storage, no copia la lista, y
  exige el quorum exacto. La comision se quema despues de despachar, y eso se mide en el
  BurnedDebt de la propia transaccion.

Pesos: submit_proposal, submit_treasury_proposal y veto_proposal leen 3 cuentas mas. Medidos en
la Pi: 5 procesos limpios, el nucleo calentado 3 s antes de cada uno, a 2,4 GHz.

Operacion de la rp1, arrancar.sh:
- en cada encendido desde el 26-oct el nodo moria al segundo porque la red no estaba; ahora
  espera a la ruta por defecto;
- un cerrojo flock impide dos instancias;
- el pid vivo se reconoce por su linea de comandos.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
CharonandClaude Opus 5.5 committed 2026-10-29 09:21:54 -05:00
1 parent b6d05eaf45
commit 158060bfe4
7 files changed
+355 -101

No files matched your search

+45 -43
View File
@@ -22,24 +22,26 @@
// Ed25519). Lo COBRADO sube menos, entre +4 % y +56 %, porque lecturas y escrituras de storage
// (RocksDbWeight) no cambian y pesan más que la ejecución (revisión adversarial, 25-oct).
//
// SPEC 18 (RV17): SEIS de estos pesos NO son de Laurha. Los midió Charon en la misma Pi el
// 2026-10-28, 21:49-21:52, porque su código cambió: `submit_proposal`, `submit_treasury_proposal`,
// `finalize_proposal`, `finalize_override`, `veto_proposal` y `treasury_disbursement`.
// Es un SMOKE DECLARADO, no un certificado:
// governor ondemand (no performance) a 2,4 GHz, núcleo 3 por taskset y SIN aislar,
// throttled 0x0, 48-64 °C.
// 5 procesos LIMPIOS: ningún job de la CI vivo en ningún segundo de cada ventana (cualquier
// proceso de gitea-runner salvo el daemon), y 30 s de calma antes de cada uno.
// frame-omni-bencher 0.15.0 · wasm sha256 539d7bf4…9311eb9 (spec 18, RV17) · steps 50 ·
// repeat 20 · máximo de los 5 (max-de-n.py).
// Evidencia en la rp1: ~/charon/bench-spec18/v2 (limpios/, perfil-v3.csv, limpio.log,
// SHA256SUMS-limpio).
// Se descartó una medida anterior: su muestreador sólo contaba `rustc` y no veía los binarios de
// test de la CI. Un proceso salió 10 veces más lento y el máximo lo habría cobrado.
// Calibración: sobre los 11 que no cambian, este smoke da 0,75-1,25 veces lo certificado (el
// ruido entre procesos que midió Laurha). Esos 11 se quedan con lo de Laurha. Las lecturas, las
// escrituras y el proof de los 17 coinciden con el bench del Mac sobre el mismo wasm. Laurha
// puede certificar los 6 en su banco y sustituirlos.
// SPECS 18 Y 19 (RV17): SEIS de estos pesos NO son de Laurha. Son de Charon, medidos en la misma
// Pi porque su código cambió. Es un SMOKE DECLARADO, no un certificado: governor ondemand, núcleo
// 3 por taskset y SIN aislar, 5 procesos LIMPIOS (ningún proceso de gitea-runner salvo el daemon
// en ningún segundo de cada ventana, y 30 s de calma antes), steps 50, repeat 20, y el máximo de
// los 5 (max-de-n.py). frame-omni-bencher 0.15.0.
// - `finalize_proposal`, `finalize_override` y `treasury_disbursement`: el 2026-10-28,
// 21:49-21:52, wasm de spec 18 `539d7bf4…9311eb9`, 48-64 °C. Evidencia en
// ~/charon/bench-spec18/v2 de la rp1.
// - `submit_proposal`, `submit_treasury_proposal` y `veto_proposal`: el 2026-10-29,
// 09:15-09:19, wasm de spec 19 `c817695a…f96b23a3`. Leen los pools y el vault para el quórum.
// El núcleo se calentó 3 s antes de cada proceso: 2,4 GHz en todas las muestras, 59-64 °C.
// Evidencia en ~/charon/bench-spec19/v2.
// Sin calentar, ondemand arrancaba cada proceso a 1,5-2,1 GHz y el máximo salía hasta un 10 %
// más alto (~/charon/bench-spec19/sin-calentar, sobre un wasm anterior).
// Se descartó una medida del 28-oct: su muestreador sólo contaba `rustc` y no veía los tests de
// la CI. Un proceso salió 10 veces más lento.
// Calibración: sobre los que no cambian, estos smokes dan 0,75-1,24 veces lo certificado (el ruido
// entre procesos que midió Laurha). Esos once se quedan con lo de Laurha. Las lecturas, las
// escrituras y el proof de los 17 coinciden con el bench del Mac sobre el mismo wasm. Laurha puede
// certificar los seis en su banco y sustituirlos.
//! Weights AUTOGENERADOS para `origin_chain_governance` — NO editar a mano.
//!
@@ -132,7 +134,7 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
/// Proof: `Governance::Proposals` (`max_values`: None, `max_size`: Some(257), added: 2732, mode: `MaxEncodedLen`)
/// Storage: `Balances::TotalIssuance` (r:1 w:0)
/// Proof: `Balances::TotalIssuance` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`)
/// Storage: `System::Account` (r:1 w:1)
/// Storage: `System::Account` (r:4 w:1)
/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
/// Storage: `System::Number` (r:1 w:0)
/// Proof: `System::Number` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
@@ -149,11 +151,11 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
fn submit_proposal() -> Weight {
// Proof size en bytes:
// Medido: `108`
// Estimado: `3722`
// Tiempo minimo de ejecucion: 120_389_000 picosegundos.
Weight::from_parts(124_315_000, 0)
.saturating_add(Weight::from_parts(0, 3722))
.saturating_add(T::DbWeight::get().reads(7_u64))
// Estimado: `11402`
// Tiempo minimo de ejecucion: 133_445_000 picosegundos.
Weight::from_parts(135_242_000, 0)
.saturating_add(Weight::from_parts(0, 11402))
.saturating_add(T::DbWeight::get().reads(10_u64))
.saturating_add(T::DbWeight::get().writes(6_u64))
}
/// Storage: `Governance::AdvisorFlags` (r:1 w:0)
@@ -270,10 +272,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
/// Proof: `Governance::VetoVotes` (`max_values`: None, `max_size`: Some(96), added: 2571, mode: `MaxEncodedLen`)
/// Storage: `Balances::TotalIssuance` (r:1 w:0)
/// Proof: `Balances::TotalIssuance` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`)
/// Storage: `System::Account` (r:5 w:2)
/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
/// Storage: `Governance::ProposalBond` (r:1 w:1)
/// Proof: `Governance::ProposalBond` (`max_values`: None, `max_size`: Some(96), added: 2571, mode: `MaxEncodedLen`)
/// Storage: `System::Account` (r:2 w:2)
/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
/// Storage: `System::ExecutionPhase` (r:1 w:0)
/// Proof: `System::ExecutionPhase` (`max_values`: Some(1), `max_size`: Some(5), added: 500, mode: `MaxEncodedLen`)
/// Storage: `System::EventCount` (r:1 w:1)
@@ -292,10 +294,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Proof size en bytes:
// Medido: `1441`
// Estimado: `16416`
// Tiempo minimo de ejecucion: 250_427_000 picosegundos.
Weight::from_parts(279_612_000, 0)
// Tiempo minimo de ejecucion: 263_724_000 picosegundos.
Weight::from_parts(269_483_000, 0)
.saturating_add(Weight::from_parts(0, 16416))
.saturating_add(T::DbWeight::get().reads(21_u64))
.saturating_add(T::DbWeight::get().reads(24_u64))
.saturating_add(T::DbWeight::get().writes(11_u64))
}
/// Storage: `Governance::AdvisorFlags` (r:1 w:1)
@@ -582,7 +584,7 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
/// Proof: `Governance::Proposals` (`max_values`: None, `max_size`: Some(257), added: 2732, mode: `MaxEncodedLen`)
/// Storage: `Balances::TotalIssuance` (r:1 w:0)
/// Proof: `Balances::TotalIssuance` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`)
/// Storage: `System::Account` (r:1 w:1)
/// Storage: `System::Account` (r:4 w:1)
/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
/// Storage: `System::Number` (r:1 w:0)
/// Proof: `System::Number` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
@@ -601,11 +603,11 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
fn submit_treasury_proposal() -> Weight {
// Proof size en bytes:
// Medido: `108`
// Estimado: `3722`
// Tiempo minimo de ejecucion: 128_000_000 picosegundos.
Weight::from_parts(132_148_000, 0)
.saturating_add(Weight::from_parts(0, 3722))
.saturating_add(T::DbWeight::get().reads(7_u64))
// Estimado: `11402`
// Tiempo minimo de ejecucion: 140_537_000 picosegundos.
Weight::from_parts(143_630_000, 0)
.saturating_add(Weight::from_parts(0, 11402))
.saturating_add(T::DbWeight::get().reads(10_u64))
.saturating_add(T::DbWeight::get().writes(7_u64))
}
}
@@ -613,9 +615,9 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
/// Impl para mocks y tests — `RocksDbWeight` directo, sin necesitar `T`.
impl WeightInfo for () {
fn submit_proposal() -> Weight {
Weight::from_parts(124_315_000, 0)
.saturating_add(Weight::from_parts(0, 3722))
.saturating_add(RocksDbWeight::get().reads(7_u64))
Weight::from_parts(135_242_000, 0)
.saturating_add(Weight::from_parts(0, 11402))
.saturating_add(RocksDbWeight::get().reads(10_u64))
.saturating_add(RocksDbWeight::get().writes(6_u64))
}
fn cast_vote() -> Weight {
@@ -643,9 +645,9 @@ impl WeightInfo for () {
.saturating_add(RocksDbWeight::get().writes(4_u64))
}
fn veto_proposal() -> Weight {
Weight::from_parts(279_612_000, 0)
Weight::from_parts(269_483_000, 0)
.saturating_add(Weight::from_parts(0, 16416))
.saturating_add(RocksDbWeight::get().reads(21_u64))
.saturating_add(RocksDbWeight::get().reads(24_u64))
.saturating_add(RocksDbWeight::get().writes(11_u64))
}
fn mark_as_advisor() -> Weight {
@@ -709,9 +711,9 @@ impl WeightInfo for () {
.saturating_add(RocksDbWeight::get().writes(6_u64))
}
fn submit_treasury_proposal() -> Weight {
Weight::from_parts(132_148_000, 0)
.saturating_add(Weight::from_parts(0, 3722))
.saturating_add(RocksDbWeight::get().reads(7_u64))
Weight::from_parts(143_630_000, 0)
.saturating_add(Weight::from_parts(0, 11402))
.saturating_add(RocksDbWeight::get().reads(10_u64))
.saturating_add(RocksDbWeight::get().writes(7_u64))
}
}