Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/kigawas/minichain
Mini blockchain in Python
https://github.com/kigawas/minichain
bitcoin blockchain cryptocurrency ethereum python3
Last synced: 19 days ago
JSON representation
Mini blockchain in Python
- Host: GitHub
- URL: https://github.com/kigawas/minichain
- Owner: kigawas
- License: mit
- Created: 2018-04-27T12:04:23.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2023-03-07T20:58:55.000Z (over 1 year ago)
- Last Synced: 2024-10-18T15:08:01.421Z (29 days ago)
- Topics: bitcoin, blockchain, cryptocurrency, ethereum, python3
- Language: Python
- Homepage: https://kigawas.me/minichain/
- Size: 384 KB
- Stars: 12
- Watchers: 2
- Forks: 5
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# minichain
[![License](https://img.shields.io/github/license/kigawas/minichain.svg)](https://github.com/kigawas/minichain)
[![CI](https://img.shields.io/github/workflow/status/kigawas/minichain/Build)](https://github.com/kigawas/minichain/actions)
[![Codecov](https://img.shields.io/codecov/c/github/kigawas/minichain.svg)](https://codecov.io/gh/kigawas/minichain)- Using the freshest Python 3 syntax
- UTXO model
- Nakamoto consensus, or PoW
- P2P part is powered by `asyncio` and [`kademlia`](https://github.com/bmuller/kademlia)
- Elliptic curve part is powered by [`coincurve`](https://github.com/ofek/coincurve)## How to run
Install dependencies first by running `poetry install`.
Open 3 terminals and run separately:
```bash
python -m chain 8999 --mine --debug # block time is around 5s
python -m chain 9000 -b 127.0.0.1 8999 --debug # no mining
python -m chain 9001 -b 127.0.0.1 9000 --debug --mine # connecting second node
```## How to implement
### Find peers
This repo is leveraging [Kademlia algorithm](https://github.com/bmuller/kademlia) for finding peers via UDP and syncing blockchain via TCP.
You can create a UDP server and a TCP server listening at the **same port** to simplify the logic. When it's found peers by Kademlia, our node just directly connects to that IP and port to start syncing blockchain data.
### Sync blocks
A simple example about syncing the latest block:
1. Sending `REQUEST_LATEST_BLOCK` message to a peer or peers.
2. When receiving `REQUEST_LATEST_BLOCK`, send back the message `RECEIVE_LATEST_BLOCK` with block data.
3. When receiving `RECEIVE_LATEST_BLOCK`:
1. Check the received block is valid or not;
2. If valid, add it to our blockchain and broadcast it to peers;
3. Else, check if the block is ahead;
1. If ahead, sending `REQUEST_BLOCKCHAIN` to peers and wait for the incoming blockchain data.
2. Else, which means our blockchain is the freshest, do nothing.For more details, check the [`p2p.py`](https://github.com/kigawas/minichain/blob/master/chain/p2p.py) code. The logic is simple, but more powerful protocols (like log replication of Raft protocol) are based on the simple ideas behind the implementation here.
## Reference
Go check [this](https://blockchaindemo.io/) and [this](https://coindemo.io/) to learn the basics and stay tuned with this repo!