Bitcoin Core 0.12.0 is a significant release that introduced numerous new features, performance improvements, and critical changes to the network's foundational software. This version marked a major step forward in scalability, security, and user control. Installation binaries were available for download from the official Bitcoin Core website, and the source code remained accessible in the public GitHub repository.
This article provides a detailed breakdown of the key changes, enhancements, and important considerations for users upgrading to or from this version.
How to Upgrade and Downgrade
How to Upgrade
If you were running an older version, the standard upgrade procedure applied. You needed to first shut down the software completely. For older versions, this complete shutdown could take several minutes. After the process was fully stopped, you could run the new installer (on Windows) or simply overwrite the existing /Applications/Bitcoin-Qt (on macOS) or bitcoind/bitcoin-qt (on Linux) with the new version.
Downgrade Warnings
Downgrading to a Version Below 0.10.0
Version 0.10.0 introduced a headers-first synchronization method and parallel block downloads. This change made the block files and databases incompatible with Bitcoin Core versions prior to 0.10.0 and other software that followed the old format.
- Block files were stored on disk in an order that did not match their acceptance order, making them incompatible with some external tools.
- The new block index database only stored block headers, a format unsupported by earlier versions.
If you wished to retain the ability to downgrade, it was highly recommended to make a full backup of your entire data directory. Without a backup, a node would need to perform a full sync from scratch if downgraded. While data from a fully synced 0.10.0 node might sometimes work in earlier versions, this was unsupported behavior and could lead to crashes during index rebuilding.
This incompatibility did not affect wallet forward or backward compatibility.
Downgrading to a Version Below 0.12.0
Starting with version 0.12.0, the software began obfuscating the chainstate during every new sync and reindex. This obfuscated chainstate was incompatible with versions prior to 0.12.0.
If you downgraded from version 0.12.0 or newer after a reindex had occurred, you would need to trigger another reindex when first starting version 0.11.0 or lower.
Major Changes and Features
Libsecp256k1 for Signature Verification
This release replaced OpenSSL with the libsecp256k1 library for ECDSA signature verification in Bitcoin transactions. This change resulted in a massive performance increase for raw signature verification.
On x86_64 platforms, verification was up to five times faster. In practical terms, this meant the time for initial block chain download and new block validation was at least cut in half. The libsecp256k1 library underwent extensive testing and review, making it a robust and secure replacement. A side effect was that libconsensus no longer depended on OpenSSL.
Reduced Upload Traffic
A significant portion of a node's outgoing bandwidth was dedicated to serving historical block data to other nodes during their initial block download. Bitcoin Core 0.12.0 introduced the -maxuploadtarget parameter to limit the total amount of upstream traffic.
This was not a hard cap but a threshold to minimize outbound traffic. As uploads approached the set limit, the node would stop serving historical blocks (those older than one week). Additionally, any SPV node requesting filtered blocks would be disconnected. This feature was disabled by default (-maxuploadtarget=0). Whitelisted peers were exempt from disconnection, though their traffic counted toward the target. For a deeper dive into traffic management, you could explore more strategies for optimizing node performance.
Direct Headers Announcement
Compatible nodes implemented BIP 130 for direct headers announcement. This allowed blocks to be announced by sending their headers directly, rather than just their hash. During a chain reorganization, all new headers were sent, not just the tip, which often prevented redundant downloads of existing blocks. This change also enabled pruning nodes to relay new blocks to compatible peers.
Mempool Limiting
Previous versions limited the mempool size indirectly by comparing transaction fees to a minimum relay fee. This made nodes with low memory vulnerable to being spammed with transactions paying just above the default fee. Bitcoin Core 0.12.0 introduced a strict mempool size limit.
The default size was set to 300 MB, configurable with -maxmempool. When a new transaction would exceed this limit, the transaction(s) with the lowest fee rate (including their descendants) would be evicted. The node's minimum relay fee was then incrementally raised. The software also introduced new policies to limit the length and size of chains of unconfirmed transactions, mitigating various memory-based attacks.
Opt-In Replace-by-Fee (RBF)
Version 0.12.0 added support for opt-in transaction replacement in the mempool, as described in BIP 125. A transaction could signal its replaceability by setting its nSequence value to less than 0xffffffff - 1. A replacement transaction was only accepted if it paid a sufficient fee.
This feature could be disabled entirely by miners or nodes using the -mempoolreplacement=0 option. Wallet support for creating replaceable transactions was not included in this release.
RPC: Random-Cookie Authentication
To simplify setup, a new authentication method was added for the JSON-RPC interface. If no -rpcpassword was specified, the daemon would use a randomly generated 'cookie' file for authentication. This file, created at startup and deleted on exit, contained the authentication token. This approach, similar to Tor's CookieAuthentication, allowed users to run bitcoind without any manual RPC configuration.
Relay: OP_RETURN Data Pushes
The restriction on OP_RETURN outputs was relaxed. Previously, only outputs with a single data push were relayed and mined. This limitation was removed to allow any combination of data pushes and constant opcodes (OP_1 to OP_16) after OP_RETURN. The size limit for these outputs was applied to the entire serialized script.
Transaction Priority Changes
Bitcoin Core's heuristic "priority" system, which ordered transactions based on coin age and value, saw significant changes. Due to the new mempool limiting, transactions that did not meet a dynamically adjusted minimum fee were no longer relayed or mined, even if they had a high priority.
Mining transactions based on priority was disabled by default. It could be re-enabled by setting the -blockprioritysize parameter. The calculation of priority for transactions with unconfirmed inputs was also simplified, generally resulting in a lower calculated value.
Automatic Tor Hidden Service Support
Leveraging features in Tor version 0.2.7.1+, Bitcoin Core gained the ability to automatically create and use "ephemeral" Tor hidden services. If Tor was running with proper authentication available, the client could automatically create a hidden service for incoming connections and route all outgoing connections through Tor. This greatly improved privacy and increased the number of available Tor nodes on the network.
Notifications via ZMQ
The client added the optional ability to asynchronously notify external applications of new transactions and blocks via a ZMQ-based PUB socket. This required the ZMQ 4.x C API library to be installed and configured via the command line or configuration file.
Wallet: Transaction Fee Improvements
Several enhancements were made to the wallet's fee calculation logic. Users could set a fixed fee with -paytxfee or let the software use a floating fee based on historical data, aiming to get a transaction confirmed within a target number of blocks (configurable with -txconfirmtarget, default 2). A fallback fee (-fallbackfee) and a maximum fee cap (-maxtxfee) were also implemented to handle estimation failures and prevent excessive fees.
Wallet: Conflict Detection
The wallet introduced improved logic for detecting conflicts (double-spends). Conflicting transactions now showed a negative confirmation count. A new "trusted" field in the listtransactions RPC call indicated whether an unconfirmed transaction was considered safe to spend.
Wallet: Merkle Branch Removal
To save space, the wallet stopped storing Merkle branches to prove a transaction's inclusion in a block. This data was only used for an optional verification. Wallets loaded from 0.12.x into older versions would automatically rescan to compensate for this change.
Wallet: Pruning Mode
A major milestone was the full activation of wallet functionality in pruning mode. This allowed nodes to discard old block data after validating it, reducing disk usage from over 60 GB to around 2 GB, while still supporting most wallet operations. However, rescans and RPC commands like importwallet were disabled in this mode.
‘NODE_BLOOM’ Service Bit
Support for the NODE_BLOOM service bit, as defined in BIP 111, was added to the P2P protocol code. This allowed nodes to advertise their support for Bloom filters, which are used by SPV (Simplified Payment Verification) clients.
Parsing Behavior
Command-line option parsing was changed to be strictly order-dependent. The last specified option now took precedence, making behavior consistent with most other software. For example, -X -noX would now result in X being disabled.
Frequently Asked Questions (FAQ)
What was the most important performance improvement in Bitcoin Core 0.12.0?
The integration of the libsecp256k1 library for signature verification was the most significant performance boost, making signature validation up to five times faster and drastically reducing the time required for IBD and block processing.
Could I run a Bitcoin node on a computer with limited disk space after this update?
Yes, the introduction of full wallet functionality in pruning mode was a game-changer. You could set a prune target (e.g., prune=5500 for roughly 5.5 GB), allowing you to run a fully validating node with a fraction of the former disk space requirement.
How did the new mempool limiting prevent spam attacks?
By enforcing a strict memory limit (default 300 MB) and dynamically evicting the lowest-feerate transactions when full, the node protected itself from being flooded with low-fee transactions. This was a more robust defense than the previous method of adjusting the minimum relay fee.
What was Opt-In Replace-by-Fee (RBF)?
Opt-In RBF was a mechanism that allowed a transaction to be replaced by a different transaction that spent at least one of the same inputs but paid a higher fee. This was useful if a transaction was stuck because the fee was too low. It was "opt-in" because only transactions explicitly signaling replaceability could be replaced.
Did the automatic Tor feature make my node completely anonymous?
While it significantly improved privacy by routing all traffic through the Tor network and creating a hidden service for incoming connections, achieving complete anonymity involves complex operational security practices beyond just software configuration.
Why were Merkle branches removed from the wallet?
They were removed to save storage space as they were largely redundant for modern wallet operation. The security of a transaction was guaranteed by the full node's validation, not by the wallet storing this proof.