Перейти к содержимому
ecdsa.com
Bitcoin Core RPCКошельки и подписи Web3

Сообщение об ошибке

Address does not refer to key

Также выводится как

  • error code: -3 error message: Address does not refer to key

`bitcoin-cli` выводит «error code: -3» и «error message:» в строках перед текстом. Клиенты JSON-RPC получают `{"code": -3, "message": "Address does not refer to key"}`.

Bitcoin Core RPC — verifymessage / signmessage with a non-P2PKH address

Что это означает

Подпись сообщений в Bitcoin Core (`signmessage`/`verifymessage`) реализует исходную схему «Bitcoin Signed Message», которая работает только с legacy-адресами P2PKH: из подписи восстанавливается открытый ключ, и Core сравнивает его хеш с адресом. Адреса native SegWit (`bc1q…`), Taproot (`bc1p…`) и P2SH (`3…`) в этом смысле не считаются адресами «ключа», поэтому Core отклоняет их с ошибкой RPC -3, а не возвращает true или false.

Почему это происходит

Как исправить

  1. 1.

    Подпишите сообщение legacy-адресом в Core

    Если второй стороне нужно лишь подтверждение того, что вы контролируете ключ в своём кошельке, создайте для этого подтверждения legacy-адрес.

    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. 2.

    Используйте BIP-322 для SegWit и Taproot

    BIP-322 определяет подписи сообщений для адресов всех типов. Используйте библиотеку или кошелёк, в которых он реализован, и согласуйте его использование с проверяющей стороной.

    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);

Связанные ошибки

Открыть всю базу ошибок подписей