How to Implement Bitcoin Keys and Addresses in Python?

Leave a Reply

To leave a comment, please Login or Register

Comments (1)

Mansoor Ahmed Selected

Mansoor Ahmed

7 months ago
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.

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