Example #1
0
def mine():
    Log.log_message(
        'blockchain.resolve_conflicts={}'.format(blockchain.resolve_conflicts),
        port)
    if blockchain.public_key is None:
        load_keys_return = load_keys()
        if load_keys_return[1] is not 201:
            return load_keys_return
    Log.log_message(
        'blockchain.resolve_conflicts={}'.format(blockchain.resolve_conflicts),
        port)
    if blockchain.resolve_conflicts:
        response = {'message': 'Resolve conflicts first, block not added!'}
        Log.log_error(409, response, port)
        return jsonify(response), 409
    block = blockchain.mine_block()
    if block != None:
        dict_block = block.to_json()
        response = {
            'message': 'Block added succesfully',
            'block': dict_block,
            'funds': blockchain.get_balance()
        }
        Log.log_status(201, response, port)
        return jsonify(response), 201
    else:
        response = {
            'message': 'Adding a block failed.',
            'wallet_set_up': wallet.public_key != None
        }
        Log.log_error(500, response, port)
        return jsonify(response), 500
Example #2
0
 def mine_block(self):
     if self.public_key == None:
         return None
     last_block = self.__chain[-1]
     hashed_block = HashUtil.hash_block(last_block)
     proof = self.proof_of_work()
     reward_transaction = Transaction('MINING', self.public_key, '',
                                      MINING_REWARD)
     copied_transactions = self.__open_transactions[:]
     for tx in copied_transactions:
         if not Wallet.verify_transaction(tx):
             return None
     copied_transactions.append(reward_transaction)
     block = Block(len(self.__chain), hashed_block, copied_transactions,
                   proof)
     self.__chain.append(block)
     self.__open_transactions = []
     self.save_data()
     for node in self.__peer_nodes:
         url = '{}/broadcast-block'.format(node)
         # Log.log_message(url, self.node_id)
         try:
             response = requests.post(url, json={'block': block.to_json()})
             Log.log_message(response, self.node_id)
             if response.status_code == 400 or response.status_code == 500:
                 print('Block declinde, needs resolving!')
             if response.status_code == 409:
                 self.resolve_conflicts = True
         except requests.exceptions.ConnectionError:
             continue
     return block
Example #3
0
def add_new_transaction():
    values = request.get_json()
    if not values:
        response = {'message': 'No data found.'}
        return jsonify(response), 400
    required_fields = ['sender', 'signature', 'recipient', 'amount']
    if not all(field in values for field in required_fields):
        response = {'message': 'Required data is missing.'}
        Log.log_error(400, response, port)
        return jsonify(response), 400
    sender = values['sender']
    signature = values['signature']
    recipient = values['recipient']
    amount = float(values['amount'])
    Log.log_message(amount, port)

    success = blockchain.add_transaction(recipient, sender, signature, amount)
    Log.log_message(success, port)
    if success:
        response = {
            'message': 'Succesfully added transaction',
            'transaction': {
                'sender': wallet.public_key,
                'recipient': recipient,
                'amount': amount,
                'signature': signature
            },
            'funds': blockchain.get_balance()
        }
        return jsonify(response), 201
    else:
        response = {'message': 'Creating a transaction failed..!'}
        Log.log_error(500, response, port)
        return jsonify(response), 500
Example #4
0
def add_node():
    values = request.get_json()
    if not values:
        response = {'message': 'No data attached.'}
        return jsonify(response), 400
    Log.log_message(values, port)
    if 'node' not in values:
        response = {'message': 'No node data attached.'}
        Log.log_error(401, response, port)
        return jsonify(response), 401
    node = values.get('node')

    blockchain.add_peer_node(node)
    response = {
        'message': 'Node added succesfully.',
        'all_nodes': blockchain.get_peer_nodes()
    }
    return jsonify(response), 201
