使用Python 搭建自己的区块链
【相关学习推荐:python教程】
你是否会和我一样,对加密数字货币底层的区块链技术非常感兴趣,特别想了解他们的运行机制。
但是学习区块链技术并非一帆风顺,我看多了大量的视频教程还有各种课程,最终的感觉就是真正可用的实战课程太少。
我喜欢在实践中学习,尤其喜欢一代码为基础去了解整个工作机制。如果你我一样喜欢这种学习方式,当你学完本教程时,你将会知道区块链技术是如何工作的。
写在开始之前
记住,区块链是一个 不可变的、有序的 被称为块的记录链。它们可以包含交易、文件或任何您喜欢的数据。但重要的是,他们用哈希 一起被链接在一起。
如果你不熟悉哈希,这里是一个解释。
该指南的目的是什么?
你可以舒服地阅读和编写基础的 Python,因为我们将通过 HTTP 与区块链进行讨论,所以你也要了解 HTTP 的工作原理。
我需要准备什么?
确定安装了 Python 3.6 + (还有 pip
) ,你还需要安装 Flask、 Requests 库:
1 |
|
对了, 你还需要一个支持HTTP的客户端, 比如 Postman 或者 cURL,其他也可以。
源码在哪儿?
可以点击这里
Step 1: 创建一个区块链
打开你最喜欢的文本编辑器或者IDE, 我个人比较喜欢 PyCharm. 新建一个名为blockchain.py
的文件。 我们将只用这一个文件就可以。但是如果你还是不太清楚, 你也可以参考 源码.
描述区块链
我们要创建一个 Blockchain
类 ,他的构造函数创建了一个初始化的空列表(要存储我们的区块链),并且另一个存储交易。下面是我们这个类的实例:
blockchain.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
我们的 Blockchain
类负责管理链式数据,它会存储交易并且还有添加新的区块到链式数据的Method。让我们开始扩充更多Method。
块是什么样的 ?
每个块都有一个 索引
,一个 时间戳(Unix时间戳)
,一个事务列表
, 一个 校验
(稍后详述) 和 前一个块的散列
。
下面是一个Block的例子 :
blockchain.py
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
在这一点上,一个 区块链
的概念应该是明显的 - 每个新块都包含在其内的前一个块的 散列
。 这是至关重要的,因为这是 区块链
不可改变的原因:如果攻击者损坏 区块链
中较早的块,则所有后续块将包含不正确的哈希值。
这有道理吗? 如果你还没有想通,花点时间仔细思考一下 - 这是区块链背后的核心理念。
添加交易到区块
我们将需要一个添加交易到区块的方式。我们的 new_transaction()
方法的责任就是这个, 并且它非常的简单:
blockchain.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
new_transaction()
方法添加了交易到列表,它返回了交易将被添加到的区块的索引---讲开采下一个这对稍后对提交交易的用户有用。
创建新的区块
当我们的 Blockchain
被实例化后,我们需要将 创世 区块(一个没有前导区块的区块)添加进去进去。我们还需要向我们的起源块添加一个 证明,这是挖矿的结果(或工作证明)。 我们稍后会详细讨论挖矿。
除了在构造函数中创建 创世 区块外,我们还会补全 new_block()
、 new_transaction()
和 hash()
函数:
blockchain.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
|
上面的代码应该是直白的 --- 为了让代码清晰,我添加了一些注释和文档说明。 我们差不多完成了我们的区块链。 但在这个时候你一定很疑惑新的块是怎么被创建、锻造或挖掘的。
工作量证明算法
使用工作量证明(PoW)算法,来证明是如何在区块链上创建或挖掘新的区块。PoW 的目标是计算出一个符合特定条件的数字,这个数字对于所有人而言必须在计算上非常困难,但易于验证。这是工作证明背后的核心思想。
我们将看到一个简单的例子帮助你理解:
假设一个整数 x
乘以另一个整数 y
的积的 Hash 值必须以 0 结尾,即 hash(x * y) = ac23dc...0
。设 x = 5
,求y
。
用 Python 实现:
1 2 3 4 5 6 |
|
结果是:y = 21
。因为,生成的 Hash 值结尾必须为 0
。
1 |
|
在比特币中,工作量证明算法被称为 Hashcash ,它和上面的问题很相似,只不过计算难度非常大。这就是矿工们为了争夺创建区块的权利而争相计算的问题。 通常,计算难度与目标字符串需要满足的特定字符的数量成正比,矿工算出结果后,就会获得一定数量的比特币奖励(通过交易)。
验证结果,当然非常容易。
实现工作量证明
让我们来实现一个相似 PoW 算法。规则类似上面的例子:
找到一个数字 P ,使得它与前一个区块的 Proof 拼接成的字符串的 Hash 值以 4 个零开头。
blockchain.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
衡量算法复杂度的办法是修改零开头的个数。使用 4 个来用于演示,你会发现多一个零都会大大增加计算出结果所需的时间。
现在 Blockchain 类基本已经完成了,接下来使用 HTTP Requests 来进行交互。
Step 2: Blockchain 作为 API 接口
我们将使用 Python Flask 框架,这是一个轻量 Web 应用框架,它方便将网络请求映射到 Python 函数,现在我们来让 Blockchain 运行在基于 Flask web 上。
我们将创建三个接口:
-
/transactions/new
创建一个交易并添加到区块 -
/mine
告诉服务器去挖掘新的区块 -
/chain
返回整个区块链
创建节点
我们的 Flask 服务器 将扮演区块链网络中的一个节点。我们先添加一些框架代码:
blockchain.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
简单的说明一下以上代码:
- 第 15 行:实例化节点。阅读更多关于 Flask 内容。
- 第 18 行:为节点创建一个随机的名称。.
- 第 21 行:实例化 Blockchain 类。
- 第 24--26 行:创建 /mine 接口,GET 方式请求。
- 第 28--30 行:创建 /transactions/new 接口,POST 方式请求,可以给接口发送交易数据。
- 第 32--38 行:创建 /chain 接口,返回整个区块链。
- 第 40--41 行:服务器运行端口 5000 。
发送交易
发送到节点的交易数据结构如下:
1 2 3 4 5 |
|
因为我们已经有了添加交易的方法,所以基于接口来添加交易就很简单了。让我们为添加事务写函数:
blockchain.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
挖矿
挖矿正是神奇所在,它很简单,做了一下三件事:
- 计算工作量证明 PoW
- 通过新增一个交易授予矿工(自己)一个币
- 构造新区块并将其添加到链中
blockchain.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
注意交易的接收者是我们自己的服务器节点,我们做的大部分工作都只是围绕 Blockchain 类方法进行交互。到此,我们的区块链就算完成了,我们来实际运行下。
Step 3: 运行区块链
你可以使用 cURL 或 Postman 去和 API 进行交互
启动 Server:
1 2 |
|
让我们通过请求 http://localhost:5000/mine ( GET )来进行挖矿:
用 Postman 发起一个 GET 请求.
创建一个交易请求,请求 http://localhost:5000/transactions/new (POST),如图
如果不是使用 Postman,则用一下的 cURL 语句也是一样的:
1 2 3 4 5 |
|
在挖了两次矿之后,就有 3 个块了,通过请求 http://localhost:5000/chain 可以得到所有的块信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
Step 4: 一致性(共识)
我们已经有了一个基本的区块链可以接受交易和挖矿。但是区块链系统应该是分布式的。既然是分布式的,那么我们究竟拿什么保证所有节点有同样的链呢?这就是一致性问题,我们要想在网络上有多个节点,就必须实现一个一致性的算法。
注册节点
在实现一致性算法之前,我们需要找到一种方式让一个节点知道它相邻的节点。每个节点都需要保存一份包含网络中其它节点的记录。因此让我们新增几个接口:
-
/nodes/register
接收 URL 形式的新节点列表. -
/nodes/resolve
执行一致性算法,解决任何冲突,确保节点拥有正确的链.
我们修改下 Blockchain 的 init 函数并提供一个注册节点方法:
blockchain.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
我们用 set 来储存节点,这是一种避免重复添加节点的简单方法.
实现共识算法
就像先前讲的那样,当一个节点与另一个节点有不同的链时,就会产生冲突。 为了解决这个问题,我们将制定最长的有效链条是最权威的规则。换句话说就是:在这个网络里最长的链就是最权威的。 我们将使用这个算法,在网络中的节点之间达成共识。
blockchain.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
|
第一个方法 valid_chain()
负责检查一个链是否有效,方法是遍历每个块并验证散列和证明。
resolve_conflicts()
是一个遍历我们所有邻居节点的方法,下载它们的链并使用上面的方法验证它们。 如果找到一个长度大于我们的有效链条,我们就取代我们的链条。
我们将两个端点注册到我们的API中,一个用于添加相邻节点,另一个用于解决冲突:
blockchain.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
在这一点上,如果你喜欢,你可以使用一台不同的机器,并在你的网络上启动不同的节点。 或者使用同一台机器上的不同端口启动进程。 我在我的机器上,不同的端口上创建了另一个节点,并将其注册到当前节点。 因此,我有两个节点:http://localhost:5000
和 http://localhost:5001
。 注册一个新节点:
然后我在节点 2 上挖掘了一些新的块,以确保链条更长。 之后,我在节点1上调用 GET /nodes/resolve
,其中链由一致性算法取代:
这是一个包,去找一些朋友一起,以帮助测试你的区块链。
我希望本文能激励你创造更多新东西。我之所以对数字货币入迷,是因为我相信区块链会很快改变我们看待事物的方式,包括经济、政府、档案管理等。
更新:我计划在接下来的第2部分中继续讨论区块链交易验证机制,并讨论一些可以让区块链进行生产的方法。
相关推荐:编程视频课程
以上是使用Python 搭建自己的区块链的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Stellar再次引起广泛关注,这不仅仅是炒作。在一则新视频中,来自Ncashofficial的加密专家Nick,拥有超过200,000订阅者,详细分析了Stellar的情况。尽管Stellar的XLM在第一层的领域展现了对资产代币化的承诺,并拥有令人瞩目的合作伙伴组合,但关于XLM的讨论主要集中在其突破阻力和保持动力方面的挑战。然而,拥有超过206,000订阅者的Ncashofficial的加密货币专家Nick最近的分析显示,XLM可能是最被忽视的代币之一。随着华尔街继续向区块链和BenHor

