예제 #1
0
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))
예제 #2
0
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()