将到来的数字革命?用Python实现一个区块链
bigegpt 2024-10-07 06:28 4 浏览
Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。Python是一种面向对象的解释型计算机程序设计语言,下面我们用区块链的实现。
python实现一个基础的区块链
我们实现的区块链有如下几个特性:
可以向区块链中添加多个节点。
工作量证明(PoW)。
简单的节点间冲突解决机制。
使用RSA 加密进行交易。
我们的区块链客户端有如下几个功能:
使用公钥/私钥加密技术生成钱包。(基于RSA算法)。
使用RSA 加密算法生成交易。
我们还实现了2个展示界面:
挖矿者使用的“区块链前端”
用户生成钱包和发币的“区块链客户端”
我在原始代码的基础上进行了一些改动,向交易中加入了RSA加密,并实现了钱包生成和交易加密,两个界面使用HTML/CSS/JS 实现。
用python实现区块链:
首选: 打造一个 Blockchain
新建一个文件 blockchain.py,本文所有的代码都写在这一个文件中。首先创建一个 Blockchain 类,在构造函数中我们创建了两个列表,一个用于储存区块链,一个用于储存交易。
一个区块有五个基本属性:index,timestamp(in Unix time),transaction 列表,工作量证明(稍后解释)以及前一个区块的 Hash 值。
到这里,区块链的概念应该比较清楚了:每个新的区块都会包含上一个区块的 Hash 值。这一点非常关键,它是区块链不可变性的根本保障。如果攻击者破坏了前面的某个区块,那么后面所有区块的 Hash 都会变得不正确。不理解?慢慢消化~
我们需要一个向区块添加交易的方法:
new_transaction() 方法向列表中添加一个交易记录,并返回该记录将被添加到的区块——下一个待挖掘的区块——的索引,稍后在用户提交交易时会有用。
当 Blockchain 实例化后,我们需要创建一个初始的区块(创世块),并且给它预设一个工作量证明。
除了添加创世块的代码,我们还需要补充 new_block(), new_transaction() 和 hash() 方法:
上面的代码应该很直观,我们基本上有了区块链的雏形。但此时你肯定很想知道一个区块究竟是怎样被创建或挖掘出来的。
新的区块来自工作量证明(PoW)算法。PoW 的目标是计算出一个符合特定条件的数字,这个数字对于所有人而言必须在计算上非常困难,但易于验证。这就是工作量证明的核心思想。
举个例子:
假设一个整数 x 乘以另一个整数 y 的积的 Hash 值必须以 0 结尾,即 hash(x * y) = ac23dc...0。设 x = 5,求 y?
结果是 y = 21 // hash(5 * 21) = 1253e9373e...5e3600155e860
在比特币中,工作量证明算法被称为 Hashcash,它和上面的问题很相似,只不过计算难度非常大。这就是矿工们为了争夺创建区块的权利而争相计算的问题。通常,计算难度与目标字符串需要满足的特定字符的数量成正比,矿工算出结果后,就会获得一定数量的比特币奖励(通过交易)。
网络要验证结果,当然非常容易。
让我们来实现一个 PoW 算法,和上面的例子非常相似,规则是:寻找一个数 p,使得它与前一个区块的 proof 拼接成的字符串的 Hash 值以 4 个零开头。
区块链的实现
你可以从终端启动区块链节点,通过进入blockchain文件夹,并输入命令:python blockchain_client.py或python blockchain_client.py -p <PORT NUMBER> 。如果你未指定端口号,则会默认端口号为5000。在浏览器中打开http://localhost:<PORT NUMBER>可以看到区块链前端展示界面。
展示界面导航栏有两个标签:
挖掘:用于查看交易和区块链数据,以及挖掘新的交易区块。
配置:用于配置不同区块链节点之间的连接。
下面是blockchain.py文件代码中一些重要部分的说明。
我们首先定义一个具有以下属性的Blockchain类:
transactions:将被添加到下一区块的交易列表。
chain::实际的区块链,也就是一个区块数组。
nodes:一个包含节点URL的集合。区块链使用这些节点从其他节点中检索区块链数据并且在检查到它们没有同步时更新其区块链。
node_id:一个标识blockchain节点的随机字符串。
这个Blockchain类还实现了以下方法:
register_node(node_url): 将新的区块链节点添加到节点列表中。
verify_transaction_signature(sender_address, signature, transaction): 检查提供的签名是否与通过公钥(sender_address)签署的交易相符。
submit_transaction(sender_address, recipient_address, value, signature): 如果签名通过验证,则将交易添加到交易列表中。
create_block(nonce, previous_hash):向区块链添加一个交易块。
hash(block): 创建一个区块的SHA-256散列。
proof_of_work():工作算法的证明。寻找满足挖掘条件的随机数。
valid_proof(transactions, last_hash, nonce, difficulty=MINING_DIFFICULTY):检查散列值是否满足挖掘条件。该函数在proof_of_work函数中使用。
valid_chain(chain): 检查区块链是否有效。
resolve_conflicts():通过用网络中最长链代替链的方法解决区块链节点之间的冲突。
class Blockchain: def __init__(self): self.transactions = [] self.chain = [] self.nodes = set() #Generate random number to be used as node_id self.node_id = str(uuid4()).replace('-', '') #Create genesis block self.create_block(0, '00') def register_node(self, node_url):""" Add a new node to the list of nodes """ ... def verify_transaction_signature(self, sender_address, signature, transaction):""" Check that the provided signature corresponds to transaction signed by the public key (sender_address) """ ... def submit_transaction(self, sender_address, recipient_address, value, signature):""" Add a transaction to transactions array if the signature verified """ ... def create_block(self, nonce, previous_hash):""" Add a block of transactions to the blockchain """ ... def hash(self, block):""" Create a SHA-256 hash of a block """ ... def proof_of_work(self):""" Proof of work algorithm """ ... def valid_proof(self, transactions, last_hash, nonce, difficulty=MINING_DIFFICULTY):""" Check if a hash value satisfies the mining conditions. This function is used within the proof_of_work function. """ ... def valid_chain(self, chain):""" check if a bockchain is valid """ ... def resolve_conflicts(self):""" Resolve conflicts between blockchain's nodes by replacing our chain with the longest one in the network. """ ...
下面这一行,我们初始化了一个Python Flask 应用,用于创建和区块链交互的API。
app = Flask(__name__)CORS(app)
下面,我们初始化一个区块链对象。
blockchain = Blockchain()
下面我们定义了2种返回我们区块链前端展示界面html页面的Flask路线。
@app.route('/')def index():returnrender_template('./index.html')@app.route('/configure')def configure():returnrender_template('./configure.html')
下面我们定义了Flask API来管理交易和挖掘区块链。
此API将'sender_address', 'recipient_address', 'amount' 和 'signature' 作为输入,并且如果签名有效,则将交易添加到将添加到下一个块的交易列表中。
'/transactions/get':此API返回所有将会添加到下一个块的交易。
'/chain':此API返回所有区块链数据。
'/mine': 此API运行工作算法的证明,同时添加新的交易块到区块链。
好了,今天的知识就分享到这里,欢迎关注爱编程的南风,私信关键词:学习资料,获取更多学习资源,如果文章对你有有帮助,请收藏关注,在今后与你分享更多学习python的文章。同时欢迎在下面评论区留言如何学习python。
相关推荐
- Dify「模板转换」节点终极指南:动态文本生成进阶技巧(附代码)Jinja2引擎解析
-
这篇文章是关于Dify「模板转换」节点的终极指南,解析了基于Jinja2模板引擎的动态文本生成技巧,涵盖多源文本整合、知识检索结构化、动态API构建及个性化内容生成等六大应用场景,助力开发者高效利用模...
- 我用C#造了个AI程序员:自动调试+重构代码实战
-
在软件开发的世界里,调试和重构代码往往占据了程序员大量的时间。我一直梦想着能有一个智能助手,帮我处理这些繁琐的工作。于是,我决定用C#打造一个AI程序员,让它具备自动调试和重构代码的能力。系统架构设计...
- 公文自动排版vba代码(公文自动排版vba代码)
-
Sub公文自动排版()'设置页面参数(单位:厘米)WithActiveDocument.PageSetup.TopMargin=CentimetersToPoints(3.7)...
- Anthropic最强代码神器:Claude Code系统提示词
-
最近,在融合Opus-4之后,ClaudeCode的整体能力直线飙升.甚至一度把曾经的最强开发工具——Cursor打的抬不起头来。无论是代码生成的准确度,还是智能补全的丝滑体验,都让人印象深...
- 使用 Ruff 进行 Python 代码格式化与静态检查
-
随着Python项目的规模增大,保持一致的代码风格和高质量的代码变得尤为重要。Ruff是一个现代、高性能、支持lint和格式化的Python工具,能帮助你快速发现并修复常见代码问题。本文...
- 基础语法篇:格式化输出 含完整示例代码
-
所谓格式化输出就是按照一定格式来输出对应的内容,在Python的语法中格式化输出包含两种:格式化符号、格式化字符串一、格式化符号常用的格式化符号包括%s(将内容转换为字符串,放入占位位置)、%d(将内...
- 代码整洁如诗!Keil 插件上线,一键格式化代码,告别风格混乱!
-
引言:代码格式不统一?你的团队还在为“括号位置”吵架吗?嵌入式开发者们,你是否经历过这些抓狂瞬间?代码风格“百花齐放”:同事的代码缩进用空格,你的用Tab,合并时冲突频发!手动调整耗时费力:为了通过C...
- [信捷PLC] 信捷PLC之C函数编程(一)
-
前言写PLC程序,越来越觉得结构化文本编程语言(ST)给PC编程带来的便利,在处理一些数据上,可以写的更加灵活。所以,在项目PLC选型上,我都会优先选择支持结构化文本的PLC。国内有些厂商推出了一些较...
- C语言-HelloWorld解析(c语言的helloworld怎么写)
-
使用VisualStudio2017开发工具新创建一个项目,编写第一个C语言程序。#include<stdio.h>voidmain(){printf("HelloW...
- VSCode 配置 C++ 开发环境!教程详解
-
第一步、安装VSCode应用程序打开VSCode官网,下载对应安装包并默认安装(这里指明:安装路径可以修改)第二步、安装相关插件此时的VSCode仅仅是一个英文文本编辑器,还称不上开发工具,所以需要...
- C语言进阶教程:C语言与汇编语言交互
-
C语言和汇编语言的交互是底层编程和性能优化中的一个重要方面。理解它们如何协同工作,可以帮助开发者更好地控制硬件、优化关键代码段以及理解编译器的行为。为什么需要在C语言中嵌入汇编?尽管C语言已经提供了相...
- C语言如何处理平台相关代码(c语言的开发平台)
-
在进行跨平台C编程时,不可避免地会遇到需要针对不同操作系统或硬件架构编写特定代码的情况。C语言通过预处理器指令,特别是条件编译指令,为我们提供了处理平台相关代码的有效机制。最常用的就是利用预定义的宏(...
- C语言:hello world(c语言helloworld代码)
-
环境:a.初学者建议用“啊哈C”,这款软件简单易装;b.devc.visualstdiod.Vc6.0第一行代码:#include<stdio.h>#<stdio.h&g...
- C语言之编译器集合(编写c语言编译器)
-
C语言有多种不同的编译器,以下是常见的编译工具及其特点:一、主流C语言编译器1.GCC(GNUCompilerCollection)特点:开源、跨平台,支持多种语言(C、C++、Fortran...
- 适合零基础初学者学习C语言第一课教程,揭开C语言的神秘面纱
-
一、C语言简介我刚接触编程,首先想要学习的就是C语言,这次我就把我的感悟用我自己理解的文字表述出来,这样对刚学C语言的人来说,才是比较友好的。因为我们都没有C语言的基础,不懂啥是编程,啥事代码。我们...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- libcrypto.so (74)
- linux安装minio (74)
- ubuntuunzip (67)
- vscode使用技巧 (83)
- secure-file-priv (67)
- vue阻止冒泡 (67)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)