创建一个简单的区块链,并使用 Flask 框架提供一个简单的 Web 接口来与区块链交互。

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

目录

前言

一、代码展示

二、代码注释

1.简单的区块链模拟实现,这段代码定义了一个简单的区块链类,可以创建一个新的区块链,并能够添加新的区块到链上,同时获取最新的区块信息。这个模拟的区块链可以用于教学或演示区块链的基本概念。

2.这段代码是一个简单的工作量证明(Proof of Work)算法的实现,它是区块链技术中的一个关键概念。工作量证明是一种用来防止网络滥用和垃圾信息的机制,它要求用户在进行某些操作(如创建新区块)之前,必须完成一项计算工作。这个计算工作通常是解决一个难题,而解决这个难题的“答案”就是工作量证明。

3.这段代码定义了一个名为 hash 的方法,它属于 Blockchain 类,用于计算区块链中某个区块的哈希值。哈希值是区块内容的唯一表示,它是通过哈希函数对区块数据进行计算得到的。在区块链中,哈希值用于确保数据的完整性和不可篡改性。

5、这段代码展示了如何使用 Flask 框架创建一个简单的 Web 应用程序,并结合之前定义的 Blockchain 类和相关方法来实现一个区块链挖矿的功能。

6、这段代码定义了一个 Flask 应用程序的路由处理函数,用于响应客户端对 /get_chain 路径的 GET 请求。当这个路径被访问时,这个函数将返回当前区块链的完整数据和一个表示链长度的计数。

7、这段代码是Flask应用中的一个路由处理函数,用于检查区块链的完整性和有效性

8、这行代码是 Flask 应用程序的启动命令,它会启动一个本地开发服务器,使得应用程序能够响应外部的 HTTP 请求

三、扩展(postman测试)

总结


前言

本文演示了如何创建一个简单的区块链,并使用 Flask 框架提供一个简单的 Web 接口来与区块链交互。


一、代码展示

# Module 1 -Create a Blockchain
#时间戳
import datetime
import hashlib
import json
#Flask可以定义Web应用的路由(URL到Python函数的映射),并处理HTTP请求和响应。jsonify是一个函数,用于将Python对象转换为JSON格式的响应。当你在Flask路由函数中返回一个jsonify对象时,Flask会自动将该对象对应的数据转换为JSON格式,并设置合适的HTTP响应头,以便客户端可以正确解析响应内容。
from flask import Flask, jsonify
#  1******
class Blockchain:
    def __init__(self):
        self.chain=[]
        self.create_block(proof=1,previous_hash='0')
    
    def create_block(self,proof,previous_hash):
        block={'index':len(self.chain)+1,
               'timestamp':str(datetime.datetime.now()),
               'proof':proof,
               'previous_hash':previous_hash}
        self.chain.append(block) 
        return block
    def get_previous_block(self):
        return self.chain[-1] 
    
    def proof_of_work(self,previous_proof):
        new_proof=1
        check_proof=False
        while check_proof is False:
            hash_oparation=hashlib.sha256(str(new_proof**2-previous_proof**2).encode()).hexdigest()
            if hash_oparation[:4]=='0000':
                check_proof=True
            else:
                new_proof+=1
        return new_proof
    
    def hash(self, block):
        encode_block = json.dumps(block, sort_keys=True).encode()
        return hashlib.sha256(encode_block).hexdigest()

    def is_chain_valid(self,chain):
        previous_block=chain[0]
        block_index=1
        while block_index<len(chain):
          block=chain[block_index]
          if block['previous_hash'] !=self.hash(previous_block):
              return False
          previous_proof=previous_block['proof']
          proof=block['proof']
          hash_oparation=hashlib.sha256(str(proof**2-previous_proof**2).encode()).hexdigest()
          if hash_oparation[:4] !='0000':
              return False
          previous_block=block
          block_index+=1
        return True
            
       
#Part 2 -Mining our Blockchain

#Creating a Web App
app = Flask(__name__)
#Creating a Blockchain
blockchain=Blockchain()
#Mining a new block
@app.route('/mine_block',methods=['GET'])
def mine_block():
    previous_block=blockchain.get_previous_block()
    previous_proof=previous_block['proof']
    proof=blockchain.proof_of_work(previous_proof)
    previous_hash=blockchain.hash(previous_block)
    block=blockchain.create_block(proof, previous_hash)
    response={'message':'Congratulation,you just mined a block',
              'index':block['index'],
              'timestamp':block['timestamp'],
              'proof':block['proof'],
              'previous_hash':block['previous_hash']}
    return jsonify(response),200
            
