def handle_message(peers, server_port, message,s_sender): global bc global PORT global transction_tbd print('Received message :') print(message) message_type = message['type'] if message_type == 'register_miner': port = message['port'] print('Registering miner N° {} with port {}'.format(len(peers.keys()), port)) #if port in peers: #ps = peers[port] #else: #send infotmation about the network to the new miner ps = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ps.connect((HOST, port)) send_peers_port(ps, list(peers.keys())) ps.close() ps2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ps2.connect((HOST, port)) send_blockchain(ps2,bc.describe()) peers[port] = ps #no need for peer_socket !!! we crreate it each time for peer_port, peer_socket in peers.items(): if peer_port != port and peer_port != server_port: pss = socket.socket(socket.AF_INET, socket.SOCK_STREAM) pss.connect((HOST, peer_port)) send_new_peer(pss, port) elif message_type == 'register_peers': port = message['port'] for peer_port in port: if peer_port != server_port and peer_port not in peers: peers[peer_port]=None print(f"Peer {peer_port} added") elif message_type == 'new_peer': port = message['port'] peers[port] = None print(f"Peer {port} added to peers") elif message_type == 'show-blockchain': print(bc.toString()) elif message_type == 'make-transaction': amount = message['amount'] fromWallet = message['fromWallet'] toWallet = message['toWallet'] timestamp = message['timestamp'] transaction_tmp = Transaction(timestamp=timestamp, fromWallet=int(fromWallet), toWallet=int(toWallet), transactionAmount=float(amount)) transaction_in = False for i in transction_tbd: if i.hash()== transaction_tmp.hash(): transaction_in = True if transaction_in == False: transction_tbd.append(transaction_tmp) #we check if we have more than 3 transactions to be done: if(len(transction_tbd) >= 2 ): # maybe we need lock mine_list = transction_tbd[-2:] transction_tbd = transction_tbd[:-2] #threading.Thread(target=mineBlock([Transaction(time(), fromWallet, toWallet, amount)]), ).start() mine_list_tmp = [] for transaction_mine in mine_list: if bc.validTransaction(transaction_mine): mine_list_tmp.append(transaction_mine) if (len(mine_list_tmp) > 0): mineBlock(mine_list_tmp) for peer_port, peer_socket in peers.items(): if peer_port != server_port: ps = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ps.connect((HOST, peer_port)) print('Broadcasting our blockchain') print(bc.toString()) broadcast_blockchain(ps, bc.describe(),server_port) ## we add the transaction elif message_type == "init_bc": received_bc = message["blockchain"] bc = BlockChain(chain=received_bc['chain']) elif message_type == 'broadcast_blockchain': sender_port = message["sender_port"] received_bc = message['blockchain'] received_bc = BlockChain(chain=[Block(index=block['index'], nonce=block['nonce'], hash=block['hash'], previousHash=block['previousHash'], transactions=[Transaction(timestamp=transaction['timestamp'], fromWallet=transaction['fromWallet'], toWallet=transaction['toWallet'], transactionAmount=transaction['transactionAmount']) for transaction in block['transactions']]) for block in received_bc['chain']]) if(received_bc.hash() !=bc.hash()): if received_bc.valid_chain() and len(received_bc.chain) > len(bc.chain): print('New blockchain') print(received_bc.toString()) bc = received_bc for peer_port, peer_socket in peers.items(): if peer_port != server_port and peer_port!= sender_port: print("Broadcast to : ",peer_port) pss = socket.socket(socket.AF_INET, socket.SOCK_STREAM) pss.connect((HOST, peer_port)) broadcast_blockchain(pss, bc.describe(),server_port) else: print("Blockchain already updated") elif message_type == 'check-transaction': id_transaction = message['id'] #transaction_tmp = Transaction(timestamp=timestamp, fromWallet=int(fromWallet), toWallet=int(toWallet), transactionAmount=float(amount)) block = bc.getBlock(id_transaction) block.merkleTree() block.calculateMerkleRoot() if block is None: proof = MerkleProof(not_found=True) else: transaction_position = block.transactionIndex(id_transaction) block_merkletree = block.merkletree proof = MerkleProof(root=block.merkleRoot, hashList=block_merkletree.get_proof(transaction_position)) print('Proof:', proof.describe()) print('In Merkle Tree ? ', proof.inMerkleTree(transaction_position))
from blockchain import BlockChain myChain = BlockChain() myChain.addBlock("first block") myChain.addBlock("second block") myChain.addBlock("third block") myChain.addBlock("forth block") for block in myChain.getBlocks(): print block.getData() print myChain.getBlock(1).getData()