Example #5
0
def broadcast_transaction():
    values = request.get_json()
    Log.log_message(
        'broadcast-transaction started with values{}'.format(values), port)
    if not values:
        response = {'message': 'No data found.'}
        Log.log_error('400', response, port)
        return jsonify(response), 400
    required = ['sender', 'recipient', 'amount', 'signature']
    if not all(key in values for key in required):
        response = {'message': 'Some data are missing.'}
        Log.log_error('400', response, port)
        return jsonify(response), 400
    Log.log_message('Broadcast-transaction', port)
    success = blockchain.add_transaction(values['recipient'], values['sender'],
                                         values['signature'], values['amount'],
                                         True)
    Log.log_message('Broadcast-transaction Ended', port)
    if success:
        response = {
            'message': 'Succesfully added transaction',
            'transaction': {
                'sender': values['sender'],
                'recipient': values['recipient'],
                'amount': values['amount'],
                'signature': values['signature']
            }
        }
        return jsonify(response), 201
    else:
        response = {'message': 'Creating a transaction failed..!'}
        return jsonify(response), 500
Example #6
0
    def add_peer_node(self, new_node):
        # self.__peer_nodes.add(new_node)
        # get all the peer nodes of the added node
        url = '{}/node'.format(new_node)
        try:
            response = requests.get(url)
            peer_nodes = response.json()
            for peer_node in peer_nodes['all_nodes']:
                self.__peer_nodes.add(peer_node)
        except requests.exceptions.ConnectionError:
            Log.log_error(requests.exceptions.ConnectionError,
                          'ConnectionError', self.node_id)

        Log.log_message(Misc.get_Public_IP(self.node_id), self.node_id)
        # if count == 0:
        #     try:
        #         local_http_addr = 'http://{}:{}'.format(Misc.get_Public_IP(self.node_id), self.node_id)
        #         response = requests.post(url, json={'node': local_http_addr, 'count': 1})
        #         Log.log_error(response.status_code, response, self.node_id)
        #     except requests.exceptions.ConnectionError:
        #         None

        self.__peer_nodes.add(new_node)
        self.save_data()
Example #7
0
if __name__ == '__main__':
    from argparse import ArgumentParser
    parser = ArgumentParser()
    parser.add_argument('-p', '--port', type=int, default=80)
    parser.add_argument('-n', '--nodeUrl', type=str, default='')
    parser.add_argument('-np', '--nodePort', type=str, default='')

    args = parser.parse_args()
    port = args.port
    IP_Address = Misc.get_Public_IP(port)

    if args.nodeUrl is not '':
        node_Url = args.nodeUrl
        Log.log_message(
            'A new node URL"{}" will be added at port:{}'.format(
                node_Url, port), port)
    elif args.nodePort is not '':
        print('step 1')
        node_Url = 'http://{}:{}'.format(IP_Address, args.nodePort)
        print(node_Url)
    else:
        print('No parameters were passed!')
        exit()

    url = 'http://{}:{}/node'.format(IP_Address, port)
    print('url:{}'.format(url))
    try:
        response = requests.post(url, json={'node': node_Url})
        print(response)
        if response.status_code == 400 or response.status_code == 500:
Example #8
0
@app.route('/node/<node_url>', methods=['DELETE'])
def remove_node(node_url):
    if node_url == '' or node_url == None:
        response = {'message': 'No node attached.'}
        return jsonify(response), 400
    blockchain.remove_peer_node(node_url)
    response = {
        'message': 'Node removed succesfully.',
        'all_nodes': blockchain.get_peer_nodes()
    }
    return jsonify(response), 201


@app.route('/node', methods=['GET'])
def get_node():
    nodes = blockchain.get_peer_nodes()
    response = {'all_nodes': nodes}
    return jsonify(response), 201


if __name__ == '__main__':
    from argparse import ArgumentParser
    parser = ArgumentParser()
    parser.add_argument('-p', '--port', type=int, default=3200)
    args = parser.parse_args()
    port = args.port
    Log.log_message('Server started at port:{}'.format(port), port)
    wallet = Wallet(port)
    blockchain = Blockchain(wallet.public_key, port)
    app.run(host='0.0.0.0', port=port)