# A Python library for 'bitcoin cryptography'
<!-- markdownlint-disable MD013 -->
| | |
| --- | --- |
| Project | [](https://pypi.python.org/pypi/btclib/) [](https://github.com/btclib-org/btclib/blob/master/LICENSE) |
| Package | [](https://calver.org/) [](https://pypi.python.org/pypi/btclib/) [](https://pepy.tech/project/btclib) |
| Supported platforms | [](https://pypi.python.org/pypi/btclib/) |
| Formatting standards | [](https://github.com/PyCQA/isort) [](https://github.com/psf/black) [](<https://github.com/PyCQA/flake8>) [](<https://github.com/asottile/yesqa>) [](https://github.com/DavidAnson/markdownlint-cli2) |
| Coding standards | [](https://github.com/PyCQA/pylint) [](https://github.com/PyCQA/autoflake) [](https://github.com/asottile/pyupgrade) [](https://sourcery.ai) [](https://github.com/PyCQA/bandit) |
| Type checking | [](http://mypy-lang.org/) [](https://github.com/microsoft/pyright) |
| Documentation | [](https://btclib.readthedocs.io) [](https://github.com/PyCQA/docformatter) [](https://github.com/DanielNoord/pydocstringformatter) [](https://github.com/PyCQA/pydocstyle)|
| CI/CD | [](https://github.com/pre-commit/pre-commit) [](https://results.pre-commit.ci/latest/github/btclib-org/btclib/master) [](https://github.com/btclib-org/btclib/actions/workflows/lint.yml) [](https://github.com/btclib-org/btclib/actions/workflows/test.yml) [](https://github.com/btclib-org/btclib/actions/workflows/test-pydev.yml) [](https://coveralls.io/github/btclib-org/btclib) |
| Conversations | [](https://bbt-training.slack.com/messages/C01CCJ85AES) [](https://twitter.com/intent/follow?screen_name=btclib)|
[Browse GitHub Code Repository](https://github.com/btclib-org/btclib/)
---
<!-- markdownlint-enable MD013 -->
[btclib](https://btclib.org) is a
Python3 [type annotated](https://docs.python.org/3/library/typing.html)
library intended for teaching, learning, and using bitcoin;
the focus is on elliptic curve cryptography and bitcoin's blockchain.
It is rigorously and extensively tested: the test suite
[covers 100%](https://coveralls.io/github/btclib-org/btclib)
of the code base and reproduces results from both informal
and major reference sources.
Originally developed for the
_[Bitcoin and Blockchain Technology](https://www.ametrano.net/bbt/)_
course at the University of Milano-Bicocca,
btclib is not intended for production environments:
it is often refactored for improved clarity,
without care for backward compatibility; moreover,
some of its algorithms could be broken using side-channel attacks.
The library is not limited to the bitcon elliptic curve secp256k1;
anyway, FFI bindings to
[libsecp256k1](https://github.com/bitcoin-core/secp256k1)
(the optimized C library used by Bitcoin Core)
are available for this curve and used by default.
Included features are:
- modulo algebra functions (gcd, inverse, legendre symbol, square root)
- octets / integer / point / var_int / var_bytes helper functions
- elliptic curve class
- fast algebra implemented using Jacobian coordinates
- double scalar multiplication (Straus's algorithm, also known as
Shamir's trick)
- multi scalar multiplication (Bos-coster's algorithm)
- point simmetry solution: odd/even, low/high, and quadratic residue
- elliptic curves: SEC 1 v1 and v2, NIST, Brainpool, and
low cardinality test curves
- ECDSA signature with (transaction) DER encoding
- ECDSA signature with (message) compact encoding: standard p2pkh and
[BIP137](https://github.com/bitcoin/bips/blob/master/bip-0137.mediawiki)/[Electrum](https://electrum.org/#home)
extensions to p2wpkh and p2wpkh-p2sh
- [RFC 6979](https://tools.ietf.org/html/rfc6979) for deterministic signature
schemes
- EC Schnorr signature (according to
[BIP340](https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki)
bitcoin standardization)
- batch validation
- threshold signature (see test-suite)
- MuSig multi-signature (see test-suite)
- Borromean ring signature
- Sign-to-contract commitment
- Diffie-Hellman
- Pedersen committment
- Base58 encoding/decoding
- p2pkh/p2sh addresses and WIFs
- Bech32 encoding/decoding
- p2wpkh/p2wsh native SegWit addresses and their legacy p2sh-wrapped versions
- [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)
hierarchical deterministic key chains
- [SLIP132](https://github.com/satoshilabs/slips/blob/master/slip-0132.md)
key versions (xprv, yprv, zprv, Yprv, Zprv, tprv, uprv, vprv, and Uprv)
with corresponding mapping to
p2pkh/p2sh, p2wpkh-p2sh, p2wpkh, p2wsh-p2sh, p2wsh and p2tr addresses
- [BIP39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki)
wordlists and mnemonic for generating deterministic keys
- [Electrum](https://electrum.org/#home) standard for mnemonic
- Script encoding/decoding
- nulldata, p2pk, p2ms, p2pkh, p2sh, p2wpkh, p2wsh and p2tr ScriptPubKeys
- BlockHeader and Block data classes
- OutPoint, TxIn, TxOut, and TX data classes
- legacy, segwit_v0 and taproot transaction hash signatures
- [BIP174](https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki)
partially signed bitcoin transactions (PSBT):
PsbtIn, PbstOut, and Psbt data classes
---
To install (and/or upgrade) btclib:
```shell
python -m pip install --upgrade btclib
```
You might want to install btclib into a
python virtual environment; e.g. from the root folder:
Shell:
```shell
python -m venv venv_btclib
source ./venv_btclib/bin/activate
python -m pip install --upgrade btclib
```
Windows CMD or PowerShell:
```powershell
python -m venv venv_btclib
.\venv_btclib\Scripts\activate
python -m pip install --upgrade btclib
```
Windows Git bash shell:
```bash
python -m venv venv_btclib
cd ./venv_btclib/Scripts
. activate
cd ../..
python -m pip install --upgrade btclib
```
See [CONTRIBUTING](./CONTRIBUTING.md) if you are interested
in btclib develoment.
See [SECURITY](./SECURITY.md) if you have found a security vulnerability.