| Variant | Prefix | Объект proof | Основная граница |
|---|---|---|---|
| Legacy | Без нового prefix | Recoverable ECDSA signature | MAY только для legacy P2PKH; новые proofs SHOULD использовать новый формат |
| Simple | smp | Consensus-encoded witness stack | Native P2WPKH/P2WSH/P2TR без timelock scripts |
| Full | ful | Полная виртуальная to_sign transaction | Поддерживает общий script path и time constraints |
| Full Proof of Funds | pof | Finalized PSBT с дополнительными UTXO inputs | Показывает выбранный набор, не полноту; нужен current UTXO-set check |
- Variant
- Legacy
- Prefix
- Без нового prefix
- Объект proof
- Recoverable ECDSA signature
- Основная граница
- MAY только для legacy P2PKH; новые proofs SHOULD использовать новый формат
- Variant
- Simple
- Prefix
- smp
- Объект proof
- Consensus-encoded witness stack
- Основная граница
- Native P2WPKH/P2WSH/P2TR без timelock scripts
- Variant
- Full
- Prefix
- ful
- Объект proof
- Полная виртуальная to_sign transaction
- Основная граница
- Поддерживает общий script path и time constraints
- Variant
- Full Proof of Funds
- Prefix
- pof
- Объект proof
- Finalized PSBT с дополнительными UTXO inputs
- Основная граница
- Показывает выбранный набор, не полноту; нужен current UTXO-set check
Запрос фиксирует message bytes, script и момент проверки
До контакта с signer проверяющий формирует сообщение с целью, доменом или контекстом, уникальным challenge и временем либо сроком принятия. BIP-322 hash использует сообщение как есть: другая кодировка, перенос строки или пробел создают другой результат. Отдельно фиксируют Bitcoin network, полный адрес и полученный из него scriptPubKey. Адрес — удобное представление, но проверка удовлетворяет именно script challenge.
| Поле | Пример содержания без реальных данных | Зачем |
|---|---|---|
| Purpose | Подтверждение контроля для конкретной заявки | Не даёт переносить proof в другой процесс |
| Nonce/challenge | Случайное одноразовое значение | Снижает риск replay старого proof |
| Time window | Создано и принимается до указанного UTC | Определяет freshness вне самой подписи |
| Address/script | Точная mainnet/testnet строка и scriptPubKey | Закрепляет policy, которую должен удовлетворить signer |
| Variant/version | BIP-322 v2.0.0 smp, ful или pof | Исключает догадки decoder и старый draft flow |
- Поле
- Purpose
- Пример содержания без реальных данных
- Подтверждение контроля для конкретной заявки
- Зачем
- Не даёт переносить proof в другой процесс
- Поле
- Nonce/challenge
- Пример содержания без реальных данных
- Случайное одноразовое значение
- Зачем
- Снижает риск replay старого proof
- Поле
- Time window
- Пример содержания без реальных данных
- Создано и принимается до указанного UTC
- Зачем
- Определяет freshness вне самой подписи
- Поле
- Address/script
- Пример содержания без реальных данных
- Точная mainnet/testnet строка и scriptPubKey
- Зачем
- Закрепляет policy, которую должен удовлетворить signer
- Поле
- Variant/version
- Пример содержания без реальных данных
- BIP-322 v2.0.0 smp, ful или pof
- Зачем
- Исключает догадки decoder и старый draft flow
Proof выглядит как spend, но его challenge input не существует в сети
Спецификация строит to_spend с несуществующим prevout и output, содержащим message_challenge, затем to_sign тратит этот виртуальный output в нулевой OP_RETURN. Signer удовлетворяет input так, как удовлетворил бы Bitcoin Script. Это позволяет использовать witness, multisig и Taproot-механики, не создавая broadcastable transaction и не перемещая bitcoin. Verifier реконструирует те же виртуальные objects и запускает consensus checks с перечисленными BIP-322 ограничениями. До подтверждения важно видеть, что именно подписывает кошелёк.
Workflow signer → verifier
- 1Заморозить request
Сохранить UTF-8 bytes сообщения, network, address/script, BIP-322 version и допустимый variant до подписи.
- 2Проверить implementation
Убедиться, что wallet и verifier явно поддерживают нужный script и финальный v2.0.0 format; слова sign message без version недостаточно.
- 3Показать challenge signer
Устройство должно отобразить сообщение и challenge address/script как message signing, а не неизвестную отправку средств.
- 4Получить prefixed proof
Не отрезать smp, ful или pof и не менять base64 payload. Для multisig собрать требуемые partial signatures до финализации.
- 5Проверить independently
Verifier использует исходные bytes и script, декодирует variant, выполняет script checks и фиксирует valid, invalid либо inconclusive.
Совместимость проверяют по версии продукта, script и completed flow
BIP-322 Complete не означает, что каждый кошелёк уже реализовал все variants. На дату проверки официальная документация COLDCARD описывает completed-flow BIP-322 PSBT для Mk4/Mk5 начиная с 5.5.1 и Q с 1.4.1Q; более ранние draft-запросы передавали message отдельно и не являются текущим flow. Это пример точной границы, а не универсальный список совместимости. Для любого другого signer, включая аппаратный кошелёк, нужны его официальный version note, поддерживаемый script и формат export; для verifier — явная поддержка prefix и test vectors v2.0.0.
Proof of Funds раскрывает выбранные UTXO, но не весь баланс
В pof signer добавляет к виртуальному challenge реальные UTXO inputs и удовлетворяет их scripts. Проверяющий с доступом к актуальному UTXO set может установить, что перечисленные outputs существуют и не потрачены на момент проверки. Сам proof не доказывает, что это все средства адреса или организации; offline verifier способен проверить cryptographic witness, но не current unspent state. Публикация pof также связывает выбранные coins, scripts, public keys и иногда wallet structure — существенная граница для Proof of Reserves.
| Проверено | Допустимый вывод | Недопустимый вывод |
|---|---|---|
| Message proof | Script удовлетворён для точного challenge | Подписант — конкретный человек или владелец по закону |
| Fresh nonce/time policy | Proof принят в заданном внешнем окне | Контроль гарантирован после окна |
| pof witness | Signer удовлетворил scripts выбранных UTXO | Показан полный баланс или чистое происхождение средств |
| pof + current chain check | Указанные UTXO unspent на момент query | Средства не будут потрачены сразу после проверки |
| Valid script | Verifier понимает и принимает policy | Ранее отправленная транзакция создана этим signer |
- Проверено
- Message proof
- Допустимый вывод
- Script удовлетворён для точного challenge
- Недопустимый вывод
- Подписант — конкретный человек или владелец по закону
- Проверено
- Fresh nonce/time policy
- Допустимый вывод
- Proof принят в заданном внешнем окне
- Недопустимый вывод
- Контроль гарантирован после окна
- Проверено
- pof witness
- Допустимый вывод
- Signer удовлетворил scripts выбранных UTXO
- Недопустимый вывод
- Показан полный баланс или чистое происхождение средств
- Проверено
- pof + current chain check
- Допустимый вывод
- Указанные UTXO unspent на момент query
- Недопустимый вывод
- Средства не будут потрачены сразу после проверки
- Проверено
- Valid script
- Допустимый вывод
- Verifier понимает и принимает policy
- Недопустимый вывод
- Ранее отправленная транзакция создана этим signer
Invalid и inconclusive исправляют сверкой контекста, не новой подписью вслепую
Recovery при несовместимом proof
- 1Сравните bytes
Проверить UTF-8 encoding, пробелы, переносы, Unicode normalization и одноразовый challenge с сохранённым request.
- 2Сравните script
Пересчитать scriptPubKey из точного address в правильной сети; не подменять wrapped SegWit, native SegWit и Taproot.
- 3Сравните variant
Сохранить prefix smp/ful/pof и убедиться, что verifier декодирует именно BIP-322 v2.0.0, а не pre-final draft.
- 4Проверьте support
Найти официальный version note signer/verifier и повторить test vector. Inconclusive означает недостаток поддержки, а не valid.
- 5Создайте новый request
Если freshness window истёк или message был неверен, отозвать старый challenge и подписать новый после визуальной сверки.
Остановитесь, если устройство показывает обычный spend, адрес или message не совпадают, координатор просит seed, либо proof предлагается как доказательство личности, права собственности или отсутствия других UTXO. Корректный handoff содержит request bytes/hash, network, address/script, variant/version, proof и timestamp проверки. Эти данные позволяют воспроизвести технический результат, не расширяя его смысл.
Источники
Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.
- BIP-322 v2.0.0 — Generic Signed Message Format Bitcoin BIPs · Проверено 21 августа 2026 г. в 22:03 GMT+5
- COLDCARD — BIP-322 Signing Coinkite / COLDCARD · Проверено 21 августа 2026 г. в 22:03 GMT+5
- COLDCARD — Version History Coinkite / COLDCARD · Проверено 21 августа 2026 г. в 22:03 GMT+5
