feat(weights): RV13 — los 19 estaban subdeclarados, los 19

Primera medicion real de los weights con frame-omni-bencher sobre el
propio blob WASM. El resultado no es un ajuste fino: los 19 extrinsics
de los 5 pallets custom declaraban MENOS de lo que cuestan.

EL PATRON SISTEMATICO. Se costeo el storage del pallet y se olvido el
que cuesta emitir un evento — System::Events, EventCount, ExecutionPhase
y Number son reads y writes reales en cada extrinsic que deposita
evento. Ejemplos medidos: attest_asset declaraba 4 reads / 1 write y
cuesta 7/3; submit_proposal declaraba 12 us y cuesta 62; register_agent_did
declaraba 3/2 y cuesta 6/4.

EL PEOR, Y ES UN ERROR MIO DOCUMENTADO AL REVES. proof_size valia 0 en
los 19. La cabecera de los interinos afirmaba que T::DbWeight "puebla
tanto ref_time como proof_size ... cerrando el hueco". Es falso y se
comprueba en la fuente: sp_weights::RuntimeDbWeight solo tiene los
campos read y write, y reads(r) devuelve from_parts(read * r, 0). Los
interinos arreglaron reads/writes y dejaron el proof_size exactamente
donde estaba. Un proof_size en cero miente al block-builder sobre el
peso PoV: es el vector de DoS que la nota decia haber cerrado. La
afirmacion sobrevivio mas de un mes sin que ninguna lectura la
desmintiera; la desmintio una medicion.

Cada fichero generado lleva ahora un guard GENERADO desde la lista real
de benchmarks que reprueba cualquier proof_size = 0 o ref_time = 0.
Verificado que sabe reprobar: contra los weights anteriores se pone rojo
con "`attest_asset` declara proof_size = 0".

ADVERTENCIA QUE VA EN EL CODIGO, NO SOLO AQUI: son numeros de un
MacBook Pro M3 Max, NO del banco de referencia BM V2. La forma
(reads/writes/proof_size) no depende del hardware y es correcta; el
ref_time si, y en un Pi 5 sera mayor. Un caso lo enseña solo:
attest_asset BAJA de 50 a 44 us, y es el extrinsic dominado por el
verify Ed25519, el mas sensible al silicio. Antes de mainnet hay que
regenerar en el Pi 5 con governor y aislamiento declarados — peticion
abierta a Laurha (request:66f500d54e28a80c) con el blob, el comando y
la version exacta del bencher.

RV12 -> RV13 (weights = consenso). TRANSACTION_VERSION intacto.
295 tests verde.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
davidherranandClaude Opus 5 committed 2026-09-09 11:06:39 -05:00
1 parent b72650974d
commit 38e5602d78
7 files changed
+1084 -245

No files matched your search

+27 -2
View File
@@ -315,6 +315,31 @@ pub const IMPL_NAME: &str = borrowed_str(&VERSION.impl_name);
/// lo llama `los_tres_presets_construyen_estado`, con contrafactual verificado.
/// Nada de esto cambia una transicion de estado de la cadena viva (no hay cadena
/// viva): el bump es por higiene de blob y de metadata. TRANSACTION_VERSION intacto.
///
/// **v13 (los weights dejan de ser estimados y pasan a ser medidos)**: los 19
/// extrinsics de los 5 pallets custom cambian de weights INTERIM hand-derived a
/// weights MEDIDOS con `frame-omni-bencher` sobre el propio blob WASM. Los
/// weights son consenso-relevantes ⇒ spec bump obligatorio. Lo que la medicion
/// destapo: **los 19 estaban subdeclarados, los 19.** El patron sistematico era
/// el mismo — se costeo el storage del pallet y se olvido el que cuesta emitir
/// un evento (`System::Events`, `EventCount`, `ExecutionPhase`, `Number`), que
/// son reads y writes reales en cada extrinsic que deposita evento. Y el peor:
/// **`proof_size` valia 0 en los 19**, que es exactamente el agujero que la
/// cabecera de los interinos afirmaba haber cerrado — falso, porque
/// `sp_weights::RuntimeDbWeight` solo tiene `read` y `write` y su `reads(r)`
/// devuelve `from_parts(read * r, 0)`. Un `proof_size` en cero miente al
/// block-builder sobre el peso PoV. Ahora cada fichero generado lleva un guard
/// que reprueba cualquier cero.
///
/// ⚠️ **NUMEROS DE MAQUINA DE DESARROLLO, NO CANONICOS.** Estan medidos en un
/// MacBook Pro M3 Max, no en el banco de referencia BM V2 (Pi 5). La FORMA
/// (reads / writes / proof_size) no depende del hardware y es correcta; el
/// `ref_time` SI depende, y en un Pi 5 sera bastante mayor. Un caso lo enseña
/// solo: `attest_asset` BAJA de 50 a 44 µs, y es justo el extrinsic dominado
/// por el verify Ed25519 — el mas sensible al silicio. Antes de mainnet hay que
/// correr `scripts/bench/regen-weights.sh` en el Pi 5 con governor y aislamiento
/// declarados (peticion abierta a Laurha, `request:66f500d54e28a80c`).
/// TRANSACTION_VERSION intacto: ninguna firma de extrinsic cambia.
pub const RUNTIME_VERSION: u32 = VERSION.spec_version;
/// Canonical authoring version per Substrate semver canonical.
@@ -961,7 +986,7 @@ pub const VERSION: sp_version::RuntimeVersion = sp_version::RuntimeVersion {
spec_name: alloc::borrow::Cow::Borrowed("origin-chain"),
impl_name: alloc::borrow::Cow::Borrowed("origin-chain-charon"),
authoring_version: 1,
spec_version: 12,
spec_version: 13,
impl_version: 1,
apis: RUNTIME_API_VERSIONS,
transaction_version: 1,
@@ -997,7 +1022,7 @@ mod tests {
/// mismo commit en que la version subio a 12.
#[test]
fn spec_version_vigente_y_transaction_version_intacta() {
assert_eq!(RUNTIME_VERSION, 12);
assert_eq!(RUNTIME_VERSION, 13);
assert_eq!(TRANSACTION_VERSION, 1);
}