创建一个区块链,是由三个节点组成的去中心化网络。

目录

一、准备工作:

1、创建三个python文件:

2、创建nodes.json文件

3、transaction.json文件

4、打开三个控制台

二、在三个节点上进行交互。

二、添加交易发布请求(a向b发送10000coin)


一、准备工作:

1、创建三个python文件:

lancoin_node_5001.py、lancoin_node_5002.py、lancoin_node_5003.py。

它们每个都将连接到不同的端口,一个端口用于a,一个端口用于b,一个端口用于c。

a在端口5001上,b在端口5002上,c在端口5003上

代码示例(lancoin_node_5001.py):

 # 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 blockdef get_previous_block(self):return self.chain[-1] def proof_of_work(self,previous_proof):new_proof=1check_proof=Falsewhile check_proof is False:hash_oparation=hashlib.sha256(str(new_proof**2-previous_proof**2).encode()).hexdigest()if hash_oparation[:4]=='0000':check_proof=Trueelse:new_proof+=1return new_proofdef 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=1while block_index<len(chain):block=chain[block_index]if block['previous_hash'] !=self.hash(previous_block):return Falseprevious_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 Falseprevious_block=blockblock_index+=1return Truedef 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']+1def add_node(self,address):parsed_url=urlparse(address)self.nodes.add(parsed_url.netloc)def replace_chain(self):network = self.nodeslongest_chain = Nonemax_length = len(self.chain)for node in network:try:response = requests.get(f'http://{node}/get_chain')response.raise_for_status()  # 这将抛出异常,如果请求失败except requests.exceptions.RequestException as e:print(f"Failed to get the chain from {node}. Exception: {e}")continueif response.status_code == 200:length = response.json()['length']chain = response.json()['chain']if length > max_length and self.is_chain_valid(chain):max_length = lengthlongest_chain = chainif longest_chain:self.chain = longest_chainreturn Truereturn False
#Part 2 -Mining our Blockchain#Creating a Web App
app = Flask(__name__)#Creating an address for the node on Port 5000
node_address=str(uuid4()).replace('-', '')#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)blockchain.add_transaction(sender=node_address,receiver='a',amount=1)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'],'transactions':block['transactions']}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 is valid
@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#Addling a new transaction to the Blockchain
@app.route('/add_transaction',methods=['POST']) 
def add_transaction():json =request.get_json()transaction_keys=['sender','receiver','amount']if not all(key in json for key in transaction_keys):return 'Some elements of the transaction are missing',400index=blockchain.add_transaction(json['sender'], json['receiver'],json['amount'])response={'message':f'This transaction will be added to Block {index}'}return jsonify(response),201#Connecting new nodes
@app.route('/connect_node', methods=['POST'])
def connect_node():json = request.get_json()nodes = json.get('nodes')if nodes is None:return "No nodes provided", 400for node in nodes:blockchain.add_node(node)# 将响应构建移到循环外,并在所有节点添加后才返回response = {'message': 'All the nodes are now connected. The Lancoin Blockchain now contains the following nodes:','total_nodes': list(blockchain.nodes)}return jsonify(response), 201
#Replacing the chain by the longest chain if needed
@app.route('/replace_chain', methods=['GET'])
def replace_chain():is_chain_replaced = blockchain.replace_chain()if is_chain_replaced:response = {'message': 'The nodes had different chains so the chain was replaced by the longest one.','new_chain': blockchain.chain}else:response = {'message': 'All good. the chain is the largest one.','actual_chain': blockchain.chain}return jsonify(response), 200   app.run(host='0.0.0.0',port=5001)         

lancoin_node_5002.py、lancoin_node_5003.py则是lancoin_node_5001.py中的mine_block函数的blockchain.add_transaction(sender=node_address,receiver='a',amount=1),a改为b、c,然后app.run(host='0.0.0.0',port=5001)中的5001改为5002、5003


2、创建nodes.json文件

{"nodes":["http://127.0.0.1:5001","http://127.0.0.1:5002","http://127.0.0.1:5003"]
}

3、transaction.json文件

{"sender":"","receiver":"","amount":
}

4、打开三个控制台

在这里我用的是Spyder编译器,打开三个控制台,分别在控制台是运行各节点,控制台1运行5001节点,控制台2运行5002节点,控制台3运行5003节点,如图所示


二、在三个节点上进行交互。

(1)跳转到postman,创建三个测试,分别对应5001、5002、5003节点


(2)获取链来查看创世区块是否创建良好http://127.0.0.1:5001/get_chain、http://127.0.0.1:5002/get_chain、http://127.0.0.1:5003/get_chain

以5001为例子


(3)发出第一个请求(post),将发出我们的第一个发布请求以将节点相互连接。

