Wiki de ZooBC
Integraciones

Mensajes firmados y cifrados

No toda firma necesita una transacción. Un mensaje firmado demuestra que tienes una clave sin mover dinero y sin pagar comisión; un mensaje cifrado permite que solo lo lea su destinatario. Esta página trata de ambos, y de dos firmas relacionadas que acepta la API del nodo.

Demostrar que controlas una dirección

Un sitio web que quiere saber que controlas una dirección de ZooBC te envía un desafío aleatorio. Tú lo firmas con zbc-cli sign-message, o con la misma función en cualquier versión de las herramientas de línea de comandos públicas, y el sitio comprueba la firma con tu dirección. En una dirección ZBC_ nativa, la dirección es la propia clave pública, así que no hace falta nada más. Enviar un pago también demostraría el control, pero eso es una transacción y cuesta una comisión. Nunca le des a nadie tu clave privada en su lugar.

El esquema se llama ZBC-MSG-v2. Firma, con Ed25519:

SHA3-256("ZBC-MSG-v2" ‖ genesis hash ‖ message)

Dos partes de ese resumen importan:

  • La etiqueta. Las transacciones se firman bajo una etiqueta distinta, «ZBC-TX». Por tanto, una firma de mensaje nunca puede ser válida como transacción, ni una firma de transacción como mensaje.
  • El hash del génesis. Ata la firma a una sola red: un mensaje firmado para devnet nunca se verifica en testnet ni en mainnet (firmas vinculadas a la cadena).

Durante un periodo de transición, el verify-message de las herramientas también acepta la forma antigua sin cadena, ZBC-MSG-v1 (SHA3-256 de «ZBC-MSG» y el mensaje). El periodo termina en un momento límite fijado en las herramientas; después, solo se verifica ZBC-MSG-v2.

La etiqueta ZBC-MSG-v2, el hash del génesis y el mensaje se combinan con SHA3-256 y se firman con Ed25519, y después se verifican con la dirección ZBC_; las etiquetas ZBC-TX y ZBC-MSG-v2 nunca son intercambiables
La etiqueta ZBC-MSG-v2, el hash del génesis y el mensaje se combinan con SHA3-256 y se firman con Ed25519, y después se verifican con la dirección ZBC_; las etiquetas ZBC-TX y ZBC-MSG-v2 nunca son intercambiables

La firma de mensajes es una convención de las herramientas públicas y de los servicios que la adoptan, no una función de la cadena. No se guarda nada en la cadena, y los nodos no tienen ningún endpoint para ella.

Mensajes cifrados

Toda transacción puede llevar un mensaje (sobre de la transacción). Un mensaje en claro tiene como máximo 256 bytes. Uno cifrado empieza por el marcador «ZBE1», seguido de una caja sellada (sealed box) de libsodium dirigida a la clave del destinatario, que solo puede abrir la clave privada del destinatario. Un mensaje cifrado puede tener hasta 320 bytes, lo que deja sitio para un máximo de 268 bytes de texto.

Solo se cifra el mensaje. El resto de la transacción, como su remitente, su destinatario y su importe, sigue siendo tan público como cualquier otro.

Peticiones firmadas a la API

La mayor parte de la API del nodo son lecturas abiertas, y una transacción no necesita ninguna clave de API porque lleva su propia firma. Cuando una petición en sí debe ir firmada, la firma es Ed25519 sobre el texto METHOD:PATH:TIMESTAMP:BODY, válida durante 300 segundos. Un cliente que falla 20 autenticaciones firmadas en 5 minutos queda bloqueado durante 300 segundos.

Cancelar una transacción pendiente

Una transacción que espera en el conjunto de espera de un nodo puede retirarse de ese nodo con DELETE /api/v1/transactions/pending/ seguido de su hash. La petición lleva una firma sobre:

SHA3-256("ZBC-CANCEL" ‖ genesis hash ‖ transaction hash)

Solo elimina la copia del conjunto de espera de ese nodo. Otros nodos que ya tengan la transacción pueden seguir incluyéndola en un bloque, así que una cancelación es una petición, no una garantía.

Véase también