Proceso de firma:
- Preparar la data
Arma el objeto data con los campos acordados (amount, domain, expiry, random, source, symbol, target).- Importante: normaliza expiry a UTC con Z (ej. “2026-02-13T15:32:43.701Z”).
- Convertir la data a JSON canónico
Serializa la data a JSON determinístico:- Claves ordenadas alfabéticamente.
- Sin espacios extra (separators (”,”, ”:”)).
- Mismos tipos (ej. amount como string si así lo usas).
- Calcular hash.value (doble SHA‑256)
- Hash #1 = SHA256( UTF‑8(canonical_json) ) → (hex).
- Hash #2 = SHA256( bytes.fromhex(Hash #1) ) → (hex).
El Hash #2 es tu hash.value.
- Firmar hash.value
- Convierte hash.value (hex) a bytes.
- Firma esos bytes con Ed25519 prehash (Ed25519ph) usando tu secretKey (seed Ed25519 de 32 bytes).
- Obtén la firma (64 bytes) y conviértela a HEX (128 caracteres).
Ese HEX es lo que va en meta.signatures[0].string.
- Armar la firma en el body
Dentro de meta.signatures[0]:- scheme: “eddsa-ed25519”
- signer: data.source
- string: firma HEX (128)
- public: clave pública RAW (32 bytes) en HEX (64), derivada de la misma secretKey

- Llave pública
- Es la llave que sí puede compartirse
- Permite verificar que un mensaje o acción realmente proviene de quien dice enviarlo.
- Llave secreta
- Debe protegerse y mantenerse privada.
- Es la que se utiliza para firmar digitalmente información.
- Funciona como “la firma personal” del sistema.