ℹ️ NOTE: This section has been recently added to the course and is an early draft that may still be awaiting review. Caveat reader.
Libwally is an extensive library that provides a considerable amount of wallet-related functionality, much of it not available through bitcoin-cli
. Following is an overview of some functionality not previously covered in this chapter.
A number of cryptographic functions can be directly accessed from Libwally:
wally_aes
— Use AES encryption or decryptionwally_aes_cbc
— Use AES encryption or decryption in CBC modewally_hash160
— Use RIPEMD-160(SHA-256) hashwally_scrypt
— Use Scrypt key derivationwally_sha256
— Use SHA256 hashwally_sha256_midstate
— Use SHA256 to hash only the first chunk of datawally_sha256d
— Conduct a SHA256 double-hashwally_sha512
— Use SHA512 hash
There are also HMAC functions for the two SHA hashes, which are used generate message-authentication-codes based on the hashes. They're used in BIP32, among other places.
wally_hmac_sha256
wally_hmac_sha512
Additional functions cover PBKDF2 key derivation and elliptic-curve math.
Libwally contains a number of functions that can be used to import, export, and translate Bitcoin addresses.
Some convert back and forth between addresses and scriptPubKey
bytes:
wally_addr_segwit_from_bytes
— Convert a witness program (in bytes) into a Segwit addresswally_addr_segwit_to_bytes
— Convert a Segwit address into ascriptPubKey
(in bytes)wally_address_to_scriptpubkey
— Convert a legacy address into ascriptPubKey
(in bytes)wally_scriptpubkey_to_address
— Convert ascriptPubKey
(in bytes) into a legacy address
Some relate to the wallet import format (WIF):
wally_wif_from_bytes
— Convert a private key (in bytes) to a WIFwally_wif_is_uncompressed
— Determines if a WIF is uncompressedwally_wif_to_address
— Derive a P2PKH address from a WIFwally_wif_to_bytes
— Convert a WIF to a private key (in bytes)wally_wif_to_public_key
— Derive a public key (in bytes) from a WIF
There are additional BIP32 HD-wallet functions, beyond what was covered in §17.3: Using BIP32 in Libwally.
bip32_key_get_fingerprint
— Generate a BIP32 fingerprint for an extended keybip32_key_serialize
— Transform an extended key into serialized bytesbip32_key_strip_private_key
— Convert an extended private key to an extended public keybip32_key_unserialize
— Transform serialized bytes into an extended key
There are also numerous various depending on whether you want to allocate memory or have Libwally do the _alloc
for you.
BIP38 allows for the creation of password-protected private key. We do not teach it because we consider inserting this sort of human factor into key management dangerous. See #SmartCustody.
The main functions are:
bip38_from_private_key
— Encode a private key using BIP38bip38_to_private_key
— Decode a private key using BIP38
A few BIP39 mnemonic-word functions were just overviewed in §17.2: Using BIP39 in Libwally:
bip39_get_languages
— See a list of supported languagesbit39_get_word
— Retrieve a specific word from a language's word listbip39_get_wordlist
— See a list of words for a language
Listings of most PSBT functions can be found in 17.4: Using PSBTs in Libwally.
§17.5: Using Scripts in Libwally just barely touched upon Libwally's Scripts functions.
There's another function that lets you determine the sort of script found in a transaction:
wally_scriptpubkey_get_type
— Determine a transaction's script type.
Then there are a slew of functions that create scriptPubKey
from bytes, scriptSig
from signatures, and Witnesses from bytes or signatures.
wally_script_push_from_bytes
wally_scriptpubkey_csv_2of2_then_1_from_bytes
wally_scriptpubkey_csv_2of3_then_2_from_bytes
wally_scriptpubkey_multisig_from_bytes
wally_scriptpubkey_op_return_from_bytes
wally_scriptpubkey_p2pkh_from_bytes
wally_scriptpubkey_p2sh_from_bytes
wally_scriptsig_multisig_from_bytes
wally_scriptsig_p2pkh_from_der
wally_scriptsig_p2pkh_from_sig
wally_witness_multisig_from_bytes
wally_witness_p2wpkh_from_der
wally_witness_p2wpkh_from_sig
wally_witness_program_from_bytes
We also just barely touched upon the functions that can be used to create and convert functions in §17.5.
There are numerous informational functions, some of the more interesting of which are:
wally_tx_get_length
wally_tx_get_total_output_satoshi
wally_tx_get_weight
There also are functions that affect a wally_tx
, a wally_tx_input
, a wally_tx_output
, or a wally_tx_witness_stack
and that create signatures.
Libwally can be compiled to be used with Blockstream's Elements, which includes access to its assets functions.
There is much more that you can do with Libwally, more than can be covered in this chapter or even listed in this section. Notably, you can perform cryptographic functions, encode private keys, build complete transactions, and use Elements. The Libwally docs are the place to go for more information, though as of this writing they are both limited and out-of-date. The Libwally header files are a backup if the docs are incomplete or wrong.
Finish learning about "Programming Bitcoin with Libwally" in §17.7: Integrating Libwally and Bitcoin-CLI.