Python区块链服务及API实现

Python区块链服务及API实现

下面我将创建一个完整的区块链服务,并使用Flask封装为RESTful API接口。这个实现包含区块链核心功能、工作量证明机制、交易处理、节点共识和网络同步等功能。

import hashlib
import json
import time
from uuid import uuid4
from flask import Flask, jsonify, request
import requests
from urllib.parse import urlparse

class Blockchain:
    def __init__(self):
        self.chain = []
        self.current_transactions = []
        self.nodes = set()
        
        # 创建创世区块
        self.new_block(previous_hash='1', proof=100)
    
    def new_block(self, proof, previous_hash=None):
        """
        创建新区块
        :param proof: 工作量证明
        :param previous_hash: 前一个区块的哈希值
        :return: 新的区块
        """
        block = {
   
   
            'index': len(self.chain) + 1,
            'timestamp': time.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, data=None):
        """
        创建新的交易
        :param sender: 发送方地址
        :param recipient: 接收方地址
        :param amount: 交易金额
        :param data: 附加数据(可选)
        :return: 包含此交易的区块索引
        """
        self.current_transactions.append({
   
   
            'sender': sender,
            'recipient': recipient,
            'amount': amount,
            'data': data,
            'timestamp': time.time(),
            'transaction_id': str(uuid4()).replace('-', '')
        })
        return self.last_block['index'] + 1
    
    @property
    def last_block(self):
        """返回链中的最后一个区块"""
        return self.chain[-1]
    
    @staticmethod
    def hash(block):
        """
        计算区块的SHA-256哈希值
        :param block: 区块
        :return: 哈希值
        """
        # 确保字典是有序的,否则哈希值会不一致
        block_string = json.dumps(block, sort_keys=True).encode()
        return hashlib.sha256(block_string).hexdigest()
    
    def proof_of_work(self, last_proof):
        """
        简单的工作量证明算法:
         - 查找一个数p',使得hash(pp')以4个0开头
         - p是上一个区块的证明,p'是新的证明
        :param last_proof: 上一个区块的证明
        :return: 新的证明
        """
        proof = 0
        while self.valid_proof(last_proof, proof) is False:
            proof += 1
        return proof
    
    @staticmethod
    def valid_proof(last_proof, proof):
        """
        验证证明:是否hash(last_proof, proof)以
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小赖同学啊

感谢上帝的投喂

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值