Към съдържанието
ДаретеEN

Трансакции

PSBT

PSBT, или частично подписана трансакция в биткойн, носи неподписана трансакция и данните за подписване между портфейлите. Вижте формата по BIP 174 и версия 2.

От Dimitar Zurnov · Обновено на 4 ноември 2026
Адаптирано от Learn Me a Bitcoin на Greg Walker.

PSBT, или частично подписана трансакция (partially signed Bitcoin transaction), пакетира неподписана трансакция с допълнителната информация, която всеки подписващ ѝ трябва, за да я подпише. Портфейлите и устройствата си пращат PSBT-тата напред-назад, докато всеки вход получи подписите си. Форматът е дефиниран в BIP 174, а втората версия е в BIP 370. PSBT никога не съдържа частен ключ.

Защо подписващият се нуждае от повече от трансакцията?

Неподписаната трансакция съдържа входовете и изходите, но не и всичко, от което зависи подписът. За да подпише SegWit вход, подписващият се нуждае от сумата и заключващия скрипт на изхода, който се харчи. Тези данни са в по-ранната трансакция, която е създала изхода, а не в трансакцията, която го харчи.

Портфейл, свързан с интернет, може да ги вземе от мрежата. Офлайн подписващ, като хардуерно устройство или студен портфейл, не може. При SegWit входовете сумата е част от това, което подписът покрива, така че подписващ, който не я вижда, не може да подпише правилно.

PSBT решава това, като носи липсващите данни заедно с трансакцията. Така офлайн устройството може да подписва, а два портфейла от различен софтуер могат да работят по една и съща трансакция.

Какво има в PSBT?

PSBT е поредица от двойки ключ-стойност, групирани в карти (maps). Може да се съхранява като двоичен файл или да се кодира като base64 текст, а и двете форми съдържат едни и същи данни.

PSBT е заглавна част, следвана от глобална карта, по една карта за вход и по една за изход. Всяка карта завършва с нулев байт. заглавие: psbt, след ff 70736274ff глобална карта: една, с трансакцията завършва с байт 00 карти на входовете: по една за вход всяка завършва с байт 00 карти на изходите: по една за изход всяка завършва с байт 00 всеки запис: дължина на ключа, тип ключ, данни за ключа, дължина, стойност
Картите са в фиксиран ред, а всяка завършва с нулев байт.

Структурата има четири части, в този ред:

  1. Заглавна част. Петте байта 70736274ff: ASCII буквите psbt, след тях разделителният байт ff.
  2. Глобална карта. Точно една. Тя съдържа информация за цялата трансакция.
  3. Карти на входовете. По една за всеки вход в трансакцията, в същия ред.
  4. Карти на изходите. По една за всеки изход, в същия ред.

Картата е списък от записи и завършва с един байт 00. Карта без нищо за казване е само този байт 00.

Всеки запис има четири полета:

Поле Размер Значение
Дължина на ключа compact size размерът на типа ключ и данните за ключа, които следват
Тип на ключа обикновено 1 байт какъв вид данни съдържа записът
Данни за ключа незадължителни допълнителна информация, като публичен ключ, която прави ключа уникален
Дължина на стойността compact size размерът на стойността
Стойност променлива самите данни

Дължините на ключа и на стойността използват compact size числа, така че кратките полета заемат един байт. Типът на ключа е число, а същото число може да означава различни неща в различни карти. Тип 0x00 в глобалната карта е неподписаната трансакция, докато тип 0x00 в карта на вход е предходната трансакция.

Какво съдържа реален PSBT?

Тестовите примери на BIP 174 включват валиден PSBT с един P2PKH вход. И двете му карти на изходи са празни. Първите му байтове показват структурата на практика. Диаграмата по-долу ги разглежда:

