rust-bitcoin-unsafe-fast/bitcoin/CHANGELOG.md

47 KiB

0.32.0 - TODO: Add date when we do final release

  • Bump MSRV to Rust 1.56.1 #2188
  • Remove "no-std" feature #2233
  • Enforce displaying Amount with trailing zeros #2604

Things you will almost certainly hit when upgrading

  • Rename Signature field names #2338
    • sig becomes signature
    • hash_ty becomes sighash_type
  • Rename txid to compute_txid #2366
  • In hardcoded BIP-32 derivation paths: Remove m/ prefix requirement #2451

Crate smashing

This release we continued our effort to split up the library into smaller crates AKA crate smashing.

  • Release new bitcoin-units crate docs
  • Release new base58ck crate docs
  • Release new bitcoin-io crate docs

Bug fixes

  • Fix FeeRate::checked_mul_by_weight #2182
  • Use network when calculating difficulty #2168
  • Fix InputWeightPrediction::P2WPKH_MAX constant DER sig length #2213
  • Fix CJDNS marker byte check #2546
  • Add resource limit check during deserialization of merkle block #2607

Changes to and involving the Network type

In release 0.31.0 we managed to annoy a lot of people by the addition of non_exhaustive to the Network type. After much discussion, and in an effort to cater to multiple camps, we did a bunch of changes this release. To sum up, "network" is ill defined and it means different things to different devs/software. Your software should probably have some custom handling of whatever "network" means to you.

