bitcoind.app
CommandsGuidesContact ↗
Home/Guides/Understanding PSBT: Partially Signed Bitcoin Transactions
Transactions

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.

In this guide
What is a PSBT?Why PSBTs MatterThe PSBT WorkflowCreating Your First PSBTPSBT in Practice: Hardware Wallet Flow

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.

Related RPC Commands

createpsbtCreates a transaction in the Partially Signed Transaction format.decodepsbtReturn a JSON object representing the serialized, base64-encoded PSBT.analyzepsbtAnalyzes and provides information about the current status of a PSBT and its inputs.combinepsbtCombine multiple partially signed Bitcoin transactions into one transaction.finalizepsbtFinalize the inputs of a PSBT. Signs and finalizes where possible.walletcreatefundedpsbtCreates and funds a transaction in PSBT format. Inputs will be added if supplied inputs are not enough.walletprocesspsbtUpdate a PSBT with input information from the wallet and then sign inputs that the wallet can sign for.converttopsbtConverts a network serialized transaction to a PSBT.utxoupdatepsbtUpdates all segwit inputs and outputs in a PSBT with data from output descriptors, the UTXO set or the mempool.
← Previous Guide
Bitcoin RPC Authentication Guide
Next Guide →
Bitcoin Fee Estimation: How to Set the Right Transaction Fee

bitcoind.app — Bitcoin Core RPC Reference

Contact ↗