The most significant and important bitcoin library in Python is pybitcointools by Vitalik Buterin. Pybitcointools is used as a Python library for Crypto coins signatures and transactions. We can make sure its installation by using
pip install cryptos
This Library helps and supports making and pushing raw transactions for:
Bitcoin mainnet
Bitcoin testnet
Bitcoin Cash mainnet (with replay protection)
Bitcoin Cash testnet (with replay protection)
Litecoin mainnet
Litecoin testnet
Dash mainnet
Dash testnet
Dogecoin mainnet
Bitcoin Gold mainnet (with replay protection)
Description
There are some advantages and disadvantages of the pybitcointools library.
Advantages:
Methods have an easy and simple interface, inputting and outputting in standard formats
Classes for different coins with a common interface
Numerous functions may be taken out and used individually
Supports binary, hex and base58
Transaction deserialization format almost compatible with BitcoinJS
Electrum and BIP0032 support
Generate and publish a transaction all in a single command-line instruction with full control
Includes non-bitcoin-specific conversion and JSON utilities
Disadvantages:
This has not a full node, no idea what blocks are
Relies on centralized explorers for blockchain operations
Bitcoin’s elliptic curve equation
y2 mod p = (x3 + 7) mod p
In this equation, p is a prime constant and the value is 2256 – 232 – 29 – 28 – 27 – 26 – 24 – 1
The public key is K = k * G
Where G is the generation point on an elliptic curve specified in Bitcoin. The k is the private key, and the calculated public key is also a point on the curve, which is the public key point (x, y ). The ordinary public key is directly 04xy. In this way, ‘04’, the hexadecimal of x and the hexadecimal of y, are directly put together
How to compress the public key
As the public key is a point on the elliptic curve. Only record x and y may be calculated by equation. Y in the real number field2 would get a pair of opposite solutions. By a finite field based on the prime power p, y2 two solutions with different parities would be obtained. We need to mark it to know which y value of the initial K point is.
Suppose that the public key coordinates are (x, y), the common public key address is 04xy, and the compressed public key address is 02x or 03x.
Example: Key and address generation and formatting with the help of pybitcointools library
We use the pybitcointools library that is imported as bitcoin to generate and display keys and addresses in various formats.
pip install cryptos
This Library helps and supports making and pushing raw transactions for:
Bitcoin mainnet
Bitcoin testnet
Bitcoin Cash mainnet (with replay protection)
Bitcoin Cash testnet (with replay protection)
Litecoin mainnet
Litecoin testnet
Dash mainnet
Dash testnet
Dogecoin mainnet
Bitcoin Gold mainnet (with replay protection)
Description
There are some advantages and disadvantages of the pybitcointools library.
Advantages:
Methods have an easy and simple interface, inputting and outputting in standard formats
Classes for different coins with a common interface
Numerous functions may be taken out and used individually
Supports binary, hex and base58
Transaction deserialization format almost compatible with BitcoinJS
Electrum and BIP0032 support
Generate and publish a transaction all in a single command-line instruction with full control
Includes non-bitcoin-specific conversion and JSON utilities
Disadvantages:
This has not a full node, no idea what blocks are
Relies on centralized explorers for blockchain operations
Bitcoin’s elliptic curve equation
y2 mod p = (x3 + 7) mod p
In this equation, p is a prime constant and the value is 2256 – 232 – 29 – 28 – 27 – 26 – 24 – 1
The public key is K = k * G
Where G is the generation point on an elliptic curve specified in Bitcoin. The k is the private key, and the calculated public key is also a point on the curve, which is the public key point (x, y ). The ordinary public key is directly 04xy. In this way, ‘04’, the hexadecimal of x and the hexadecimal of y, are directly put together
How to compress the public key
As the public key is a point on the elliptic curve. Only record x and y may be calculated by equation. Y in the real number field2 would get a pair of opposite solutions. By a finite field based on the prime power p, y2 two solutions with different parities would be obtained. We need to mark it to know which y value of the initial K point is.
Suppose that the public key coordinates are (x, y), the common public key address is 04xy, and the compressed public key address is 02x or 03x.
Example: Key and address generation and formatting with the help of pybitcointools library
We use the pybitcointools library that is imported as bitcoin to generate and display keys and addresses in various formats.
import bitcoin
# Generate a random private key
valid_private_key = False
while not valid_private_key:
private_key = bitcoin.random_key()
decoded_private_key = bitcoin.decode_privkey(private_key, 'hex')
valid_private_key = 0 < decoded_private_key < bitcoin.N
print "Private Key (hex) is: ", private_key
print "Private Key (decimal) is: ", decoded_private_key
# Convert a private key to WIF format
wif_encoded_private_key = bitcoin.encode_privkey(decoded_private_key, 'wif')
print "Private Key (WIF) is: ", wif_encoded_private_key
# Add suffix 01 to show a compressed private key
compressed_private_key = private_key + '01'
print "Private Key Compressed (hex) is: ", compressed_private_key
# Create a WIF format from the compressed private key (WIF-compressed)
wif_compressed_private_key = bitcoin.encode_privkey(
bitcoin.decode_privkey(compressed_private_key, 'hex'), 'wif')
print "Private Key (WIF-Compressed) is: ", wif_compressed_private_key
# Multiply the EC generator point G by the private key to receive a public key point
public_key = bitcoin.fast_multiply(bitcoin.G, decoded_private_key)
print "Public Key (x,y) coordinates is:", public_key
# Encode as hex, prefix 04
hex_encoded_public_key = bitcoin.encode_pubkey(public_key,'hex')
print "Public Key (hex) is:", hex_encoded_public_key
# Compress public key, fix prefix depending on whether y is even or odd
(public_key_x, public_key_y) = public_key
if (public_key_y % 2) == 0:
compressed_prefix = '02'
else:
compressed_prefix = '03'
hex_compressed_public_key = compressed_prefix + bitcoin.encode(public_key_x, 16)
print "Compressed Public Key (hex) is:", hex_compressed_public_key
# Generate bitcoin address from the public key
print "Bitcoin Address (b58check) is:", bitcoin.pubkey_to_address(public_key)
print "Compressed Bitcoin Address (b58check) is:",
bitcoin.pubkey_to_address(hex_compressed_public_key)
Following Example shows the output from running this code. Running key-to-address-ecc-example.py
$ python key-to-address-ecc-example.py
Private Key (hex) is:
3aba4162c7251c891207b747840551a71939b0de081f85c4e44cf7c13e41daa6
Private Key (decimal) is:
26563230048437957592232553826663696440606756685920117476832299673293013768870
Private Key (WIF) is:
5JG9hT3beGTJuUAmCQEmNaxAuMacCTfXuw1R3FCXig23RQHMr4K
Private Key Compressed (hex) is:
3aba4162c7251c891207b747840551a71939b0de081f85c4e44cf7c13e41daa601
Private Key (WIF-Compressed) is:
KyBsPXxTuVD82av65KZkrGrWi5qLMah5SdNq6uftawDbgKa2wv6S
Public Key (x,y) coordinates are:
(41637322786646325214887832269588396900663353932545912953362782457239403430124L,
16388935128781238405526710466724741593761085120864331449066658622400339362166L)
Public Key (hex) is:
045c0de3b9c8ab18dd04e3511243ec2952002dbfadc864b9628910169d9b9b00ec↵
243bcefdd4347074d44bd7356d6a53c495737dd96295e2a9374bf5f02ebfc176
Compressed Public Key (hex) is:
025c0de3b9c8ab18dd04e3511243ec2952002dbfadc864b9628910169d9b9b00ec
Bitcoin Address (b58check) is:
1thMirt546nngXqyPEz532S8fLwbozud8
Compressed Bitcoin Address (b58check) is:
14cxpo3MBCYYWCgF74SWTdcmxipnGUsPw3