run.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. from flask import Flask, jsonify, request
  2. from uuid import uuid4
  3. from blockchain import Blockchain
  4. app = Flask(__name__)
  5. # Generate a unique address for this node
  6. node_identifier = str(uuid4()).replace('-', '')
  7. # Instantiate the blockchain
  8. blockchain = Blockchain()
  9. @app.route('/mine', methods=['GET'])
  10. def mine():
  11. # We run the proof of work algorithm to get the next proof...
  12. last_block = blockchain.last_block
  13. last_proof = last_block['proof']
  14. proof = blockchain.proof_of_work(last_proof)
  15. # We must receive a reward for finding the proof.
  16. # The sender is "0" to signify that this node has mined a new coin.
  17. blockchain.new_transaction(
  18. sender="0",
  19. recipient=node_identifier,
  20. amount=1,
  21. )
  22. # Forge the new Block by adding it to the chain
  23. previous_hash = blockchain.hash(last_block)
  24. block = blockchain.new_block(proof, previous_hash)
  25. response = {
  26. 'message': "New Block Forged",
  27. 'index': block['index'],
  28. 'transactions': block['transactions'],
  29. 'proof': block['proof'],
  30. 'previous_hash': block['previous_hash'],
  31. }
  32. return jsonify(response), 200
  33. @app.route('/transactions/new', methods=['POST'])
  34. def new_transaction():
  35. values = request.get_json()
  36. # Check that the required fields are in the POST'ed data
  37. required = ['sender', 'recipient', 'amount']
  38. if not all(k in values for k in required):
  39. return 'Missing values', 400
  40. # Create a new Transaction
  41. index = blockchain.new_transaction(values['sender'], values['recipient'], values['amount'])
  42. response = {'message': f'Transaction will be added to Block {index}'}
  43. return jsonify(response), 201
  44. @app.route('/chain', methods=['GET'])
  45. def full_chain():
  46. response = {
  47. 'chain': blockchain.chain,
  48. 'length': len(blockchain.chain),
  49. }
  50. return jsonify(response), 200
  51. @app.route('/nodes/register', methods=['POST'])
  52. def register_nodes():
  53. values = request.get_json()
  54. nodes = values.get('nodes')
  55. if nodes is None:
  56. return "Error: Please supply a valid list of nodes", 400
  57. for node in nodes:
  58. blockchain.register_node(node)
  59. response = {
  60. 'message': 'New nodes have been added',
  61. 'total_nodes': list(blockchain.nodes),
  62. }
  63. return jsonify(response), 201
  64. @app.route('/nodes/resolve', methods=['GET'])
  65. def consensus():
  66. replaced = blockchain.resolve_conflicts()
  67. if replaced:
  68. response = {
  69. 'message': 'Our chain was replaced',
  70. 'new_chain': blockchain.chain
  71. }
  72. else:
  73. response = {
  74. 'message': 'Our chain is authoritative',
  75. 'chain': blockchain.chain
  76. }
  77. return jsonify(response), 200
  78. @app.route('/chain/remove', methods=['POST'])
  79. def remove_block():
  80. values = request.get_json()
  81. if not all(k in values for k in ['index']):
  82. return 'Missing values', 400
  83. index = int(values['index'])
  84. blockchain.remove_block(index)
  85. response = {'message': f'Block {index} has been removed.',
  86. 'chain': blockchain.chain}
  87. return jsonify(response), 200
  88. if __name__ == '__main__':
  89. from argparse import ArgumentParser
  90. parser = ArgumentParser()
  91. parser.add_argument('-p', '--port', default=5000, type=int, help='port to listen on')
  92. args = parser.parse_args()
  93. port = args.port
  94. app.run(host='0.0.0.0', port=port)