主页 > imtoken最新app下载 > 区块链技术详解及Python实现案例

区块链技术详解及Python实现案例

imtoken最新app下载 2023-01-17 00:14:39

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

区块链的核心是一个分布式数据库,允许两方在没有中央授权的情况下直接进行交易,通常称为“去中心化”。 “权力下放”这个简单但重要的概念对于银行、政府和市场等机构具有重要意义。 可以说,任何依赖中央数据库作为核心竞争优势的企业或组织都可能被区块链技术挑战甚至颠覆。

这篇文章的目的是给你一个实用的区块链技术介绍,而不是炒作比特币和其他加密货币概念。 第1节和第2节介绍了区块链的一些核心概念,第3节介绍了如何使用Python实现区块链。 我们还将实施 2 个 Web 前端程序,以方便用户与区块链系统进行交互。

在本文中,我将使用比特币作为“区块链”的示例,但本文中描述的大多数概念都适用于其他加密货币。

1. 区块链素养课程

2008年,一个自称中本聪的人发布了区块链白皮书,这个中本聪是谁,谁也不知道。 这份名为“比特币:一种点对点电子现金系统”的白皮书为区块链奠定了技术基础。 在最初的白皮书中,中本聪描述了如何建立一个点对点的电子现金系统,使得在线支付可以直接从一方发送到另一方,而无需通过中央机构。 该系统解决了数字货币中被称为双重支出的许多重要问题。

1.1 那么什么是双花?

假设爱丽丝想付给鲍勃 1 美元。 如果爱丽丝和鲍勃使用实物现金,那么交易执行后爱丽丝不再有 1 美元。 如果爱丽丝和鲍勃使用数字货币,问题就会变得更加复杂。 数字货币是数字形式的,可以很容易地被复制。 如果 Alice 给 Bob 发了一份价值 1 美元的数字文件,Bob 不能确定 Alice 已经删除了她的文件副本。 如果 Alice 还持有之前 1 美元的数字文件,她可以选择将相同的文件发送给 Carol。 这个问题称为双重支出。

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

解决双重支出问题的一种方法是在 Alice、Bob 和网络中的所有其他参与者之间建立一个可信的第三方(例如银行)。 该第三方负责集中管理分类账,用于跟踪和验证网络中的所有交易。 该解决方案的缺点是,要使系统正常运行,需要信任中心化的第三方。

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

为了解决双重支出问题,中本聪提出了公共账本概念,利用区块链来跟踪网络中的所有交易。 区块链具有以下特点:

分布式:账本在多台计算机上复制,而不是存储在中央服务器上。 任何具有互联网连接的计算机都可以下载区块链的完整副本;

密码:密码用于确保发送方拥有他们尝试发送的比特币,并确定交易将如何添加到区块链;

不可变的:区块链只能以追加方式更改。 也就是说,交易只能通过追加记录的方式加入到区块链中,原有的交易记录无法删除或修改;

工作证明(PoW):参与破解加密算法的人(也称为矿工)可以将交易记录添加到区块链。 这个过程称为工作证明比特币使用的数字签名方案叫什么,它使系统更安全(稍后详细介绍)。

支付比特币的流程如下:

第 1 步(仅一次):创建一个比特币钱包。 对于发送或接收比特币的人比特币使用的数字签名方案叫什么,她需要创建一个比特币钱包。 比特币钱包存储两条信息:私钥和公钥。 私钥是一个秘密字符串,允许所有者将比特币发送给其他用户,或在使用比特币支付时使用。 公钥是接收比特币所需的字符串。 公钥也称为比特币地址(不太正确,但为了简单起见,我们暂时使用它)。 请注意,钱包本身不存储比特币,比特币余额信息存储在比特币区块链中;

第 2 步:创建比特币交易。 如果爱丽丝想付给鲍勃 1 个比特币,爱丽丝需要使用她的私钥连接到她的比特币钱包,并创建一个包含比特币数量和发送地址的交易消息;

第 3 步:将交易广播到比特币网络。 一旦爱丽丝创建了一笔比特币交易,她需要将这笔交易信息广播到整个比特币网络;

第四步:确认交易。 “监听”比特币网络的矿工使用 Alice 的公钥验证交易,验证 Alice 的钱包是否有足够的比特币(在本例中至少有 1 个 BTC),并添加一个新的记录被创建,其中包含有关交易的信息;

