Today marks the official release of Bitcoin Core 0.17.0, the 17th generation of Bitcoin’s original software client launched by Satoshi Nakamoto almost 10 years ago and still the dominant Bitcoin implementation on the network today. Overseen by Bitcoin Core lead maintainer Wladimir van der Laan, this latest major release was developed by some 135 contributors over a span of about seven months.
The result of well over 700 merged pull requests, Bitcoin Core 0.17.0 includes a range of performance improvements and bug fixes, as well as other changes.
Here’s an overview of some of these changes.
Improved Coin Selection
Coins in a wallet are effectively stored as separate chunks (“transaction outputs”). There is typically one chunk for each received payment; therefore, most chunks represent different amounts. When a payment is made from a wallet, different chunks are added together to make up an amount that’s large enough to make the payment, plus the fee. The different chunks often don’t add up to the exact amount needed, however, in which case a “change address” is added to the transaction, sending any leftover funds back to the same wallet.
Up until now, the Bitcoin Core wallet added different chunks together. Only then would it calculate and add the fee required to pay for the transaction. But in some cases, adding the fee to the transaction meant that the added chunks no longer made up a large enough amount, in which case an additional chunk had to be included.
Bitcoin Core 0.17.0 introduces the “Branch and Bound” algorithm designed by BitGo engineer Mark Erhardt. This offers two concrete improvements. First, the fee for each chunk is calculated before it is selected to be part of a transaction in order to avoid new chunks having to be added later. Second, the algorithm tries to match different chunks so they add up to the exact amount needed, avoiding the need for “change addresses” (where the leftover “change” gets sent) where possible. (Big wallets with lots of chunks, like those operated by exchanges or other high-traffic entities, are less likely to need change addresses than other wallets.)
Additionally, the coin selection algorithm in Bitcoin Core 0.17.0 includes an optional privacy improvement.
While it is against best practices, it’s possible to receive multiple payments to the same Bitcoin address. (This happens a lot with donation addresses, for example.) Reusing addresses is bad for privacy in itself as it’s obvious that all the coins on that address and all payments made from that address are from the same user. But it’s even worse when the different chunks tied to the same address are used in different transactions, linking them to chunks that weren’t initially associated with that address.
To fix this last problem, Bitcoin Core 0.17.0 gives users the option to prioritize adding chunks tied to the same address together in a transaction and to leave any other chunks out of the transaction where possible.
Easily Create and Use New Wallets
Since Bitcoin Core 0.15.0, it’s been possible to create several wallets that operate independently of each other. These wallets all have their own separate Bitcoin addresses, private keys and, therefore, funds. Users can utilize the different wallets for different purposes; for example, one wallet can be used for personal day-to-day purchases, another for business-related transactions, and a third just for trading. This can make accounting easier and more convenient, and users can more easily benefit from increased privacy as the different wallets cannot be linked to each other by blockchain analysis.
However, up until now, new wallets could only be created when starting up the node, and it was not available for Bitcoin Core wallet (GUI) users. Both of these limitations are now resolved. Bitcoin Core 0.17.0 lets users create new wallets whenever they’d like, and it offers this feature in the GUI.
As an added benefit, Bitcoin Core 0.17.0 introduces a feature called “Scantxoutset.” This lets users quickly verify whether their new wallet already includes coins (for example, because the private keys are imported from another wallet) by checking the unspent transaction output (UTXO) set, instead of rescanning the entire transaction history.
Non-HD to HD Wallet Upgrade
Whereas Bitcoin Core versions older than 0.13.0 still required users to back up all their private keys, all Bitcoin Core versions since have offered Hierarchical Deterministic (HD) wallets instead. HD wallet users only need to store one seed phrase (a list of words) as a backup.
However, Bitcoin Core users who upgraded their system to Bitcoin Core 0.13.0 and newer were unable to create new HD wallets. An incompatibility between non-HD wallets and HD wallets meant that these users were still stuck backing up all their private keys.
Bitcoin Core 0.17.0 now lets these users upgrade to the HD format as well. In addition, Bitcoin Core wallet users who already had HD wallets can now opt to generate or import a new HD seed.
Watch Only–Only Wallets
Bitcoin wallets typically store private keys, which allow users to spend their coins. But Bitcoin Core has also supported “Watch Only” addresses for some time now. The private keys to these addresses are not stored in the wallet, but coins attached to these addresses are still visible in the wallet. This lets users easily accept payments and keep track of their funds while, for example, storing their private keys offline.
Bitcoin Core 0.17.0 takes this concept one step further and allows users to create specific Watch Only wallets in which every address is a Watch Only address. As a concrete example, this will make it easier to use Bitcoin Core to keep track of funds in a hardware wallet or on a paper wallet in the form of an HD seed.
Partially Signed Bitcoin Transactions
While many transactions are straightforward — one user pays another — Bitcoin allows for more complex types of transactions as well. These include, for example, multisignature (multisig) transactions where several users need to sign off on sending funds, as well as privacy-enhancing CoinJoin transactions where different users merge their independent transactions into one big transaction.
To better facilitate these types of transactions, Bitcoin Core 0.17.0 introduces the BIP 174 Partially Signed Bitcoin Transaction (PSBT) framework, designed by Andrew Chow. This framework lets Bitcoin Core users sign a transaction partially, but also adds metadata to such a partially signed transaction. This metadata can be used by someone else to complete the transaction.
PSBT will be particularly useful if the standard is adopted by other wallets. As one potential use case, it could, for example, let a user protect his funds by locking them into a multisig account in which a transaction would require a signature created from the Bitcoin Core wallet, as well as a signature from a hardware wallet. Or it could let Bitcoin Core users partake in CoinJoin schemes with (other) privacy-preserving wallet users.
For now, the partially-signed-transaction feature is only for users who operate Bitcoin Core from the command line or through connected applications.
Pruning from the User Interface
Storing all (on-chain) Bitcoin transactions that ever happened, the Bitcoin blockchain is currently well over 180 gigabytes and growing every day. New Bitcoin Core users must download and validate all this data.
Thanks to a trick called “blockchain pruning,” however, these users do not necessarily need to store all this data. In pruning mode, nodes will automatically forget about older transaction data and keep only what’s necessary to operate securely. Until now, pruning mode could be enabled only through command line.
For the first time, Bitcoin Core 0.17.0 offers a convenient GUI toggle to enable pruning from the wallet, making it more accessible for casual, non-technical Bitcoin users who wish to run a full node for optimal security.
For more details on what’s new in this latest version of Bitcoin Core, see the Bitcoin Core 0.17.0 release notes or watch Chaincode Labs engineer and Bitcoin Core contributor John Newberry’s presentation at the London Bitcoin Devs Meetup.