Mensaje de error
Address does not refer to key
También se muestra como
- error code: -3 error message: Address does not refer to key
`bitcoin-cli` muestra «error code: -3» y «error message:» en las líneas anteriores al texto. Los clientes JSON-RPC reciben `{"code": -3, "message": "Address does not refer to key"}`.
Bitcoin Core RPC — verifymessage / signmessage with a non-P2PKH address
Qué significa
La firma de mensajes de Bitcoin Core (`signmessage`/`verifymessage`) implementa el esquema original «Bitcoin Signed Message», que solo funciona con direcciones P2PKH heredadas (legacy): la firma permite recuperar una clave pública, y Core compara el hash de esa clave con la dirección. Las direcciones SegWit nativas (`bc1q…`), Taproot (`bc1p…`) y P2SH (`3…`) no son direcciones «de clave» en ese sentido, así que Core las rechaza con el error RPC -3 en lugar de devolver true o false.
Por qué ocurre
Una dirección SegWit nativa
frecuenteLa mayoría de las billeteras usan ahora por defecto direcciones `bc1q…`. Las plataformas de intercambio y los procesos de prueba de reservas que piden un mensaje firmado desde una dirección así no pueden usar el esquema heredado de Core.
Dirección Taproot o P2SH
ocasionalLas direcciones `bc1p…` y `3…` (SegWit anidado, multifirma) no tienen un único hash de clave pública con el que Core pueda compararlas.
Una firma hecha por otra billetera para una dirección SegWit
ocasionalElectrum, Trezor y otras amplían el formato heredado para SegWit (valores del 35 al 42 del byte de encabezado BIP-137) o usan BIP-322. El `verifymessage` de Core no acepta ninguna de las dos opciones.
Cómo solucionarlo
- 1.
Firmar con una dirección heredada en Core
Si la contraparte solo necesita una prueba de control sobre una clave de tu billetera, crea una dirección heredada para la prueba.
bash # Bitcoin Core signs and verifies messages only for legacy P2PKH addresses (1... / m... / n...) addr=$(bitcoin-cli getnewaddress "proof" legacy) sig=$(bitcoin-cli signmessage "$addr" "I own this address") bitcoin-cli verifymessage "$addr" "$sig" "I own this address" - 2.
Usar BIP-322 para SegWit y Taproot
BIP-322 define firmas de mensajes para todos los tipos de dirección. Usa una biblioteca o billetera que lo implemente y acuérdalo con el verificador.
js // SegWit / Taproot addresses: BIP-322 "simple" signatures, e.g. with the bip322-js library import { Verifier } from "bip322-js"; const ok = Verifier.verifySignature("bc1q...", "I own this address", signatureBase64);