使用了Python语言和Flask框架。创建一个区块链网络,允许用户通过HTTP请求进行交互,如包括创建区块链、挖矿、验证区块链等功能。

目录

大概来说:

二、代码注释

1.添加交易方法(add_transaction函数)

2.添加新的节点(add_node 函数)

3、替换链的方法(replace_chain函数)

总结


大概来说:

  1. 定义了一个名为Blockchain的类,用于构建区块链。
  2. 在Blockchain类中,定义了创建区块、获取上一个区块、工作量证明、哈希计算、验证区块链等方法。
  3. 使用Flask框架创建了一个Web应用,提供了挖矿、获取整个区块链和验证区块链的API接口。
  4. 运行Web应用,监听5000端口。

一、代码展示

# Module 1 - Create a Cryptocurrency
# To be installed:
# Flask==0.12.2: pip install Flask==0.12.2
# Postman HTrp Client: https://www.getpostman.com
# requests==2.18.4: pip install requests==2.18.4

# 时间戳
import datetime
import hashlib
import json

# Flask可以定义Web应用的路由(URL到Python函数的映射),并处理HTTP请求和响应。
# jsonify是一个函数,用于将Python对象转换为JSON格式的响应。
# 当你在Flask路由函数中返回一个jsonify对象时,Flask会自动将该对象对应的数据转换为JSON格式,
# 并设置合适的HTTP响应头,以便客户端可以正确解析响应内容。
from flask import Flask, jsonify, request
import requests
from uuid import uuid4
from urllib.parse import urlparse

# 1******Building a Blockchain

