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’}
うーん、なるほどな〜 というところか…