主页 > imtoken中文版app > 如何用Python快速实现区块链?

如何用Python快速实现区块链?

imtoken中文版app 2023-11-23 05:08:05

区块链的核心是分布式数据库,任何交易双方都可以直接进行交易,无需通过权威中介。 这个简单而强大的概念对银行、政府和市场等不同的机构具有巨大的影响。 任何以中心化数据库为核心竞争优势的企业或组织都可能受到区块链技术的威胁​​。

本文的主要目的是从实用的角度介绍区块链,而不是讨论比特币等加密货币的价格等炒作。 第一小节和第二小节将介绍区块链背后的核心概念,第三小节将介绍使用Python实现区块链的方法。 它还将介绍两个 Web 应用程序,帮助最终用户轻松地与区块链交互。

请注意,我在这里以比特币为例向您介绍更通用的“区块链”技术,本文介绍的大部分概念也适用于其他区块链和加密货币。

下面是我们将在第 3 节中创建的 Web 应用程序的动画屏幕截图。

比特币余额生成器_比特币地址余额排名_比特币钱包生成多个地址

1. 区块链崩溃

关于区块链的一切起源于2008年以中本聪为名的匿名人士或组织发表的一份白皮书。这份白皮书的标题是《比特币:一种端到端的电子货币系统》(请参考这里为原文:),奠定了后世著名的区块链的基础。 在最初的比特币白皮书中,中本聪解释了如何构建一个端到端的数字货币系统,使在线支付能够直接从一方传输到另一方,而无需通过中介。 该系统解决了电子货币中的一个重要问题:即“双重支付”。

1.1 什么是双花?

假设 A(爱丽丝)想付给 B(鲍勃)1 美元。 如果使用现金,那么交易完成后,A手里的1元钱就没了。 如果A和B使用数字货币,那么问题就复杂了。 数字货币是数字形式的,很容易被复制。 例如,A通过电子邮件给B发送了一份价值1元的数字文件,但B并不知道A是否删除了这份文件的副本。 如果 A 手里还拿着那张 1 美元的文件,她可以继续把同样的文件寄给 C(Carol)。 这个问题被称为“双花”。

比特币余额生成器_比特币钱包生成多个地址_比特币地址余额排名

图片:双重支出问题:如果 A(爱丽丝)向 B(鲍勃)发送电子货币。 B无从得知A是否删除了该文件的副本,A可以继续将同一个文件发送给C(Carol)。

解决双重支出问题的一种方法是在 A、B 和所有其他参与者的网络中找到一个可信的第三方(例如银行)。 该第三方负责管理集中分类账,记录和验证网络中的所有交易。 这种解决方案的缺点是系统需要一个中心化的第三方来提供信任。

1.2 比特币:双重支出问题的去中心化解决方案

为了解决双重支出问题,中本聪提出了公共账本,即比特币区块链可以记录网络中的所有交易。 比特币区块链具有以下特点:

比特币地址余额排名_比特币钱包生成多个地址_比特币余额生成器

图 1:实物现金

实物现金不存在双重支出的问题。

图 2:中心化数字货币

双花问题可以由中心化的第三方解决,比如银行。

图 3:去中心化数字货币

比特币通过去中心化网络区块链解决了数字货币的双重支付问题。

发送比特币的具体过程如下:

2. 深入区块链技术

本小节的目标是深入介绍构成区块链的组件。 我们将涵盖公钥密码学、哈希函数、挖掘和区块链安全性。

2.1 公钥加密

公钥加密或非对称加密是指使用一对密钥的加密系统。 一个密钥是公钥,可以广泛分发,另一个密钥是私钥,只有持有者知道。 这种加密有两个应用:第一个是身份验证,公钥可以验证信息确实是由私钥持有者发送的; 二是加密,用公钥加密的信息,只有私钥持有者才能解密。

RSA加密算法和椭圆曲线数字签名(ECDSA)算法是最流行的公钥加密算法。

