Troubleshooting
Problemas habituales al gestionar DIDs en ISBE y sus soluciones.
Errores en el alta del DID
400 Bad Request al llamar a insertFirstDidDocument
Posibles causas:
proofno coincide condid+publicKey— Regenera la tripleta DID/PublicKey/Proof con./did-gen did -p ...para asegurar coherencia.vMethodIdcon formato incorrecto — Debe ser 32 bytes en base64url sin padding (43 caracteres exactos). El thumbprint JWK cumple este formato por defecto.publicKeycon prefijo equivocado — Parasecp256k1, debe empezar por0x04(formato uncompressed).modelDeploydel DID no coincide con la red — Si llamas a la API de PRO con un DIDdid:isbe:uc-pre:...la operación falla. Asegúrate de coincidencia entre los tres valores: red, DID y API.
La transacción se envía pero el DID no aparece
- Revisa el campo
statusdelreceipt. Si vale0, la transacción se ejecutó pero el smart contract revirtió. Causas típicas:- La EOA
fromno tiene autorización para llamar ainsertFirstDidDocument(esa operación tiene autorización especial). - El DID ya existe.
- La EOA
- Si
statuses1pero el GET sigue devolviendo404, espera unos segundos a que el indexador refleje el nuevo bloque.
Errores al firmar
cli-tx-save lanza error de JSON al pasarle el cuerpo
Si usas el binario interno cli-tx-save, el parámetro -t espera una cadena JSON entre comillas simples. Si el JSON contiene comillas dobles internas y lo pasas entre dobles, se rompe. Solución:
./sign-tx sign -p 0x<KEY> -t '{"to":"0x...","data":"0x..."}'
Si te sigue dando problemas, la alternativa más portable es firmar con ethers.js o eth_account directamente (ver Registro desde la API — paso 4).
ethers.js lanza "from must be undefined or match the signer"
Los endpoints POST /contract/... devuelven from dentro del objeto. ethers se niega a serializar una transacción con from distinto al signer. Solución: descártalo antes de construir la Transaction:
const tx = Transaction.from({ ...raw, from: undefined });
eth_account se queja de campos en hexadecimal
A diferencia de ethers, eth_account espera enteros nativos en gas, gasPrice, nonce, value y chainId. Convierte los hex 0x... con int(x, 16) antes de firmar.
La transacción firmada se rechaza con nonce too low
El nonce devuelto por la API es el actual de la EOA. Si entre que generaste la transacción y la firmaste enviaste otra, el nonce puede haber quedado obsoleto. Solución: vuelve a llamar al endpoint para regenerar la transacción.
Errores al añadir verification methods
La clave no aparece como assertionMethod
Recuerda que la API expone los pasos por separado:
addVerificationMethodregistra la clave.addVerificationRelationshipla asocia al uso (assertionMethod,authentication, etc.).
Si solo ejecutas el primero, la clave existe pero no es utilizable para firmar credenciales.
publicKeyType y formato de publicKey desalineados
publicKeyType determina el formato del campo publicKey, no la curva. La curva sale del propio material:
publicKeyType: "secp256k1"→publicKeydebe ser 64 bytes XY hexadecimales (formato uncompressed sin envoltura JWK). Si pegas aquí un JWK serializado, la API responde con400por formato inválido.publicKeyType: "JsonWebKey2020"→publicKeydebe ser un JWK válido serializado a JSON y codificado en hex. La curva real se lee del campocrvdentro del JWK. Aceptasecp256k1,P-256, etc.
Errores frecuentes:
publicKeyType: "secp256k1"con un JWK serializado enpublicKey→400 BAD_REQUEST. Mete el JWK conpublicKeyType: "JsonWebKey2020", o extrae los 64 bytes XY de la clave secp256k1 y envíalos como hex puro.publicKeyType: "P-256"literal →400 UNSUPPORTEDcon mensaje "The 'P-256' publicKeyType is temporarily unsupported." El valor está reservado en la spec pero deshabilitado en la implementación actual; usaJsonWebKey2020concrv: "P-256"en su lugar.publicKeyType: "JsonWebKey2020"con un JWK cuyocrvno esté soportado por el contrato → la inserción puede pasar la validación de formato pero la clave no será operativa para firmar. Las curvas comprobadas como funcionales sonsecp256k1yP-256.
Confusión con la EOA from
from siempre debe ser la EOA de la clave secp256k1 de control del DID, no la EOA derivada de la nueva clave P-256. La P-256 sirve para firmar off-chain; las transacciones on-chain las firma la secp256k1.
Errores al resolver
404 Not Found
- El DID no está registrado en ese entorno (revisa el
modelDeploy). - El DID está URL-encoded incorrectamente. Algunos clientes HTTP requieren codificar los
:del DID. Prueba con cURL primero para descartar.
406 Not Acceptable
El header Accept no es uno de los soportados:
application/did+ld+jsonapplication/did+json
Errores de fondos / gas
insufficient funds for gas
La EOA no tiene saldo. En PRE puedes solicitar fondos en la sección Faucet del portal. En PRO los fondos se asignan en el onboarding inicial; contacta con ISBE si necesitas más.
gas required exceeds allowance
El gasLimit devuelto por la API debería ser suficiente. Si te ocurre este error, no modifiques el gasLimit manualmente: vuelve a generar la transacción para que la API recalcule.
Errores en la cadena de confianza
El CLI dice que la acreditación es inválida
Causas frecuentes:
accreditedForyaccreditedSchemasno tienen la misma cardinalidad. Debe haber correlación 1:1.- Los tipos / esquemas no son subconjunto de los acreditados por la acreditación padre.
- El
domainno coincide con el de la acreditación padre. - La URL en
accreditedByno es accesible o devuelve un JWT inválido.
El verificador no encuentra mi acreditación
- Confirma con ISBE que la acreditación se ha publicado en el TIR.
- Verifica que el verificador apunta al TIR del entorno correcto.
Pedir ayuda
Si tras revisar estos puntos sigues teniendo problemas, abre una incidencia en el portal de soporte de ISBE adjuntando:
- Entorno (
PRE/PRO). - DID afectado.
- Endpoint y cuerpo de la petición.
- Respuesta completa (incluido
tx_hashsi la transacción llegó a enviarse). - Logs del CLI si la incidencia es local.