This is a new major version release, bringing both new features and bug fixes.
Upgrading and downgradingHow to UpgradeIf you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or bitcoind/bitcoin-qt (on Linux).
If you are upgrading from version 0.7.2 or earlier, the first time you run 0.10.0 your blockchain files will be re-indexed, which will take anywhere from 30 minutes to several hours, depending on the speed of your machine.
Downgrading warningBecause release 0.10.0 makes use of headers-first synchronization and parallel block download (see further), the block files and databases are not backwards-compatible with older versions of Bitcoin Core:
Blocks will be stored on disk out of order (in the order they are received, really), which makes it incompatible with some tools or other programs. Reindexing using earlier versions will also not work anymore as a result of this.
The block index database will now hold headers for which no block is stored on disk, which earlier versions won't support.
If you want to be able to downgrade smoothly, make a backup of your entire data directory. Without this your node will need start syncing (or importing from bootstrap.dat) anew afterwards.
This does not affect wallet forward or backward compatibility.
Notable changesFaster synchronizationBitcoin Core now uses 'headers-first synchronization'. This means that we first ask peers for block headers (a total of 27 megabytes, as of December 2014) and validate those. In a second stage, when the headers have been discovered, we download the blocks. However, as we already know about the whole chain in advance, the blocks can be downloaded in parallel from all available peers.
In practice, this means a much faster and more robust synchronization. On recent hardware with a decent network link, it can be as little as 3 hours for an initial full synchronization. You may notice a slower progress in the very first few minutes, when headers are still being fetched and verified, but it should gain speed afterwards.
A few RPCs were added/updated as a result of this:
getblockchaininfo now returns the number of validated headers in addition to the number of validated blocks.
getpeerinfo lists both the number of blocks and headers we know we have in common with each peer. While synchronizing, the heights of the blocks that we have requested from peers (but haven't received yet) are also listed as 'inflight'.
A new RPC
getchaintips lists all known branches of the block chain, including those we only have headers for.
Transaction fee changesThis release automatically estimates how high a transaction fee (or how high a priority) transactions require to be confirmed quickly. The default settings will create transactions that confirm quickly; see the new 'txconfirmtarget' setting to control the tradeoff between fees and confirmation times.
Prior releases used hard-coded fees (and priorities), and would sometimes create transactions that took a very long time to confirm.
Statistics used to estimate fees and priorities are saved in the data directory in the fee_estimates.dat file just before program shutdown, and are read in at startup.
New command line options for fee estimation:
-
txconfirmtarget=n : create transactions that have enough fees (or priority) so they are likely to confirm within n blocks (default: 1). This setting is over-ridden by the -paytxfee option.
New RPC commands for fee estimation:
estimatefee nblocks : Returns approximate fee-per-1,000-bytes needed for a transaction to be confirmed within nblocks. Returns -1 if not enough transactions have been observed to compute a good estimate.
estimatepriority nblocks : Returns approximate priority needed for a zero-fee transaction to confirm within nblocks. Returns -1 if not enough free transactions have been observed to compute a good estimate.
RPC access control changesSubnet matching for the purpose of access control is now done by matching the binary network address, instead of with string wildcard matching. For the user this means that -rpcallowip takes a subnet specification, which can be
a single IP address (e.g. 1.2.3.4 or fe80::0012:3456:789a:bcde)
a network/CIDR (e.g. 1.2.3.0/24 or fe80::0000/64)
a network/netmask (e.g. 1.2.3.4/255.255.255.0 or fe80::0012:3456:789a:bcde/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff)
An arbitrary number of -rpcallow arguments can be given. An incoming connection will be accepted if its origin address matches one of them.
REST interfaceA new HTTP API is exposed when running with the -rest flag, which allows unauthenticated access to public node data.
It is served on the same port as RPC, but does not need a password, and uses plain HTTP instead of JSON-RPC.
Assuming a local RPC server running on port 8332, it is possible to request:
Blocks:
http://localhost:8332/rest/block/HASH.EXT Blocks without transactions:
http://localhost:8332/block/notxdetails/HASH.EXT Transactions (requires -txindex):
http://localhost:8332/tx/HASH.EXTIn every case, EXT can be bin (for raw binary data), hex (for hex-encoded binary) or json.
For more details, see the doc/REST-interface.md document in the repository.
RPC Server "Warm-Up" ModeThe RPC server is started earlier now, before most of the expensive intialisations like loading the block index. It is available now almost immediately after starting the process. However, until all initialisations are done, it always returns an immediate error with code -28 to all calls.
This new behaviour can be useful for clients to know that a server is already started and will be available soon (for instance, so that they do not have to start it themselves).
Improved signing securityFor 0.10 the security of signing against unusual attacks has been improved by making the signatures constant time and deterministic.
This change is a result of switching signing to use libsecp256k1 instead of OpenSSL. Libsecp256k1 is a cryptographic library optimized for the curve Bitcoin uses which was created by Bitcoin Core developer Pieter Wuille.
There exist attacks[1] against most ECC implementations where an attacker on shared virtual machine hardware could extract a private key if they could cause a target to sign using the same key hundreds of times. While using shared hosts and reusing keys are inadvisable for other reasons, it's a better practice to avoid the exposure.
OpenSSL has code in their source repository for derandomization and reduction in timing leaks, and we've eagerly wanted to use it for a long time but this functionality has still not made its way into a released version of OpenSSL. Libsecp256k1 achieves significantly stronger protection: As far as we're aware this is the only deployed implementation of constant time signing for the curve Bitcoin uses and we have reason to believe that libsecp256k1 is better tested and more thoroughly reviewed than the implementation in OpenSSL.
[1]
https://eprint.iacr.org/2014/161.pdfWatch-only addresses in the walletThe wallet can now track transactions to addresses (or scripts) for which you do not have the private keys.
This can be used to track payments without needing the private keys online on a possibly vulnerable system. In addition, it can help for (manual) construction of multisig transactions where you are only one of the signers.
One new RPC, importaddress, is added which functions similarly to importprivkey, but instead takes an address or script (in hexadecimal) as argument. After using it, outputs credited to this address or script are considered to be yours.
The following RPCs have optional support for watch-only addresses: getbalance, listreceivedbyaddress, listreceivedbyaccount, listtransactions, listaccounts, listsinceblock, gettransaction. See the RPC documentation for those methods for more information.
Compared to using getrawtransaction, this mechanism does not require -txindex, scales better, integrates better with the wallet, and is compatible with future block chain pruning functionality. It does mean the address needs to added to the wallet before the payment, though.
Consensus libraryStarting from 0.10.0, the Bitcoin Core distribution includes a consensus library.
The purpose of this library is to make the verification functionality that is critical to Bitcoin's consensus available to other applications, e.g. to language bindings such as python_bitcoinlib or alternative node implementations.
This library is called libbitcoinconsensus.so (or, .dll for Windows). Its interface is defined in the C header bitcoinconsensus.h.
In its initial version the API includes two functions:
bitcoinconsensus_verify_script verifies a script. It returns whether the indicated input of the provided serialized transaction correctly spends the passed scriptPubKey under additional constraints indicated by flags
bitcoinconsensus_version returns the API version, currently at an experimental 0
The functionality is planned to be extended to e.g. UTXO management in upcoming releases, but the interface for existing methods should remain stable.
Standard script rules relaxed for P2SH addressesThe IsStandard() rules have been almost completely removed for P2SH redemption scripts, allowing applications to make use of any valid script type, such as "n-of-m OR y", hash-locked oracle addresses, etc. While the Bitcoin protocol has always supported these types of script, actually using them on mainnet has been previously inconvenient as standard Bitcoin Core nodes wouldn't relay them to miners, nor would most miners include them in blocks they mined.
bitcoin-txIt has been observed that many of the RPC functions offered by bitcoind are "pure functions", and operate independently of the bitcoind wallet. This included many of the RPC "raw transaction" API functions, such as createrawtransaction.
bitcoin-tx is a newly introduced command line utility designed to enable easy manipulation of bitcoin transactions. A summary of its operation may be obtained via "bitcoin-tx --help" Transactions may be created or signed in a manner similar to the RPC raw tx API. Transactions may be updated, deleting inputs or outputs, or appending new inputs and outputs. Custom scripts may be easily composed using a simple text notation, borrowed from the bitcoin test suite.
This tool may be used for experimenting with new transaction types, signing multi-party transactions, and many other uses. Long term, the goal is to deprecate and remove "pure function" RPC API calls, as those do not require a server round-trip to execute.
Other utilities "bitcoin-key" and "bitcoin-script" have been proposed, making key and script operations easily accessible via command line.
CreditsThanks to everyone who contributed to this release:
21E14
Adam Weiss
Aitor Pazos
Alexander Jeng
Alex Morcos
Alon Muroch
Andreas Schildbach
Andrew Poelstra
Andy Alness
Ashley Holman
Benedict Chan
Ben Holden-Crowther
Bryan Bishop
BtcDrak
Christian von Roques
Clinton Christian
Cory Fields
Cozz Lovan
daniel
Daniel Kraft
David Hill
Derek701
dexX7
dllud
Dominyk Tiller
Doug
elichai
elkingtowa
ENikS
Eric Shaw
Federico Bond
Francis GASCHET
Gavin Andresen
Giuseppe Mazzotta
Glenn Willen
Gregory Maxwell
gubatron
HarryWu
himynameismartin
Huang Le
Ian Carroll
imharrywu
Jameson Lopp
Janusz Lenar
JaSK
Jeff Garzik
JL2035
Johnathan Corgan
Jonas Schnelli
jtimon
Julian Haight
Kamil Domanski
kazcw
kevin
kiwigb
Kosta Zertsekel
LongShao007
Luke Dashjr
Mark Friedenbach
Mathy Vanvoorden
Matt Corallo
Matthew Bogosian
Micha
Michael Ford
Mike Hearn
mrbandrews
mruddy
ntrgn
Otto Allmendinger
paveljanik
Pavel Vasin
Peter Todd
phantomcircuit
Philip Kaufmann
Pieter Wuille
pryds
randy-waterhouse
R E Broadley
Rose Toomey
Ross Nicoll
Roy Badami
Ruben Dario Ponticelli
Rune K. Svendsen
Ryan X. Charles
Saivann
sandakersmann
SergioDemianLerner
shshshsh
sinetek
Stuart Cardall
Suhas Daftuar
Tawanda Kembo
Teran McKinney
tm314159
Tom Harding
Trevin Hofmann
Whit J
Wladimir J. van der Laan
Yoichi Hirai
Zak Wilcox
As well as everyone that helped translating on Transifex.