我们现在想做的是连接节点,因此我将返回到nodes.json文件,复制后返回postman发出请求,

按照图内,将三个都按照图上进行相应的修改


(4)测试共识

首先在5001节点(也就是a)上挖一个块

可以通过获取链请求(get_chain)来查看它,就会发现我的新链

然后在5002节点上(也就是b)、5003节点(也就是a)选择替换链请求。下面以5002为例子


二、添加交易发布请求(a向b发送10000coin)

(1)先选择post请求,点开transaction.json文件,复制以后回到postman,在5001节点上,如图


2)然后再5001界面get一个http://127.0.0.1:5001/mine_block。创建这个包含两笔交易的新区块,其中一笔交易与我刚刚开采了这个新区块并因此给我一个addcoin有关,当然还有a给b的交易,给b10000coin


(3)查看5001是否开采区块,3个区块,如图


(4)查看5002的区块,2个区块


(5)查看5003的区块,2个区块


(6)达成共识,以确保区块链中的每个节点都具有相同的链。在postman的5002节点界面再运行一遍http://127.0.0.1:5002/replace_chain(get),然后在5003节点界面运行http://127.0.0.1:5003/replace_chain,然后5002、5003节点也会有3个节点


(7)最后在三个节点中分别get请求一下get_chain,以检查是否具有相同的链。以5002为例


注:本篇用的代码解释都可在我以往的文章中找到

“创建一个简单的区块链,并使用 Flask 框架提供一个简单的 Web 接口来与区块链交互。(持续更新)-CSDN博客”

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

“使用Python,结合Flask框架,创建一个可以处理交易、挖矿新区块、验证区块链有效性,并能在网络节点间同步的区块链网络。(持续更新)-CSDN博客”

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

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

相关文章

LeetCode - 611.有效三角形个数

