Перейти к содержимому
buybitcoinsmart

Глоссарий / Транзакции и комиссии

PSBT

Другие названия: Partially Signed Bitcoin Transaction, BIP174.

Что такое PSBT?
PSBT представляет собой файл незавершенной транзакции: в нем содержатся входы, выходы и все, что нужно подписанту для их проверки, и он передается между устройствами, а не по сети.

Определено в BIP-174.

Раньше подписание транзакции означало передачу приватных ключей той программе, которая собирает транзакцию. BIP174 разделил эти задачи в 2018 году, а поддержка в Bitcoin Core появилась в версии 0.17.0, так что устройство, хранящее ключи, может быть не тем устройством, которое подключено к интернету. Сейчас этот формат поддерживают все аппаратные кошельки и координаторы мультиподписи.

Как это работает

PSBT представляет собой контейнер из карт «ключ-значение»: одна глобальная карта описывает собираемую транзакцию, затем идет карта для каждого входа и карта для каждого выхода.

Файл начинается с пяти магических байтов 70 73 62 74 ff, которые образуют "psbt" плюс разделитель. Обычно файл передают в кодировке Base64, поэтому PSBT, вставленный в текстовое поле, всегда начинается с символов cHNidP8. Строка, которая начинается иначе, не является PSBT, что бы ни говорил отправитель.

Карта каждого входа содержит сведения, которые офлайн-подписывающее устройство не может найти самостоятельно:

  • выход, который расходуется, чтобы устройство знало точную сумму и скрипт блокировки, которые санкционирует
  • скрипт погашения или скрипт свидетеля, если монета защищена политикой, а не одним ключом
  • путь производной и отпечаток мастер-ключа для каждого ключа, который должен подписать, чтобы устройство с нужной сид-фразой могло найти нужный дочерний ключ
  • частичные подписи, собранные к этому моменту, по одной на подписанта

Карты выходов тоже содержат сведения о производной, и именно это позволяет подписанту убедиться, что выход со сдачей действительно принадлежит кошельку, который он защищает.

BIP174 делит работу на роли, а не на программы. Создатель формирует каркас, обновляющий заполняет сведения о входах, подписанты добавляют частичные подписи, объединитель сливает файлы, подписанные по отдельности, финализатор превращает частичные подписи в действительный скрипт или свидетеля, а экстрактор создает сырую транзакцию, готовую к рассылке. Одна программа часто выполняет несколько ролей сразу, но именно разделение ролей позволяет файлам от разных поставщиков взаимодействовать.

Формат создан так, чтобы допускать незнание. Каждое поле несет байт типа, и подписант, который не понимает поле, должен передать его без изменений, а не отбросить; именно поэтому кошелек, написанный в 2018 году, все еще может передать файл кошельку, написанному для Taproot. BIP371 добавил поля Taproot; BIP370 определяет версию 2, в которой входы и выходы можно добавлять и после создания, а это свойство нужно совместным транзакциям.

Почему это важно при покупке биткоина

Как только вы переводите биткоины с биржи в свой аппаратный кошелек, вы используете формат PSBT, даже если ни один экран об этом не сообщает.

Ключи остаются вне вашего компьютера. Ноутбук собирает расход и создает PSBT, Trezor или Ledger читает файл, показывает его содержимое, подписывает и возвращает его. Ничего секретного не проходит по кабелю. В этом разница между скомпрометированным ноутбуком, последствия которого переживаемы, и скомпрометированной сид-фразой, последствия которой пережить нельзя.

Защита от подмены адреса сдачи. Вредоносная программа, управляющая вашим компьютером, может показывать честный экран оплаты, тихо направляя сдачу на адрес, которым владеет сама, а сдача обычно составляет большую сумму. Поскольку файл задает путь производной для каждого выхода, подписывающее устройство может проверить, что сдача происходит от его собственной сид-фразы, и предупредить вас, если это не так. Читайте экран устройства, а не вкладку браузера.

Это делает мультиподпись пригодной для людей, которые не инженеры. Схема 2-из-3 с двумя аппаратными кошельками и резервной копией в другом здании работает только в том случае, если неподписанная транзакция может путешествовать на SD-карте, через QR-код или по электронной почте, ничего не раскрывая. PSBT не содержит приватных ключей, поэтому его утрата при передаче ничего вам не стоит.

