BotRadixBotRadixDocumentación

Compilación reproducible

Receta con solc 0.8.37, hash de la entrada exacta y comprobaciones de fuentes, artefactos y código desplegado.

Ver en Markdown

Una compilación reproducible permite comprobar que unas fuentes y ajustes concretos producen los artefactos esperados. Es una comprobación de correspondencia; no es una auditoría de seguridad ni demuestra que una implementación siga activa. Para esto último hay que leer las rutas de los proxies en un bloque determinado.

Compilador y ajustes#

La receta de referencia v2.2 utiliza:

AjusteValor
Soliditysolc 0.8.37+commit.f401782d
Lenguaje de entradaSolidity, formato Standard JSON
Optimizadorenabled: true, runs: 200
Compilación mediante IRviaIR: true
EVM objetivoevmVersion: "paris"
Hash de metadatos en bytecodemetadata.bytecodeHash: "none"
Dependencias de la entrada de referenciaOpenZeppelin 5.6.1, incluidas con sus nombres de unidad originales

Este es el fragmento de ajustes que afecta a la receta. Para compilar se usa la entrada completa, incluidas las fuentes y outputSelection, sin reconstruirla a partir del fragmento:

json
{
  "optimizer": { "enabled": true, "runs": 200 },
  "viaIR": true,
  "evmVersion": "paris",
  "metadata": { "bytecodeHash": "none" }
}

Identificar la entrada exacta#

La entrada Standard JSON reúne el contenido de las fuentes y dependencias bajo sus rutas originales. Conserva nombres de archivo, nombres de unidades importadas, ajustes y versiones. No sustituyas dependencias por la versión más reciente ni combines fuentes de varias entregas.

Referencia documental: 11 de octubre de 2026. La entrada v22.standard-input.json del paquete de referencia 20261011-145007 contiene 54 unidades. Su SHA-256, calculado sobre los bytes del archivo, es:

text
54a204b3dd61ceb7196f84c7337927fbf5b3af5c721e6eac1319487da050ddf6

Este hash identifica esa entrada concreta, no un paquete final aún por publicar. Cambiar comentarios o el formato del JSON cambia el hash del archivo aunque el bytecode pueda seguir siendo idéntico. La publicación deberá identificar su propia entrada y su SHA-256, junto con el resultado de la comparación de bytecode.

Estado de publicación: las fuentes verificadas se publicarán conjuntamente en BaseScan cerca del cierre. La descarga pública de la entrada final y sus artefactos está pendiente; no se presenta aquí una URL de descarga que aún no está disponible.

Reproducir sin publicar#

Con el compilador exacto ya instalado y la entrada completa disponible, trabaja en un directorio local. Estos comandos no envían transacciones ni publican código:

bash
solc --version
sha256sum v22.standard-input.json
solc --standard-json < v22.standard-input.json > v22.compiler-output.json

Comprueba que la versión incluye 0.8.37+commit.f401782d y que el hash corresponde al archivo de la entrega que estás verificando. El hash anterior solo corresponde a la entrada de referencia indicada. Si una entrada tiene todas las fuentes embebidas, no necesita resolver importaciones por red.

Comprueba además los errores del JSON de salida: el código de salida del proceso, por sí solo, no demuestra que Solidity haya compilado correctamente.

python
import json
from pathlib import Path

result = json.loads(Path("v22.compiler-output.json").read_text())
errors = [item for item in result.get("errors", []) if item.get("severity") == "error"]
for item in errors:
    print(item.get("formattedMessage", item.get("message", "")))
assert not errors, "Solidity compilation failed"
assert result.get("contracts"), "No contract output"
print("Compilation completed; compare artifacts next")

Revisa también los avisos y conserva compilador, entrada, salida y hashes. No hace falta una wallet, una clave privada ni una clave de API para esta compilación local.

Comparar los artefactos y el despliegue#

Compara por nombre de unidad y nombre de contrato, no solo por nombre de archivo de salida. Para fuentes idénticas deben compararse tanto evm.bytecode.object (creación) como evm.deployedBytecode.object (runtime), junto con ABI y disposición de almacenamiento cuando se evalúe una actualización.

El runtime del compilador puede contener ubicaciones para valores immutable que el constructor fija al desplegar. La comprobación de una dirección debe resolver immutableReferences, argumentos de constructor y, si existen, referencias a librerías enlazadas. El código de creación y los argumentos del constructor tampoco son lo mismo. No descartes diferencias arbitrarias para forzar una coincidencia.

bytecodeHash: "none" omite el hash de metadatos del bytecode; no significa que cualquier cambio de fuentes sea inocuo ni que desaparezca toda información de metadatos. Un cambio solo de comentarios puede conservar el código generado, pero hay que recompilar y comparar para demostrarlo. Cambiar lógica, literales o nombres usados para calcular identificadores puede cambiar el resultado.

La comparación con código en cadena requiere indicar red, dirección y bloque, y tratar por separado anfitrión, implementaciones y módulos. Una coincidencia del proxy no acredita la lógica a la que delega. Consulta Seguridad y contratos para el alcance de las revisiones y los cambios posibles mientras las piezas estén OPEN.

Última actualización: 2026-10-12