In particular consider having some type that implements AsRef<Params>, we have attempted to replace Network in much of the API (#2541).

  • Add NetworkKind #2232
  • Reduce usage of Network in the public API #2541
  • Remove Network from AddressInner #1832
  • Add consts to Params for individual networks #2396
  • Add params() method to Network #2172
  • Use KnowHrp`` instead of Network` #2387
  • Add check to max difficulty transition threshold #2337

Other API additions

  • Add CompressedPublicKey #2277
  • Add a consensus::deserialize_hex function #2039
  • Add Witness::p2tr_key_spend function #2097
  • Add taproot::SerializedSignature #2156
  • Add input weight predictions for p2pkh outputs #2185
  • Add Weight::from_vb_weight function function (added in #2206, renamed in #2228
  • Implement LowerHex and UpperHex for CompactTarget #2221
  • Add conversions from TXIDs to merkle nodes #2227
  • Add transaction::effective_value() function #2230
  • Improve LockTimes and related types:
    • Improve relative locktime API #2549
    • Implement ordered::ArbitraryOrd for absolute and relative locktimes, introducing the "ordered" feature:
  • Add and use custom ArrayVec
  • Add the implementation of Display for transaction::Version #2309
  • Add functionality to serialize signatures to a writer #2392
  • Add unchecked integer operations to Amount and SignedAmount (add, sum etc.) #2436
  • Add methods p2wpkh_script_code to Script and ScriptBuf #2445
  • Improve API for signing Taproot inputs in PSBTs #2458
  • Add TapNodeHash getter method on TapTree and NodeInfo #2467
  • Add hex parsing to pow types #2514
  • Implement From<core::convert::Infallible> for errors #2516
  • Add ServiceFlags::P2P_V2 #2555

Other API breaking changes

  • Require io::BufRead instead of io::Read in consensus decode trait #2240
  • Make Payload and AddressEncoding private #1979
  • Remove bech32 from the public API #2381
  • Make from_hex inherent for byte-like types #2491
  • Remove the FromHexStr trait #2492

Error handling

  • Split Prevouts errors out into specific error types #2042
  • Improve error handling in the sighash module #2329
  • Improve lock time errors #2417
  • Split relative locktime error up #2433
  • Improve amount module errors #2487
  • Add the FromScriptError for handling errors in address #2497
  • Add NetworkValidationError #2508 but don't return it #2610
  • Improve leaf errors ("leaf" means not enum with nested error type) #2530

0.31.1 - 2023-10-18

  • Bump MSRV to Rust 1.48.0 #1729

  • Add new example code for signature verification #1776

  • Manually implement Debug on Witness #1913

  • Use new bech32 API #1951 and #2117

  • Upgrade to secp256k1 v0.28.0 #2098

  • Upgrade to base64 v0.21.3 #2032

  • API Improvements:

    • Add kilo weight unit conversion #1735
    • Add ChainHash::from_genesis_block_hash#1753
    • Add implementation of PartialEq trait for Address<NetworkUnchecked> #1757
    • Add unsafe address type conversions #1765
    • Add Inventory::network_hash() method #515
    • Implement serde::Serialize for Address #1785
    • Expose valid (min, max) difficulty transition thresholds #1820
    • Add functionality to generate PrivateKey #1837
    • Allow parsing sub-sat denominations with decimal points #1768
    • Fix associated constants of InputWeightPrediction #1835
    • Add FeeRate::checked_mul_by_weight #1864
    • Use Amount type for the TxOut value field #1811
    • Add support for alloc-free parse errors #1297
    • Add Amount::from_int_btc #1870
    • Make ckd_priv function private and impl AsRef for ChildNumber #1882
    • Use hex_lit::hex in benches (also backported to v0.30.1) #1941
    • Add a verify function to PublicKey #1911
    • Add method Script::count_sigops #1890
    • Implement From<PublicKey> for XOnlyPublicKey #1901
    • Implement From<secp256k1::PublicKey> for bitcoin::PublicKey #1949
    • Add DerivationPath::to_u32_vec #1946
    • Use Target as type for pow_limit #2107
    • Add Witness::p2wpkh constructor #2084
    • Make Instruction be able to read the script number #2081
    • Add Script::is_mulitsig #2078
    • Count sigops for Transaction #2073
    • Add Psbt fee checks #2064
    • Add version bytes consts #2020
    • Add transaction::Version data type #2006
  • Moves, Removes, and renames:

    • Move witness types to the script module #1846
    • Remove reexport of psbt::Prevouts #1872
    • Rename Transaction::is_coin_base to is_coinbase #1796
    • Rename TaprootSpendInfo::as_script_map to script_map #1897
    • Rename Script::empty to Script::new #1925
    • Rename PartiallySignedTransaction to Psbt #1938
    • Rename XpubIdenifier to XKeyIdentifier #2021
    • Rename ExtendedPubKey to Xpub #2019
    • Rename ExtendedPrivKey to Xpriv #2019
    • Remove _v0 from various function names (eg, new_v0_p2wpkh) #1994
    • Remove SighashCache::segwit_signature_hash (add p2wpkh_signiture_hash and p2wsh_signature_hash) #1995
    • Reexport all the hash types from the crate root #1998
    • Rename opcodes::All to Opcode #1995
    • Removed TxOut::default(), the same logic now exists as TxOut::NULL #1811 and #1838
  • Error handling improvements:

    • Improve hashes::Error #1873
    • Add ValidationError #1874
    • Improve crypto::taproot error type #1895
    • Audit error types code base wide #2101

0.30.1 - 2023-07-16

0.30 - 2023-03-21 "The First Crate-Smashing Release"

We now have a website for crates that live under the rust-bitcoin GitHub organization: https://rust-bitcoin.org/

This release is big, to help users upgrade we wrote a blog post, please see https://rust-bitcoin.org/blog/release-0.30.0/

0.29 - 2022-07-20 "Edition 2018 Release"

As promised, this is our quick release to bring on edition 2018 by increasing our MSRV to Rust 1.41.1 #983

This work saw a bunch of new language features become available to us. At the same time we were able to start using rustfmt. We also started linting as part of CI.

Breaking changes

There are numerous breaking changes in this release related to the new language features but also other improvements such as more newtypes added. Note that not all changes cause compilation failure! For example, Witness serialization was changed to support human-readable formats.

Detailed list of breaking changes

Highlights

  • Added support for BIP 152 #1088
  • Edition 2018 improvements
    • Implement TryFrom #1007
    • Add non_exhaustive to all error enums #1026
    • Various other improvements, see tracking issue for more information.
  • Enable clippy on CI #1061
  • Taproot improvements #950 #936
  • serde improvements/changes #1006 #905 #1071 []
  • Performance improvements #1033 #996 #1053 #1023
  • PSBT improvements #853 [#951] (https://github.com/rust-bitcoin/rust-bitcoin/pull/951) #940
  • Script improvements #1021 #954
  • New types that may be of interest
    • Sequence, transaction sequence number #1093
    • ChainHash, as used in Lightning #878
    • LockTime, transaction nLockTime #994
  • Improve pubkey sorting: #1084
  • Introduce rustfmt #1040
  • Dependencies
    • Upgrade to use bitcoinconsensus v0.20.2-0.5.0 #1165
    • Upgrade to use secp256k1 v0.24.0 #1110
    • Upgrade to use bech32 v0.9.0 #1131
    • Remove base64-compat in favour of base64 #993
    • Do not pin transitive ryu dependency #1013
  • Take Writer/Reader by &mut in consensus en/decoding #1035
  • Consume self in conversion methods named to_* instead of borrowing #1161

0.28.2 - 2022-11-01

Backported a set of changes from 0.29 which may cause some specific transactions and/or blocks to fail to deserialize. No known such transactions exist on any public blockchain.

0.28 - 2022-04-20 "The Taproot Release"

At nearly nine months, this is our longest release cycle ever, and thanks to a huge increase in the number of active contributors this year and last, it is also by far our largest release ever, at 148 PRs merged from 23 different contributors. Our primary goal in this release was to introduce support for Taproot and its associated data structures: addresses, taptrees, sighashes, PSBT fields, and more. As it turned out, these changes required (or at least, incentivized) changing a lot of our APIs, causing a significant increase in scope.

We have more big changes coming down the pike. 2022 is going to be a big year for rust-bitcoin, which we know is exciting for us but disruptive to downstream users who ultimately want the library to just work. Our hope is that by 2023 we will have eliminated large amounts of technical debt, modernized our APIs to meet current Rust conventions, and clarified the scope of the individual crates in this ecosystem while still providing the essential functionality needed by our downstream users, especially wallet projects.

We will also develop a plan to make our releases more predictable and manageable, likely by having scheduled releases with limited scope. We would like to reach a point where we no longer have frequent breaking releases, but right now we are nowhere close.

Upcoming changes will include

  • A quick new release which updates our MRSV from 1.29 to 1.41 and does little else
  • Updating our codebase to take advantage of the new MSRV, especially regarding nostd and wasm support
  • A comprehensive rethinking and flattening of our public-facing APIs
  • Richer support for PSBT, Script, and BIP-0340/Schnorr signatures

With so many changes since 0.27, we cannot list every PR. Here are the highlights:

Additionally we made several minor API changes (renaming methods, etc.) to improve compliance with modern Rust conventions. Where possible we left the existing methods in place, marked as deprecated.

0.27 - 2021-07-21

0.26.2 - 2021-06-08

The previous release changed the behavior of Display for ChildNumber, assuming that any correct usage would not be affected. Issue 608 goes into the details of why this isn't the case and how we broke both rust-miniscript and BDK.

0.26.1 - 2021-06-06 (yanked, see explanation above)

0.26.0 - 2020-12-21

0.25.1 - 2020-10-26

  • Remove an incorrect debug_assert that can cause a panic when running using the dev profile.

0.25.1 - 2020-10-07

0.25.0 - 2020-09-10

  • Bump MSRV to 1.29.0

0.24.0 - 2020-09-10

0.23.0 - 2020-01-07

  • Update secp256k1 dependency to 0.17.1.
  • Update bitcoinconsensus dependency to 0.19.0-1.
  • Update bech32 dependency to 0.7.2.

0.22.0 - 2020-01-07

  • Add ServiceFlags type.
  • Add NetworkMessage::command.
  • Add key::Error.
  • Add newtypes for specific hashes:
    • Txid
    • Wtxid
    • BlockHash
    • SigHash
    • PubkeyHash
    • ScriptHash
    • WPubkeyHash
    • WScriptHash
    • TxMerkleNode
    • WitnessMerkleNode
    • WitnessCommitment
    • XpubIdentifier
    • FilterHash
  • Refactor CommandString.
  • Refactor Reject message.
  • Rename RejectReason enum variants.
  • Refactor encode::Error.
  • Implement Default for TxIn.
  • Implement std::hash::Hash for Inventory.
  • Implement Copy for InvType enum.
  • Use psbt::Error in PartiallySignedTransaction::from_unsigned_tx.
  • Drop message decode max length to 4_000_000.
  • Drop hex and byteorder dependencies.

0.21.0 - 2019-10-02

0.20.0 - 2019-08-23

  • Update secp256k1 0.15 and bitcoinconsensus 0.17

0.19.0 - 2019-08-16

  • Add Amount and SignedAmount types.
  • Add BIP-158 support with BlockFilter and related types.
  • Add util::misc::signed_msg_hash() for signing messages.
  • Add MerkleBlock and PartialMerkleTree types.
  • bip32: Support serde serializaton for types and add some utility methods:
    • ChildNumber::increment
    • DerivationPath::children_from
    • DerivationPath::normal_children
    • DerivationPath::hardened_children
  • Add blockdata::script::Builder::push_verify to verify-ify an opcode.
  • Add sendheaders network message.
  • Add OutPoint::new() method and JSON-serialize as <txid>:<vout>.
  • Refactor Address type:
    • Now supports segwit addresses with version >0.
    • Add Address::from_script constructor.
    • Add Address::address_type inspector.
    • Parsing now returns an address::Error instead of encode::Error.
    • Removed bitcoin_bech32 dependency for bech32 payloads.
  • bip143: Rename witness_script to script_code
  • Rename BlockHeader::spv_validate to validate_pow
  • Rename OP_NOP2 and OP_NOP3 to OP_CLTV and OP_CSV
  • psbt: Use BTreeMap instead of HashMap to ensure serialization roundtrips.
  • Drop Decimal type.
  • Drop LoneHeaders type.
  • Replace strason dependency with (optional) serde_json.
  • Export the bitcoin_hashes and secp256k1 dependent crates.
  • Updated bitcoin_hashes dependency to v0.7.
  • Removed rand and serde_test dependencies.
  • Internal improvements to consensus encoding logic.

0.18.0 - 2019-03-21

  • Update bitcoin-bech32 version to 0.9
  • add to_bytes method for util::key types
  • add serde impls for util::key types
  • contracthash: minor cleanups, use util::key types instead of secp256k1 types

0.17.1 - 2019-03-04

  • Add some trait impls to PublicKey for miniscript interoperability

0.17.0 - 2019-02-28 - ``The PSBT Release''

0.16.0 - 2019-01-15

  • Reorganize opcode types to eliminate unsafe code
  • Un-expose some macros that were unintentionally exported
  • Update rust-secp256k1 dependency to 0.12
  • Remove util::iter::Pair type which does not belong in this library
  • Minor bugfixes and optimizations

0.15.1 - 2018-11-08

0.15.0 - 2018-11-03

  • Significant API overhaul:
    • Remove nu_select macro and low-level networking support
    • Move network::consensus_params to consensus::params
    • Move many other things into consensus::params
    • Move BitcoinHash from network::serialize to util::hash; remove impl for Vec<u8>
    • Rename/restructure error types
    • Rename Consensus{De,En}coder to consensus::{De,En}coder
    • Replace Raw{De,En}coder with blanket impls of consensus::{De,En}coder on io::Read and io::Write
    • make serialize and serialize_hex infallible
  • Make 0-input transaction de/serialization always use segwit
  • Implement FromStr and Display for many more types

0.14.2 - 2018-09-11

  • Add serde support for Address

0.14.1 - 2018-08-28

  • Reject non-compact VarInts on various types
  • Expose many types at the top level of the crate
  • Add Ord, PartialOrd impls for Script

0.14.0 - 2018-08-22

0.13.1

  • Add Display trait to uints, FromStr trait to Network enum
  • Add witness inv types to inv enum, constants for Bitcoin regtest network, is_coin_base accessor for tx inputs
  • Expose merkleroot(Vec<Sha256dHash>)

0.13

  • Move witnesses inside the TxIn structure
  • Add Transaction::get_weight()
  • Update bip143 sighash_all API to be more ergonomic

0.12

  • The in-memory blockchain was moved into a dedicated project rust-bitcoin-chain.
  • Removed old script interpreter
  • A new optional feature "bitcoinconsensus" lets this library use Bitcoin Core's native script verifier, wrappend into Rust by the rust-bitcoinconsenus project. See Transaction::verify and Script::verify methods.
  • Replaced Base58 traits with encode_slice, check_encode_slice, from and from_check functions in the base58 module.
  • Un-reversed the Debug output for Sha256dHash
  • Add bech32 support
  • Support segwit address types

0.11

  • Remove num dependency at Matt's request; agree this is obnoxious to require all downstream users to also have a num dependency just so they can use Uint256::from_u64.