当前位置:首页 > 行业资讯 > 在Go中构建区块链 - 第7部分:网络

在Go中构建区块链 - 第7部分:网络

admin 5个月前 204 0
原文标题:在Go中构建区块链 - 第7部分:网络

前言

到目前为止,我们已经构建了一个具有所有关键功能的区块链:匿名,安全和随机生成的地址; 区块链数据存储;工作认证系统; 存储交易的可靠方式。虽然这些功能至关重要,但还不够。是什么让这些功能真正起作用,使加密货币成为可能的是网络。在单台计算机上运行此区块链实现有什么用?当只有一个用户时,基于加密的功能有什么用?它的网络使所有这些机制非常有用。

您可以将区块链功能视为一项规则,类似于人们在共同生活和生活时构建的规则,社交安排ENT。区块链网络是遵循相同规则的程序社区,它遵循使网络活动的规则。同样,当人们分享相同的想法时,他们会变得更强大,可以共同努力,创造更美好的生活。如果有人遵循不同的规则,他们将住在一个单独的区域。同样,如果区块链节点遵循不同的规则,它们将形成一个网络。

这非常重要:如果没有网络,没有节点共享相同的规则,这些规则就没用了!

免责声明:不幸的是,我没有足够的时间来实现真正的P2P网络原型。在本文中,我将演示涉及不同类型节点的最常见方案之一。改善这种状况并使之成为现实P2P网络对您来说是一个很大的挑战和实践!另外,我不能保证除了本文中实现的那些之外的其他内容。抱歉!

本节介绍重要的代码更改,因此在此解释所有内容没有意义。请参阅 本页 以查看自上一篇文章以来的所有更改。


区块链网络

区块链网络是分散的,这意味着没有服务器可以使用服务器来获取或处理数据。区块链网络中有节点,每个节点都是网络的成熟成员。节点就是一切:它既是客户端又是服务器。记住这一点很重要,因为它与通常的Web应用程序非常不同秒。

区块链网络是P2P(点对点)网络,这意味着节点直接相互连接。它的拓扑结构是扁平的,因为节点角色中没有层次结构。这里的图表如下:


商业矢量 Dooder 制作 - Freepik.com