class Blockchain:
    # 初始化区块链类
    def __init__(self):
        self.transactions = []  # 存储交易信息
        self.chain = []  # 存储区块链
        self.create_block(proof=1, previous_hash='0')  # 创建创世区块
        self.nodes = set()  # 存储网络节点

    # 创建一个新的区块
    def create_block(self, proof, previous_hash):
        block = {
            'index': len(self.chain) + 1,
            'timestamp': str(datetime.datetime.now()),
            'proof': proof,
            'previous_hash': previous_hash,
            'transactions': self.transactions
        }
        self.transactions = []  # 清空交易列表
        self.chain.append(block)  # 将新区块添加到链中
        return block  # 返回创建的区块

    # 获取链中最后一个区块
    def get_previous_block(self):
        return self.chain[-1]

    # 工作量证明(Proof of Work)
    def proof_of_work(self, previous_proof):
        new_proof = 1
        check_proof = False
        while check_proof is False:
            hash_operation = hashlib.sha256(str(new_proof**2 - previous_proof**2).encode()).hexdigest()
            if hash_operation[: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_operation = hashlib.sha256(str(proof**2 - previous_proof**2).encode()).hexdigest()
            if hash_operation[:4] != '0000':
                return False
            previous_block = block
            block_index += 1
        return True

    # 添加交易
    def add_transaction(self, sender, receiver, amount):
        self.transactions.append({
            'sender': sender,
            'receiver': receiver,
            'amount': amount
        })
        previous_block = self.get_previous_block()
        return previous_block['index'] + 1

    # 添加网络节点
    def add_node(self, address):
        parsed_url = urlparse(address)
        self.nodes.add(parsed_url.netloc)

    # 替换链,如果找到更长的链则替换当前链
    def replace_chain(self):
        network = self.nodes
        longest_chain = None
        max_length = len(self.chain)
        for node in network:
            response = requests.get(f'http://127.0.0.1:5000/get_chain')
            if response.status_code == 200:
                length = response.json()['length']
                chain = response.json()['chain']
                if length > max_length and self.is_chain_valid(chain):
                    max_length = length
                    longest_chain = chain
        if longest_chain:
            self.chain = longest_chain
            return True
        return False

# 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

# 运行Flask应用
app.run(host='0.0.0.0', port=5000)

二、代码注释

注:下面对三个函数进行讲解,其他函数的详解在我的另外一篇我的文章里“创建一个简单的区块链,并使用 Flask 框架提供一个简单的 Web 接口来与区块链交互。-CSDN博客”add_transaction 函数、add_node 函数、replace_chain 函数

1.添加交易方法(add_transaction函数)

这个函数用于向区块链中添加交易记录。它接受三个参数:发送者(sender)、接收者(receiver)和交易金额(amount)。该函数将交易信息以字典的形式添加到当前区块的交易列表中,并返回下一个区块的索引值。

  # 添加交易
#创建一个字典,包含发送者、接收者和金额信息,然后将这个字典添加到self.transactions
列表中。def add_transaction(self, sender, receiver, amount):self.transactions.append({'sender': sender,'receiver': receiver,'amount': amount})
#获取当前区块链的最后一个区块,并返回它的索引加1,这个索引加1将是下一个区块的索引。        previous_block = self.get_previous_block()return previous_block['index'] + 1

2.添加新的节点(add_node 函数)

这个函数用于向网络中添加新的节点。它接受一个参数:节点地址(address)。该函数使用 urlparse 函数解析地址,并将解析后的主机名(netloc)添加到节点集合中。

# 添加网络节点

def add_node(self, address):

# 使用urlparse函数解析提供的地址,这个函数是Python内置的url解析模块urllib.parse中的一个函数
        parsed_url = urlparse(address)

# 通过urlparse得到的parsed_url对象中,netloc属性包含了解析后的网络位置,通常是主机名(有时也包括端口号)

# 例如,如果提供的地址是 'http://localhost:5000',那么parsed_url.netloc将会是 'localhost:5000'

# 将解析得到的网络位置添加到self.nodes集合中 # self.nodes是一个集合(set),它自动去除了重复的元素,并且保持了添加的顺序无关性
        self.nodes.add(parsed_url.netloc)

3、替换链的方法(replace_chain函数)

这个函数函数用于替换当前的区块链。它首先获取网络中的所有节点,然后遍历每个节点,通过发送 HTTP 请求获取其区块链信息。如果收到有效的响应,并且该链的长度大于当前链的长度且有效,则将最长链替换为当前链。最后,根据是否成功替换链,返回相应的布尔值。

def replace_chain(self):

# 获取当前区块链网络中的所有节点

        network = self.nodes

# 初始化最长链为None,表示尚未找到更长的链
        longest_chain = None

# 获取当前链的长度
        max_length = len(self.chain)

# 遍历网络中的每个节点
        for node in network:

# 尝试从每个节点获取区块链信息
            response = requests.get(f'http://127.0.0.1:5000/get_chain')

# 如果请求成功(HTTP状态码为200)
            if response.status_code == 200:

# 从响应中获取链的长度和链数据
                length = response.json()['length']
                chain = response.json()['chain']

# 如果获取的链比当前已知最长链更长,并且验证该链是有效的
                if length > max_length and self.is_chain_valid(chain):

# 更新最长链长度和最长链数据
                    max_length = length
                    longest_chain = chain

# 如果找到了更长的有效链,则用它替换当前链,并返回True
        if longest_chain:
            self.chain = longest_chain
            return True

# 如果没有找到更长的链,或者找到的链无效,则返回False
        return False


总结

这段代码定义了一个Blockchain类,它包含了创建区块、验证工作量证明、添加交易、添加网络节点、替换链等方法。然后,使用Flask框架创建了一个Web应用,通过定义路由来处理不同的HTTP请求,如挖掘新区块、获取区块链信息、验证区块链的有效性等。最后,启动了Flask应用,使其在端口5000上监听请求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/827382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1、初识Linux系统 shell 脚本

shell脚本组成介绍 1、shell脚本命名规则 必须以.sh文件结尾&#xff0c;类似.txt文件&#xff1b;例如创建一个test.sh文件 2、linux系统中shell脚本开头&#xff0c;必须以如下代码开头 test.sh内容如下&#xff1a; #!/bin/bash# 这是一个注释echo "Hello, World!&…

西安地区调频广播频率一览

FM89.6 陕西人民广播电台经济广播 FM91.6 陕西人民广播电台交通广播 FM93.1 西安人民广播电台音乐广播 FM95.5 中央人民广播电台音乐之声 FM96.4 中央人民广播电台中国之声 FM98.8 陕西人民广播电台音乐广播 FM101.1 陕西人民广播电台戏曲广播 FM101.8 陕西人民广播电台…

高效过滤器检漏方法选择指南及关键注意事项一览

在生物制药企业中&#xff0c;高效过滤器&#xff08;HEPA&#xff09;的检漏工作是确保洁净室能够达到并保持设计的洁净级别的关键步骤。这关系到产品的质量和安全&#xff0c;因此必须遵循相关法规标准和操作流程。 关于北京中邦兴业 北京中邦兴业科技有限公司是一家国家高新…

element中file-upload组件的提示‘按delete键可删除’,怎么去掉?

问题描述 element中file-upload组件会出现这种提示‘按delete键可删除’ 解决方案&#xff1a; 这是因为使用file-upload组件时自带的提示会盖住上传的文件名&#xff0c;修改一下自带的样式即可 ::v-deep .el-upload-list__item.is-success.focusing .el-icon-close-tip {d…

2.微服务技术

微服务技术对比 DubboSpringCloudSpringCloudAlibaba注册中心zookeeper&#xff0c;RedisEureka,ConsulNacos,Eureka服务远程调用Dubbo协议Feign(http协议)Dubbo,Feign配置中心SpringCloudConfigSpringCloudConfig,Nacos服务网关SpringCloudGateway,ZuulSpringCloudGateway,Zu…

css 设置div阴影样式

文章目录 问题描述解决方案代码示例设置阴影样式 问题描述 大家好&#xff01;我是夏小花&#xff0c;今天是2024年4月23日|农历三月十五&#xff0c;今天这篇文章主要以div或者是view添加阴影样式为主题 &#xff0c;详细代码如下 解决方案 这段是vue页面中的 代码&#xff0…

基于SpringBoot的宠物领养网站管理系统

基于SpringBootVue的宠物领养网站管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 宠物领养 宠物救助站 宠物论坛 登录界面 管理员界面 摘要 基于Spr…

1.C++入门

目录 1.C关键字 2.命名空间 作用域方面的优化 a.命名空间定义 b.命名空间使用 3.C 输入&输出 1.C关键字 C有63个关键字&#xff0c;C语言有32个关键字&#xff0c;存在重叠如荧光笔标出 2.命名空间 作用域方面的优化 如果变量&#xff0c;函数和类的名称都存在于全…

vue-router学习4:嵌套路由

一些应用程序的 UI 由多层嵌套的组件组成。在这种情况下&#xff0c;URL 的片段通常对应于特定的嵌套组件结构。 定义子路由组件 首先&#xff0c;你需要为嵌套路由创建对应的子组件。这些组件将在父路由组件的 <router-view></router-view> 中被渲染。 <!-…

AI自动生成PPT文档 aippt的API介绍文档

官方链接直达&#xff01; 产品介绍​ 能力介绍​ AiPPT 是一款智能生成演示幻灯片的在线工具。专业设计团队打造海量模板资源&#xff0c;输入标题即可轻松生成完整的PPT。同时 AiPPT 支持导入多格式文档一键生成 PPT&#xff0c;让 PPT 创作更加高效。聚焦于内容&#xff0…

安装zabbix server

目录 1、实验环境 2、yum 安装zabbix server 2.1 解决权限问题和放行流量 2.2 安装zabbix-server 1、实验环境 操作系统rhel8zabbix6.0TLS数据库mysql8.0.30IP地址192.168.81.131时间配置NTP时间服务器同步 2、yum 安装zabbix server 如果通过yum源安装&#xff0c;操作系…

SysetmUI开机是否显示Keyguard的流程

KeyguardViewMediator的onSystemReady方法 没有启用keyguard时KeyguardViewMediator的log&#xff1a; onSystemReady 方法 doKeyguardLocked LockPatternUtils.isLockScreenDisabled 来判断是否启用 public final static String DISABLE_LOCKSCREEN_KEY "lockscreen.…

深度学习——Transformer的理解整理

一、答主1 机器翻译 transformer刚被提出的时候就是被用于处理机器翻译的。在transformer架构中的不同位置Q&#xff0c;K&#xff0c;V指代的变量是不一样的。 假设现在处理的是英文->德文的翻译任务。 在encoder的输入端&#xff0c;这里执行的是self-attention&#x…

说说redis的集群的原理吧

为什么redis集群这么牛&#xff1f;为什么其拥有那么多的优点了&#xff1f;为什么大厂用的都是redis集群&#xff1f; 因为其 1.高可用 2.高性能 3.数据容错性 4.数据持久化 5.线性扩展 6.客户端重定向 为什么有以上这么多优势了&#xff1f; 其实跟redis集群背后的原理有关&a…

信息化工作人员必备常识4——ping命令详解【不间断发包自定义发包的大小自定义发包次数】

信息化工作人员必备常识4——ping命令详解【不间断发包&自定义发包的大小&自定义发包次数】 前言回顾pingtelnetnslookup命令 ping 命令详解帮助手册不间断向目标 IP 发送数据包 -t定义发送数据包的大小 -l-t&-l 验证网络承载能力自定义发送数据包的次数统计响应时…

[BT]BUUCTF刷题第20天(4.22)

第20天 Web [GWCTF 2019]我有一个数据库 打开网站发现乱码信息&#xff08;查看其他题解发现显示的是&#xff1a;我有一个数据库&#xff0c;但里面什么也没有~ 不信你找&#xff09; 但也不是明显信息&#xff0c;通过dirsearch扫描得到robots.txt&#xff0c;然后在里面得…

51单片机数字温度报警器_DS18B20可调上下限(仿真+程序+原理图)

数字温度报警器 1 **主要功能&#xff1a;*****\*资料下载链接&#xff08;可点击&#xff09;&#xff1a;\**** 2 **仿真图&#xff1a;**3 **原理图&#xff1a;**4 **设计报告&#xff1a;**5 **程序设计&#xff1a;**主函数外部中断函数DS18B20驱动 6 讲解视频7 **资料清…

OSPF的七种LSA类型

OSPF的LSA类型 在OSPF协议中&#xff0c;使用LSA来传递路由信息和拓扑信息&#xff0c;因此了解不同的LSA的内容和其功能&#xff0c;对了解OSPF协议的路由形成有很大帮助。这里的OSPF是v2版本&#xff0c;只针对IPv4来讲。 描述一条LSA的三要素&#xff1a; ADV Router产生者…

上海亚商投顾:沪指震荡调整 油气等周期股集体下挫

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡调整&#xff0c;深成指、创业板指小幅走弱。军工板块逆势拉升&#xff0c;中船应急、捷安高科、…

ORACLE数值相关的sql语句

ORACLE数值相关的sql语句 引言1. 基础数值运算2. 数值函数应用2.1 精确数值函数2.2 绝对值函数 ABS() 3. 判断和转换数值4. 聚合数值字段5. 数值范围查询总结 引言 在Oracle数据库中&#xff0c;处理数值数据是一项常见的任务&#xff0c;不论是进行简单的数学运算&#xff0c;…