Глоссарий / Транзакции и комиссии
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, чтобы вывести с них что-либо.