在加密货币市场中,选择一个可靠的交易平台是至关重要的。OK交易平台作为全球知名的数字资产交易所,吸引了大量大陆新手用户。本指南将详细介绍如何在OK交易平台上进行注册和使用,帮助新手用户快速上手。

2025年全球十大加密货币交易平台APP依次为:1. Binance(币安),全球交易量第一,支持600 加密货币,冷钱包存储98%资产;2. OKX(欧易),合约交易量全球第三,推出元宇宙交易大厅;3. Coinbase,美国最大合规交易所,支持美元直接交易,用户超1亿;4. Bybit,衍生品交易量全球第二,推出现货流动性配对计划;5. Bitget,复制交易功能行业领先,聚焦亚洲市场;6. MEXC Global,主打山寨币交易,支持2276种加密货币;7. Gate.io(芝麻开门),老

在加密货币市场中,山寨币(altcoins)常常被投资者视为潜在的高回报资产。虽然市场上存在许多山寨币,但并非所有山寨币都能带来预期的收益。本文将为零基础的投资者提供一份详细的攻略,介绍2025年值得囤积的5种山寨币,并解释如何通过这些投资实现稳赚50倍的目标。

Python和JavaScript的主要区别在于类型系统和应用场景。1.Python使用动态类型,适合科学计算和数据分析。2.JavaScript采用弱类型,广泛用于前端和全栈开发。两者在异步编程和性能优化上各有优势,选择时应根据项目需求决定。

币安(Binance)是全球领先的加密货币交易平台之一,提供多种数字资产的交易服务。如果你正在考虑使用币安进行加密货币交易,本文将为你提供详细的安装和注册指南。

币圈十大加密货币交易所排名:1. Binance:全球领先,提供高效交易和多种金融产品。2. OKX:创新多样,支持多种交易类型。3. Huobi:稳定可靠,服务优质。4. Coinbase:新手友好,界面简洁。5. Kraken:专业交易者首选,工具强大。6. Bitfinex:高效交易,交易对丰富。7. Bittrex:安全合规,监管合作。8. Poloniex等等。

如果你是一位苹果手机用户,并且对加密货币交易感兴趣,那么你一定不能错过OKX欧易这个平台。OKX欧易作为全球领先的加密货币交易所之一,提供了多种数字资产的交易服务,涵盖了比特币、以太坊、莱特币等主流币种,同时还支持多种山寨币和新兴代币的交易。无论你是刚入门的投资者,还是经验丰富的交易者,OKX欧易都能够满足你的需求。下面我们将详细介绍如何通过苹果手机在OKX欧易官方网站上进行注