#Getting the full Blockchain
@app.route('/get_chain',methods=['GET'])
def get_chain():
    response={'chain':blockchain.chain,
             'length':len(blockchain.chain)}
    return jsonify(response),200        
            
#Checking if the Blockchain
@app.route('/is_valid',methods=['GET']) 
def get_valid():
    is_valid=blockchain.is_chain_valid(blockchain.chain)
    if is_valid:
        response={'message':'All good. The Blockchain is valid.'}
    else:
        response={'message':'Houston,we have a problem.The Blockchain is not valid.'}
    return jsonify(response),200
app.run(host='0.0.0.0',port=5000)         
            

二、代码注释

1.简单的区块链模拟实现,这段代码定义了一个简单的区块链类,可以创建一个新的区块链,并能够添加新的区块到链上,同时获取最新的区块信息。这个模拟的区块链可以用于教学或演示区块链的基本概念。

#这行代码导入了Python的datetime模块,用于处理日期和时间。
import datetime
#这行代码导入了hashlib模块,用于生成哈希值,但在这段代码中并未使用到。
import hashlib
#用于处理JSON数据格式,但在这段代码中并未使用到
import json
#从flask模块中导入了Flask和jsonify两个对象。Flask是一个轻量级的Web应用框架,jsonify是一个函数,用于将Python对象转换为JSON格式的响应。
from flask import Flask,jsonify
#定义了一个名为Blockchain的类,用于模拟区块链的基本功能。
class Blockchain:
#这是Blockchain类的构造函数,用于初始化区块链实例。在这个函数中,创建了一个空字典self.chain来存储区块链中的区块,并通过调用self.create_block()方法创建了第一个区块。
    def __init__(self):
        self.chain=[]
#,创建了区块链的第一个区块。proof参数设置为1,previous_hash参数设置为字符串'0'。
        self.create_block(proof=1,previous_hash='0')
        
#这是Blockchain类的一个方法,用于创建一个新的区块并将其添加到区块链中。方法接收两个参数:proof(工作量证明值)和previous_hash(前一个区块的哈希值)。
    def create_block(self,proof,previous_hash):
#这行代码创建了一个新的字典block,它代表一个新的区块。index键对应的值是当前区块链中区块的数量加1,即新创建的区块的索引。
        block={'index':len(self.chain)+1,
                'timetamp':str(datetime.datetime.now()),
#block字典添加了proof键,其值是创建区块时提供的工作量证明值。
                'proof':proof,
                'previous_hash':previous_hash}
#新创建的区块添加到self.chain字典列表中,从而将新区块添加到区块链中。
        self.blain.append(block)
#返回新创建的区块,可以用于验证或显示新区块的信息。
        return block

#这是Blockchain类的一个方法,用于获取区块链中的最后一个区块。
    def get_previous_block(self):
#这行代码返回self.chain列表中的最后一个元素,即最新的区块
        return self.chain[-1] 

2.这段代码是一个简单的工作量证明(Proof of Work)算法的实现,它是区块链技术中的一个关键概念。工作量证明是一种用来防止网络滥用和垃圾信息的机制,它要求用户在进行某些操作(如创建新区块)之前,必须完成一项计算工作。这个计算工作通常是解决一个难题,而解决这个难题的“答案”就是工作量证明。

#这行代码定义了一个名为proof_of_work的方法,它属于之前定义的Blockchain类。这个方法接收一个参数previous_proof,它代表前一个区块的工作量证明值。
def_proof_of_work(self,previous_proof)
#这行代码初始化一个新的变量new_proof,它的初始值设为1。这个变量将用于生成新的工作量证明。
    new_proof=1
#初始化一个布尔变量check_proof,用于检查新生成的工作量证明是否满足条件。初始值设为False,表示还没有找到满足条件的工作量证明。
    check_proof=False
#它会一直执行,直到check_proof变量的值为True,即找到了满足条件的工作量证明。
    while check_proof is False:
#这行代码执行了核心的哈希计算操作。首先,它计算new_proof的平方减去previous_proof的平方的结果,然后将这个结果转换为字符串,并进行SHA-256哈希运算。hashlib.sha256()是Python中用于SHA-256算法的函数,.encode()将字符串转换为字节流,以便进行哈希运算。.hexdigest()将哈希结果转换为十六进制字符串。
        hash_oparation=hashlib.sha256(str(new_proof**2-previous_proof**2).encode()).hexdigest()