Это тот элемент, который понадобится вашим наследникам. Конверт с сид-фразой не является планом восстановления для чего-либо сложнее кошелька с одним ключом. Дополните сид-фразы дескриптором выходов кошелька и запиской с названием программы, которая читает PSBT, и план переживет вас. Остальные детали такой настройки описаны в нашем руководстве по безопасности.

Подписание вывода по схеме 2-из-3, шаг за шагом

Предположим, вы купили 0,4 BTC на бирже и вывели их в хранилище, которым управляют три ключа, причем потратить средства могут любые два из них.

Через несколько месяцев вы хотите переместить часть средств. Кошелек только для наблюдения на вашем ноутбуке, загруженный дескриптором хранилища и не имеющий ключей, собирает транзакцию: один вход, один выход платежа и один выход сдачи. Вход native segwit 2-из-3 занимает около 105 виртуальных байтов, а два выхода добавляют еще около 62, так что с учетом служебных данных все вместе составляет примерно 177 виртуальных байтов, и при 8 sat/vB комиссия составит около 1400 сатоши.

Ноутбук записывает PSBT. Вы подключаете первый аппаратный кошелек, он читает файл, показывает получателя, сумму и комиссию и записывает одну подпись в карту входа. Затем вы переносите файл на карте microSD ко второму устройству, которое никогда не подключалось к сети, и оно добавляет вторую подпись.

Снова на ноутбуке объединитель сливает два файла, финализатор собирает подписи в свидетеля в том порядке, который ожидает скрипт, а экстрактор создает сырую транзакцию. Только после этого что-либо попадает в сеть. До этого момента ни один ключ не покинул устройство, и никто не видел, что вы делаете.

PSBT vs сериализованная транзакция

Сериализованная транзакция завершена; PSBT представляет собой рабочее пространство. Если разослать PSBT, все узлы его отклонят, потому что это не формат, который передает одноранговый протокол. Различие работает и в обратную сторону: PSBT содержит контекст, который завершенная транзакция отбрасывает, например стоимость каждого расходуемого входа и то, какой ключ произвел каждый адрес; именно эти сведения нужны аппаратному кошельку и не нужны блоку.

PSBT vs дескриптор выходов

Дескриптор выходов описывает кошелек; PSBT описывает один расход. Дескриптор представляет собой одну строку, в которой названы тип скрипта, ключи и пути производной, и он не меняется из года в год. PSBT одноразовые, по одному на транзакцию. Для кошелька с одним ключом одной сид-фразы достаточно, чтобы восстановить все, но для мультиподписи нужны оба: дескриптор, чтобы определить, какие адреса ваши, и PSBT, чтобы вывести с них что-либо.

Не путать с

Часто задаваемые вопросы

Безопасно ли отправлять PSBT по электронной почте или загружать его в интернет?

Он не содержит приватных ключей, поэтому никто не сможет с его помощью потратить ваши биткоины. Но он раскрывает, с какими адресами и суммами вы работаете, поэтому относитесь к нему как к утечке приватности, а не как к риску кражи, и там, где это важно, предпочитайте SD-карту или QR-код.

Нужно ли знать, что такое PSBT, чтобы пользоваться аппаратным кошельком?

Нет. Sparrow, Electrum, Bitcoin Core и приложения производителей создают и финализируют их за вас. Знание формата помогает, когда подпись не объединяется, когда два кошелька расходятся в оценке одного файла или когда вы проектируете схему с мультиподписью.

Почему мой аппаратный кошелек просит подтвердить выход для сдачи?

Потому что PSBT сообщает ему, к какому пути производной относится каждый выход, и он может доказать, что сдача возвращается на ваш собственный адрес, выведенный из вашей сид-фразы. Если устройство не может это проверить, оно помечает выход как неизвестного получателя, и вам следует остановиться и проверить.

В чем разница между версией 1 и версией 2 PSBT?

Версия 1, определенная в BIP174, фиксирует набор входов и выходов в момент создания. Версия 2, определенная в BIP370, позволяет участникам добавлять входы и выходы позже, что необходимо для совместных транзакций, таких как coinjoin и payjoin.

Читайте далее

Связанные термины

Еще в разделе «Транзакции и комиссии»

Читать эту страницу на английском