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>
84 lines
4.1 KiB
Bash
Executable File
84 lines
4.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# regen-weights.sh — REGENERAR LOS WEIGHTS DE LOS 5 PALLETS CUSTOM
|
|
#
|
|
# POR QUE EXISTE
|
|
# ──────────────
|
|
# Durante meses los weights fueron "INTERIM hand-derived" y el fichero prometia
|
|
# que regenerarlos "es mecanico". No lo era: no habia comando. Cuando por fin se
|
|
# midio (2026-09-09) los 19 extrinsics estaban SUBDECLARADOS — los 19 — y el
|
|
# proof_size valia 0 en todos, que es el mismo agujero que los interinos decian
|
|
# haber cerrado. La promesa costo lo que cuestan las promesas sin codigo.
|
|
#
|
|
# QUE HACE
|
|
# ────────
|
|
# 1. Construye el runtime WASM con `runtime-benchmarks`.
|
|
# 2. Corre `frame-omni-bencher` sobre ESE blob (el mismo que se despliega).
|
|
# 3. Reescribe los 5 `weights.rs` con la plantilla de la casa, que emite
|
|
# trait + SubstrateWeight<T> + () + un guard generado que reprueba cualquier
|
|
# proof_size = 0.
|
|
#
|
|
# LA VERSION DEL BENCHER NO ES OPCIONAL
|
|
# ─────────────────────────────────────
|
|
# `frame-omni-bencher 0.15.0`. La ultima (0.23) trae `sp-storage 25` contra el
|
|
# `sp-storage 22` de este runtime, y `TrackedStorageKey` no decodifica al cruzar
|
|
# la frontera FFI. Falla con "unexpected first byte decoding Option", que no se
|
|
# parece en nada a "version equivocada".
|
|
# cargo install frame-omni-bencher --version 0.15.0 --locked
|
|
#
|
|
# DONDE CORRERLO
|
|
# ──────────────
|
|
# Para NUMEROS CANONICOS: en el banco de referencia (Pi 5), con el governor
|
|
# fijado a `performance` y el core aislado. `ondemand` arranca a 1600 MHz y sube
|
|
# a 2400: las primeras muestras salen ~50% lentas y el weight sale de la rampa,
|
|
# no del silicio. Sin `isolcpus` el aislamiento es una moneda al aire (medido).
|
|
# En cualquier otra maquina el resultado es un SMOKE del pipeline, util para ver
|
|
# la forma (reads/writes/proof_size, que NO dependen del hardware) e inservible
|
|
# como precio.
|
|
set -euo pipefail
|
|
|
|
cd "$(dirname "$0")/../.."
|
|
ROOT="$PWD"
|
|
STEPS="${STEPS:-50}"
|
|
REPEAT="${REPEAT:-20}"
|
|
BENCHER="${BENCHER:-frame-omni-bencher}"
|
|
WASM="${WASM:-$ROOT/target/release/wbuild/origin-chain-runtime/origin_chain_runtime.compact.compressed.wasm}"
|
|
# SKIP_BUILD=1 mide un blob YA construido. Es el modo del banco de referencia:
|
|
# el Pi 5 no compila Substrate, se le lleva el blob que se va a desplegar — asi
|
|
# el binario medido y el desplegado son el MISMO, que es la condicion de Laurha.
|
|
|
|
command -v "$BENCHER" >/dev/null || { echo "falta $BENCHER — ver cabecera"; exit 1; }
|
|
"$BENCHER" --version | grep -q "0\.15\.0" || echo "⚠ el bencher NO es 0.15.0; si falla al decodificar TrackedStorageKey, es esto"
|
|
|
|
if [ "${SKIP_BUILD:-0}" = "1" ]; then
|
|
echo "═══ 1/2 SALTADO — midiendo blob ya construido ═══"
|
|
else
|
|
echo "═══ 1/2 construyendo el WASM con runtime-benchmarks ═══"
|
|
WASM_BUILD_STD=0 cargo build --release -p origin-chain-runtime --features wasm-build,runtime-benchmarks
|
|
fi
|
|
echo "blob: $( (shasum -a 256 "$WASM" 2>/dev/null || sha256sum "$WASM") | cut -d' ' -f1)"
|
|
|
|
echo "═══ 2/2 midiendo (steps=$STEPS repeat=$REPEAT) ═══"
|
|
PARES="
|
|
origin_chain_provenance:crates/origin-chain-provenance/src/weights.rs
|
|
origin_chain_agent_identity:crates/origin-chain-agent-identity/src/weights.rs
|
|
origin_chain_fees:crates/origin-chain-fees/src/weights.rs
|
|
origin_chain_emission:crates/origin-chain-emission/src/weights.rs
|
|
origin_chain_governance:crates/origin-chain-governance/src/weights.rs
|
|
"
|
|
# Lista plana y no array asociativo a proposito: el bash por defecto de macOS
|
|
# es el 3.2, que no tiene `declare -A`, y con `set -u` falla con un
|
|
# «unbound variable» que no se parece en nada a la causa.
|
|
echo "$PARES" | while IFS=: read -r p dest; do
|
|
[ -n "$p" ] || continue
|
|
echo "── $p"
|
|
"$BENCHER" v1 benchmark pallet \
|
|
--runtime "$WASM" --genesis-builder-preset development \
|
|
--pallet "$p" --extrinsic "" \
|
|
--steps "$STEPS" --repeat "$REPEAT" \
|
|
--template "$ROOT/scripts/bench/origin-weights-template.hbs" \
|
|
--header "$ROOT/scripts/bench/HEADER.txt" \
|
|
--output "$ROOT/$dest"
|
|
done
|
|
|
|
echo "═══ listo — ahora: cargo test --workspace ═══"
|