Saltar al contenido principal

Recibos de liquidación cuántico-seguros

Un recibo de liquidación es una prueba portátil y autocontenida de que el lote de liquidación de un rollup fue anclado a la Cadena Principal bajo una firma poscuántica. Vincula un lote específico al ancla en cadena que comprometió el estado del rollup a esa altura, y puede verificarse totalmente sin conexión — sin nodo, sin confianza en la ruta de red del verificador.

La firma del ancla es ML-DSA-87 (Dilithium-5, FIPS-204), el mismo esquema poscuántico que usa la Cadena Principal, de modo que un recibo hereda la integridad cuántico-segura de la cadena base.

El mensaje canónico del ancla

La verificación comprueba una firma Dilithium-5 sobre un mensaje canónico construido a partir de los campos del ancla, concatenados en este orden exacto:

layer_id || layer_height (8-byte big-endian) || state_root || validator_set_hash

anchorSignBytes(...) produce estos bytes; el verificador los reconstruye a partir del recibo y comprueba la firma frente a la clave ML-DSA-87 registrada del creador de la capa.

Construir y verificar (TypeScript)

import {
createRdkClient,
buildSettlementReceipt,
verifySettlementReceipt,
} from "@qorechain/rdk";

// The public qore.host endpoints are baked into the presets (RDK ≥ 0.4.2);
// pass `endpoints` only to target your own node.
const rdk = createRdkClient({ network: "testnet" });

// Build a portable receipt for one batch.
const receipt = await buildSettlementReceipt(rdk, "my-roll", 7);

// Persist it, ship it, hand it to a counterparty — it is self-contained JSON.

// Verify fully offline. With no client, you must supply the creator's key.
const result = await verifySettlementReceipt(receipt, {
creatorPublicKey: "<layer creator ML-DSA-87 public key>",
});

console.log(result.valid); // true when the signature and the batch↔anchor binding both hold

Si pasas un client en lugar de (o junto con) creatorPublicKey, la verificación obtiene la clave ML-DSA-87 registrada del creador de la capa desde la cadena (getPqcAccount(address)). La verificación comprueba entonces dos cosas:

  1. la firma Dilithium-5 sobre el mensaje canónico del ancla, y
  2. el vínculo lote ↔ raíz de estado del ancla — que el lote que tienes es el que comprometió el ancla.
// Online verification: fetch the creator's PQC key from the chain.
const online = await verifySettlementReceipt(receipt, { client: rdk });

Leer anclas

Los recibos se construyen a partir de la consulta Anchor en cadena de x/multilayer, disponible tanto por gRPC como por REST a partir de la versión de cadena v3.1.80 (consulta REST / gRPC Endpoints). Las lecturas:

  • getAnchor(layerId) — el ancla de una capa.
  • getLatestAnchor() — el ancla más reciente.
  • getAnchors(layerId) — el historial de anclas de una capa.
  • getPqcAccount(address) — una cuenta poscuántica registrada (su clave ML-DSA-87), usada para verificar la firma del creador.

CLI

# Build a receipt and print it.
qorollup receipt my-roll 7

# Build, then verify it inline.
qorollup receipt my-roll 7 --verify

# Build and write it to a file.
qorollup receipt my-roll 7 --out receipt.json

Consulta Desplegar un Rollup para la CLI completa de operador qorollup.

Otros lenguajes

Los clientes de Python, Go, Rust y Java (JVM) exponen la misma superficie de construcción/verificación. Realizan la verificación ML-DSA-87 a través de la biblioteca qorechain-pqc en lugar de una implementación JavaScript empaquetada; instálala junto con el cliente RDK de tu lenguaje.