学习区块链的捷径:构建一个属于自己的区块链

当前位置:首页 > 币圈百科 > 学习区块链的捷径:构建一个属于自己的区块链

学习区块链的捷径:构建一个属于自己的区块链

2022-12-15币圈百科312

你愿意看这篇文章是因为你对加密货币的崛起感到兴奋,你想知道它们背后的基础技术3354区块链是如何工作的。

但是理解区块链并不容易,至少对我来说是这样。在跋涉了很多视频,学习了很多教程之后,我开始自己动手练习。

我喜欢动手学习。它迫使我从代码层面理解区块链的本质。如果你做同样的事情,在学习本指南后,你会对区块链的基本操作原理有一个坚实的掌握。

开始之前.

记住,我们所说的区块链是由不易篡改的数据块按顺序链接而成的记录簿。它们可以包含交易、文件或任何你想要的数据。重要的是,将它们链接在一起的过程使用了hash。

如果你不知道什么是地狱哈希,这篇文章会给你一个很好的解释。

这篇指南文章是给谁看的?您应该精通基本Python语言的读写,并对HTTP请求如何工作有一些了解,因为我们将通过HTTP与我们的区块链对话。

我需要准备什么?确保你安装了Python 3.6?还需要安装Flask和Requests库:

pip install Flask==0 . 12 . 2 Requests==2 . 18 . 4哦,对了,还需要一个HTTP客户端,比如Postman或者cURL。当然,其他客户端也是可能的。最终代码在哪里?可以在这里找到:https://github.com/dvf/blockchain

第一步:构建区块链

打开你喜欢的文本编辑器或IDE。我个人喜欢用PyCharm。新建一个文件,命名为blockchain.py我们只用一个文件,但是如果丢失了,随时可以引用源代码。我们创建了一个区块链类,它的构造函数创建一个初始空列表(存储我们的区块链),而另一个用于存储事务。下面是我们的类设计大纲:ff

区块链类设计大纲

我们的区块链类负责管理这个区块链。它将用于存储事务,并有一些辅助方法向区块链添加新的块。让我们开始实现一些方法。街区是什么样子的?每个块都有一个索引、一个时间戳(Unix时间)、一系列事务、一个证书(后面会提到)和一个以前块的散列。下面是一个块中包含的一些信息:ff至此,区块链的概念应该很明显了。每个新块除了自己的信息之外,还包括前一个块的散列。这一点非常关键,因为它使得区块链不可变:如果攻击者破坏了区块链中的前一个块,所有后续块将包含不正确的散列。这有什么用?如果你不这么认为,请花点时间考虑一下。这是区块链背后的核心理念。向块中添加事务我们需要一种向块中添加事务的方法。我们的new_transaction()代码负责这个,也很简单:ffnew _ transaction()指令在链表中增加一个事务后,会返回增加的事务块(也就是下一个要挖的块)的索引。之后,这对提交交易的用户很有用。创建一个新块当我们的区块链被部署时,我们需要生成创建块(初始块)来启动它。我们还需要给我们的创始块加一个“证书”,也就是挖掘的结果(或者工作量证书)。稍后我们将详细讨论采矿。除了使用我们的构造函数创建创始块,我们还会学习更多关于new_block(),new_transaction()和hash (): ff ff ff上面的代码应该说是简单的。我添加了一些注释和文档字符串,使代码更容易阅读。我们几乎完成了区块链的建设。但在这一点上,你一定想知道新的区块是如何被创造或挖掘出来的。 理解工作量证明(pow)所谓工作量证明,就是找一串解数学题。这个字符串一定很难找到,但是很容易被网络上的每个人验证。这是工作负载证明背后的核心思想。让我们看一个非常简单的例子来帮助您理解工作负载证明。我们决定,某个整数x乘以另一个整数y的散列,结果的结尾一定是0。所以,hash (x * y)=ac23dc.0.为了简化,我们将x设为5。然后我们用Python实现:

from hash lib import sha 256 x=5y=0 #我们还不知道y应该是多少.而sha 256(f“{ x * y }”。encode())。Hexdigest () [-1]。=' 0' y=1print (f '解为y={y}')

这里的解,y=21因此,生成的hash以0结尾:

hash (5 * 21)=1253E9373E.5E3600155E860。这个算法和我们上面的基本例子没有太大的不同。在这种算法下,矿工争相解决这个新的解决方案,以创造一个新的区块。矿工提出这一新解决方案后,将获得比特币代币奖励。

网络可以轻松验证他们的解决方案。

部署基本工作负载证明

让我们为区块链部署一个类似的算法。我们的规则会和上面的例子类似:

蓑衣网小编2022ff

ff如果要调整算法的难度,可以修改前导零的个数。但是四个就够了。你会发现加一个前导零会导致寻找解所需的时间差别很大。

我们的类快完成了,我们准备开始与HTTP请求交互。

第二步:区块链作为API

我们准备用Python Flask框架。这是一个微框架,它允许我们通过HTTP请求与我们的区块链对话。

我们有三种创建方式:

?/transactions/new为块创建新的事务;/我的告诉我们的服务器挖一个新块?/chain返回整个区块链

Set Flask