专门针对比特币,它使用ECDSA算法生成比特币钱包。 比特币使用各种密钥和地址,但为了简单起见,我们在本文中假设每个比特币钱包都持有一对公钥/私钥,并且比特币地址是钱包的公钥。 如果您对比特币钱包的技术细节感兴趣,那么我推荐您阅读这篇文章:。

在发送或接收 BTC 时,用户必须首先生成一个包含私钥和公钥的钱包。 如果 A 想向 B 发送一些 BTC,她可以输入她和 B 的公钥以及发送的金额,然后创建交易。 接下来A需要用自己的私钥对交易进行签名。 区块链上的一台计算机使用 A 的公钥验证交易的真实性,并将交易记录添加到区块链中。

比特币钱包生成多个地址_比特币余额生成器_比特币地址余额排名

区块链上交易的认证流程

图 1:A 生成交易并使用私钥对其进行签名

图 2:A 将交易、签名和公钥的副本发送到区块链网络

图 3:区块链网络上的任何计算机都可以使用交易、签名和 A 的公钥来验证交易

2.2 哈希函数与挖矿

所有比特币交易都被分组到称为块的文件中。 比特币每 10 分钟添加一个交易块。 一旦一个新的区块进入区块链,这个区块就是不可变的,不能被删除或修改。 网络中有一类特殊的用户称为矿工,他们负责为交易创建新的区块。 矿工必须使用发件人的公钥验证每笔交易,确认发件人有足够的余额支付,然后将交易添加到区块中。 矿工可以自由选择将哪些交易包含在区块中,因此发送方需要向矿工支付交易费,作为他们将交易添加到区块中的奖励。

区块需要被“挖掘”才能被区块链接受。 为了开采一个区块,矿工需要找到一个非常非常罕见的密码问题解决方案。 如果区块链接受了一个开采的区块,矿工除了交易费用之外还可以获得额外的奖励。 挖矿过程也称为工作量证明(PoW),其主要机制是保证区块链的免信任和安全(后面会详细讨论区块链的安全性)。

哈希和区块链加密机制

为了更好的理解区块链的这个密码学问题,我们需要先介绍一下哈希函数。 哈希函数用于将任意长度的数据映射成固定长度。 哈希函数的返回值称为哈希。 哈希函数通常用于通过检测重复记录来加速数据库查询,它们也广泛用于加密。 密码哈希函数可以很容易地验证输入数据是否与给定的哈希值匹配,但如果输入数据未知,则很难推断出具有已知哈希值的输入。

比特币使用的加密哈希函数称为 SHA-256。 块数据(比特币交易)与随机数(称为随机数)结合计算 SHA-256。 通过更改块数据或随机数,我们可以获得完全不同的哈希值。 对于一个有效的或“挖出的”区块,它的带有 nonce 的哈希值需要满足一定的条件。 例如,哈希值的前 4 位必须等于“0000”。 我们可以通过增加条件的复杂度来增加挖矿的难度,比如可以增加hash值开头需要0的个数。

矿工需要解决的密码学问题是找到一个随机数,保证生成的哈希值满足挖矿条件。 下面显示的应用程序可以模拟挖矿。 当你在“Data”文本框中输入一个数字或者改变Nonce时,你可以看到哈希值的变化。 当您点击“我的”时,应用程序会从0开始一个一个地替换随机数,计算哈希值并检查前4位是否等于“0000”。 如果前4位不等于“0000”,则将随机数加1,然后重复整个计算过程,直到找到满足条件的nonce值。 如果块被成功开采,背景颜色将变为绿色。

比特币钱包生成多个地址_比特币余额生成器_比特币地址余额排名

2.3 从区块到区块链

正如我们在上一节中讨论的那样比特币余额生成器,交易组存储在块中,然后将其添加到区块链中。 为了建立区块链,每个新区块都必须使用前一个区块的哈希值作为其数据的一部分。 在创建新区块时,矿工需要选择一组交易,加上前一个区块的哈希值,然后按照上述方式挖出当前区块。