[这种网络中的节点更难实现,因为它们必须执行大量操作。每个节点必须与多个其他节点交互,它必须请求其他节点的状态,将其与自己的状态进行比较,并在它变得过时时更新其状态。


节点角色

虽然完全垫ure,block Chain节点可以在网络中扮演不同的角色。

1.矿工。
鸟   这些节点在强大的或专用的硬件上运行(例如 ASIC ),唯一的目标是尽快挖掘新的块。矿工只能在使用工作证书的区块链中使用,因为挖掘实际上意味着解决 PoW 拼图。例如,在 Pro-of-Stake 区块链中,没有采矿。

2,完成节点。
鸟   这些节点验证矿工的块并验证交易。为此,他们必须拥有区块链的完整副本。此外,这样的节点执行这样的路由操作,例如帮助其他r节点发现彼此。
鸟   对于网络,拥有许多完整节点非常重要,因为正是这些节点做出决定:它们决定块或事务是否有效。

3,SPV。

  SPV 代表简化付款验证。这些节点不存储区块链的完整副本,但它们仍然能够验证事务(不是所有事务,而是子集,例如,发送到特定地址的子集)。 SPV 节点依赖于整个节点来获取数据,并且可能有许多 SPV 节点连接到完整节点。 SPV 使钱包申请成为可能:一个人不需要下载广告完整的区块链,但仍然可以验证他们的交易。

4,网络简化

在我们的区块链中实施网络我们必须简化一些事情。问题是我们没有很多计算机来模拟具有多个节点的网络。我们可以使用虚拟机或Docker来解决这个问题,但它可以使它更难:你必须解决可能的虚拟机或Docker问题,我的目标是专注于区块链实现。所以我们想在一台机器上运行多个区块链节点,我们希望它们具有不同的地址。为此,我们将端口用作节点标识符而不是IP地址。例如,将显示具有地址的节点: 127.0。0.1:3000 127.0.0.1:3001 127.0.0.1: 3002 等,我们将调用端口节点ID并使用 NODE_ID 环境变量来设置它们。因此,您可以打开多个终端窗口,设置不同的 NODE_ID 并运行不同的节点。

此方法还需要不同的区块链和钱包文件。现在,他们必须依赖节点ID和相同的名称 blockchain_3000.db blockchain_30001.db wallet_3000.db wallet_30001.db 等等。


执行

然后当你这样做wnload比特币核心和第一次运行时会发生什么?它必须连接到节点才能下载区块链的最新状态。那你知道节点是什么吗?

对比特币核心中的节点地址进行硬编码将是一个错误:节点可能受到攻击或关闭,这可能导致新节点缺席.Law加入网络。相比之下,在比特币核心中, DNS 种子 硬编码。这些不是节点,而是知道某些节点地址的DNS服务器。当你启动一个干净的比特币核心时,它将连接到其中一个种子,并获得一个完整的节点列表,从中下载区块链。

在我们的实施中,它将是集中的。我们将有三个节点:

1    1,中心节点。这是所有其他节点将连接到的节点,该节点将在其他节点之间发送数据。

2.    2,矿工节点。此节点将在 mempool 中存储新事务,当有足够的事务时,它将挖掘新块。

3.    3,钱包节点。此节点将用于在钱包之间发送硬币。与 SPV 节点不同,它存储区块链的完整副本。


场景

这个目标article是实现以下场景:

1. 中心节点创建区块链。

2. 其他(钱包)节点连接到它并下载区块链。

3. 另一个(矿工)节点连接到中央节点并下载区块链。

4. 钱包节点创建交易。

5. 矿工节点接收事务并将其保留在其内存池中。

6. 当内存池中有足够的事务时,矿工开始挖掘新的块。

7. 当开采新块时,它将被发送到中央节点。

8. 钱包节点与中心节点同步。

9. 钱包节点的用户检查是否他们的付款成功了。

这就是比特币的样子。即使我们不打算建立一个真正的P2P网络,我们也将为比特币实现一个真实的,主要的和最重要的用例。


版本

节点通过消息通信。当一个新节点运行时,它会从DNS种子中获取几个节点并向它们发送 版本 消息,这将在我们的实现中查看。像这样:



]我们只有一个区块链版本,因此 版本 字段不保留任何重要信息。 BestHeight 圣路易斯的长度orage节点区块链。 AddFrom 存储发件人的地址。

接收 版本 消息的节点应该做什么?它将回复其 版本 消息。这是一种握手:没有事先的问候就不能进行其他交互。但这不仅仅是礼貌: 版本 用于寻找更长的区块链。当节点收到 版本 消息时,它检查节点的区块链是否长于值 BestHeight 。如果没有,节点将请求并下载丢失的块。

为了收到讯息,我们需要一台服务器:



首先,我们硬编码中心节点的地址:每个节点必须知道它最初连接的位置。 minerAddress 参数指定接收采矿奖励的地址。这项工作:



意味着如果当前节点不是中心节点,必须将消息发送到 版本 中心节点,以查明其区块链是否已过期。



我们是在较低级别该消息是一个字节序列。前12个字节指定命令名称(在本例中为“version”),后面的字节将包含 gob -encoded m消息结构。 commandToBytes 看起来像这样:



它创建一个12字节的缓冲区并用命令名填充它,其余字节留空。有相反的功能:



当节点收到命令时,它运行 bytesToCommand 以提取命令名称并使用正确的处理程序来处理命令体:


]


好的,这是 版本 ] 命令处理程序的外观如下:



[ 123]

首先,我们需要解码请求和分机有效载荷。这和所有处理程序类似,所以我将在以后的代码片段中省略此部分。

然后,节点将其

BestHeight 与消息中的节点进行比较。如果节点的区块链很长,它将回复 版本 消息;否则,它将发送 getblocks ] 消息。


Getblocks