题目链接 LeetCode - 611. 有效三角形的个数 动画解释 代码解释 class Solution { public:int triangleNumber(vector<int>& nums) {sort(nums.begin(),nums.end());int cout 0;int fix nums.size()-1;while(fix>1){int left 0;int right fix-1;while(left &l…

[集群聊天项目] muduo网络库

目录 网络服务器编程常用模型什么是muduo网络库什么是epoll muduo网络库服务器编程 网络服务器编程常用模型 【方案1】 &#xff1a; accept read/write 不是并发服务器 【方案2】 &#xff1a; accept fork - process-pre-connection 适合并发连接数不大&#xff0c;计算任…

在 Linux 上把 Vim 配置为默认编辑器

目录 ⛳️推荐 在 Linux 命令行中编辑 将 Vim 设置为其他程序的默认值 在 Alpine 中编辑电子邮件 总结 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 我使用 Linux 大概有…

Unity读书系列《Unity3D游戏开发》——脚本(一)

文章目录 前言一、脚本模版及其拓展1、脚本模版2、拓展脚本模版 二、脚本的生命周期三、脚本的执行顺序四、脚本序列化1、序列化数据2、serializedObject3、监听部分元素修改事件 五、定时器与间隔定时器六、工作线程&#xff08;多线程&#xff09;总结 前言 脚本在Unity的重…

【信安评估】2024年全国职业院校技能大赛高职组“信息安全管理与评估”安徽省选拔赛赛项规程

培训、环境、资料、考证 公众号&#xff1a;Geek极安云科 网络安全群&#xff1a;624032112 网络系统管理群&#xff1a;223627079 网络建设与运维群&#xff1a;870959784 移动应用开发群&#xff1a;548238632 极安云科专注于技能提升&#xff0c;赋能 2024年广东省高校的技…

Centos的一些基础命令

CentOS是一个基于开源代码构建的免费Linux发行版&#xff0c;它由Red Hat Enterprise Linux (RHEL) 的源代码重新编译而成。由于 CentOS是基于RHEL构建的&#xff0c;因此它与RHEL具有非常类似的特性和功能&#xff0c;包括稳定性、安全性和可靠性。并且大部分的 Linux 命令在C…

sqlplus / as sysdba登陆失败,(ORA-01017)

周一上班检查alert log&#xff0c;看到某个库报出大量的错误 提示无法连接到ASM实例&#xff0c;这是某知名MES厂商DBA创建的11G RAC刚刚​转交到我手上的&#xff0c;这又是给我挖了什么坑&#xff1f; 报错为ORA-01017​用户名密码不对&#xff1f;​what&#xff1f; 登陆o…

大语言模型在研究领域的应用——信息检索中的大语言模型

信息检索中的大语言模型 大语言模型提升信息检索任务利用大语言模型进行信息检索大语言模型增强的信息检索模型.检索增强的大语言模型输入优化策略.指令微调策略.预训练策略.总结应用建议未来方向大语言模型对于传统信息检索技术与应用范式带来了重要影响。这两者在技术路径上具…

在Mac M1笔记本上跑大语言模型llama3的4个步骤?(install、pull、run、ask)

要点 Ollama一个功能强大的本地大语言模型LLM运行工具&#xff0c;支持很多模型&#xff0c;并且操作极其简单快速回忆步骤&#xff1a; 下载ollama工具&#xff1a;https://ollama.com/download 下载模型&#xff1a;ollama pull llama3 #根据libs列表直接指定名字 运行模型…

卡巴斯基plus(kaspersky plus) 21.16主界面出不来

请选择下载x86版本的dotnet 6.0 x86版本的dotnet 6.0 https://download.visualstudio.microsoft.com/download/pr/4aded178-a52a-4fcc-a779-59bb444df048/67924e3556a3a69da09528bd74dca9ef/dotnet-sdk-6.0.421-win-x86.exe

企业微信hook接口协议,ipad协议http,发送大视频文件

发送大视频文件 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信send_userid是long要发送的人或群idisRoom是bool是否是群消息 请求示例 {"uuid":"1688853790xxx", //uuid 默认随机生成如果初始化传了id则用初始…

软考-论文写作-论架构风格论文

题目 素材 框架 一、 摘要 2020年12月,我参加了某省政协委员履职系统的开发。该系统为政协机关人员线上开展各项工作以及委员完成各项履职提供了全方位的软件支撑。我在该项目重担任系统架构师一职,负责履职系统的架构设计。本文结合实践,以委员履职系统为例,主要讨论软件…

12.6.1 实验5:IOS恢复

1、实验目的 通过本实验可以掌握&#xff1a; copy方式恢复IOS的步骤。TFTPDNLD方式恢复IOS的步骤。Xmodem方式恢复IOS的步骤。 2、实验拓扑 路由器IOS恢复的实验拓扑如下图所示。 3、实验步骤 如果工作中不慎误删除路由器IOS&#xff0c;或者升级了错误版本的IOS&#xff…

请编写一个函数void fun(char*ss),其功能是:将字符串ss中所有下标为奇数位置上的字母转换为大写(若该位置上不是字母,则不转换)。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 请编…

制作一个RISC-V的操作系统十三-抢占式多任务和兼容协作式多任务

文章目录 强占式多任务流程代码具体流程兼容协作式多任务&#xff08;软中断&#xff09;寄存器 msip流程代码结果 强占式多任务 流程 抢占式多任务由计时器中断触发&#xff0c;最后在处理程序中切换到下一个进程 代码具体流程 上下文中增加pc寄存器 寄存器保留上下文和切…

数据挖掘实验一

一、实验环境及背景 使用软件&#xff1a; Anaconda3 Jupyter Notebook 实验内容&#xff1a; 1.使用Tushare或者其他手段获取任意两支股票近三个月的交易数据。做出收盘价的变动图像。2.使用Pandas_datareader获取世界银行数据库中美国&#xff08;USA&#xff09;、瑞典&…

【中级软件设计师】上午题12-软件工程(2):单元测试、黑盒测试、白盒测试、软件运行与维护

【中级软件设计师】上午题12-软件工程&#xff08;2&#xff09; 1 系统测试1.1 单元测试1.2 集成测试1.2.1 自顶向下1.2.2 自顶向上1.2.3 回归测试 2 测试方法2.1 黑盒测试2.1.1 McCabe度量法 2.2 白盒测试2.2.1 语句覆盖-“每个流程”执行一次2.2.2 判定覆盖2.2.3 条件覆盖-A…

vue+springboot项目的登录验证码(JAVA自带)

后台springboot CaptureController package com.example.controller;import com.example.common.Result; import com.example.service.AuthCodeService; import com.example.utils.CodeUtils; import lombok.SneakyThrows; import org.apache.ibatis.annotations.Param; impo…

Java openrasp记录-01

例子1 https://github.com/anbai-inc/javaweb-expression 一个hook ognl、spel、MVEL表达式注入的例子 用的是asm5进行字节码修改 采用premain进行插桩&#xff0c;重写transform方法 expClassList是要hook的类&#xff0c;这里定义在MethodHookDesc 这里判断hook点通过类名…

Java并发编程:ThreadPoolExecutor详细源码解析与应用

Thread直接创建线程的弊端 在开始解析ThreadPoolExecutor类之前&#xff0c;让我们先来了解直接创建线程所带来的弊端。在Java中&#xff0c;线程是资源密集型对象&#xff0c;每当需要并发执行任务时&#xff0c;直接创建新线程会带来以下问题&#xff1a; 资源消耗 每个线…