第 5 步:向所有矿工广播区块链更改。 一旦交易被确认,矿工应该向其他矿工广播区块链变化,以确保他们的区块链副本全部同步。

2. 对区块链技术的深入研究

本节的目标是深入介绍区块链技术相关模块。 我们将介绍公钥密码学、散列函数、区块链“挖掘”和安全性。

2.1 公钥加密

公钥密码术(也称为非对称密码术):公钥可以广播,而私钥只有所有者知道。 这包含两个功能:

(1) 认证:验证发送消息的持有者是否持有与其配对的私钥;

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

(2) 加密:私钥的持有者只能用私钥与公钥配对来解密用公钥加密的消息。

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

就比特币而言,ECDSA 算法用于生成比特币钱包。 比特币使用各种密钥和地址,但为了简单起见,我们在本文中假设每个比特币钱包都有一对私钥/公钥,并且比特币地址是钱包的公钥。 如果您对比特币钱包的完整技术细节感兴趣,我推荐这篇文章 (/wiki/Technical_background_of_version_1_Bitcoin_addresses)。

要发送或接收比特币,用户首先要生成一个包含一对私钥和公钥的钱包。 如果 Alice 想发送一些 BTC 给 Bob,她需要创建一个交易,在该交易中输入她和 Bob 的公钥,以及她要发送的 BTC 数量,最后用她的私钥签署交易。 区块链中的计算机使用 Alice 的公钥来验证交易的真实性,并将交易记录添加到区块链的一个区块中。

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

2.2 哈希函数和“挖掘”

所有比特币交易都单独记录在称为区块的文件中。 比特币每 10 分钟添加一个新的交易块。 一旦一个新的区块被添加到区块链中,它就不能被改变,也不能被删除。 矿工负责创建新的交易区块。 矿工必须使用发送方的公钥来验证每笔交易,确认发送方有足够的余额用于本次交易请求,确认通过后交易将被加入区块。 矿工可以自由选择将哪些交易包含在区块中,因此发送者需要向矿工支付交易费用以激励矿工将他们的交易记录添加到区块中。

向区块链添加区块的过程称为“挖矿”,参与“挖矿”的参与者称为矿工。 矿工需要破解加密问题才能将块添加到区块链。 成功破解加密问题的矿工将获得比特币奖励(注意这与上面的交易手续费不同)。 “挖矿”过程也称为工作量证明 (PoW),它是使区块链安全可靠的主要机制(稍后会详细介绍安全问题)。

散列和区块链的密码学难题

要理解区块链的密码学难题,我们需要从哈希函数开始。 哈希函数可用于将任意大小的数据映射到固定大小的数据。 哈希函数返回的值称为哈希值。 哈希函数通常用于通过检测重复记录来加速数据库查找。 它也广泛用于密码学。 密码哈希函数可以验证一些输入数据与给定哈希值之间的映射关系,但如果输入数据未知,则很难通过哈希值推导出输入数据。 [2]

比特币使用一种称为SHA-256的散列加密算法,SHA-256应用于区块数据(比特币交易)和一个称为nonce的随机数的组合,通过改变区块数据或nonce,我们可以得到完全不同的散列值。 一个区块被认为是有效的(“挖出的”),它的哈希值和随机数需要满足一定的条件,例如,哈希值的前 4 位数字需要是“0000”。 我们可以通过使条件更复杂来增加“挖掘”的复杂性来做到这一点,例如,我们可以增加哈希值开始所需的 0 的数量。

矿工需要找到一个随机值,使哈希值满足“挖矿”条件。 下面的应用程序可以用来模拟这个过程,当你在文本框中输入数据或者改变nonce值时,你可以注意到hash值的变化。 当您点击“挖矿”按钮时,申请的nonce从0开始计算哈希值,并检查哈希值的前四位是否等于“0000”。 如果前四位不等于“0000”,则对随机数加1,重复整个过程,直到找到满足条件的随机值。

(译者注:此图仅为静态展示,程序演示请访问原文链接)

2.3 从区块到区块链

正如前面部分所讨论的,交易被分组在块中,块被附加到区块链。 要创建区块链,每个新块都使用前一个块的哈希值作为其数据的一部分。 为了创建一个新块,矿工在“挖掘”过程中以 2.2 中描述的方式添加前一个块的哈希和“挖掘”有效块。

