Блокчейн/Уровень IV · Глубины протокола/4.2 Обновления/Урок 3
Частично подписанные транзакции (PSBT)
Контейнер, позволяющий постороннему проверить, что именно подписывает устройство
МатериалыАппаратный кошелёк с поддержкой PSBTBitcoin Core с доступной командой 'decodepsbt'Компьютер или устройство с изолированной сетевой средой
Любопытство
- Почему незавершённая транзакция требует больше данных, чем завершённая?
- Почему раньше каждому аппаратному кошельку требовался собственный формат неподписанных транзакций?
- Как пользователь может добавить новый выход, когда исходный шаблон уже собран?
Исследование
- Стандартная сырая транзакция — это компактный финальный артефакт, готовый к отправке в сеть. Частично подписанная биткоин-транзакция (Partially Signed Bitcoin Transaction, PSBT), описанная в BIP174 Эндрю Чоу в 2017 году, устроена иначе: это контейнер, содержащий незавершённую транзакцию вместе со всеми метаданными, необходимыми для её последующего завершения. Она существует в трёх состояниях: полностью собранная, но не подписанная; частично подписанная, когда одни входы уже подписаны, а другие ещё нет; полностью подписанная и готовая к извлечению в сырой hex. Этот формат позволяет недоверенной программе сформировать шаблон, который проверит доверенное устройство, не нуждающееся в доступе к сети.
- Процесс работы с PSBT определяет шесть ролей: Creator (создатель), Updater (обновляющий), Signer (подписант), Combiner (объединяющий), Finalizer (финализатор) и Extractor (извлекающий); версия 2 добавляет седьмую — Constructor (конструктор). После того как создатель собирает транзакцию, обновляющий прикладывает тратимые предыдущие выходы, их скрипты и пути деривации ключей, чтобы подписант мог точно проверить, что он одобряет, включая суммы и комиссию. Из-за явного включения метаданных файл получается заметно менее компактным, чем при стандартной сериализации, но это принципиально важно: аппаратные кошельки могут проверять структуру транзакции без обращения к ноде с выходом в интернет, которая может быть скомпрометирована или работать с вредоносным ПО.
- Главная движущая сила PSBT — совместимость. До появления этого стандарта разные кошельки использовали несовместимые способы передачи данных между горячим кошельком и устройством холодного хранения, привязывая пользователя к конкретному производителю. BIP174 решил эту проблему, введя универсальный язык; сегодня координатор, например Sparrow, может передать один и тот же PSBT устройствам подписи разных производителей — через USB, SD-карту или QR-код. Это делает мультисиг на устройствах разных производителей практичным: каждый подписант добавляет в файл свою подпись, и ни один приватный ключ никогда не покидает своё устройство.
- У PSBT версии 0 есть жёсткое структурное ограничение: после создания глобальная неподписанная транзакция зафиксирована. Версия 0 хранит полную неподписанную транзакцию в глобальном поле, поэтому после её создания нельзя добавить ни входы, ни выходы. Из-за этой негибкости, если кто-то начинал собирать сложную многостороннюю транзакцию и понимал, что нужен дополнительный выход для сдачи, приходилось отбрасывать весь процесс и начинать с нуля с новым шаблоном.
- BIP370 вводит PSBT версии 2, чтобы решить проблему неизменяемости. В версии 2 вся информация о конкретном входе или выходе собрана в его собственном поле, а не разделена между локальными и глобальными данными. Благодаря этому участники могут добавлять входы или выходы после создания, если это разрешают флаги «modifiable» в PSBT. Это упрощает совместную работу: глядя на отдельный вход, вы видите все относящиеся к нему данные прямо в нём, что упрощает проверку для аппаратных устройств и снижает риск рассинхронизации состояния.
- Практическое применение — от подписи на аппаратном кошельке до совместных транзакций, таких как payjoin и coinjoin, где участники передают PSBT друг другу, пока все не подпишут. Для обычного пользователя это значит, что можно создать транзакцию на телефоне, подключить аппаратный кошелёк, чтобы безопасно подписать её офлайн, а затем извлечь итоговую сырую транзакцию для отправки в сеть, — причём каждое устройство видит именно то, что подписывает.
Ключевые факты
- BIP174 определяет PSBT версии 0, где требуется глобальное поле с неподписанной транзакцией, которое нельзя изменить после создания.
- BIP370 определяет версию 2 (PSBTv2), позволяющую добавлять входы и выходы после создания за счёт сведения данных в поля соответствующих входов и выходов.
- PSBT намеренно менее компактен, чем стандартная сериализация, поскольку хранит значительный объём метаданных для проверки устройствами подписи.
- Исходный процесс включает шесть ролей: Creator (создатель), Updater (обновляющий), Signer (подписант), Combiner (объединяющий), Finalizer (финализатор) и Extractor (извлекающий).
- PSBT обеспечивает совместимость между разными программными кошельками и аппаратными устройствами подписи.
- Координаторы, такие как Sparrow, и устройства для подписи, такие как Coldcard, обмениваются PSBT через файлы или QR-коды.
Упражнение девять, шесть, три, один
9СобратьПеречислите 9 различных ролей или состояний в жизненном цикле биткоин-транзакции — от создания до финальной отправки в сеть.
6СгруппироватьСгруппируйте 9 пунктов в 6 категорий в зависимости от того, связаны ли они с добавлением данных, проверкой структуры, наложением криптографических подписей, объединением вкладов участников, финализацией формата или отправкой результата в сеть.
3Выделить главноеСведите 6 групп к 3 основным функциям, которые должна выполнять любая система управления транзакциями для обеспечения безопасности и совместимости.
1КристаллизоватьНапишите одно предложение о том, почему незавершённой транзакции нужно больше данных, чем завершённой.
Проверка фактов
Даты, цифры и утверждения были проверены по приведенным ниже опубликованным источникам.