How to mine Bitcoin using Python?

Bitcoin is the latest trend in the cryptocurrency world which aims to disrupt the centralized banking system of the world by making it decentralized. Before we jump into the world of crypto-currency we need to understand what is Bitcoin and how to mine with python? If your system is old or python runs slower than other languages on your local machine, then you can read this listicle about “5 Tips and Tricks to speed up your Python Programs” and then continue on with this article.

A bitcoin is an online form of currency that was created in January of 2009 by a mysterious man who goes by the pseudonym “Satoshi Nakamoto”. The whitepaper can be found here. The identity of the person is a mystery to date and Bitcoin actually offers a lower transaction fee than a traditional payment system for even a large amount of money and all you need to send someone money is their wallet address.

There are no physical coins lying around with the name bitcoin on them but the whole thing is virtual which is maintained on a public ledger to which everyone has equal access. All the transactions are verified with a huge amount of computing power and they are not issued by any bank. They are truly decentralized and secure at the same time. Bitcoin is also commonly known as “BTC”.

The key points to remember are :

  • Bitcoin was launched in 2009 and is the largest cryptocurrency by volume in the world by market cap.
  • Bitcoin is traded, created, distributed, and stored using blockchain technology.
  • Bitcoin prices have been known to be very volatile with massive growth and crashes.
  • It was the first cryptocurrency to meet such popularity and later it inspired a list of other cryptocurrencies or also known as “Altcoins”

Analyzing Bitcoin

The Bitcoin ecosystem is made out of nodes or miners who execute the bitcoin code and store it in the blockchain. Each blockchain contains transactions in them and everyone has the whole blockchain to them, thus they can access and see the new blocks being added to the system and it is tamper-proof.

Anyone can view the transactions happening right now and there are over 12000 nodes as of January 2021 and this number keeps on growing every day. Bitcoins are stored in wallets with their own address and it is managed using the public key and the private key which uses encryption to generate long length of strings. The Public key can be thought of as a bank account number or a UPI ID. It is public and telling it to others will do no harm to you. On the other hand, your private key is like your ATM pin or the UPI ID pin. You should never disclose it to anyone else and keep it private at all times.

What is Peer to Peer Technology?

Bitcoin was perhaps the first digital currency to utilize peer-to-peer technology to create an instant payment system. Any individual with sufficient computing power can become a miner and they process transactions on the blocks. They are motivated by the rewards which is the release of a new bitcoin and transaction fees which is paid in bitcoin.

The miners together make the decentralized authority that upholds the credibility of the whole bitcoin network. It also helps to beat inflation as there will never be more than 21 million bitcoin and by the end of January 2021, 18,614,806 bitcoins have already been mined.  Central banking systems can print more currency whenever they want to so that they can match the rate of the growth in goods but Bitcoins work according to the algorithm and it sets the release date ahead of the time to effectively deal with inflation.

What is Bitcoin Mining?

Mining is the process by which bitcoins are gradually released to become a part of the circulation. Mining generally refers to solving a computationally tough mathematical puzzle. Bitcoin Mining is the process of adding verified transactions to the chain and the reward gets halved every 210,000 blocks that are mined. In 2009 the reward was 50 bitcoins per block and after the third halving on 11th MAy 2020, the reward is now down to 6.25 bitcoins.

Any hardware specification can be used for mining but some are just more efficient than the others like ASIC of Application Specific Integrated Circuits or even GPU which outperform the CPU and mine faster than a CPU. One bitcoin can be divided up to 8 decimal places and the smallest unit is known as one Satoshi. If the miners do accept the change, then it can be further divided up into more decimal places.

A Bitcoin Transaction has a miner’s fee attached with it and every transaction is added to a new blockchain and then the next block gets created with the correct hash. With the public key of the sender, the message can be decrypted, and hence never share your private key with anyone.

How to Mine Bitcoin?

Mining is achieved by finding the correct hash which has a preset number of zeros in the beginning and it also signifies the difficulty level. We begin with importing a necessary library.

from bitcoin import *

If you do not have the package, then you can install it via pip :

pip install bitcoin

After that, we need to create our Private and public key, along with our wallet address. We can do that with the following code.