#检查哈希结果的前四个字符是否为'0000'。这是工作量证明的条件,意味着新生成的工作量证明必须满足这个条件才能被接受。
        if hash_oparation[:4]='0000':
            check_proof=Ture
        else
            new_proof+=1
    return new_proof

3.这段代码定义了一个名为 hash 的方法,它属于 Blockchain 类,用于计算区块链中某个区块的哈希值。哈希值是区块内容的唯一表示,它是通过哈希函数对区块数据进行计算得到的。在区块链中,哈希值用于确保数据的完整性和不可篡改性。

#它接收一个参数 block,这个参数代表一个区块的数据。在区块链的上下文中,一个区块通常包含多个字段,如 index、timestamp、proof、previous_hash 等。
def_hash(self,block):
#首先使用 json.dumps() 函数将区块数据 block 转换为 JSON 格式的字符串。sort_keys=True 参数确保 JSON 字符串的输出是键值对排序后的格式,这有助于生成一致的哈希值。接着,.encode() 方法将 JSON 字符串转换为字节串,这是因为哈希函数需要一个字节串作为输入。
    encode_block=json.dumps(block,sort_keys=True).encode()
#使用 hashlib.sha256() 函数对字节串 encode_block 进行 SHA-256 哈希计算。SHA-256 是一种加密哈希函数,它可以将任意长度的输入数据转换为固定长度(256位)的哈希值。.hexdigest() 方法将计算得到的哈希值转换为十六进制字符串形式,并返回这个字符串作为区块的哈希值。
    return hashlib.sha256(encode_block).hexdigest()

4、这段代码定义了一个名为 is_chain_valid 的方法,它用于验证一个区块链的有效性。具体来说,它检查链中的每个区块的 previous_hash 值是否与其前一个区块的哈希值相匹配,以及每个区块的工作量证明(Proof of Work)是否满足特定条件。

def is_chain_valid(self,chain):
#将区块链中的第一个区块赋值给变量 previous_block。这个区块是初始的“创世区块”,它的 previous_hash 通常设置为一个特定的值(如 '0' 或 '0000' 等)。
        previous_block=chain[0]
#码初始化一个变量 block_index,用于跟踪当前正在验证的区块在区块链中的索引位置。由于 previous_block 是第一个区块,所以从索引 1 开始。
        block_index=1
#用于遍历区块链中的每个区块。循环条件是 block_index 小于区块链的长度,确保每个区块都被检查。
        while block_index<len(chain):
#根据 block_index 的值获取当前正在验证的区块。
          block=chain[block_index]
#检查当前区块的 previous_hash 字段是否与 previous_block 经过 self.hash() 方法计算后的哈希值相匹配。如果不匹配,说明区块链的连续性被破坏,即某个区块被篡改或替换,因此返回 False。
          if block['previous_hash'] !=self.hash(previous_block):
              return False
#获取 previous_block 的 proof 字段值,并将其赋值给变量 previous_proof。
          previous_proof=previous_block['proof']
          proof=block['proof']
          hash_oparation=hashlib.sha256(str(proof**2-previous_proof**2).encode()).hexdigest()
          if hash_oparation[:4] !='0000':
              return False
#更新 previous_block 变量,将其设置为当前正在验证的区块 block。
          previous_block=block
#增加 block_index 的值,以便在下一次循环中验证下一个区块。
          block_index+=1
        return True

这个方法是区块链安全性的一个重要保障,确保了区块链的不可篡改性和数据的完整性。通过验证每个区块的哈希值和工作量证明,可以确保区块链的每个区块都是按照正确的顺序和规则添加的。

5、这段代码展示了如何使用 Flask 框架创建一个简单的 Web 应用程序,并结合之前定义的 Blockchain 类和相关方法来实现一个区块链挖矿的功能。

#创建了一个 Flask 应用程序实例
app=Flask(__name__)
#创建了一个 Blockchain 类的实例,这个实例将用于管理区块链数据。
blockchain=Blockchain()
#这是一个装饰器,用于定义 Flask 应用程序的路由。当用户访问 /mine_block 路径时,并且请求方法为 GET,就会调用 mine_block 函数。
@app.route('mine_block',methods=['GET'])
#定义了一个名为 mine_block 的函数,它是 /mine_block 路径的处理函数。
def mine_block():
#这行代码调用 blockchain 实例的 get_previous_block 方法来获取区块链中最后一个区块的信息。
     previous_block=blockchain.get_previous_block()
#这行代码从上一个区块中提取 proof(工作量证明)值。
     previous_proof=previous_block['proof']
