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:
1 parent
b72650974d
commit
38e5602d78
7 files changed
+1084
-245
No files matched your search
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user