#Generate private key
my_private_key = random_key()
#display private key
print("Private Key: %sn" % my_private_key)
#Generate public key
my_public_key = privtopub(my_private_key)
print("Public Key: %sn" % my_public_key)
#Create a bitcoin address
my_bitcoin_address = pubtoaddr(my_public_key)
print("Bitcoin Address: %sn" % my_bitcoin_address)

Output :

Private Key: 82bd4291ebaa6508001600da1fea067f4b63998ed85d996aed41df944c3762be
Public Key: 04f85fa7c009dba8d1e6b7229949116f03cb3de0dfaf4d6ef3e6320a278dfc8dd91baf058fcafe0b5fbf94d09d79412c629d19cc9debceb1676d3c6c794630943d
Bitcoin Address: 1FtaFRNgxVqq4s4szhC74EZkJyShmeH5AU

Now we move onto the computational part where we are going to use SHA256 encryption to find the correct hash. We import the library and then do a test run of what SHA256 actually means.

from hashlib import sha256
sha256("ABC".encode("ascii")).hexdigest()

Output :

b5d4045c3f466fa91fe2cc6abe79232a1a57cdf104f7a26e716e0a1e2789df78

When you execute the same code, you will get the same hash code for a particular string and hence it always gives a definite output for a definite input. The length of the hash is 64 and each digit is hexadecimal, which makes it equal to 4 bits and hence the whole number is actually 256 bits and that is why it is also known as SHA256.

Bitcoin follows a protocol that the first ‘n’ number of digits of the has must be zero. Currently the value of ‘n’ stands at 20 but I am gonna show it to you using smaller ‘n’ so that the code actually finishes execution in linear time. The text over which you would apply SHA256 is made up of the Block number, transition details, previous hash value, and since all the 3 previous values are constant for a block and cannot be changed, a new value called ‘Nonce’ is introduced. Our goal is to find the Nonce value so that the hash of the block produces the required number of zeros in the beginning according to the protocol.

We will begin coding by taking a dummy transaction along with the latest block number and the previous hash value. We will begin with 4 zeros in the beginning and work our way up and you will realize why bitcoin mining is a tough job. We begin by defining a SHA256 and a mine Function which we would call.

def SHA256(text):
  return sha256(text.encode("ascii")).hexdigest()
MAX_NONCE=10000000        # You can also use a while loop to run infinitely with no upper limit
def mine(block_number,transaction,previous_hash,prefix_zeros):
  prefix_str='0'*prefix_zeros
  for nonce in range(MAX_NONCE):
    text= str(block_number) + transaction + previous_hash + str(nonce)
    hash = SHA256(text)
    # print(hash)
    if hash.startswith(prefix_str):
      print("Bitcoin mined with nonce value :",nonce)
      return hash
  print("Could not find a hash in the given range of upto", MAX_NONCE)

Then we provide the required details and start mining with 4 zeros at the beginning of the hash.

transactions='''
A->B->10
B->c->5
'''
difficulty = 4
import time as t
begin=t.time()
new_hash = mine(684260,transactions,"000000000000000000006bd3d6ef94d8a01de84e171d3553534783b128f06aad",difficulty)
print("Hash value : ",new_hash)
time_taken=t.time()- begin
print("The mining process took ",time_taken,"seconds")

Output :

Bitcoin mined with nonce value: 36674
Hash value :  000086ae35230f32b08e9da254bd7ba1b351f11d40bde27a7ebd5e7ec9568f8d
The mining process took  0.08681821823120117 seconds

If we change the difficulty value by even 1, hence it will be 5, the output will be.

Output :

Bitcoin mined with nonce value : 2387325
Hash value :  00000f5254db00fa0dde976d53bb39c11f9350292949493943a90610d62c1a5e
The mining process took  4.895745515823364 seconds

Hence you can see the drastic change in the time taken by the same code when the difficulty is increased from 4 to 5 and it only keeps on increasing exponentially. Thus that is the main reason why mining one bitcoin takes so much energy and computational power. If that was not enough, you have to be the first one to find the hash or you will not be rewarded. So you are also competing with all the other miners out there and this whole system works on the ‘PoW’ or ‘Proof of Work concept’.