#这行代码调用 blockchain 实例的 proof_of_work 方法来计算新的工作量证明值。
     proof=blockchain.proof_of_work(previous_proof)
#这行代码调用 blockchain 实例的 hash 方法来获取上一个区块的哈希值。
     previous_hash=blockchain.hash(previous_block)
#这行代码调用 blockchain 实例的 create_block 方法来创建一个新的区块,新的区块包含新的工作量证明值和上一个区块的哈希值。
     block=blockchain.create_block(proof, previous_hash)
#这行代码创建了一个字典 response,用于存储响应信息。这个字典包含了恭喜消息、新挖矿区块的索引、时间戳、工作量证明值和前一个区块的哈希值。
     response={'message':'Congratulation,you just mined a block',
            'index':block['index'],
             'timestamp':block['timestamp'],
             'proof':block['proof'],
             'previous_hash':block['previous_hash']}
#这行代码使用 Flask 的 jsonify 函数将 response 字典转换为 JSON 格式的响应,并返回状态码 200。200 表示请求成功。
        return jsonify(response),200

这段代码通过 Flask 创建了一个 Web 应用程序,用户可以通过访问 /mine_block 路径来触发挖矿过程。应用程序将执行工作量证明算法来创建一个新的区块,并将其添加到区块链中。然后,它会向用户返回新挖矿区块的相关信息。这是一个简单但有效的区块链挖矿 Web 应用程序的实现。

6、这段代码定义了一个 Flask 应用程序的路由处理函数,用于响应客户端对 /get_chain 路径的 GET 请求。当这个路径被访问时,这个函数将返回当前区块链的完整数据和一个表示链长度的计数。

@app.route('/get_chain',methods=['GET'])
def get_chain():
#在 get_chain 函数内部,创建了一个名为 response 的字典,它包含两个键值对。第一个键值对是 'chain',它的值是 blockchain 实例的 chain 属性,这是一个包含区块链中所有区块的列表。第二个键值对是 'length',它的值是 blockchain.chain 的长度,即区块链中区块的数量。
    response={'chain':blockchain.chain,
             'length':len(blockchain.chain)}
    return jsonify(response),200

客户端(如 Web 浏览器或其他 HTTP 客户端)向 Flask 应用程序发送一个 GET 请求到 /get_chain 路径时,应用程序将调用 get_chain 函数,并将当前区块链的完整数据和区块数量作为 JSON 响应返回给客户端。这样,客户端就可以查看和验证区块链的状态。这个功能对于区块链的透明度和可审计性是非常重要的。

7、这段代码是Flask应用中的一个路由处理函数,用于检查区块链的完整性和有效性

#Checking if the Blockchain
@app.route('/is_valid',methods=['GET']) 
定义了一个名为get_valid的函数,它是当访问/is_valid路由时被调用的。
def get_valid():
这一行调用了Blockchain类的一个方法is_chain_valid,传入了blockchain.chain作为参数。blockchain.chain是存储区块链数据的数据结构(在这个例子中是一个列表)。is_chain_valid方法会检查区块链的每个区块,确保它们的哈希值和前一个区块的哈希值是正确的,以及每个区块的工作量证明(Proof of Work)也是正确的。如果所有检查都通过,它会返回True,表示区块链是有效的;
    is_valid=blockchain.is_chain_valid(blockchain.chain)
    if is_valid:
        response={'message':'All good. The Blockchain is valid.'}
    else:
        response={'message':'Houston,we have a problem.The Blockchain is not valid.'}
    return jsonify(response),200

8、这行代码是 Flask 应用程序的启动命令,它会启动一个本地开发服务器,使得应用程序能够响应外部的 HTTP 请求

app.run(host='0.0.0.0',port=5000) 

三、扩展(postman测试)

运行成功以后

1、模拟挖矿过程,并在区块链上创建一个新的区块:在postman输入http://127.0.0.1:5000/mine_block(网址得看你运行成功以后给出的是什么,我给出的是这个)

创建一个简单的区块链,并使用 Flask 框架提供一个简单的 Web 接口来与区块链交互。,flask,python,后端,区块链,去中心化

2、查看当前区块链的状态,包括所有已经挖掘的区块和区块链的总长度:在postman中输入“http://127.0.0.1:5000/get_chain”

创建一个简单的区块链,并使用 Flask 框架提供一个简单的 Web 接口来与区块链交互。,flask,python,后端,区块链,去中心化

3、验证区块链是否有效:输入“http://127.0.0.1:5000/is_valid”