我们的“服务器”将在我们的区块链网络中形成单个节点。我们来创建一些样板代码:

ff

ff蓑衣网小编2022上面代码的部分描述:

第15行:实例化我们的节点。你可以在这里阅读更多关于Flask的内容:http://flash.pocoo.org/docs/0.12/QuickStart/# a-minimal-application

第18行:为我们的节点创建一个随机的名字第21行:实例化我们的区块链类第24-26行:创建/挖掘端点,第28-30行:创建/transactions/new端点,这是一个POST请求,因为我们会将数据发送给它;第32-38行:创建/chain端点,将返回整个区块链;第40-41行:在端口5000上运行服务器;

事务端点

这是事务请求的外观,是用户发送给服务器的信息:

{'sender'' myaddress '' recipient ''别人的地址'' amount' 5}

因为我们已经添加了,所以我们来写添加事务的函数:

挖掘端点ff

我们的挖掘端点就是神奇发生的地方,其实很简单。它要做三件事:

计算工作量证书,通过一个交易向矿工(我们)授予代币作为报酬;创建一个新块,并将其添加到区块链;

蓑衣网小编2022ff

注意,挖方块的接收方是我们的节点地址。在这一点上,我们可以说它完成了,我们可以开始与我们的区块链互动。

ff第三步:与我们的区块链交互

你可以使用普通的cURL或者Postman与我们的API交互。

启动服务器:

$ python blockchain.py *运行于3358127.0.0.1: 5000/(按ctrl c退出)

让我们尝试用一个GET请求挖掘一个块[X]3358 localhost:5000/mine

[X]使用Postman创建一个GET请求[X][X]让我们通过创建一个POST请求创建一个新的事务[X]http://localhost:5000/transactions/new

我们通过http://localhost:5000/chain:request:

{ ' chain '[{ ' index '1,' previous _ hash' 1,' proof' 100,' timestamp' 1506280650.770839,' transactions' []},{'index' 2,' previous_hash' 'c099bc.bfb7 '' proof' 35293,' timestamp' 1506280664.717925,' transactions' [{'amount' 1,' recipient '' 8 bbcb 347 e 0634905 b 0 CAC 7955 BAE 152 b '' sender' '0'}]},{'index' 3,' previous_hash' 'eff91a.10f2 '凭证'35089,'时间戳'1506280666.1086972,'交易'[{ '金额'1,'收件人'' 8bcb347e0634905b 0ca7955be152b ''发件人'我们已经有了接受交易的基本区块链,这使我们能够挖掘新的区块。但是区块链的灵魂在于它的权力下放。如果是去中心化的,如何保证所有参与者使用的链条都是一样的?这就是所谓的共识问题。如果我们想在网络中有多个节点,我们必须部署一个共识算法。

ff注册新节点

在部署共识算法之前,我们需要一种方法来使节点能够识别它们的网络邻居。我们网络中的每个节点都应该有网络中其他节点的注册表。所以我们需要更多的端点:

1、/nodes/register来接受一系列URL形式的新节点;2./nodes/resolve来部署我们的共识算法,它负责解决任何冲突,并确保节点所在的链是正确的。

我们需要修改我们的区块链构造函数,并提供一种注册节点的方法:

ff

注意,我们使用set()来保存节点列表。这是一种确保新添加的节点是等幂的廉价方法。这意味着无论我们添加多少次特定的节点,它出现的次数都只有1次。

部署共识算法

如前所述,冲突是指一个节点与另一个节点处于不同的链中。为了解决这个问题,我们会制定一个规则,最长的有效链就是权限链。换句话说,网络上最长的链是有效的区块链。使用这种算法,我们网络中的节点已经达成共识。

第一种方法是valid_chain(),负责通过遍历每个块,验证hash和证明来检查一个链是否有效;

resolve_conflicts()就是遍历我们所有的邻居节点,下载它们的链,用上面的方法验证。如果找到一个有效的链条,并且它的长度比我们的链条长,我们就用这个新链条替换我们的旧链条。

让我们在我们的API中注册这两个端点,一个用于添加邻居节点,另一个用于解决冲突:

ff

此时,如果您愿意,您可以使用不同的机器并在您的网络上启动它们。或者你可以使用相同的机器和不同的端口来启动程序。我在我的机器上用一个不同的端口启动了另一个节点,并用我当前的节点注册了它。 所以我有两个节点:

http://localhost:5000和http://localhost: 5001。

ff

注册一个新的节点

ff然后我在节点2上挖了一些新的块来确保链更长。之后我在节点1上调用了GET /nodes/resolve函数,然后通过consensus算法把节点1的链替换成了节点2的链。

ff

你也可以找一些朋友来帮你测试你的区块链……

希望这能激发你创造新的东西。我相信区块链将很快改变我们对经济、政府和记录的看法。

更新:我计划在下一个第二部分扩展交易验证机制,并讨论一些区块链产品化的方法。

如果你喜欢这个教程,或者有什么建议或者问题,请在评论里告诉我。如果你发现任何错误,你可以在这里帮助https://github.com/dvf/blockchain改正!ff

学习区块链的捷径:构建一个属于自己的区块链 | 分享给朋友: