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 текст, а и двете форми съдържат едни и същи данни.
Структурата има четири части, в този ред:
- Заглавна част. Петте байта
70736274ff: ASCII буквитеpsbt, след тях разделителният байтff. - Глобална карта. Точно една. Тя съдържа информация за цялата трансакция.
- Карти на входовете. По една за всеки вход в трансакцията, в същия ред.
- Карти на изходите. По една за всеки изход, в същия ред.
Картата е списък от записи и завършва с един байт 00. Карта без нищо за казване е само този байт 00.
Всеки запис има четири полета:
| Поле | Размер | Значение |
|---|---|---|
| Дължина на ключа | compact size | размерът на типа ключ и данните за ключа, които следват |
| Тип на ключа | обикновено 1 байт | какъв вид данни съдържа записът |
| Данни за ключа | незадължителни | допълнителна информация, като публичен ключ, която прави ключа уникален |
| Дължина на стойността | compact size | размерът на стойността |
| Стойност | променлива | самите данни |
Дължините на ключа и на стойността използват compact size числа, така че кратките полета заемат един байт. Типът на ключа е число, а същото число може да означава различни неща в различни карти. Тип 0x00 в глобалната карта е неподписаната трансакция, докато тип 0x00 в карта на вход е предходната трансакция.
Какво съдържа реален PSBT?
Тестовите примери на BIP 174 включват валиден PSBT с един P2PKH вход. И двете му карти на изходи са празни. Първите му байтове показват структурата на практика. Диаграмата по-долу ги разглежда:
- Глобална карта. Ключ
00съдържа неподписаната трансакция, която е 117 байта. Тя е версия 2, с един вход и два изхода, със 99,999,699 и 100,000,000 сатоши. Входовете имат празни скриптове за отключване, защото още нищо не е подписано. - Карта на входа. Ключ
00съдържа цялата предходна трансакция, която е 421 байта. Нейният ID съвпада с outpoint-а, който входът харчи, така че подписващият може да провери сумата, за която подписва. - Карти на изходите. Две карти, и двете празни, така че всяка съдържа само терминатора
00.
Тестовият пример е добър за самостоятелно декодиране. Base64 формата му започва с cHNidP8, защото това е base64 кодирането на байтовете на заглавната част. Всеки PSBT в base64 започва така.
Как се движат PSBT-тата между страните?
PSBT минава през няколко роли. Всяка роля добавя един вид информация, а едно устройство или портфейл често изпълнява повече от една роля.
- 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 носи за всеки от тях. Следващият раздел, скриптовете, разглежда заключванията, които носят изходите.
Източници
- BIP 174: Partially Signed Bitcoin Transaction Format дефинира формата, ролите и типовете ключове за версия 0.
- BIP 370: PSBT версия 2 дефинира версия 2 и нейните типове ключове.
- Ръководството за PSBT в Bitcoin Core изброява RPC командите за всяка роля.
- Бележките към версия 32.0 на Bitcoin Core правят версия 2 по подразбиране при създаване на PSBT.
- Кодът на Bitcoin Core 32.0 за PSBT задава най-високата версия на PSBT, която се чете: 2.
В този раздел: Трансакции
Целият курс „Биткойн от нулата“
Нещо не изглежда наред? Кажете ни