任何一个区块中数据的变化都会影响其后面区块的哈希值。 每个块将使用前一个块的哈希值作为其数据的一部分。 如果前一个区块的数据发生变化,后面的区块就会变成“无效”区块,区块链因此具有不可篡改的特性。

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

您可以使用以下应用程序来模拟具有 3 个块的区块链。 当您输入“Data”文本框或更改 nonce 值时,您可以注意到下一个块的哈希值和“Prev”值(前一个哈希)的变化。 您可以通过点击每个区块的“挖矿”按钮来模拟挖矿过程。 挖出3个区块后,尝试更改区块1或区块2中的数据,你会发现所有后续区块都失效了。 (译者注:程序演示请访问原文链接)

2.4 添加区块到区块链

比特币网络中的所有矿工相互竞争,看谁能首先找到一个有效的区块,谁可以将其添加到区块链并从网络中获得奖励。 找到一个有效的随机数(上面的nonce值)是非常困难的,但是俗话说,悬赏之下必有勇士,有人会尝试挖矿。 那么如果两个或更多矿工同时提交他们的区块会怎样呢?

解决冲突

如果两个矿工几乎同时解决一个区块,那么我们将在网络中有两个不同的区块链(区块链 1 和区块链 2),我们需要等待下一个区块来解决冲突。 一些矿工会不断尝试在区块链 1 和区块链 2 上挖矿,如果在区块链 1 上挖出了新的区块,则区块链 2 失效,挖出区块链 1 的矿工获得相应的奖励 同时,交易区块链 2 未加入区块链的部分信息将返回交易池并加入下一个区块。 简而言之,如果区块链上发生冲突,则较长的链将成为赢家。

2.5 区块链与双花

在本节中,我们将介绍区块链通常如何处理双花攻击,以及用户应采取哪些步骤来保护他们免受损失。

种族攻击

攻击者快速连续地将同一枚硬币发送到两个不同的地址。 为防止这种攻击,只需在接受付款之前等待至少一个区块确认。 [3]

芬尼攻击

比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司_央行数字货币和比特币

攻击者事先在一笔交易中“挖掘”一个区块,并在释放该区块之前在第二笔交易中花费相同的硬币。 在这种情况下,第二笔交易将不会被验证。 为防止这种攻击,只需等待至少 6 个块确认(?),然后再接受付款。 [3]

多数攻击(也称为 51% 攻击)

在这次攻击中,攻击者拥有全网51%的算力。 攻击者首先在全网创建一个交易,然后“挖矿”一个私人区块链,他在其中改变交易信息,比如接收100个币变成接收200个币。 由于攻击者拥有大部分算力,他可以保证在交易的这个时间点他的链比“诚实”的区块链更长,并且根据区块链规则,这些私有区块将成为“诚实”的“区块” ,而这个被篡改的交易也披上了一件“合法”的外衣,当然,这种攻击发生的可能性很小,因为获得51%算力的成本太高,几乎没有人能负担得起. [4]

3. Python 中的区块链实现

在本节中,我们将使用 Python 实现一个基本的区块链和一个区块链客户端。

我们的区块链将具有以下功能:

1) 向区块链添加多个节点

2)工作量证明(PoW)

3)节点间的冲突解决

4)使用RSA加密交易

我们的区块链客户端将具有以下功能:

1)使用公钥/私钥加密(基于RSA算法)生成钱包

2)使用RSA加密生成交易

我们还将实施 2 个仪表板:

1)矿工“区块链前台”

2)“区块链客户端”让用户生成钱包并发送硬币

这个项目是基于这个github项目()。 我对原始代码进行了一些修改,以便为交易添加 RSA 加密。 钱包生成和交易加密基于 Jupyter 编辑器,2 个仪表板使用 HTML/CSS/JS 实现。

您可以从下载完整的源代码。

请注意,该项目仅供学习,不用于生产,不够安全,缺少许多重要功能。

3.1 区块链客户端实现

您可以通过访问 blockchain_client 文件夹并键入 python blockchain_client.py 从终端启动区块链客户端。 在浏览器中输入 http://localhost:8080 ,您将看到以下仪表板:

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

仪表板的导航栏中有 3 个选项卡:

1)钱包生成器:使用RSA加密算法生成钱包(公钥/私钥对);

