Partially Signed Bitcoin Transactions (PSBT) is an interchange format for Bitcoin transactions that are not fully signed yet, together with relevant metadata to help entities work towards signing it.
PSBT was introduced in BIP 174 and has been supported in Bitcoin Core since version 0.17.
What is PSBT?
PSBT simplifies workflows where multiple parties need to cooperate to produce a transaction. Common use cases include:
Hardware wallets
Multi-signature setups
Offline signing
CoinJoin transactions
PSBT Workflow
The PSBT process involves several distinct roles:
Creator
Proposes a transaction by constructing a PSBT with specific inputs and outputs, but no additional metadata. bitcoin-cli createpsbt \
'[{"txid":"txid_here","vout":0}]' \
'{"receiving_address":0.01}'
Updater
Adds information about the UTXOs being spent and scripts/public keys involved: bitcoin-cli utxoupdatepsbt "psbt_base64"
Signer
Inspects the transaction and produces partial signatures for inputs they control: bitcoin-cli walletprocesspsbt "psbt_base64"
Combiner (if needed)
Merges metadata from different PSBTs for the same transaction: bitcoin-cli combinepsbt '["psbt1_base64", "psbt2_base64"]'
Finalizer
Converts partial signatures into final scriptSig and scriptWitness: bitcoin-cli finalizepsbt "psbt_base64"
Extractor
Produces a valid network-format Bitcoin transaction: The finalizepsbt command outputs the final transaction hex if all inputs are signed.
Bitcoin Core PSBT RPCs
Creating PSBTs
createpsbt - Create a PSBT from inputs and outputs:
bitcoin-cli createpsbt \
'[{"txid":"abc...","vout":0}]' \
'{"tb1q...": 0.01}'
walletcreatefundedpsbt - Create and fund a PSBT automatically:
bitcoin-cli walletcreatefundedpsbt \
'[]' \
'{"destination_address": 0.01}'
This command acts as Creator and Updater, adding inputs, change, and metadata.
converttopsbt - Convert unsigned raw transaction to PSBT:
bitcoin-cli converttopsbt "raw_transaction_hex"
Processing PSBTs
walletprocesspsbt - Add UTXO/key/script data and sign:
bitcoin-cli -rpcwallet= "mywallet" walletprocesspsbt \
"psbt_base64" \
true # sign if possible
descriptorprocesspsbt - Sign using specific descriptors:
bitcoin-cli descriptorprocesspsbt \
"psbt_base64" \
'["wpkh(...)#checksum"]'
utxoupdatepsbt - Add UTXO information from the UTXO set:
bitcoin-cli utxoupdatepsbt "psbt_base64"
utxoupdatepsbt only works for SegWit inputs where UTXO data is available.
Analyzing PSBTs
decodepsbt - Display PSBT in human-readable JSON format:
bitcoin-cli decodepsbt "psbt_base64"
analyzepsbt - Examine current status and next steps:
bitcoin-cli analyzepsbt "psbt_base64"
Returns information about:
Missing signatures
Next required role
Estimated fee and weight
Input status
Combining PSBTs
combinepsbt - Merge multiple versions of the same PSBT:
bitcoin-cli combinepsbt '["psbt1", "psbt2"]'
Use this when multiple signers independently sign the same PSBT.
joinpsbts - Concatenate inputs and outputs from multiple PSBTs:
bitcoin-cli joinpsbts '["psbt1", "psbt2"]'
joinpsbts is for CoinJoin-style transactions where PSBTs have different inputs/outputs. For multi-signature workflows, use combinepsbt instead.
Finalizing PSBTs
finalizepsbt - Finalize and extract the transaction:
bitcoin-cli finalizepsbt "psbt_base64"
Returns:
hex - Final transaction hex (if complete)
complete - Boolean indicating if all inputs are signed
Complete PSBT Example
Here’s a full workflow creating and signing a PSBT:
Create and fund PSBT
PSBT = $( bitcoin-cli walletcreatefundedpsbt \
'[]' \
'{"tb1qxxx...": 0.01}' \
| jq -r '.psbt' )
Analyze the PSBT
bitcoin-cli analyzepsbt " $PSBT "
Sign with wallet
SIGNED = $( bitcoin-cli walletprocesspsbt " $PSBT " \
| jq -r '.psbt' )
Finalize and broadcast
HEX = $( bitcoin-cli finalizepsbt " $SIGNED " | jq -r '.hex' )
bitcoin-cli sendrawtransaction " $HEX "
PSBT for Offline Signing
PSBTs are essential for offline signing workflows:
Online wallet creates unsigned PSBT
Transfer PSBT to offline wallet (via USB, QR code, etc.)
Offline wallet signs the PSBT
Transfer signed PSBT back to online wallet
Online wallet broadcasts the transaction
See the Offline Signing guide for detailed instructions.
Security Considerations
Always verify PSBT contents before signing:
Check all output addresses
Verify amounts and fees
Ensure inputs belong to your wallet
Use decodepsbt and analyzepsbt to inspect details
Advanced Features
Custom Signing
Sign only specific inputs:
bitcoin-cli walletprocesspsbt " $PSBT " true "ALL" 0
The last parameter specifies which input to sign.
Sighash Types
Specify different signature hash types:
bitcoin-cli walletprocesspsbt " $PSBT " true "ALL|ANYONECANPAY"
Available sighash types:
ALL (default)
NONE
SINGLE
ALL|ANYONECANPAY
Next Steps
Multi-signature Use PSBTs for multi-signature transactions
Offline Signing Sign transactions on an air-gapped machine