Skip to main content
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:
1

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}'
2

Updater

Adds information about the UTXOs being spent and scripts/public keys involved:
bitcoin-cli utxoupdatepsbt "psbt_base64"
3

Signer

Inspects the transaction and produces partial signatures for inputs they control:
bitcoin-cli walletprocesspsbt "psbt_base64"
4

Combiner (if needed)

Merges metadata from different PSBTs for the same transaction:
bitcoin-cli combinepsbt '["psbt1_base64", "psbt2_base64"]'
5

Finalizer

Converts partial signatures into final scriptSig and scriptWitness:
bitcoin-cli finalizepsbt "psbt_base64"
6

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:
1

Create and fund PSBT

PSBT=$(bitcoin-cli walletcreatefundedpsbt \
  '[]' \
  '{"tb1qxxx...": 0.01}' \
  | jq -r '.psbt')
2

Analyze the PSBT

bitcoin-cli analyzepsbt "$PSBT"
3

Sign with wallet

SIGNED=$(bitcoin-cli walletprocesspsbt "$PSBT" \
  | jq -r '.psbt')
4

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:
  1. Online wallet creates unsigned PSBT
  2. Transfer PSBT to offline wallet (via USB, QR code, etc.)
  3. Offline wallet signs the PSBT
  4. Transfer signed PSBT back to online wallet
  5. 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