Revision history for Perl extension Bitcoin::Crypto.
4.002 Fri Nov 14, 2025
[Public interface changes]
- Bitcoin::Crypto::Key::Public:
- added params argument to verify_message method
- Bitcoin::Crypto::Key::Private:
- added params argument to verify_message method
- Bitcoin::Crypto::Script:
- added push_number method
- Bitcoin::Crypto::Script::Runner:
- added flags attribute
- Bitcoin::Crypto::Transaction:
- added flags argument to get_digest method
- added flags argument to verify method
- added Bitcoin::Crypto::Transaction::Flags class
[Improvements and behavior changes]
- transaction verification procedure can now be controlled using flags to achieve historical consensus rules
- module no longer rejects unnormalized signatures with default flags (revert change made in 4.000)
- deserializing a block no longer validates the coinbase transaction (revert change made in 4.001)
- added autogenerated documentation of supported PSBT fields
[Fixes]
- creating a key from unknown key data no longer raises undefined value warnings
- coinbase transaction verification no longer checks height for version 2 and above blocks
4.001 Wed Nov 12, 2025
[Public interface changes]
- Bitcoin::Crypto::Transaction:
- added block attribute
- added is_coinbase method
- added params argument to from_serialized method
- Bitcoin::Crypto::Block:
- added clearer to merkle_root attribute
- added clearer to height attribute
- height attribute can now be lazy built from coinbase transaction in version 2 and above blocks
[Improvements and behavior changes]
- block and transaction deserialization performance has been greatly improved
- checking bytestrings in various function inputs has been optimized
- adding a transaction to a block now sets the block attribute in the transaction
- calling update_utxos on a transaction now sets block in utxo if transaction has a block
- coinbase transactions are now verified using a simplified procedure:
- general format of the coinbase transaction is verified
- some details, most notably block subsidy, are currently not verified
- verification requires a block to be set in the transaction
- deserializing a block now validates the coinbase transaction
[Deprecations]
- passing block through the parameter to verify method is now deprecated in favor of set_block
4.000 Sun Nov 9, 2025
[Public interface changes]
- Bitcoin::Crypto:
- added btc_tapscript function
- added btc_script_tree function
- Bitcoin::Crypto::Util:
- added merkle_root function
- added tagged_hash function
- added lift_x function
- added has_even_y function
- added get_taproot_ext function
- Bitcoin::Crypto::Script:
- added opcode_class method
- added dump method
- Bitcoin::Crypto::Script::Runner:
- added script attribute
- added codeseparator attribute
- added to_minimal_bool method
- added compile method
- added is_tapscript method
- removed deprecated methods:
- get_script, get_script_hash
- Bitcoin::Crypto::Key::ExtPrivate:
- removed deprecated methods:
- generate_mnemonic, mnemonic_from_entropy
- from_hex_seed
- from_serialized_base58, to_serialized_base58
- Bitcoin::Crypto::Key::ExtPublic:
- removed deprecated methods:
- from_serialized_base58, to_serialized_base58
- Bitcoin::Crypto::Key::Private:
- added taproot_output attribute
- added get_taproot_output_key method
- added script_tree argument to sign_transaction method
- removed deprecated methods:
- new($bytes) variant
- from_bytes, to_bytes
- from_hex, to_hex
- Bitcoin::Crypto::Key::Public:
- added taproot_output attribute
- added get_xonly_key method
- added get_taproot_address method
- added get_taproot_output_key method
- added $version and $args arguments to witness_program method
- removed deprecated methods:
- new($bytes) variant
- from_bytes, to_bytes
- from_hex, to_hex
- key_hash
- Bitcoin::Crypto::Transaction:
- added get_digest_object method
- added clear_digest_object method
- added taproot_ext_flag argument to get_digest method
- added taproot_ext argument to get_digest method
- added taproot_annex argument to get_digest method
- Bitcoin::Crypto::Transaction::Input:
- added is_taproot method
- Bitcoin::Crypto::PSBT:
- added $key argument to get_field method
- added $key argument to get_all_fields method
- added list_fields method
- added handling of taproot-specific fields (BIP371)
- Bitcoin::Crypto::Types:
- added ByteStrLen type
- added BitcoinScriptTree type
- added BitcoinDigest type
- Bitcoin::Crypto::Exception:
- added ScriptTree exception subclass
- added ScriptCompilation exception subclass
- added ScriptSuccess exception subclass
- removed Verify exception subclass
- added Bitcoin::Crypto::Script::Tree class
- added Bitcoin::Crypto::Tapscript class
- added Bitcoin::Crypto::Tapscript::Opcode class
- added Bitcoin::Crypto::Transaction::ControlBlock class
- added Bitcoin::Crypto::Key::NUMS class
- added Bitcoin::Crypto::Transaction::Digest::Result class
[Improvements and behavior changes]
- it is now possible to sign and verify P2TR transactions
- public key's get_address method now returns taproot address by default
- BIP44 derivation methods now accept purpose 86, known as bip44_taproot_purpose in Bitcoin::Crypto::Constants
- standard data push in scripts is now compiled to OP_PUSH pseudo-opcode (was OP_PUSHDATA1)
- PSBT check method now also checks if there are any out of range input/output maps
- documentation overhaul
[Fixes]
- verify_message from public and private keys can no longer throw an exception, always returns false on failure
- OP_VERIF and OP_VERNOTIF now correctly mark script as invalid on compilation
- getting unknown opcode by code now returns an UNKNOWN pseudo-opcode that fails on execution (like OP_RESERVED)
- scripts now correctly place empty vector on execution stack for false values
- scripts now correctly check integer value for 4 byte limit
- scripts now correctly handle SIGHASH_SINGLE with input index higher than last output index
- scripts now correctly fail when stack element count exceeds 1000
- scripts now correctly fail when stack element size exceeds 520 bytes
- serializing PSBTs now creates missing maps if they don't exist instead of raising an exception
- creating PSBT field with undefined key or value is now permitted and ignores the value
- subscripts of witness scripts now no longer remove codeseparators after the last one executed (as specified in BIP143)
- module no longer rejects unnormalized signatures, since they are forced by the standard, not protocol
- module no longer rejects uncompressed public keys in segwit, since they are forced by a default policy only
- module now rejects generating P2WPKH addresses from uncompressed public keys (to conform to above policy)
- minor bugfixes
[Breaking changes and deprecations]
- module now requires perl version 5.10.1 (was 5.10.0)
- using set_compressed and set_network (from various classes) in method chaining is no longer supported:
- these methods will continue to return $self, but this behavior is no longer documented
- this is done to standardize the way setters work across the module (not returning $self)
- using set_compressed from key classes without an argument is deprecated:
- this behavior is surprising, use set_compressed(1) instead
- changed interface of PSBT fields PSBT_GLOBAL_XPUB, PSBT_IN_BIP32_DERIVATION, PSBT_OUT_BIP32_DERIVATION:
- these fields now return instance of Bitcoin::Crypto::DerivationPath instead of list of numbers
- digesting a transaction now returns an instance of Bitcoin::Crypto::Transaction::Digest::Result:
- this class stringifies automatically to preimage (which was returned previously)
- using it directly will work the same, but checking its identity will behave differently
- importing an extended key in the serialized form with standard prefix now assumes no purpose:
- BIP86 specifies no special serialization prefix for taproot purpose, so it is shared with legacy
- if this is not desired, purpose can be set manually on deserialized keys
3.002 Fri Oct 24, 2025
[Added interface]
- Bitcoin::Crypto::Block now supports full block serialization / deserialization (thanks @regcostajr)
[Changes and fixes]
- Bitcoin::Crypto::Block::height is now optional and can be undefined
3.001 Tue Sep 24, 2024
[Changes and fixes]
- fixed building ecc context on some older perls on Windows
3.000 Fri Sep 20, 2024
[Improvements]
- the module will now reject unnormalized (high S) signatures while verifying
- module now internally uses libsecp256k1
- all ECDSA operations are now faster and more secure
- no longer needs Crypt::Perl to produce deterministic signatures
- requires installation of libsecp256k1 (will try to install with Alien)
2.007 Sun Aug 25, 2024
[Improvements]
- add predefined 'pepecoin' and 'pepecoin_testnet' networks (thanks @chromatic)
2.006 Sat Jul 27, 2024
[Added interface]
- Bitcoin::Crypto::BIP85 module (deterministic entropy)
- Bitcoin::Crypto::DerivationPath::get_path_hardened
- Bitcoin::Crypto::DerivationPath::as_string
[Improvements]
- deterministic derivation of entropy as defined in BIP85 is now implemented in Bitcoin::Crypto::BIP85
- Bitcoin::Crypto::DerivationPath is now automatically stringified back to "m" notation
- Bitcoin::Crypto::Types is now documented
- Bitcoin::Crypto::Manual now has some additional examples
- test suite has been improved and now uses Test2
2.005 Wed Jul 24 2024
[Added interface]
- Bitcoin::Crypto::PSBT namespace (support for PSBT)
- Bitcoin::Crypto::Util::from_format function (the reverse of existing to_format)
- Bitcoin::Crypto::Util::pack_compactsize function
- Bitcoin::Crypto::Util::unpack_compactsize function
- Bitcoin::Crypto::DerivationPath class (internal representation of path)
- Bitcoin::Crypto::BIP44::get_derivation_path method (getting internal representation of BIP44 path)
- Bitcoin::Crypto::Network::single_network class method (single-network mode)
- Bitcoin::Crypto::Network::set_single method
- Bitcoin::Crypto::Network::unregister method
[Improvements]
- PSBT format from BIP174 can now be serialized, deserialized and validated using Bitcoin::Crypto::PSBT
- transactions can now be created without registering UTXOs beforehand (with limited functionality)
- format descriptions now also handle base64
- extended keys can now be derived by directly passing Bitcoin::Crypto::DerivationPath
- exception is no longer raised if the default network is among multiple possible networks after deserialization of WIFs and extended keys
- module can now be configured to work in single-network mode, disallowing creation of objects with different networks
[Changes and deprecations]
- codes in Bitcoin::Crypto::Script::Opcode are now integers instead of bytestrings of length 1
- Bitcoin::Crypto::Util::get_path_info now returns instances of Bitcoin::Crypto::DerivationPath (internal structure remains unchanged)
- Bitcoin::Crypto::Key::Public::key_hash is now deprecated, added new method get_hash (consistent naming with other modules)
2.004 Tue Apr 23 2024
[Improvements]
- documentation fixes and improvements
[Breaking changes]
- removed deprecated Bitcoin::Crypto::Segwit package
2.003 Thu Oct 26 2023
[Improvements]
- fixed undefined value warnings when dumping input without an address
- documentation improvements
2.002 Sun Oct 22 2023
[New features]
- added Bitcoin::Crypto::Util::get_address_type (address validation and recognition)
- added autodetection of standard scripts from address with [address => $string]
[Improvements]
- added generic parent exception classes for Bech32, Base58 and Address exceptions
- documentation and test improvements
[Changes and fixes]
- btc_extprv->from_mnemonic with $lang argument will now get rid of extra whitespace from the mnemonic
- fix not checking length of legacy address type when creating standard script
2.001 Tue Oct 17 2023
[New features]
- added P2TR scripts, which can now be created and added as outputs to transactions
[Improvements]
- minor changes to tests and non-essential traits of the code
2.000 Sun Oct 15 2023
[New features]
- added transaction system
- added script execution system
- added more examples
- added manual
- many minor additions all across the board
[Improvements]
- all functions and methods now check their input arguments
- test suite has been refactored
- better handling of bytestrings with format descriptions (see Manual)
- better exception handling and reporting
[Changes and deprecations]
- various format-specific methods like from_hex, to_bytes are now deprecated in all packages
- simple serialization methods are now called from_serialized and to_serialized in all packages
- methods generate_mnemonic and mnemonic_from_entropy have been moved to Bitcoin::Crypto::Util
- deprecate Bitcoin::Crypto::Segwit (use Bitcoin::Crypto::Util::validate_segwit)
- deprecate Bitcoin::Crypto::Script->get_script (use to_serialized)
- deprecate Bitcoin::Crypto::Script->get_script_hash (use get_hash)
- deprecate Bitcoin::Crypto::Key::Private->new (use from_serialized)
- deprecate Bitcoin::Crypto::Key::Public->new (use from_serialized)
[Breaking changes]
- removed second argument from sign_message and verify_message. Now always uses hash256 to digest
1.008 Sat Jan 7 2023
- add clear_purpose method, which disables purpose security checks on a key
- documentation fixes
1.007 Sat May 14 2022
- extended keys derived using BIP44 scheme now use specific serialization according to BIP49 and BIP84
- basic keys derived using BIP44 scheme now prevent incorrect type of address from being generated
- Segregated Witness compatibility addresses can no longer be generated when there's no segwit_hrp config in network
1.006 Fri May 13 2022
- add predefined 'dogecoin' and 'dogecoin_testnet' networks (thanks @chromatic)
- add 'get_account' option to BIP44 to get derivation path only up the account part
- BIP44 'index' is no longer required - uses 0 by default
- slightly improved documentation
- switch to Dist::Zilla
1.005 Sat Nov 6 2021
- update CryptX dependency to fix compatibility with the latest Math::BigInt
1.004 Sat Oct 30 2021
- BIP44 implementation now also supports BIP49 and BIP84 via its 'purpose' parameter
1.003 Sat Oct 9 2021
- fix return value of set_network method in key instances to match documentation
- update CryptX dependency and check the version of optional GMP dependency to fix testers
1.002 Wed Sep 22 2021
- implement bech32m encoding and use it in segwit v1+ addresses
- fix bech32 encoding by removing mandatory bit translation - old behavior can be achieved by using new translate_ functions
- change encode_bech32 and decode_bech32 input and output format
- add new Bitcoin::Crypto::Bech32 exported functions: translate_5to8 and translate_8to5
- remove Bitcoin::Crypto::Bech32::split_bech32 from exported functions
1.001 Thu Sep 9 2021
- prefer GMP to LTM backend in Math::BigInt
1.000 Sun Sep 5 2021
- end of the beta phase
- imported mnemonics must now be proper unicode strings (important for non-english mnemonics)
- module will now use Crypt::Perl when available to produce deterministic signatures
- add Bitcoin::Crypto::Util::mnemonic_to_seed function
- set_compressed method on keys now properly handles undefined values
- code refactors and documentation improvements
0.997 Fri Jun 11 2021
- implement BIP44 derivation paths
- add derive_key_bip44 helper to extended private key class
- remove previously deprecated Exception::KeySign
- refactor testing out of examples
- minor documentation improvements
- fix distribution metadata
- change how internal constants are handled
0.996 Thu Jan 7 2021
- deprecate Exception::KeySign in favor of Exception::Sign
- add Exception::Verify, trapping CryptX exceptions during signature verification
- replace Throwable dependency with custom error class
- add explicit version number to each of module's files
- improve bytestring checking - now throws exceptions for undefs and refs
- improve error trapping - now properly executes eval
- improve documentation
- improved test suite (now covers some edge cases)
0.995 Wed Sep 16 2020
- downgrade and fix dependencies
- fix minimum perl version
- improve documentation
- explicitly document beta version
0.994 Sun Sep 06 2020
- remove Math::EllipticCurve::Prime dependency - replaced with custom function
- remove Math::BigInt::GMP dependency - replaced with LTM
- replace most of Base58 module internals with CryptX, leave the module for Base58Check
- remove base58_preserve functions - standard Base58 encoding decoding now preserves null bytes
- replace type checks with Type::Tiny
- add mnemonic_from_entropy method to Bitcoin::Crypto::Key::ExtPrivate
- verify bytestrings on method inputs (exception is thrown)
- remove trash methods from classes (namespace::clean)
- performance improvements
- update dependencies
- improve documentation
- tidy up source files with perltidy
0.993 Thu Jan 30 2020
- replace some dependencies with CryptX functions
- add shortcut functions in Bitcoin::Crypto package (autoloading of important classes)
- more tests and docs
- repo cleanup
0.992 Sun Jan 12 2020
- change Bitcoin::Crypto::Network register method to accept a plain hash (instead of a hashref)
- run examples during tests
0.991 Wed Jan 08 2020
- rewrite Bitcoin::Crypto::Network to Moo (changed interface)
- add examples directory and bip44 implementation example
- 32 bit compatibility attempt
- add the missing test to distribution
0.99 Sun Jan 05 2020
- almost complete rewrite of the module
- added extended keys
- added segwit compatibility
- added script execution
- many small improvements
- beta relase - yet to be tested in a realistic environment
0.02 Fri Nov 23 2018
- enable package on ealier Perl versions
- remove pack_hex from Bitcoin::Crypto::Util
- add pad_hex to Bitoin::Crypto::Helpers
0.01 Mon Nov 15 2018
- first version