Първите байтове на валиден тестов PSBT от BIP 174: заглавната част, глобалната карта с 117-байтова трансакция и празните карти след нея. магически байтове и разделител 70736274ff глобална карта: неподписаната трансакция 01 00 75: ключ 00, дължина 117 117 байта: версия 2, 1 вход, 2 изхода край на глобалната карта 00 карта на входа: предходната трансакция 01 00 fd a5 01: ключ 00, дължина 421 421 байта, а txid съвпада с входа край на картата на входа 00 две карти на изходи, празни 00 00
Първият валиден тестов пример в BIP 174, разгледан ръчно и проверен с код.
  • Глобална карта. Ключ 00 съдържа неподписаната трансакция, която е 117 байта. Тя е версия 2, с един вход и два изхода, със 99,999,699 и 100,000,000 сатоши. Входовете имат празни скриптове за отключване, защото още нищо не е подписано.
  • Карта на входа. Ключ 00 съдържа цялата предходна трансакция, която е 421 байта. Нейният ID съвпада с outpoint-а, който входът харчи, така че подписващият може да провери сумата, за която подписва.
  • Карти на изходите. Две карти, и двете празни, така че всяка съдържа само терминатора 00.

Тестовият пример е добър за самостоятелно декодиране. Base64 формата му започва с cHNidP8, защото това е base64 кодирането на байтовете на заглавната част. Всеки PSBT в base64 започва така.

Как се движат PSBT-тата между страните?

PSBT минава през няколко роли. Всяка роля добавя един вид информация, а едно устройство или портфейл често изпълнява повече от една роля.

Ролите на PSBT се редуват: Creator, Updater, Signer, Input Finalizer и Extractor. Combiner може да слее копия, подписани паралелно. Creator: строи неподписаната трансакция Updater: добавя данните за подписващите Signer: добавя подписи, често офлайн Input Finalizer: данните за отключване Extractor: дава подписаната трансакция Combiner: слива копия, подписани паралелно
Ролите могат да се разделят между устройства или да се съберат в един портфейл.
  • Creator. Построява неподписаната трансакция и започва PSBT-то.
  • Constructor. Добавя входове и изходи преди подписване. Тази роля съществува само във версия 2.
  • Updater. Добавя данните, които подписващият трябва, като предходната трансакция, скриптовете и пътищата на ключовете.
  • Signer. Проверява трансакцията и добавя частичните си подписи. Това е стъпката, която хардуерното устройство изпълнява, обикновено офлайн.
  • Input Finalizer. Превръща частичните подписи в окончателните данни за отключване на всеки вход.
  • Extractor. Построява завършената трансакция от финализираните входове, готова за излъчване.
  • Combiner. Слива копията на един и същ PSBT, които различни страни са подписали паралелно.

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

Работа с Bitcoin Core

Bitcoin Core има RPC команди за всяка роля. Ръководството за PSBT в хранилището му ги изброява:

  • walletcreatefundedpsbt създава PSBT, добавя входове и ресто и попълва данните, които знае.
  • walletprocesspsbt попълва още данни и подписва входовете, които ключовете му могат да подпишат.
  • combinepsbt слива копията, които различни подписващи са обработили.
  • finalizepsbt финализира входовете и, ако всички са готови, връща подписаната трансакция.
  • decodepsbt извежда PSBT в четим вид, полезно за проверка преди подписване.

Bitcoin Core 32.0 и по-новите версии четат и създават PSBT версия 2. Командите createpsbt, walletcreatefundedpsbt, converttopsbt и psbtbumpfee създават версия 2 по подразбиране, а аргументът psbt_version избира друга версия. Версиите преди 32.0 отхвърлят PSBT версия 2.

Кои типове ключове съществуват?

Всеки запис има тип ключ. BIP 174 дефинира типовете за версия 0, както са показани по-долу.

Карта Тип Име Съдържа
Глобална 0x00 Неподписана трансакция трансакцията с празни скриптове
Глобална 0x01 Разширен публичен ключ xpub и неговия път на деривация
Глобална 0xFB Версия номерът на версията на PSBT
Вход 0x00 Non-witness UTXO цялата предходна трансакция
Вход 0x01 Witness UTXO сумата и скрипта на похарчения изход
Вход 0x02 Частичен подпис подпис и публичният ключ, към който принадлежи
Вход 0x03 Тип sighash видът sighash, който подписващият трябва да ползва
Вход 0x04 Redeem script скриптът зад P2SH заключване
Вход 0x05 Witness script скриптът зад P2WSH заключване
Вход 0x06 BIP 32 деривация пътят на ключа, за да знае устройството кой ключ да ползва
Вход 0x07 Финален scriptSig готовият скрипт за отключване
Вход 0x08 Финален scriptWitness готовият witness
Изход 0x00 Redeem script скриптът зад P2SH изход
Изход 0x01 Witness script скриптът зад P2WSH изход
Изход 0x02 BIP 32 деривация пътят на ключа на изхода, често на ресто изход

