用python搭建简单的区块链

这篇具有很好参考价值的文章主要介绍了用python搭建简单的区块链。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以下是使用Python编写简单的区块链的步骤:

  1. 安装需要的库
pip install hashlib
pip install flask
  1. 创建区块链的类
import hashlib
import json
from time import time

class Blockchain:
    def __init__(self):
        self.chain = []
        self.current_transactions = []

        # 创建创世块
        self.new_block(previous_hash=1, proof=100)

    def new_block(self, proof, previous_hash=None):
        """
        创建新的区块
        :param proof: <int> 工作量证明算法提供的证明
        :param previous_hash: (Optional) <str> 前一个区块的 hash 值
        :return: <dict> 新的区块
        """

        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
  1. 创建创世块和区块的添加方法
class Blockchain:
    ...
    
    def new_block(self, proof, previous_hash=None):
        ...
        
    def new_transaction(self, sender, recipient, amount):
        """
        创建新的交易信息,将交易信息添加到当前交易列表
        :param sender: <str> 发送者地址
        :param recipient: <str> 接收者地址
        :param amount: <int> 金额
        :return: <int> 保存这个交易信息的区块的索引
        """
        self.current_transactions.append({
            'sender': sender,
            'recipient': recipient,
            'amount': amount,
        })

        return self.last_block['index'] + 1

    @staticmethod
    def hash(block):
        """
        给一个区块生成 SHA-256 值
        :param block: <dict> 区块
        :return: <str>
        """

        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):
        """
        简单的工作量证明算法:
         - 查找一个 p' 使得 hash(pp') 以4个0开头
         - p 是上一个区块的证明, p' 是当前的证明
        :param last_proof: <int>
        :return: <int>
        """

        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) 以4个0开头?
        :param last_proof: <int> Previous Proof
        :param proof: <int> Current Proof
        :return: <bool> True if correct, False if not.
        """

        guess = f'{last_proof}{proof}'.encode()
        guess_hash = hashlib.sha256(guess).hexdigest()
        return guess_hash[:4] == "0000"
  1. 创建Flask Web应用程序
from uuid import uuid4

from flask import Flask, jsonify, request

# 创建一个节点名称
node_identifier = str(uuid4()).replace('-', '')

# 实例化flask
app = Flask(__name__)

# 实例化区块链
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)

    # 给工作量证明的节点提供奖励.
    # 发送者为 "0" 表明是新挖出的币
    blockchain.new_transaction(
        sender="0",
        recipient=node_identifier,
        amount=1,
    )

    # 添加新的区块到区块链中
    previous_hash = blockchain.hash(last_block)
    block = blockchain.new_block(proof, previous_hash)

    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_transaction():
    values = request.get_json()

    # 检查请求中的必需字段是否在POST中
    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


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
  1. 运行应用程序并测试

运行应用程序:

$ python blockchain.py

使用POST请求创建新的交易:

import requests

url = "http://localhost:5000/transactions/new"
values = {
    "sender": "my address",
    "recipient": "someone else's address",
    "amount": 5
}

response = requests.post(url, json=values)
print(response)

使用GET请求获取完整的区块链:

import requests

url = "http://localhost:5000/chain"

response = requests.get(url)
print(response.json())

使用GET请求挖掘新的区块:

import requests

url = "http://localhost:5000/mine"

response = requests.get(url)
print(response.json())

以上就是使用Python编写简单的区块链的过程。当然,这只是一个简单的示例,实际上实现一个真正有用的区块链需要更多的工作和细节。文章来源地址https://www.toymoban.com/news/detail-858452.html

到了这里,关于用python搭建简单的区块链的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 抖音seo源码-源代码开发搭建-开源部署(不加密)

    抖音SEO矩阵系统源码开发功能模型是指在抖音平台上提高视频搜索排名的一种算法模型。该功能模型包括多个部分,如内容优化、用户交互、社交化推广等,通过对这些因素的优化和提升,达到提高视频搜索排名的目的。具体实现包括使用、标签等优化内容,提高用户

    2024年02月09日
    浏览(55)
  • 抖音seo源码-源代码开发搭建-开源部署操作日志

      抖音seo源码开发是一项非常重要的技术,在抖音上,有很多视频,如果你想让自己的视频脱颖而出,那么就需要优化自己的seo源码。不过,为了保护用户的隐私,抖音并不公开其seo算法的细节,因此需要开发者自己探索。抖音SEO矩阵系统源码开发功能模型是指在抖音平台上

    2024年02月13日
    浏览(47)
  • python简单小游戏代码200行,用python写小游戏源代码

    大家好,小编来为大家解答以下问题,python简单小游戏代码200行,用python写小游戏源代码,现在让我们一起来看看吧! Source code download: 本文相关源码 大家好,本文将围绕python简单小游戏代码100行展开说明,python小游戏代码能用的是一个很多人都想弄明白的事情,想搞清楚

    2024年02月21日
    浏览(58)
  • EtherNet/IP开发:C++搭建基础模块,EtherNet/IP源代码

    这里是CIP资料的协议层级图,讲解协议构造。 ODVA(www.ODVA.org)成立于1995年,是一个全球性协会,其成员包括世界领先的自动化公司。结合其成员的支持,ODVA的使命是在工业自动化中推进开放、可互操作的信息和通信技术。成员团体的基础是其在制定标准和促进通过《共同工

    2024年01月22日
    浏览(59)
  • Python游戏开发--外星人入侵(源代码)

    最近学习的python第一个项目实战,《外星人入侵》,成功实现所有功能,给大家提供源代码 环境安装:python 3.7+ pygame 安装 pygame 或者 先展示效果,消灭外星人,有三条命,按Q是退出全屏,空格键是子弹,按下play键开始游戏,击败外星人飞船会有积分加,三条命之后需要点击

    2024年02月06日
    浏览(55)
  • 【VAR | 时间序列】以美国 GDP 和通货膨胀数据为例的VAR模型简单实战(含Python源代码)

    以美国 GDP 和通货膨胀数据为例: 下载数据我们需要从 FRED 数据库下载美国 GDP 和通货膨胀数据,并将它们存储在 CSV 文件中。可以在 FRED 网站(https://fred.stlouisfed.org/)搜索并下载需要的数据。在这里,并且将它们命名为 ‘gdp.csv’ 和 ‘inflation.csv’。 网站为: 在搜索栏中输

    2024年02月02日
    浏览(97)
  • 【区块链 | 智能合约】Ethereum源代码 - 智能合约地址生成算法

    当提交智能合约部署后,会返回智能合约的地址。智能合约地址的生成逻辑在eth.api.go的submitTransaction函数中:

    2024年02月13日
    浏览(47)
  • 【区块链 | 智能合约】Ethereum源代码(10)- 以太坊Downloader源码分析

    上一节分析到Fetcher用于同步网络节点的新区块和新的交易数据,如果新区块和本地最新的区块相隔距离较远,说明本地区块数据太旧,Fetcher就不会同步这些区块。这时候就要借助Downloader来同步完整的区块数据。 一,启动Downloader handler 初始化的时候会进行Downloader的初始化:

    2024年02月15日
    浏览(43)
  • 【区块链 | 智能合约】Ethereum源代码(3)- 以太坊RPC通信实例和原理代码分析(上)

    上一节提到,以太坊在node start的时候启动了RPC服务,以太坊通过Rpc服务来实现以太坊相关接口的远程调用。这节我们用个实例来看看以太坊 RPC是如何工作的,以及以太坊RPC的源码的实现 1,RPC启动命令 : go-ethereum的RPC服务默认地址:http://localhost:8545/ 通过以下命令修改默认地

    2024年02月02日
    浏览(65)
  • 【区块链 | 智能合约】Ethereum源代码(11)- 以太坊核心BlockChain源码分析

    前面几节都在分析以太坊的通信协议,怎么广播,怎么同步,怎么下载。这一节讲讲以太坊的核心模块BlockChain,也就是以太坊的区块链。 一,BlockChain的初始化 Ethereum服务初始化func init() 的时候会调用core.SetupGenesisBlock来加载创始区块。顾名思义,创始区块就是以太坊区块链中

    2024年02月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包