Сообщение об ошибке
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.
Почему это происходит
Адрес native SegWit
частоБольшинство кошельков теперь по умолчанию создают адреса `bc1q…`. Биржи и процедуры подтверждения резервов (proof of reserves), которые запрашивают подписанное сообщение с такого адреса, не могут использовать старую схему Core.
Адрес Taproot или P2SH
иногдаУ адресов `bc1p…` и `3…` (обёрнутый SegWit, мультиподпись) нет единственного хеша открытого ключа, с которым Core мог бы сравнивать.
Подпись для SegWit-адреса, созданная другим кошельком
иногдаElectrum, Trezor и другие кошельки расширяют старый формат для SegWit (значения 35–42 в байте заголовка BIP-137) или используют BIP-322. `verifymessage` в Core не принимает ни то, ни другое.
Как исправить
- 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.
Используйте 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);