区块数据的任何变化都会影响所有后续区块的哈希值,导致它们失效。 这赋予了区块链不可变的属性。

比特币地址余额排名_比特币钱包生成多个地址_比特币余额生成器

图片:形成链的区块使用前一个区块的哈希值形成区块链。

下面显示的应用程序可以模拟由 3 个块组成的区块链。 当在“Data”文本框中输入数据或改变“Nouc​​e”时,hash值会改变,“Prev”(前一个hash)的值也会改变。 您可以单独选择每个块并单击“挖矿”按钮来模拟挖矿过程。 在所有 3 个区块都被挖出后,如果更改区块 1 或 2 中的数据,您将看到所有后续区块都将失效。

比特币钱包生成多个地址_比特币余额生成器_比特币地址余额排名

比特币钱包生成多个地址_比特币地址余额排名_比特币余额生成器

比特币地址余额排名_比特币余额生成器_比特币钱包生成多个地址

图片:以上挖矿模拟器使用了Anders Brownworth的区块链demo,详情请点这里:

2.4 将区块添加到区块链

比特币网络中的所有矿工都在相互竞争,以寻找合法的区块附加到区块链并获得奖励。 为合法区块找到随机数是一个低概率事件,但由于矿工数量众多,某个区块被某个矿工找到的概率非常高。 第一个提交有效区块的矿工将他的区块附加到区块链并获得比特币奖励。 但是比特币余额生成器,如果两个或更多矿工同时提交区块会怎样?

解决冲突

如果两个矿工同时挖一个区块,网络中就会出现两个不同的区块链,我们需要等待下一个区块来解决冲突。 一些矿工决定继续挖掘区块链 1,而另一些矿工则选择区块链 2。第一个找到新区块的矿工可以解决这种冲突。 如果新区块是在区块链 1 上挖出来的,那么区块链 2 就失效了,所以前一个区块的奖励将归区块链 1 的矿工所有,而区块链 2 中的交易将无效。 将被添加到区块链,因此它必须回到交易池与区块链 1 同步,然后移动到下一个区块。 简而言之,如果区块链有冲突,最长的链会占上风。

比特币钱包生成多个地址_比特币余额生成器_比特币地址余额排名

图片:冲突解决 - 最长的链式调用

2.5 区块链与双花

在本节中,我们将介绍最流行的应对区块链双花攻击的方法,以及用户可以采取的预防措施。

速度攻击

攻击者非常快速地将相同的货币发送到两个地址。 为防止这种攻击,我们建议至少等到下一个区块被确认后再接受付款。

芬尼攻击

攻击者预先挖掘一笔交易的一个区块,并在该区块发布之前在另一笔交易中使用相同的比特币。 在这种情况下,第二笔交易将无效。 为了防止这种攻击,我们建议在接受付款之前至少等待 6 个区块被确认。

主要攻击(也称为 51% 攻击)

在这次攻击中,攻击者必须拥有网络中 51% 的算力。 攻击者可以创建一个交易,将其广播到整个网络,然后在一个秘密区块链上双花前一个交易的硬币,然后进行挖掘。 由于攻击者拥有大部分计算能力,他当然可以在某个时候拥有比“诚实”网络更长的链。 之后,他可以用自己更长的区块链替换“诚实”的区块链,并取消原来的交易记录。 因为这种攻击在比特币等区块链中成本非常高,不太可能发生。

3.用Python实现区块链

在本节中,我们将使用 Python 实现一个基本的区块链和一个区块链客户端。 我们的区块链将具有以下特点:

我们的区块链客户端将具有以下特点:

我们还将实现两个仪表板:

区块链实现主要基于 GitHub 上的这个项目:. 为了在交易中使用RSA加密,我对原来的代码做了一些改动。 生成钱包和交易代码源自这个 Jupyter notebook:。 这两个仪表板是用 HTML/CSS/JS 从头开始​​编写的。

您可以从这里下载所有代码:

