import hashlib
import json
from datetime import datetime
import random
class Block:
def __init__(self, index, previous_hash, timestamp, data, validator):
self.index = index
self.previous_hash = previous_hash
self.timestamp = timestamp
self.data = data
self.validator = validator
self.hash = self.calculate_hash()
def calculate_hash(self):
block_dict = self.__dict__
if 'hash' in block_dict:
del block_dict['hash']
block_string = json.dumps(block_dict, sort_keys=True).encode()
return hashlib.sha256(block_string).hexdigest()
class Blockchain:
def __init__(self):
self.chain = [] # A list that holde the blocks of the blockchain
self.unconfirmed_data = [] # A list of new data or transactions
self.validators = {} # A dictionary where each validator is recoded
self.staked_tokens = {} # A dictionary that holds the amount of staked tokens for each validator.
self.minimum_stake = 500 # The minimum amout of tokens a validator must stake to participate in the network
self.create_genesis_block() # The genesis block is the first block in the blockchain.
def create_genesis_block(self):
genesis_block = Block(0, None, str(datetime.now()), "Genesis Block", None)
self.chain.append(genesis_block)
def last_block(self):
return self.chain[-1]
def add_data(self, new_data):
self.unconfirmed_data.append(new_data)
def add_validator(self, validator, stake):
if stake >= self.minimum_stake:
self.staked_tokens[validator] = stake
self.validators[validator] = True
else:
print(f"{validator} does not meet the minimum stake requirement.")
def select_validator(self):
total_stake = sum(self.staked_tokens.values())
selected_validator = None
while selected_validator == None:
pick = random.uniform(0, total_stake)
print(pick)
current = 0
for validator, stake in self.staked_tokens.items():
print(validator, stake)
current += stake
if current > pick:
selected_validator = validator
break
return selected_validator
def create_block(self, validator):
if not self.unconfirmed_data:
return False
last_block = self.last_block()
new_block = Block(index=last_block.index + 1,
previous_hash=last_block.hash,
timestamp=str(datetime.now()),
data=self.unconfirmed_data,
validator=validator)
self.chain.append(new_block)
self.unconfirmed_data = []
return new_block.index
def display_chain(self):
for block in self.chain:
print(f"Block {block.__dict__}")
# sample
blockchain = Blockchain()
blockchain.add_validator("A", 2000)
blockchain.add_validator("B", 50)
blockchain.add_validator("C", 650)
blockchain.add_validator("D", 30)
blockchain.add_validator("E", 100000)
blockchain.add_validator("F", 25)
blockchain.add_data("Alice send Bob 200 coin")
blockchain.add_data("Bob send Chen 2000 coin")
selected_validator = blockchain.select_validator()
print(f"Validator selected: {selected_validator}")
blockchain.create_block(selected_validator)
blockchain.display_chain()
$ python3 main.py
B does not meet the minimum stake requirement.
D does not meet the minimum stake requirement.
F does not meet the minimum stake requirement.
27576.935798973213
A 2000
C 650
E 100000
Validator selected: E
Block {‘index’: 0, ‘previous_hash’: None, ‘timestamp’: ‘2024-11-27 03:59:33.053116’, ‘data’: ‘Genesis Block’, ‘validator’: None, ‘hash’: ‘df536d1db7e82ccd6f51e244928263163cd36b9724c4fdb8df77a72923dca021’}
Block {‘index’: 1, ‘previous_hash’: ‘df536d1db7e82ccd6f51e244928263163cd36b9724c4fdb8df77a72923dca021’, ‘timestamp’: ‘2024-11-27 03:59:33.053659’, ‘data’: [‘Alice send Bob 200 coin’, ‘Bob send Chen 2000 coin’], ‘validator’: ‘E’, ‘hash’: ‘120255b4707e317e599eff7183b73e31bfc691d71ca987d8186a854c91e5d1bd’}
うーん、なるほどな〜 というところか…