Fehlermeldung
Address does not refer to key
Auch ausgegeben als
- error code: -3 error message: Address does not refer to key
`bitcoin-cli` gibt in den Zeilen vor dem Text „error code: -3“ und „error message:“ aus. JSON-RPC-Clients sehen `{"code": -3, "message": "Address does not refer to key"}`.
Bitcoin Core RPC — verifymessage / signmessage with a non-P2PKH address
Was der Fehler bedeutet
Das Signieren von Nachrichten in Bitcoin Core (`signmessage`/`verifymessage`) implementiert das ursprüngliche Verfahren „Bitcoin Signed Message“, das nur mit Legacy-P2PKH-Adressen funktioniert: Aus der Signatur wird ein öffentlicher Schlüssel wiederhergestellt, und Core vergleicht dessen Hash mit der Adresse. Adressen vom Typ Native SegWit (`bc1q…`), Taproot (`bc1p…`) und P2SH (`3…`) sind in diesem Sinne keine „Schlüssel“-Adressen, deshalb lehnt Core sie mit dem RPC-Fehler -3 ab, statt true oder false zurückzugeben.
Warum der Fehler auftritt
Eine native SegWit-Adresse
häufigDie meisten Wallets verwenden inzwischen standardmäßig Adressen, die mit `bc1q…` beginnen. Börsen und Proof-of-Reserves-Abläufe, die eine signierte Nachricht von einer solchen Adresse verlangen, können das Legacy-Verfahren von Core nicht nutzen.
Taproot- oder P2SH-Adresse
gelegentlichAdressen mit `bc1p…` und `3…` (Wrapped SegWit, Multisig) haben keinen einzelnen Hash eines öffentlichen Schlüssels, mit dem Core vergleichen könnte.
Eine Signatur, die eine andere Wallet für eine SegWit-Adresse erstellt hat
gelegentlichElectrum, Trezor und andere erweitern das Legacy-Format für SegWit (BIP-137-Header-Bytes 35–42) oder verwenden BIP-322. `verifymessage` in Core akzeptiert keines von beiden.
So behebst du den Fehler
- 1.
In Core mit einer Legacy-Adresse signieren
Wenn die Gegenseite nur einen Nachweis braucht, dass du über einen Schlüssel in deiner Wallet verfügst, erstelle für diesen Nachweis eine Legacy-Adresse.
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.
BIP-322 für SegWit und Taproot verwenden
BIP-322 definiert Nachrichtensignaturen für jeden Adresstyp. Verwende eine Bibliothek oder Wallet, die es implementiert, und vereinbare es mit der prüfenden Seite.
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);