请注意,本文的实现方法仅供教学使用,缺乏安全性,不具备良好的扩展性,省略了很多重要功能,请勿用于产品开发。

3.1 实现区块链客户端

您可以使用终端,转到 blockchain_client 目录,然后键入 pythonblockchain_client.py 以启动区块链客户端。 在浏览器中输入:8080,可以看到如下仪表盘。

比特币钱包生成多个地址_比特币余额生成器_比特币地址余额排名

Dashboard 的导航栏上有 3 个选项卡:

您必须至少有一个正在运行的区块链节点才能创建或查看交易。 如何运行节点,请参考下一节。

下面介绍blockchain_client.py代码中最重要的部分。

我们定义了一个名为Transaction的python类,它有4个属性:sender_address、sender_private_key、recipient_address、value。 表示创建交易所需的 4 种信息。

to_dict() 方法返回 Python 字典格式的交易信息(没有发送者的私钥)。 sign_transaction() 方法接收交易信息(没有发送方的私钥)并使用发送方的私钥对其进行签名。

比特币地址余额排名_比特币余额生成器_比特币钱包生成多个地址

以下代码行初始化 Python Flask,我们可以使用此应用程序创建不同的 API 以与区块链和客户端进行交互。

比特币钱包生成多个地址_比特币地址余额排名_比特币余额生成器

下面我们定义了 3 个 Flask 路由来返回 html 页面。 每个选项卡一个 html 页面。

比特币钱包生成多个地址_比特币余额生成器_比特币地址余额排名

下面我们定义生成钱包(一对公钥/私钥)的API。

比特币地址余额排名_比特币钱包生成多个地址_比特币余额生成器

比特币余额生成器_比特币地址余额排名_比特币钱包生成多个地址

我们下面定义的 API 接收 sender_address、sender_private_key、recipient_address、value 作为输入,然后返回交易(不包括私钥)和签名。

比特币地址余额排名_比特币余额生成器_比特币钱包生成多个地址

比特币余额生成器_比特币地址余额排名_比特币钱包生成多个地址

3.2 区块链的实现

您可以使用终端,转到区块链目录,然后键入 python blockchain_client.py 或 python blockchain_client.py -p

, 启动区块链的一个节点。 如果未指定端口,则默认使用端口 5000。 输入:在浏览器中,可以看到区块链前端的dashboard。

比特币地址余额排名_比特币钱包生成多个地址_比特币余额生成器

Dashboard 的导航栏上有 2 个选项卡:

下面是对 blockchain.py 代码中最重要部分的介绍。

我们定义一个具有以下属性的区块链类:

Blockchain 类还实现了以下方法:

比特币地址余额排名_比特币余额生成器_比特币钱包生成多个地址

以下代码行初始化 Python Flask,我们可以使用此应用程序创建不同的 API 以与区块链进行交互。

比特币余额生成器_比特币地址余额排名_比特币钱包生成多个地址

下面我们初始化区块链的实例。

比特币地址余额排名_比特币钱包生成多个地址_比特币余额生成器

如下,我们定义两个Flask路由返回区块链前端dashboard的html页面

比特币余额生成器_比特币钱包生成多个地址_比特币地址余额排名

如下,我们定义 Flask API 来管理交易和区块挖掘。

比特币余额生成器_比特币地址余额排名_比特币钱包生成多个地址

比特币钱包生成多个地址_比特币余额生成器_比特币地址余额排名

如下,我们定义了Flask的API来管理区块链的节点。

比特币钱包生成多个地址_比特币余额生成器_比特币地址余额排名

比特币地址余额排名_比特币钱包生成多个地址_比特币余额生成器

总结

在这篇文章中,我们介绍了区块链背后的核心概念,并学习了如何在 Python 中实现它们。 为了简单起见,我没有涉及太多技术细节,例如钱包地址和默克尔树。 如果你想了解更多这方面的信息,我建议你阅读原始的比特币白皮书,订阅比特币维基百科 ( ),并参考 Andreas Antonopoulos 的书《精通比特币》第 2 版 ( )。