| Objeto | Campo | Descripción | Valor |
|---|---|---|---|
| hash | types | Algoritmo(s) usados para calcular el hash final del contenido. | ”sha256:sha256” |
| steps | Método o procedimiento aplicado para preparar los datos antes del hash. | ”stringify:data” | |
| value | Resultado del doble proceso de hashing aplicado al objeto data serializado en orden alfabetico. | string hexadecimal de 64 caracteres (SHA‑256 = 32 bytes). | |
| data | amount | Monto exacto de la operación expresado como texto decimal. | Obtener de (action.amount) |
| domain | Identificador del entorno o sistema donde se genera la firma. | ”tin” | |
| expiry | Momento límite en que la firma deja de ser válida. | Hora actual + 1 minuto en formato ISO8601, ejemplo “2021-11-03T13:50:41.431Z” | |
| random | Nonce - valor único aleatorio usado para evitar reutilización de firmas. | string en hex o base64 | |
| source | Signer del origen que inicia la operación. | Signer de banco / usuario | |
| symbol | Signer del sistema Transfiya | Obtener de (action.snapshot.symbol.signer.handle) | |
| target | Signer del destino afectado por la operación. | Signer de banco / usuario | |
| meta (signatures) | scheme | Algoritmo criptográfico utilizado para firmar. | eddsa25519 - ecdsa25519 |
| signer | Signer del firmante que generó la firma. | Signer de banco / usuario | |
| public | Clave pública asociada al firmante para verificar la firma. | Llave publica del signer | |
| string | Firma digital generada a partir del hash final. | Firma digital |
- 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.