Understanding PSBT: Partially Signed Bitcoin Transactions
A comprehensive guide to PSBT (BIP 174) — what they are, why they exist, and how to create, sign, combine, and finalize PSBTs using Bitcoin Core RPC commands.
What is a PSBT?
A Partially Signed Bitcoin Transaction (PSBT) is a standardized format defined in BIP 174 for passing around unsigned or partially signed transactions. Before PSBT, there was no standard way to create a transaction on one device and sign it on another — every wallet had its own proprietary format.
PSBTs solve this by providing a container that holds the unsigned transaction along with all the metadata signers need: UTXO details, derivation paths, redeem scripts, and partial signatures. Multiple signers can each add their signature independently, and the results get combined into a final, broadcastable transaction.
Why PSBTs Matter
PSBTs enable several critical workflows that were previously difficult or impossible:
Hardware wallet integration — create the transaction on your computer, sign it on a hardware device that never touches the network.
Multisig coordination — each signer can independently add their signature without needing simultaneous access to the same wallet.
Air-gapped signing — build the transaction on an online machine, transfer to an offline machine for signing via QR code or USB drive.
CoinJoin and collaborative transactions — multiple parties can contribute inputs and signatures to a single transaction without trusting each other with private keys.
The PSBT Workflow
A typical PSBT workflow has five stages:
1. Creation — use createpsbt or walletcreatefundedpsbt to build the initial unsigned PSBT. The funded version automatically selects inputs and adds change outputs.
2. Updating — use utxoupdatepsbt to add UTXO data and other information signers will need. If you used walletcreatefundedpsbt, this step is usually done automatically.
3. Signing — use walletprocesspsbt to sign with wallet keys, or export the PSBT to an external signer (hardware wallet). Each signer adds their partial signature.
4. Combining — if multiple signers produced separate PSBTs, use combinepsbt to merge all partial signatures into one PSBT.
5. Finalizing — use finalizepsbt to assemble the complete signed transaction from the PSBT. This produces the final hex-encoded transaction ready for broadcast with sendrawtransaction.
Creating Your First PSBT
The simplest way to create a PSBT is with walletcreatefundedpsbt, which handles input selection and change automatically:
bitcoin-cli walletcreatefundedpsbt '[]' '[{"bc1qaddress...": 0.1}]'
The first argument is an empty array (let the wallet choose inputs), and the second specifies the recipient and amount. The command returns a base64-encoded PSBT string along with the fee and change position.
You can inspect what's inside any PSBT using decodepsbt, which breaks it down into its component parts: inputs, outputs, partial signatures, and metadata.
To check the status and next steps for a PSBT, use analyzepsbt — it tells you whether each input has been signed and what action is needed next (updater, signer, or finalizer).
PSBT in Practice: Hardware Wallet Flow
Here's how a typical hardware wallet transaction works with PSBTs:
On your online machine, create the funded PSBT using walletcreatefundedpsbt. Export the base64 string — you can copy it as text, write it to a file, or encode it as a QR code.
Transfer the PSBT to your hardware wallet (via USB, SD card, or QR code depending on the device). The hardware wallet displays the transaction details for verification and signs it.
Import the signed PSBT back to your online machine. Run finalizepsbt to extract the completed transaction, then broadcast it with sendrawtransaction.
This workflow ensures your private keys never touch a network-connected device.