Message d’erreur
Address does not refer to key
Également affiché sous la forme
- error code: -3 error message: Address does not refer to key
`bitcoin-cli` affiche « error code: -3 » et « error message: » sur les lignes qui précèdent le texte. Les clients JSON-RPC reçoivent `{"code": -3, "message": "Address does not refer to key"}`.
Bitcoin Core RPC — verifymessage / signmessage with a non-P2PKH address
Ce que cela signifie
La signature de messages de Bitcoin Core (`signmessage`/`verifymessage`) implémente le schéma d’origine « Bitcoin Signed Message », qui ne fonctionne qu’avec les adresses P2PKH dites legacy : la signature permet de récupérer une clé publique, et Core compare le condensat de cette clé avec l’adresse. Les adresses SegWit natives (`bc1q…`), Taproot (`bc1p…`) et P2SH (`3…`) ne sont pas des adresses « de clé » en ce sens, si bien que Core les rejette avec l’erreur RPC -3 au lieu de renvoyer true ou false.
Pourquoi cela se produit
Une adresse SegWit native
fréquenteLa plupart des portefeuilles utilisent désormais par défaut des adresses `bc1q…`. Les plateformes d’échange et les processus de preuve de réserves qui demandent un message signé depuis une telle adresse ne peuvent pas utiliser l’ancien schéma de Core.
Adresse Taproot ou P2SH
occasionnelleLes adresses `bc1p…` et `3…` (SegWit encapsulé, multisig) ne contiennent pas le condensat d’une clé publique unique que Core pourrait comparer.
Une signature produite par un autre portefeuille pour une adresse SegWit
occasionnelleElectrum, Trezor et d’autres étendent l’ancien format à SegWit (valeurs 35 à 42 de l’octet d’en-tête BIP-137) ou utilisent BIP-322. Le `verifymessage` de Core n’accepte ni l’un ni l’autre.
Comment corriger l’erreur
- 1.
Signer avec une adresse legacy dans Core
Si la contrepartie a seulement besoin de la preuve que vous contrôlez une clé de votre portefeuille, créez une adresse legacy pour cette preuve.
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.
Utiliser BIP-322 pour SegWit et Taproot
BIP-322 définit des signatures de messages pour tous les types d’adresses. Utilisez une bibliothèque ou un portefeuille qui l’implémente, et convenez de son usage avec le vérificateur.
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);