请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

json 序列化不了

https://img1.sycdn.imooc.com//szimg/5b1415920001655012880731.jpg

# 一个区块的基本结构
# {
#     "index": 0,
#     "timestamp": "",
#     "transactions" : [
#          {
#            "sender": "",
#             "recipient": "",
#             "amount": 5
#          }
#     ],
#     "proof": "",
#     "previous_hash": ""
# }

import hashlib
import json
from time import time
from uuid import uuid4

from flask import Flask, request
from flask.json import jsonify


class Blockchain:

    def __init__(self):
        # 定义一个区块链
        self.chain = []
        # 定义一个交易信息
        self.current_transactions = []
        # 定义一个创世区块
        self.new_block(proof=100, previous_hash=1)

    # 新建一个区块
    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.last_block)
        }
        self.current_transactions = []
        self.chain.append(block)
        return block

    # 新建交易记录(交易的发送者,交易的接收者,交易的金额)
    def new_transaction(self, sender, recipient, amount) -> int:
        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)

    # 获取区块链里面最后一个块
    @property
    def last_block(self):
        return self.chain[-1]

    # 工作量证明
    def proof_of_work(self, last_proof: int) -> int:
        proof = 0
        while self.valid_proof(last_proof, proof) is False:
            proof += 1
        print(proof)
        return proof

    # 挖矿动作
    @staticmethod
    def valid_proof(last_proof: int, proof: int) -> bool:
        guess = f'{last_proof}{proof}'.encode()
        guess_hash = hashlib.sha256(guess).hexdigest()
        print(guess_hash)
        return guess_hash[0:4] == "0000"


# 节点之间的通讯
app = Flask(__name__)
blockchain = Blockchain()
# 生成一个uuid给自己做交易名称
node_identifier = str(uuid4()).replace('-', '')


# 测试通讯
@app.route('/index', methods=['GET'])
def index():
    return 'Hello BlockChain'


# 接收交易信息请求
@app.route('/transactions/new', methods=['POST'])
def new_transactions():
    values = request.get_json()
    required = ['sender', 'recipient', 'amount']
    if values is None:
        return 'Missing values', 400
    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('/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, None)
    response = {
        'message': 'New Block Forged',
        'block': block['index'],
        'transactions': block['transactions'],
        'proof': block['proof'],
        'previous_hash': block['previous_hash']
    }
    return jsonify(response), 200


# 返回整个区块链信息
@app.route('/chain', methods=['GET'])
def full_chain():
    response = {
        'chain': blockchain.chain,
        'length': len(blockchain.chain)
    }
    return jsonify(response), 200


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)


正在回答 回答被采纳积分+3

1回答

Tiny 2018-06-04 12:40:42

引入包错了: 应该是: from flask import Flask, jsonify, request

0 回复 有任何疑惑可以回复我~
  • 提问者 带娃儿先走 #1
    重新引入了包也是报这个异常,难道是Python版本问题吗,我是3.7版本
    回复 有任何疑惑可以回复我~ 2018-06-04 21:03:30

相似问题

登录后可查看更多问答,登录/注册

问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信