[


getblocks

意思是“告诉我你有什么块”(在比特币中,它更复杂) 。请注意,它没有说“给我所有块”,而是它请求块哈希列表。这样做是为了减少网络负载,因为可以下载块从不同的节点,我们不想从一个节点下载数十GB。 处理指令非常简单:


[ 123]

在我们的简化实现中,它将返回所有块哈希。


INV

[


比特币


Inv

显示阻止或交易当前的其他节点节点有。同样,它不包含整个块和事务,只包含它们的哈希值。 类型 字段指示这些是块还是交易。 处理

inv

更难: [12]3]


如果发送块哈希,我们要将它们保存在


blocksInTransit

]

用于跟踪下载的块的变量。这允许我们从不同节点下载块。将块放入转移状态后,我们将 getdata 命令发送到 inv [ 123]消息的发送者更新 blocksInTransit 。在真正的P2P网络中,我们希望从不同节点传输块。 在我们的实施中,我们永远不会发送 inv

多个哈希。这就是 payload.Type ==“tx” 仅使用第一个哈希的原因。然后我们检查我们的mempool中是否有哈希值,如果是n发送 getdata 消息。 GetData


[ 123]


getdata

 用于某个A块或交易请求,它只能包含一个块/交易ID。


处理程序很简单:如果他们请求一个块,返回块;  如果他们请求交易,他们将返回交易。请注意,我们不会检查是否有此块或交易。这是一个缺陷。



及Tx


这些消息实际上是转移数据。

处理

区块

邮件非常简单:


当我们收到一个新的区块时,我们把它放在区块链中。如果我们想要下载更多块,我们从下载前一个块的同一节点请求它们。当我们最终下载了所有块时,我们重新索引了UTXO集。

TODO:我们应该在将每个传入的块添加到区块链之前验证它们,而不是无条件地信任它。

TODO:不应该运行UTXOSet.Reindex(),但应该使用UTXOSet.Update(块),因为如果区块链很大,则需要花费大量时间 - 索引整个UTXO集。

处理

tx

]消息是最困难的部分:


首先要做的是将新事务放入mempool(同样,事务必须在放入mempool之前进行验证)。下一页:



检查当前节点是否为中心节点。在我们的实现中,中心节点不挖掘块。相反,它将新事务转发到网络中的其他节点。

下一个重要部分仅适用于矿工的节点。让我们把它分成更小的部分:


miningAddress

仅在矿工节点上设置。当memp中有2个或更多事务时,挖掘开始当前(矿工)节点的ool。


首先,验证mempool中的所有事务。忽略无效事务,如果没有有效事务,则中断挖掘。


已验证的交易被放置在一个区块中,以及一个硬币基金交易奖励。挖掘块后,重新索引UTXO集。

TODO:再次,您应该使用UTXOSet.Update而不是UTXOSet.Reindex

]


交易完成后,将从mempool中删除。当前节点已知的每个其他节点

inv


使用has接收消息h新块。他们可以在处理消息后请求块。

结果


让我们玩我们先前定义的场景。

首先,在第一个终端窗口中将

NODE_ID

设置为3000(

。 123] exportNODE_ID = 3000 )。我会在下一段之前使用徽章 NODE 3000 NODE3001 了解要执行操作的节点。 NODE 3000

     创建一个钱包和一个新的区块链:



(为了清晰起见,我将使用它简洁性在假地址


之后,区块链将包含一个原因块。我们需要保存块并在其他节点中使用它。 Genesis块用作区块链的标识符(在比特币核心中,Genesis块是硬编码的)。


NODE 3001

鸟   接下来,打开一个新的终端窗口并将节点ID设置为3001.这将是一个钱包节点。生成一些地址

blockchain_gocreatewallet ,我们将这些地址称为
WALLET_1 ] WALLET_2 WALLET_3 NODE 3000


     将一些硬币寄到钱包地址:



-mine

flag表示该块将立即被同一节点挖掘。我们必须拥有这面旗帜,因为初始网络中没有矿工。

鸟   开始节点:



[123 ]节点必须运行直到方案结束。


NODE 3001

     使用上面保存的genesis块启动节点的区块链:



运行节点:


它将从中心节点下载所有块。要检查一切正常,请停止节点并检查余额:



[123 ]此外,您可以检查


CENTRAL_NODE

地址的余额,因为节点3001现在有其区块链:



