Wiki de ZooBC
Transacciones

Firmar una transacción

Una firma demuestra que quien tiene la clave de una cuenta aprobó una transacción, byte a byte. En ZooBC el firmante nunca firma la transacción desnuda: firma un resumen que cubre también la identidad de la cadena, de modo que la firma solo es válida en una cadena. Pueden firmar cuentas de muchos tipos de clave, cada una con el esquema de su cadena de origen, lo que permite que una clave de Bitcoin, Ethereum o Solana controle directamente una cuenta de ZooBC.

Qué se firma

El firmante toma el sobre sin firmar, todos los campos salvo la firma, y firma este resumen:

digest = SHA3-256( "ZBC-TX" ‖ genesis block hash ‖ unsigned bytes )

"ZBC-TX" es una etiqueta ASCII, y ‖ significa «seguido de». Solo se acepta este resumen vinculado a la cadena. En una transacción de versión 3, los 4 bytes de caducidad forman parte de los bytes sin firmar, así que se firman como cualquier otro campo.

La fórmula de firma: el SHA3-256 de la etiqueta ZBC-TX, el hash del génesis y los bytes sin firmar da el resumen que firma la clave; el hash del génesis es distinto en cada cadena
La fórmula de firma: el SHA3-256 de la etiqueta ZBC-TX, el hash del génesis y los bytes sin firmar da el resumen que firma la clave; el hash del génesis es distinto en cada cadena

El hash del bloque génesis es la identidad de la cadena. ZooBC no tiene campo de id de red: devnet, testnet y mainnet tienen cada una su propio hash del génesis, así que una firma hecha para mainnet no se verifica en devnet ni en testnet, aunque la misma clave tenga fondos en las tres. Los nodos también comparan los hashes del génesis antes de conectarse entre sí. Esto cierra la repetición entre cadenas, en la que alguien copia tu transacción de una cadena a otra; véase firmas vinculadas a la cadena.

El hash y el id

Una vez firmada, una transacción se identifica por su hash y su id:

hash = SHA3-256( unsigned bytes ‖ signature )
id   = the first 8 bytes of the hash, read as a little-endian signed 64-bit integer

Un nodo rechaza un id que ya está confirmado, lo que impide una repetición en la misma cadena. El id de una transacción IssueToken es también el id del token que crea (véase emitir un token).

Tipos de clave que pueden firmar

Una dirección empieza por un número de tipo, y el tipo decide cómo se comprueba su firma:

Tipo de clave (número)Esquema de firma
ZooBC (0), Solana (11)Ed25519
Cardano (13), Tezos (16)Ed25519, con la clave pública incluida en un campo de firma de 98 bytes
Bitcoin heredado (1), P2PKH (5), P2WPKH envuelto en P2SH (6), P2WPKH (7), Ripple (14)ECDSA secp256k1 sobre un doble SHA-256 del resumen, con la clave pública incluida
Ethereum (4), Tron (15)secp256k1 sobre Keccak-256 del resumen; la clave se recupera de una firma r‖s‖v de 65 bytes
Bitcoin Taproot (9)Schnorr BIP-340
Polkadot (12)sr25519

Las firmas ECDSA deben usar la forma low-s. Sea cual sea el esquema, todas las claves firman el mismo resumen vinculado a la cadena.

Un cuadro de los tipos de clave que pueden firmar, cada uno con su esquema de firma, y una fila gris con los tipos que no pueden
Un cuadro de los tipos de clave que pueden firmar, cada uno con su esquema de firma, y una fila gris con los tipos que no pueden

Algunos tipos de dirección no pueden firmar nunca: Empty (2), Estonia eID (3, que no tiene verificador), los scripts P2WSH de Bitcoin (8) y los datasets (10). Una dirección P2WSH representa un script y no una sola clave, y una dirección de dataset nombra datos, no a un firmante. Las cuentas sin clave, como los fondos del sistema, los grupos de cuentas y las cuentas multifirma, no tienen ninguna clave y solo gastan mediante sus propias reglas.

Firmar con una billetera de otra cadena

Una billetera de otra cadena también puede firmar una transacción de su propia cadena y hacer que se transporte, como mensaje, dentro de la transacción de ZooBC correspondiente:

  • Ethereum: una transacción legacy, EIP-2930 o EIP-1559 con una lista de acceso vacía;
  • Solana: una transferencia del System program;
  • Bitcoin: una entrada, una o dos salidas y una comisión de cero.

El nodo comprueba que el remitente, el destinatario y el importe coinciden con la transacción de ZooBC, y una carga de otra cadena dada solo puede gastarse una vez. Un mensaje así puede contener hasta 4096 bytes. Véase MetaMask y el acceso al estilo de Ethereum para el acceso al estilo de Ethereum.

Otros resúmenes firmados

El mismo patrón vinculado a la cadena, cada vez con su propia etiqueta, cubre otros consentimientos:

  • vincular una dirección a un grupo y ceder el control de un grupo ("ZBC-GROUP-LINK" y "ZBC-GROUP-CONTROL");
  • pedir a un nodo que cancele una transacción pendiente en su conjunto de espera ("ZBC-CANCEL");
  • la cofirma de un escrow entre varias partes.

Los mensajes fuera de la cadena, que no son transacciones, se firman como SHA3-256("ZBC-MSG-v2" ‖ genesis hash ‖ message) con una clave Ed25519; véase mensajes firmados y cifrados.

Véase también