Глоссарий / Кошельки и хранение
PSBT версии 2
Другие названия: PSBTv2.
- Что такое PSBT версии 2?
- PSBT версии 2 представляет собой формат частично подписанной транзакции, в котором отсутствует фиксированная неподписанная транзакция, поэтому участник может добавить входы и выходы уже после создания файла.
Определено в BIP-370.
Версия 0 фиксирует набор входов и выходов при создании; версия 2, наоборот, переносит каждую деталь в отдельные карты для входов и выходов. BIP-370 был присвоен 14 января 2021 года и пропускает номер 1, поскольку формат BIP-174 является версией 0 и в обиходе назывался версией 1. Для владельца версия 2 важна только в сеансе подписи, когда другой участник добавляет средства к транзакции, которую вы уже начали.
Как это работает
PSBT версии 2 сохраняет внешний контейнер BIP-174 и перестраивает его содержимое. Переход определяют два правила: PSBT_GLOBAL_UNSIGNED_TX должен отсутствовать, а PSBT_GLOBAL_VERSION должен присутствовать и иметь значение 2.
То, что раньше несла удаленная транзакция, распределяется по двенадцати новым полям. Пять из них глобальные: версия транзакции (0x02), резервный locktime (0x03), число входов (0x04), число выходов (0x05) и байт изменяемых флагов (0x06). Пять относятся к каждому входу: предыдущий txid длиной 32 байта (0x0e), индекс расходуемого выхода (0x0f), номер последовательности (0x10) и два обязательных locktime, один на основе отметки времени не ниже 500000000 (0x11), другой на основе высоты ниже этого значения и выше нуля (0x12). У выходов появляются два поля: сумма в сатоши как 64-битное знаковое целое с обратным порядком байтов (от младшего к старшему, little-endian) (0x03) и скрипт (0x04).
Основную работу выполняет байт изменяемых флагов. Бит 0 означает, что входы еще можно добавлять или удалять, бит 1 говорит то же о выходах, а бит 2 фиксирует, что какая-то подпись уже применена с SIGHASH_SINGLE, поэтому ее пару вход-выход нужно сохранить. Подписывающая сторона должна ужесточать эти биты по ходу дела: подпись, не использующая SIGHASH_ANYONECANPAY, снимает бит 0, а подпись, не использующая SIGHASH_NONE, снимает бит 1. Право продолжать редактирование истекает само по мере появления подписей, а не держится на вежливости следующего владельца.
BIP-370 решает два вопроса, которые оставила открытыми отсутствующая транзакция. Locktime становится наибольшим значением, с которым согласны входы, с откатом к глобальному полю или к 0, когда оно отсутствует, и требование на основе высоты выигрывает при любом равенстве. Идентификатором становится txid, полученный сборкой полей с принудительно установленным для каждого номера последовательности значением 0, поскольку последовательность еще можно изменить позже.
Где это встречается
PSBT версии 2 вводит роль, для которой в BIP-174 нет аналога, Конструктора. Создатель открывает файл с 0 входами и 0 выходами и передает его дальше; Конструктор добавляет их, проверив изменяемые флаги. Создатель, ожидающий дополнений, должен также установить версию транзакции не ниже 2, чтобы функции, привязанные к ней, например OP_CHECKSEQUENCEVERIFY, оставались доступны.
Версия 2 использует сериализацию BIP-174, поэтому внешне файл выглядит так же, и разделение сделано намеренно: из 24 недействительных тестовых векторов в BIP 13 являются обычными файлами версии 0, отклоненными из-за одного неверно расположенного поля или номера версии. Преобразование идет только в одну сторону, поскольку файл версии 2 можно пересобрать в файл версии 0 из его собственных полей. Эталонная реализация содержится в пул-реквесте 21283 проекта Bitcoin Core, а в заголовке BIP статус указан как Deployed.
Из 41 обзора кошельков на этом сайте два упоминают PSBT, Sparrow (оценка 4,7) и BlueWallet (4,2), и ни в одном не названа версия. Исходите из версии 0, если программное обеспечение не говорит иного, и проверьте незнакомый инструмент небольшой суммой, прежде чем он будет работать с остальным.
PSBT версии 2 vs номер версии транзакции
PSBT версии 2 нумерует формат файла, а номер версии транзакции нумерует транзакцию, которая собирается внутри него. Оба находятся в одной и той же глобальной карте, и BIP-370 прямо говорит, что это не одно и то же поле. PSBT_GLOBAL_VERSION равен 2 в каждом файле версии 2; PSBT_GLOBAL_TX_VERSION является знаковым 32-битным целым для создаваемой транзакции, и BIP-370 требует, чтобы оно было не меньше 2, когда Создатель ожидает дополнений, поэтому эти два значения и путают. Измените первое, и старые парсеры отклонят файл. Измените второе, и вы измените то, по каким правилам консенсуса оценивается расходование.