2)进行交易:生成交易并发送至区块链节点;

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 个返回 html 页面的 Flask 路由,每个选项卡一个。

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

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

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

下面我们定义一个 API,以 sender_address、sender_private_key、recipient_address、value 作为输入值,返回交易(不带私钥)和签名。

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

3.2 区块链实现

可以在blockchain文件夹中启动blockchain节点,然后输入python blockchain_client.py或python blockchain_client.py -p。 如果未指定端口号,它将默认为端口 5000。在浏览器中,转到 http://localhost:

查看区块链前端仪表板。

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

仪表板在导航栏中有 2 个选项卡:

1. 挖矿:用于查看交易和区块链数据,挖掘新的交易区块;

2、配置:用于配置不同区块链节点之间的连接;

以下是 blockchain.py 代码最重要部分的一些解释。

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

交易:将被添加到交易列表中;

Chain:用数据构建的区块链;

节点:包含节点 URL 的集合。 区块链使用这些节点从其他节点检索区块链数据,并在不同步时更新区块链;

node_id:标识区块链节点的随机字符串;

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():通过替换网络中最长的链来解决区块链节点之间的冲突;

下面的代码启动一个 Python Flask 应用程序,我们将使用它来创建不同的 API 以与区块链交互。 proof_of_work():工作证明算法。 找到一个满足挖矿条件的随机数。

valid_proof(transactions, last_hash, nonce, difficulty = MINING_DIFFICULTY):检查哈希值是否满足挖矿条件。 该函数用于 proof_of_work 函数。

valid_chain(chain):检查链接是否有效。

resolve_conflicts():通过替换网络中最长的链来解决区块链节点之间的冲突。

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

下面的代码启动一个 Python Flask 应用程序,我们将使用它来创建不同的 API 以与区块链交互。

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

接下来,我们启动一个区块链实例。

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

下面我们定义了 2 个 Flask 路由,它们返回我们的区块链前端仪表板的 html 页面。

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

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

'/transactions/new':该API以'sender_address'、'recipient_address'、'amount'和'signature'为输入,将交易添加到交易列表中,如果签名有效,则将交易列表添加到下一个街区中间。

'/transactions/get':此 API 返回将添加到下一个块的所有交易。

'/chain':此 API 返回所有区块链数据。

'/mine':此 API 运行工作量证明算法并将新的交易块添加到区块链。

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

央行数字货币和比特币_武汉比特币数字科技有限公司_比特币使用的数字签名方案叫什么

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

下面我们定义 Flask API 来管理区块链节点。

'/nodes/register':此 API 将节点 URL 列表作为输入并将它们添加到节点列表中。

'/nodes/resolve':此 API 通过用网络中可用的最长链替换本地链来解决区块链节点之间的冲突。

'/nodes/get':此 API 返回节点列表。

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

央行数字货币和比特币_比特币使用的数字签名方案叫什么_武汉比特币数字科技有限公司

下面的代码启动一个 Python Flask 应用程序,我们将使用它来创建不同的 API 以与区块链交互。

接下来,我们启动一个区块链实例。

下面我们定义了 2 个 Flask 路由,它们返回我们的区块链前端仪表板的 html 页面。

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

'/transactions/new':该API以'sender_address'、'recipient_address'、'amount'和'signature'为输入,将交易添加到交易列表中,如果签名有效,则将交易列表添加到下一个街区中间。

'/transactions/get':此 API 返回将添加到下一个块的所有交易。

'/chain':此 API 返回所有区块链数据。

'/mine':此 API 运行工作量证明算法并将新的交易块添加到区块链。

下面我们定义 Flask API 来管理区块链节点。

'/nodes/register':此 API 将节点 URL 列表作为输入并将它们添加到节点列表中。

'/nodes/resolve':此 API 通过用网络中可用的最长链替换本地链来解决区块链节点之间的冲突。

'/nodes/get':此 API 返回节点列表。

4。结论

在本文中,我们介绍了区块链的一些核心概念,并学习了如何使用 Python 实现示例。 为了简单起见,我没有介绍一些技术细节,例如:钱包地址和默克尔树。 如果您想了解更多,我建议您阅读比特币白皮书。

参考

1 - 维基百科 - 公钥密码学

2 - 维基百科 - 哈希函数

3 - Bitcoin Stackexchange - 交易完成后会发生什么?

4 - Bitcoin Wiki - 多数攻击

结尾。