Простият портфейл се нуждае от малка част от тях. За P2PKH вход са достатъчни неподписаната трансакция, предходната трансакция, частичните подписи и финалният scriptSig. Пътищата на деривация са незадължителни, но помагат на устройството да разпознае собствените си изходи.

Версия 0 има още типове за входове, 0x0a до 0x0d, които носят прообразите (preimage) за скриптове, които проверяват хеш. Типът 0xFC във всяка карта съдържа собствени данни, които портфейлът дефинира за себе си.

Какво се е променило във версия 2?

Версия 0 съхранява цялата неподписана трансакция в глобалната карта. Това прави трудно добавянето или премахването на входове и изходи след създаването на PSBT-то, защото цялата трансакция трябва да се построи наново.

BIP 370 дефинира версия 2. Тя разделя трансакцията на отделни полета, така че всяка част може да се променя сама. Версия 2 се маркира с глобалния ключ 0xFB със стойност 2 и добавя тези ключове:

Обхват Тип Име Съдържа
Глобален 0x02 Версия на трансакцията номерът на версията на трансакцията
Глобален 0x03 Резервен locktime locktime, който се ползва, когато никой вход не задава свой
Глобален 0x04 Брой входове колко входа има трансакцията
Глобален 0x05 Брой изходи колко изхода има трансакцията
Глобален 0x06 Трансакцията може да се променя дали още могат да се добавят входове или изходи
Вход 0x0e Предходен TXID трансакцията, която съдържа похарчения изход
Вход 0x0f Индекс на изхода кой изход от тази трансакция се харчи
Вход 0x10 Sequence номерът на sequence за входа
Вход 0x11 Необходимо времево locktime време, което трансакцията трябва да изчака
Вход 0x12 Необходима височина на locktime височина, която трансакцията трябва да изчака
Изход 0x03 Сума стойността на изхода
Изход 0x04 Скрипт заключващият скрипт на изхода

Версия 2 добавя ролята Constructor, която позволява на една страна да добавя входове и изходи, преди някой да е подписал. Locktime на трансакцията се изчислява от необходимите locktime на входовете или от резервния locktime, когато никой вход не задава свой. Двете версии не са съвместими, затова програмата трябва първо да прочете версията.

Версия 1 се пропуска. Хората вече са наричали оригиналния формат версия 1, така че BIP 370 номерира новия с 2, за да няма объркване.

Как да пазите PSBT?

PSBT не съдържа частни ключове, но разкрива много. Може да включва разширени публични ключове и пътища на деривация, които позволяват на всеки, който ги има, да види всеки адрес, изведен от тях. Споделяйте PSBT само с онези, които имат нужда от него.

Преди да подпишете, проверете три неща на самото подписващо устройство: адреса на получателя на всеки изход, сумата и таксата. Устройството е последната точка, на която грешката може да бъде хваната, защото подписът е окончателен, щом е направен. Страницата за таксата обяснява как се изчислява таксата от входовете и изходите.

Как са започнали PSBT-тата?

Pieter Wuille е предложил стандартен формат за неподписани трансакции, а Ava Chow е проектирала формата и е написала BIP 174. BIP 174 е получил номера си през 2017 г., а Bitcoin Core е добавил RPC командите за PSBT във версия 0.17. BIP 370 е получил номера си през 2021 г. и е добавил версия 2.

За по-широк поглед върху употребата на PSBT, темата за PSBT на Bitcoin Optech събира често срещаните работни потоци и инструментите, които ги поддържат. Страниците за входа и за изхода обясняват полетата, които PSBT носи за всеки от тях. Следващият раздел, скриптовете, разглежда заключванията, които носят изходите.

Източници

В този раздел: Трансакции

Целият курс „Биткойн от нулата“

Нещо не изглежда наред? Кажете ни