Mensagem de erro
Address does not refer to key
Também aparece como
- error code: -3 error message: Address does not refer to key
O `bitcoin-cli` imprime “error code: -3” e “error message:” nas linhas antes do texto. Clientes JSON-RPC recebem `{"code": -3, "message": "Address does not refer to key"}`.
Bitcoin Core RPC — verifymessage / signmessage with a non-P2PKH address
O que significa
A assinatura de mensagens do Bitcoin Core (`signmessage`/`verifymessage`) implementa o esquema original “Bitcoin Signed Message”, que só funciona com endereços P2PKH legados: a chave pública é recuperada da assinatura, e o Core compara o hash dela com o endereço. Endereços SegWit nativos (`bc1q…`), Taproot (`bc1p…`) e P2SH (`3…`) não são endereços “de chave” nesse sentido, por isso o Core os rejeita com o erro RPC -3 em vez de retornar true ou false.
Por que acontece
Um endereço SegWit nativo
comumA maioria das carteiras hoje usa endereços `bc1q…` por padrão. Corretoras e fluxos de prova de reservas que pedem uma mensagem assinada com um endereço desse tipo não podem usar o esquema legado do Core.
Endereço Taproot ou P2SH
ocasionalEndereços `bc1p…` e `3…` (SegWit encapsulado, multisig) não têm um único hash de chave pública com o qual o Core possa comparar.
Uma assinatura feita por outra carteira para um endereço SegWit
ocasionalElectrum, Trezor e outros estendem o formato legado para SegWit (bytes de cabeçalho 35–42 do BIP-137) ou usam o BIP-322. O `verifymessage` do Core não aceita nenhum dos dois.
Como corrigir
- 1.
Assinar com um endereço legado no Core
Se a outra parte só precisa de uma prova de controle sobre uma chave da sua carteira, crie um endereço legado para a prova.
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 o BIP-322 para SegWit e Taproot
O BIP-322 define assinaturas de mensagens para todos os tipos de endereço. Use uma biblioteca ou carteira que o implemente e combine seu uso com o 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);