def mine(a): func = inspect.currentframe().f_back.f_code logging.info("Starting to mine") # See if other blockchains exist blockchain = consensus() if not blockchain: logging.info("Didn't receive a blockchain from anyone and need to make one") # We didn't find one, need to make one variables.BLOCKCHAIN.append(Utility.create_genesis_block()) else: logging.info("Received a blockchain from the net") # See if we got any blocks from someone, save it variables.BLOCKCHAIN = blockchain message = Utility.buildmessage("blockchain", variables.BLOCKCHAIN) logging.debug("Adding {} to queue".format(message)) a.put(message) url = "http://" + variables.MINER_NODE_URL + ":" + str(variables.PORT) + "/blocks?update=" + User.public_key logging.debug("accessing url via GET") requests.get(url) logging.debug("Done accessing url") while True: last_block = variables.BLOCKCHAIN[len(variables.BLOCKCHAIN) - 1] # -get transactions url = "http://" + variables.MINER_NODE_URL + ":" + str(variables.PORT) + "/txion?update=" + User.public_key logging.debug("Getting transactions from {}".format(url)) transactions = requests.get(url).content logging.debug("Done getting transactions") variables.PENDING_TRANSACTIONS = json.loads(transactions) logging.warning("type of transaction: {}".format(type(variables.PENDING_TRANSACTIONS))) variables.PENDING_TRANSACTIONS.append({ "from": "network", "to": User.public_key, "amount": 1.0}) # mine using the updated blockchain pow, pow_output = proof_of_work(a, last_block, variables.PENDING_TRANSACTIONS) variables.PENDING_TRANSACTIONS = [] if pow: logging.info("Mined a block {}".format(pow_output)) variables.BLOCKCHAIN.append(pow_output) else: logging.info("Consensus returned a blockchain {}".format(pow_output)) variables.BLOCKCHAIN = pow_output logging.debug("Adding that blockchain to the Queue") a.put(["mine", variables.BLOCKCHAIN]) url = "http://" + variables.MINER_NODE_URL + ":" + str(variables.PORT) + "/blocks?update=" + User.public_key logging.debug("accessing url via GET") requests.get(url) logging.debug("Done accessing url")
def get_blocks(): func = inspect.currentframe().f_back.f_code ip = request.remote_addr logging.info("/blocks accessed from {} via {}".format(ip, request.method)) if request.method == 'POST': if str(ip) != "127.0.0.1" and ip not in variables.PEER_NODES: logging.debug("We didn't know that IP, adding it to Q") message = Utility.buildmessage("ip", ip) logging.debug("message: {}".format(message)) q.put(message) # Load current blockchain. Only you should update your blockchain qfrom = "other" if request.args.get("update") == User.public_key: logging.debug("update was from our public, we updated our blockchain") qget = q.get() logging.debug("qget is {}".format(qget)) qfrom = qget[0] variables.BLOCKCHAIN = qget[1] logging.info("Done updating our blockchain") return "200" else: chain_to_send = variables.BLOCKCHAIN logging.debug("Chain to send:{}".format(chain_to_send)) logging.debug( "request was not from us, we need to give them our blockchain") # Converts our blocks into dictionaries so we can send them as json objects later chain_to_send_json = [] for block in chain_to_send: logging.debug("block to send TYPE:{} details:{}".format( type(block), block)) try: chain_to_send_json.append(block.exportjson()) except AttributeError: logging.error("This is not a block {}".format(block)) # Send our chain to whomever requested it chain_to_send = json.dumps(chain_to_send_json) logging.debug("Sending {}".format(chain_to_send)) logging.info("Done sending out our blockchain") return chain_to_send