• python 区块链程序


    python 区块链程序

    学习了:https://mp.weixin.qq.com/s?__biz=MzAxODcyNjEzNQ==&mid=2247484921&idx=1&sn=fd7a0b10fce7b5d78c477438a0c7040e&pass_ticket=VRQ4Gl2qVWVdx9L7zKnwzmZ%2F3afkWrOb1mO8UAgklOnyOh1LnDAzTkLvyduPgzWb

    进行postman的post方法提交的时候,注意选择Body > raw 选择JSON(application/json)

    pip 进行install的时候选择国内的源;

     测试的时候使用pipenv 没有生效,后来改为修改文件,重写文件,然后启动两次;

    源文件:

    import hashlib
    import json
    from time import time
    from uuid import uuid4
    from flask import Flask, jsonify, request
    from urllib.parse import urlparse
    import requests
    
    
    class Blockchain(object):
        def __init__(self):
            self.chain = []
            self.current_transactions = []
            self.new_block(previous_hash=1, proof=None)
            self.nodes = set()
    
        def register_node(self, address):
            parsed_url = urlparse(address)
            self.nodes.add(parsed_url.netloc)
    
        def valid_chain(self, chain):
            last_block = chain[0]
            current_index = 1
            while current_index < len(chain):
                block = chain[current_index]
                print(f'{last_block}')
                print(f'{block}')
                print('
    ---------------
    ')
                if block['previous_hash'] != self.hash(last_block):
                    return False
                if not self.valid_proof(last_block['proof'], block['proof']):
                    return False
                last_block = block
                current_index += 1
            return True
    
        def resolve_conflicts(self):
            neighbours = self.nodes
            new_chain = None
            max_length = len(self.chain)
            for node in neighbours:
                response = requests.get(f'http://{node}/chain')
                if response.status_code == 200:
                    length = response.json()['length']
                    chain = response.json()['chain']
                    if length > max_length and self.valid_chain(chain):
                        max_length = length
                        new_chain = chain
            if new_chain:
                self.chain = new_chain
                return True
            return False
    
        def new_block(self, proof, previous_hash=None):
            block = {
                'index': len(self.chain) + 1,
                'timestamp': time(),
                'transactions': self.current_transactions,
                'proof': proof,
                'previous_hash': previous_hash or self.hash(self.chain[-1])
            }
            self.current_transactions = []
            self.chain.append(block)
            return block
    
        def new_transaction(self, sender, recipient, amount):
            self.current_transactions.append({
                'sender': sender,
                'recipient': recipient,
                'amount': amount
            })
            return self.last_block['index'] + 1
    
        @staticmethod
        def hash(block):
            block_string = json.dumps(block, sort_keys=True).encode()
            return hashlib.sha256(block_string).hexdigest()
    
        @property
        def last_block(self):
            return self.chain[-1]
    
        def proof_of_work(self, last_proof):
            proof = 0
            while self.valid_proof(last_proof, proof) is False:
                proof += 1
            return proof
    
        @staticmethod
        def valid_proof(last_proof, proof):
            guess = f'{last_proof}{proof}'.encode()
            guess_hash = hashlib.sha256(guess).hexdigest()
            return guess_hash[:4] == "0000"
    
    
    app = Flask(__name__)
    node_identifier = str(uuid4()).replace('-', '')
    blockchain = Blockchain()
    
    
    @app.route('/mine', methods=['GET'])
    def mine():
        last_block = blockchain.last_block
        last_proof = last_block['proof']
        proof = blockchain.proof_of_work(last_proof)
        blockchain.new_transaction(
            sender="0",
            recipient=node_identifier,
            amount=1
        )
        block = blockchain.new_block(proof)
        response = {
            'message': "New Block Forged",
            'index': block['index'],
            'transactions': block['transactions'],
            'proof': block['proof'],
            'previous_hash': block['previous_hash']
        }
        return jsonify(response), 200
    
    
    @app.route('/transactions/new', methods=['POST'])
    def new_transactions():
        values = request.get_json()
        print('*' * 20, values)
        required = ['sender', 'recipient', 'amount']
        if not all(k in values for k in required):
            return "Missing Values", 400
        index = blockchain.new_transaction(values['sender'], values['recipient'], values['amount'])
        response = {'message': f'Transaction will be added to Block{index}'}
        return jsonify(response), 201
    
    
    @app.route('/chain', methods=['GET'])
    def full_chain():
        response = {
            'chain': blockchain.chain,
            'length': len(blockchain.chain)
        }
        return jsonify(response), 200
    
    
    @app.route('/nodes/register', methods=['POST'])
    def register_nodes():
        values = request.get_json()
        nodes = values.get('nodes')
        if nodes is None:
            return "Error: Please supply a valid list of nodes", 400
        for node in nodes:
            blockchain.register_node(node)
        response = {
            'message': 'New nodes have been added',
            'total_nodes': list(blockchain.nodes)
        }
        return jsonify(response), 201
    
    @app.route('/nodes/resolve', methods=['GET'])
    def consensus():
        replaced = blockchain.resolve_conflicts()
        if replaced:
            response = {
                'message': 'Our chain was replaced',
                'new_chain': blockchain.chain
            }
        else:
            response = {
                'message': 'Our chain is authoritative',
                'chain': blockchain.chain
            }
        return jsonify(response), 200
    
    if __name__ == '__main__':
        app.run('0.0.0.0', port=5001)
  • 相关阅读:
    Flex上传文件报“Error #2038”
    AMQ9558
    perl 运算符
    linux gdm 远程桌面访问
    perl 捕获变量
    android apk嵌套 从一个apk启动另外一个apk
    apk调用另一个apk
    ORA-01591 锁被未决分布式事务处理
    jQuery事件控制点击内容下拉
    作业还是作孽?——Leo鉴书79
  • 原文地址:https://www.cnblogs.com/stono/p/8641292.html
Copyright © 2020-2023  润新知