NODE 3002


鸟   打开一个新的终端窗口并将其ID设置为3002,然后生成一个钱包。这将是一个矿工节点。初始化区块链:


并开始节点:

[123 ]



NODE 3001


&nbSP;    发送一些硬币:



[123 ]


NODE 3002

     不久!切换到矿工节点并看到它挖掘新块!另外,检查中央节点的输出。

NODE 3001
     切换到钱包节点并启动它:



它将下载新的开采的一块!

停止并查看余额:


]

就是这样!



结论

这是系列最后一部分。我可以发布一些实施的帖子这是P2P网络的真实原型,但我没时间做这件事。我希望这篇文章回答你关于比特币技术的一些问题并提出新的问题。你可以自己找到答案。比特币技术中隐藏着更多有趣的东西!祝好运!


后记: 你可以实施

地址 [ 123]

消息开始改进网络,如比特币网络协议(链接如下)所述。这是一个非常重要的消息,因为它允许节点发现彼此。我开始实现它,但还没有完成!

链接:

1,

源代码

https:// github.com/Jeiwan/blockchain_go/tree/part_7

2, 比特币协议文件 [ 123]: 的https://en.bitcoin。它/ wiki / Protocol_documentation

比特币

  3,网络 ] https:// en.bitcoin.it/wiki/Network 编辑:但原作

[ 123]

相关文章

币安比特币交易平台2014年的现状

币安比特币交易平台2014年的现状

币安比特币在中国的发展催生了许多行业。据不完全统计,目前有超过30个国内币安比特币交易平台。 交易平台是币安比特币发展不可或缺的一部分。国内币安比特币的发展引领世界。币安比特币中国...

你能说服公司接受币安比特币吗?

你能说服公司接受币安比特币吗?

币安比特币朋友,你能说服公司甚至小公司接受币安比特币吗?如果你有这样的才能,你可以去Bitcointalk并获得其他人提供的奖品。昨天,Bitcointalk上有人宣布了一项币安比特...

英国金融管理局为金融技术创新建立全球联盟,以改善金融技术合作

英国金融管理局为金融技术创新建立全球联盟,以改善金融技术合作

[123 根据8月7日的官方声明,金融市场行为监管局(FCA)宣布制定一项全球计划,以改善监管机构和金融技术创新公司之间的合作,如区块链。...

9.4事件后,回顾区块链这一年

9.4事件后,回顾区块链这一年

2017年9月4日,对于很多人来说是难忘的,不知不觉,一年已经过去了。这是动荡变幻的一年,是巨变涌动的尖峰时刻。监管越来越严,币价从巅峰跌入低谷,BAT巨头积极入局区块链,越来越多的人涌入区块链的...

币安比特币需要多长时间才能下雨?

币安比特币需要多长时间才能下雨?

最近,联邦调查局(FBI)禁止着名的币安比特币药物交易网站丝绸之路,逮捕了该网站的创始人兼运营商罗斯威廉Ubridge,并从注册中查获了近26,000个币安比特币该网站的用户,总...

科技公司挖掘“链圈”的新价值区块链技术有望造福人民

科技公司挖掘“链圈”的新价值区块链技术有望造福人民

[据研究公司Gartner称,2025年区块链的商业附加值可能增长到超过1760亿美元,到2030年,它将超过3.1万亿美元。 ] 上周,IBM公布了其第二季度财报,显示战略业务收入增长了15%,...

俄罗斯加密采矿公司的数量在2018年上半年增加了15%

俄罗斯加密采矿公司的数量在2018年上半年增加了15%

俄罗斯加密行业正在扩大。今年,运营采矿设施的公司数量有所增加,俄罗斯人拥有自己的加密货币。俄罗斯加密和区块链协会提供的数据证实了这些趋势。该协会还警告称,俄罗斯推迟使用数字金融技术将使该国每年损失1...

以太坊中的Nonce是什么?

以太坊中的Nonce是什么?

在以太坊,每笔交易都有一个随机数。 Nonce是从给定地址发送的事务数。 Nonce in English Medium,Nonce,a可以使用一次的号码,是一次性随机...