#!/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. OJO: NO es el que se despliega. # Lleva `runtime-benchmarks` (expone la runtime API Benchmark: superficie de DoS # en los nodos RPC). Lo que tiene que coincidir con lo desplegado es el COMMIT, # no el blob. Por eso se construye en su propio target (`target-bench/`) y nunca # en `target/release/wbuild`, que es de donde sale el blob de un set_code. # (Corregido en RV15: la revisión adversaria encontró el blob de bench en la # ruta de despliegue, justo después de regenerar pesos.) # 3. Reescribe los 5 `weights.rs` con la plantilla de la casa, que emite # trait + SubstrateWeight + () + 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}" # DENTRO del repo, no en /tmp: substrate-wasm-builder busca el Cargo.lock subiendo # desde el target. Fuera del workspace no lo encuentra, resuelve dependencias desde # cero y trae crates que exigen otro rustc (medido en RV15). BENCH_TARGET="${BENCH_TARGET:-$ROOT/target-bench}" WASM="${WASM:-$BENCH_TARGET/release/wbuild/origin-chain-runtime/origin_chain_runtime.compact.compressed.wasm}" # SKIP_BUILD=1 mide un blob de bench YA construido. Es el modo del banco de # referencia: el Pi 5 no compila Substrate, se le lleva el blob de bench del MISMO # COMMIT que se va a desplegar. La condicion de Laurha (medir lo que se despliega) # se cumple por commit: el blob desplegado es el mismo codigo SIN runtime-benchmarks. 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 ═══" CARGO_TARGET_DIR="$BENCH_TARGET" 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 ═══"