创建一个简单的区块链,并使用 Flask 框架提供一个简单的 Web 接口来与区块链交互。,flask,python,后端,区块链,去中心化


总结

总的来说,这段代码演示了如何创建一个简单的区块链,并使用 Flask 框架提供一个简单的 Web 接口来与区块链交互。用户可以通过 GET 请求来挖矿、获取区块链信息和验证区块链的有效性。这个示例展示了区块链技术的基本概念和 Flask Web 应用的创建与路由处理。文章来源地址https://www.toymoban.com/news/detail-851011.html

到了这里,关于创建一个简单的区块链,并使用 Flask 框架提供一个简单的 Web 接口来与区块链交互。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 使用Python Flask搭建一个简单的Web站点并发布到公网上访问

    Flask是一个Python编写的Web微框架,让我们可以使用Python语言快速实现一个网站或Web服务,本期教程我们使用Python Flask搭建一个web问答应用程序框架,并结合cpolar内网穿透工具将我们的应用程序发布到公共网络上,实现可多人远程进入到该web应用程序访问。 在操作上我们将使用

    2024年02月04日
    浏览(53)
  • python创建一个简单的flask应用

    下面用python在本地和服务器上分别创建一个简单的flask应用: 1.在pc本地 1)pip flask后创建一个简单的脚本flask_demo.py win+R进入命令行,切换到flask_demo.py的路径,执行 启动应用 如果显示启动失败,可能的原因是: 设置FLASK_APP环境变量:在命令行中输入以下命令,将FLASK_APP环境

    2024年02月05日
    浏览(36)
  • 用flask框架flask-sock和websocket创建一个自己的聊天界面

    WebSocket 协议在10年前就已经标准化了(在2011年,你能相信吗?)所以我相信你不需要介绍。但是如果你不熟悉它,WebSocket 是 HTTP 协议的一个扩展,它在客户端和服务器之间提供了一个永久的、双向的通信通道,在这里双方可以实时地发送和接收数据,而不受 HTTP 的请求/响应周期

    2024年02月07日
    浏览(46)
  • python轻量级web框架flask初探,搭建网站原来这么简单

    ✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN新星创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开

    2024年03月19日
    浏览(125)
  • 简介:在这篇教程中,我们将使用React.js框架创建一个简单的聊天机器人的前端界面,并利用Dialogflo

    作者:禅与计算机程序设计艺术 介绍及动机 聊天机器人(Chatbot)一直是互联网领域中的热门话题。而很多聊天机器人的功能都依赖于人工智能(AI)技术。越来越多的企业希望拥有自己的聊天机器人系统,从而提升自己的竞争力。为此,业界也出现了很多基于开源技术或云

    2024年02月06日
    浏览(59)
  • Python Web框架 Flask 安装、使用

    Python Web框架 Flask 安装 安装 Flask 框架 首先需要安装 Flask 框架, 可以通过以下命令安装: 创建 Flask 应用程序 在本地创建一个文件夹,例如叫 myapp ,在该文件夹中创建一个 Python 文件 app.py ,并在其中编写以下代码: 在上面的代码中,我们导入 Flask 框架,并创建了一个名为 ap

    2024年02月17日
    浏览(45)
  • node.js 简单实验 创建一个简单的web服务

    概要:用一个最简单是例子感受一下node.js 的能力 1.代码 2.运行结果 2.1 node t.js 1.2 http://127.0.0.1:8081       

    2024年02月11日
    浏览(68)
  • 一个简单的web应用程序的创建

    实体、属性、关系 简单介绍 简单介绍

    2024年02月11日
    浏览(87)
  • Python-Web框架flask使用

    目录 1.Web框架 1.1 flask 1.1.1 debug调试  1.1.2 定义参数web服务 获取字符串 ​编辑 1.1.3 html网页渲染 1.13.1 带参数传给网页文件 普通元素 列表元素  字典元素 python的web框架,目录结构如下: 1.static存放的是css,js的样式文件 2.templates存放的是html文件 3.app.py是主要接口入口,默认创

    2024年02月16日
    浏览(55)
  • Web 开发 1: Flask 框架介绍和使用

    在 Web 开发中,Flask 是一个流行且灵活的 Python Web 框架,用于构建 Web 应用程序。它简洁而易于上手,适用于小型到中型的项目。在本篇博客中,我将为你介绍 Flask 框架的基础知识和常用技巧,帮助你更好地掌握 Web 开发中的框架部分。 安装 Flask 在开始使用 Flask 之前,你需要

    2024年01月23日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包