Files
arkhe-origin-chain/scripts/bench/regen-weights.sh
T
davidherranandClaude Opus 5 b72650974d feat(bench): regenerar weights deja de ser una promesa y pasa a ser un comando
Durante meses la cabecera de los cinco weights.rs prometia que regenerar
"es mecanico". No lo era: no habia comando, ni plantilla, ni forma de
correrlo. La promesa costo lo que cuestan las promesas sin codigo — al
medir por primera vez, los 19 extrinsics estaban SUBDECLARADOS, los 19.

Tres piezas:

· scripts/bench/regen-weights.sh — construye el WASM con
  runtime-benchmarks y mide los 5 pallets. SKIP_BUILD=1 + WASM=<ruta>
  mide un blob YA construido: es el modo del banco de referencia, donde
  el Pi 5 no compila Substrate sino que recibe el blob que se despliega,
  de modo que el binario medido y el desplegado son el MISMO.

· scripts/bench/origin-weights-template.hbs — emite la forma de la casa
  (trait + SubstrateWeight<T> + impl para ()) y, dentro, un guard
  GENERADO a partir de los benchmarks reales que reprueba cualquier
  proof_size = 0 o ref_time = 0. Generado, no escrito: no puede quedarse
  corto cuando se anada un extrinsic.

· scripts/bench/HEADER.txt — la cabecera que va dentro de cada fichero
  generado, diciendo que un weight es una latencia y que sin su hardware
  y su perfil de potencia no se reproduce.

El script documenta ademas dos cosas medidas hoy que cuestan horas si no
estan escritas: (1) hay que usar frame-omni-bencher 0.15.0, porque la
0.23 trae sp-storage 25 contra el sp-storage 22 de este runtime y
TrackedStorageKey no decodifica al cruzar el FFI — falla con "unexpected
first byte decoding Option", que no se parece a "version equivocada";
(2) el governor ondemand arranca a 1600 MHz y sube a 2400, asi que las
primeras muestras salen ~50% lentas y el weight sale de la rampa.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-09 10:45:30 -05:00

80 lines
3.9 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) ═══"
declare -A DEST=(
[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
)
for p in "${!DEST[@]}"; do
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[$p]}"
done
echo "═══ listo — ahora: cargo test --workspace ═══"