主页 > imtoken中文版app > 《精通比特币》是一本很好的书

《精通比特币》是一本很好的书

imtoken中文版app 2023-04-06 05:37:18

6.2 节点类型及分工

虽然各个节点的价值或者地位是完全平等的,但是它们的功能确实是不同的,每个节点都有不同的分工。 一个完整的节点包括四个功能:

比特币和莱特币能同时挖吗_纸上计算挖比特币_挖比特币

“每个节点都参与整个网络的路由功能,可能还包括其他功能。每个节点都参与交易和区块信息的验证和传播,发现并维护与对等网络的连接。” 这里所说的路由功能,其实就是指每个节点都会主动连接到自己的节点上,为整个网络服务。 这四种功能的任意组合都会产生不同的节点。 也就是说,很多节点都不是全节点。 比如我们常说的钱包,并不具备全节点的所有功能。

6.3 扩展比特币网络

比特币网络本身就是遵守比特币协议的节点组合。 但是,比特币协议本身的一些功能是无法实现的,比如挖矿和钱包功能。 如果需要实现功能,需要扩展比特币网络协议。 例如:很多接入比特币网络的大公司都运行基于Bitcoin Core客户端的全节点客户端,拥有完整的区块链和网络节点副本,但不具备挖矿和钱包功能。 为了具备这些功能,这些网络公司会在原有的比特币网络协议上增加一些特殊的协议来增加上述功能。 扩展后的比特币网络包括各种类型的节点、网关服务器、边缘路由器、钱包客户端以及它们互连所需的各种协议。 这些扩展协议的存在使得整个比特币网络拥有了更多的功能。

6.4 网络发现

比特币网络中的节点存在于一个复杂的网络中。 每一个新的节点出现后,为了与整个区块链网络中的节点进行协作,这个节点必须主动联系已有的节点。 只有这样,我们才能加入比特币网络这个大家庭。 在这个新节点和现有节点之间建立连接的过程称为:网络发现。 这个发现的目的是找到自己的对等节点。 网络发现的过程可以类比为:搬家后寻找邻居。 (家庭地址是 IP 地址)。 我们来看看新节点是如何找到它对应的节点并建立连接的。

区块链中有许多网络节点。 当一个新节点刚开始寻找邻居时,很难一下子找到自己的对等节点。 为了提高网络发现的效率,整个网络中有一类特殊的节点,称为:种子节点。 如果说新节点找对应节点的过程是搬家找邻居,那么种子节点就是你要去的小区居委会的阿姨。 作为居委会阿姨的种子节点,里面有很多小区邻居的信息。 作为新节点,你把自己的基本信息交给种子节点,作为居委会的阿姨,种子节点会努力帮你找到能对应到你的邻居节点。 当你找到对应的邻居节点时,阿姨就不会管你了。

下一步是在你自己和你的邻居之间建立更深层次的联系。 你会主动向邻居节点发送自己的地址信息(即IP地址)。 你的邻居节点是一个热情善良的人,他会主动把你的地址信息分享给他的邻居节点。 你邻居的邻居也会是个好人,会主动帮你把地址信息再转告他的邻居。 这个过程不断重复。 最终整个社区的人都会知道你的地址信息,也很容易找到你。 此外,您还可以向您的邻居节点发送请求,以获取您的邻居已知的其他邻居节点的地址信息。 这样,作为一个新节点,全网所有节点都会知道你的地址,你也会知道全网每一个节点的地址。 至此,就可以找到对等节点,完成网络发现的目标。

最后,会出现一种特殊情况,即:节点与整个比特币网络失去联系,即离开网络。 比如你有一段时间没上班,突然不想干了,也就是说你离开了整个比特币网络。 每个节点都有随时加入和离开网络的自由,就像你生活在一个社区里一样,只要你想动,随时都可以动。 在这种情况下,节点之间的通信地址通常是不可靠的。 因此,比特币网络发明了自己的一套机制来应对这种情况。 比特币网络中的每个节点必须不断地做两件事:在失去现有邻居节点时寻找新的邻居节点,并在找到新的邻居节点时主动提供帮助。

注:以上网络发现实际上是节点间主动帮助的结果。

接下来,我们将讨论一个节点如何知道它的邻居节点是否已经移动。

原来节点之间需要周期性的发送信息来维持连接。 与人相似,如果你长时间不给一个朋友打电话或聊天,你会觉得这个朋友离开了你的朋友圈。 节点之间也是如此。 如果两个节点之间在 90 分钟内没有发送消息,则任何一个节点都可以确定其邻居节点已与网络断开连接。 这时,它可以寻找新的邻居节点。 这样的机制保证了整个比特币网络可以动态调整节点大小的增减。

6.5 全节点

维护区块链完整和最新副本的节点称为完整节点。 全节点可以独立建立和验证整个区块链,即网络中从第一个创世块到最新块的整个比特币网络。 由于全节点拥有完整的副本,全节点“可以独立验证所有交易信息,无需诉诸或信任其他系统”。 由于全节点包含了整个区块链的完整信息。 如果你想在你的电脑上有一个全节点,你的硬盘至少需要20G的存储空间。

6.6 交易所“库存清单”

库存清单在这里其实是一个比喻。 这意味着每个节点都将存储一个连接到自身的节点列表。 当网络中的两个节点需要建立连接时,这两个节点会相互交换各自存储的节点列表信息,这样可以保证一个新的全节点能够构建完整的区块链信息。

其实你可以这样理解:你是一个班的班主任,你想快速认识班里所有的新同学,和所有的新同学建立联系。 第一个与班主任建立联系的人往往是班长。 只要班长给你提供了班级的同学名单,你自然会和班级的所有同学建立联系。 作为班主任,你也可以把其他老师的名字给同学。 这个过程其实就是交换库存清单的过程。

6.7 SPV 简单支付验证节点

我在门口说过,只有全节点才有全网区块链的完整副本,只有全节点才有独立验证的能力。 许多节点不具备独立验证所有节点的能力。 因此,将采用一种称为 SPV 的验证方法。 采用 SPV 模式的节点称为 SPV 节点。 SPV 节点不会下载所有的区块链更新,只会下载每个区块的头部信息。 通俗地说,就是各个区块之间的关联信息(即区块头中的信息)。 SPV的验证方式是参照交易在区块链中的深度,而不是高度来验证交易。 简单来说,检查是否有 6 个块叠加在一个块的顶部。 如果是,则证明交易确实发生了。 这个可能暂时不好理解。 后面看完区块链的具体结构,你会更容易理解区块链深度的含义。

第七章区块链

最低必要知识:区块+链

区块是区块链最基本的单位。 每个区块包含大量的交易信息,也包含一些与相邻区块相关的信息。 你可以简单的把一个区块看成一个账本,里面包含了很多交易信息。

Chain,在区块链中,是一个比喻性的名词。 连锁关系是一种非常稳定的关系,也就是说前后关系非常紧密。 区块链中的每个块都是来回连接的。

7.1 区块链

区块链的字面意思是:一种数据结构,由包含信息的区块从后向前依次链接起来。 区块链是一条链,但整个区块链网络并不是一条首尾相连的环链,而是一条断链。 为了更好的理解区块链,我们可以把区块链看成一条垂直链。 最低的块称为创世块。 区块链中的高度是指顶层区块到创世区块的距离; 最上面的区块代表加入到区块链中的最新区块,即离创世区块最远的区块。 上面提到的SPV验证方式取决于区块的深度。

其实从竖直的角度来看,这个块上叠加了多少块,从高到低的顺序。 只要你自己的深度超过6(就是你自己叠加了6个区块),就可以说明你携带的交易信息是经过验证的。 “从上到下,超过六个区块后,区块在区块链中的位置越深,它被更改的可能性就越小。100个区块后,区块链足够稳定。此时,Coinbase Transactions(那些包含新开采的比特币)可以支付。从现在起几千个区块(一个月),区块链将成为确定的历史,永远不会改变。”

7.2 块结构

单个区块的具体结构,即单个账本的内部结构。 单个区块由两部分组成:一个是区块头,另一个是区块体。 区块头由三组元数据组成:父区块的哈希值、挖矿竞争相关数据、默克尔树根(所有交易信息的数据结构)。

7.3 区块头标识符

每个块都有自己的标识符,使其易于查找和识别。

第一种识别方法是:区块头哈希值。

相当于每个区块的唯一性:ID号。 通过SHA256加密算法计算区块头中的信息,可以得到区块头的唯一哈希值。 整个比特币网络中的区块都有自己独特的哈希值。 这个哈希值不存储在它自己的块中。 整个网络将有一个专门的存储空间。 这就好比,虽然你有身份证,但是身份证信息是保存在派出所的。

第二种识别方式是:区块链的高度。

相当于街区所在楼层的高度。 但不同于区块头的哈希值,区块高度并不是一个区块的唯一标识。 因为有区块链分叉(后面会详细解释),你可以这样理解:“两个或多个区块可能具有相同的区块高度,并在区块链中竞争相同的位置。” 在整个区块链网络中,每个矿工都在生成自己的区块。 一次,只有一个区块可以获胜并在最后添加到区块链中。 因此,在区块链的顶部,在某个时刻,可能有多个区块高度完全相同的区块。 此时,即使知道块的高度,也无法确定它是哪个块。 因此,高度不是块的唯一标识符。

你可以这样理解:在《军师联盟》中,曹操的几个儿子都想当太子,所以必须要争夺太子之位。 虽然你知道太子在一人之上,在万人之下。 但是你就是不能确定,太子是曹丕还是曹植?

7.4 块的连接

前面说过,区块链有两个部分:区块+链。 链是指区块之间的连接。 在每个区块的头部区块中,都会存储自己“父区块”的区块头哈希值。 (再次声明,一个区块存储的不是它自己的哈希值,而是它父亲的哈希值。)父区块指的是当前区块的前一个区块。 从垂直角度来看纸上计算挖比特币,它是距离自己最近的方块。 比如当前区块是第3500个区块,那么它的父区块就是第3499个区块。 以此类推,第二个区块的父区块是创世区块,也就是第一个区块。 这样的机制使得每个区块都可以根据其父区块的唯一标识符一直搜索到创世区块。 这就形成了一个永无止境的链式结构。

7.5 默克尔树

默克尔树是一种特定的数据结构。 该结构主要用于表示每个区块中的所有交易记录。 这棵树的目的是快速验证交易是否存在。 这就涉及到二叉树的算法,不是很清楚。 你可以简单的理解为提高计算效率的数学公式。 标记树结构的应用大大降低了验证交易存在的时间复杂度。

“根据该表,当区块大小从 16 笔交易(4KB)急剧增加到 65,535 笔交易(16MB)时,证明交易存在的 Merkle 路径长度增长极其缓慢,仅从 128 字节增加到 512 字节”。 这种方式使得我们前面提到的SPV(Simple Payment Verification)成为可能。 “SPV 节点不会保存所有交易,也不会下载整个区块,只会下载区块头。它们使用身份验证路径或 Merkle 路径来验证区块中是否存在交易,而无需下载区块中的所有交易。” 这样,节点可以存储最少的信息,但仍然具有整个区块链的连接关系。

第 8 章 挖矿与共识

8.1 比特币是通缩货币

比特币的发行总量是固定的,到2140年左右,将有2100万枚比特币全部产出。 这里先说个题外话。 有同学问:区块链扩容会不会导致比特币数量增加? 这里的答案可以很明确:没有。 区块的扩容,从1M到2M甚至更多,只是让一个区块记录更多的交易信息而已,仅此而已。 不会影响2100万枚比特币的总量。 至于为什么比特币的总量不会变,学完挖矿的知识,你就会豁然开朗了。

每挖出210,000个区块大约需要4年时间,每4年,发币速度就会降低50%。

前四年,大约从 2008 年开始,每个区块生产 50 个比特币。

从 2012 年 11 月开始的第二个四年,每个区块生产 25 个比特币。

从 2016 年 7 月开始的第三个四年期间,每个区块生产 12.5 个比特币。

在第四个四年期间,从 2020 年某个时候开始,每个区块生产 6.25 个比特币。

.

.

到2140年,将产生全部2100万个比特币。 从上面的规则来看,区块的产生和比特币的产生是完全不同的事情。

区块的产生是矿机挖出来的,每个区块都会产生比特币,区块产生的比特币数量会越来越少。 简单来说,区块链的区块数量几乎是无限的,只要有矿工在挖,但比特币的总量是有限的。 这使得比特币成为一种通缩货币,不存在与人民币相同的通胀风险。

8.2 挖矿的目的和动机

挖矿是增加比特币供应的过程。 同时,挖矿也是保护比特币系统安全最重要的一步。

整个区块链网络中缺席者之所以积极挖矿,是因为缺席可以得到奖励。 奖励分为两部分:区块中对应的比特币奖励,以及本区块所有交易记录的交易手续费。 那么是不是2100万个比特币全部挖完之后,矿工就不会挖了呢? 不。 2100万枚比特币被挖出后,矿工的收入基本全部来自交易手续费。 只要交易多了,区块就会不断增加,交易费就会一直存在。

8.3 去中心化共识

去中心化共识是整个区块链网络的信任基础。 分散的共识是所有网络节点交互的结果。 主要有4种类型:

每个全节点根据综合标准独立验证每笔交易; (第 8.3 章)

挖矿节点完成工作量证明的验证,独立将交易记录打包到新区块中; (第 8.5、8.6、8.7、8.8 章)

每个节点独立验证新节点并将其组装到区块链中; (第 8.9 章)

每个节点选择区块链,选择工作量最大的区块; (第 8.11 章)

8.3.1 交易的独立验证

上一节课在讲解网络发现时,想详细讲解一下新节点加入区块链网络的过程。 这笔交易的独立验证实际上发生在新节点寻找新的邻居节点时。 这里新增的节点一般都是钱包节点,因为这些节点需要传输的是:交易信息。

当新节点将交易传递给邻居节点时,邻居节点会主动验证交易信息是否为有效交易。 确认无误后,会继续传递给自己的邻居节点。 这些验证项是一个长长的列表,每个节点都会对每个需要验证的项逐一进行验证。 你可以想象,每个节点其实都是质检员,他们严格把控交易信息的质量。 当他们得到大量的交易信息时,他们会拿着一长串核对清单,逐一核对。 这个过程是对交易的独立验证。

8.3.2 挖矿节点完成计算并打包交易记录

在整个区块链网络中,挖矿节点同时在做三件事:

监控网络上的交易;

监听其他节点发现的区块; (随时关注竞争对手动态)

挖掘新区块; (其实就是找算法的解)

获得区块后,挖矿节点需要做的就是将交易记录打包到这个候选区块中。 之所以称为候选区块,是因为网络中的矿工还处于竞争状态,整个网络还没有确定哪个矿工挖出的区块可以加入区块链。

在上一步交易验证后,比特币节点会将监听到的交易记录暂时放入自己的内存池(也称交易池)中。 你可以把交易池想象成一个临时的储藏室,里面存放着已经验证过但还没有打包成区块的交易记录。 (这些记录还没有被交易确认,就是后面要讲的工作量证明)

一旦某个挖矿节点收到并验证了一个区块A,该节点就会去自己的临时储藏室查看储藏室中的所有交易记录。 从暂存室中取出区块 A 中出现过的交易记录。 剩余的记录将被打包到下一次出现的新区块 B 中。 说得更清楚一点:区块A将10分钟以内的交易记录打包进自己的区块,超过10分钟的交易记录会离开下一个区块B。因为每10分钟只能出一个区块。

#打包过程

以下是整个区块的打包过程。

这里,你可以简单地把矿工想象成打包快递包裹的工人。 只不过矿工打包的不是快递,而是交易记录。 做任何事都有优先级,矿工打包交易记录也是一样。 在区块链中,交易记录有自己的优先级,矿工会优先打包那些优先级高的交易记录。 那么什么样的交易记录优先呢? 手续费高的交易记录具有更高的优先级。

# 构建区块头

上次分享中提到纸上计算挖比特币,每个区块都有一个区块头。 元数据分为三类:父区块哈希值、挖矿竞争相关数据、默克尔树根(所有交易信息的数据结构)。 父块的哈希值和默克尔树的根在上一节课程中有提到。 这里我们将重点关注与挖矿竞争相关的数据:难度目标和Nonce。 这两个字段本质上都是一个数字。 难度目标是指当前区块的工作量证明算法的难度目标。 如果实在看不懂,可以理解为这个目标是一个具体的数字。 有点类似:王健林的小目标是赚个亿。 这只是一个数字目标。 不要被周围的名词吓倒。

难度目标可以动态调整。 动态调整的目的是保证出块速度保持在每10分钟一个区块。 (后面会详细讲)Nonce主要是工作量证明算法的一个计数器。

#成功构建新区块

区块头中的三种元数据都是在构建新区块之前预先确定的。 这些是以下6个字段:

纸上计算挖比特币_挖比特币_比特币和莱特币能同时挖吗

有了以上6个字段,矿工需要做的就是挖出这个候选区块,也就是解决工作量证明算法。 找到解决方案后,实际上可以将块添加到区块链中。 挖矿的本质其实就是对一个复杂的方程进行大量计算,最终得到方程正确解的过程。 这个过程是一个随机试验过程。 这里需要补充的是,区块头中的难度目标其实是动态变化的,是整个区块链动态调整的。

#难度目标和难度调整

难度目标决定难度,进而影响解决工作量证明算法所需的时间。 这个难度目标值是可调的。 比特币区块平均每 10 分钟生成一次。 这个速度可不是说短期的,而是在接下来的几十年里都必须保持同样的速度。 为了保证这个平均速度,我们的难度目标必须动态调整。 根据摩尔定律,未来计算机的计算性能会快速提升,参与挖矿的矿工数量也会不断变化,因此整个网络的算力会在不同时期发生变化。 为了保持出块率不变,必须根据变化调整挖矿难度。

这个难度目标会定期调整。 大致规则是这样的:

1、全网挖出一个区块需要10分钟。

2、每发现2016个区块,整个区块链网络会根据2016个区块的完成时间动态调整后续2016个区块的难度目标。

8.3.3 快速验证新区域

这一步是交易记录的验证。 这是块形成的必要步骤。 “当一个节点收到一个新块时,它会根据一长串标准验证该块,如果验证失败,该块将被拒绝。”

8.3.4 区块链选择

在验证新区块的指标后,该区块还需要找到工作量证明最大的链。 区块链的选择涉及到一个重要的概念:区块链分叉。 关于区块链分叉,书中提到的地图是比较直观的。 这里我提供另一种模型供大家参考。 大家记得对照书上的例子来理解。

挖比特币_纸上计算挖比特币_比特币和莱特币能同时挖吗

当两个矿工各自在短时间内达成工作量证明解决方案时,就会发生区块链分叉。 即上图中,矿工A挖出了红色区块n+1,同时矿工B挖出了绿色区块n+1。 红色区块和绿色区块有相同的打包交易记录,父区块为区块n。 唯一不同的是,挖出区块的矿工不同。 这时候整个区块链就出现了分叉,出现了两条完全相同的链。 这被称为区块链分叉。 这时候分叉问题是解决不了的。

那么,我们可以认为整个区块链网络的算力分为两个阵营:红色阵营和绿色阵营。 但即使整个网络的算力平均分配给这两个阵营,也总会有一个阵营先于另一个阵营发现工作量证明方案,提前发现新的黄色区块n+2。 这样一来,绿阵营的链条就比红阵营的链条长了。 这也意味着,绿色阵营的链是目前全网工作量证明最大的链。 这时候,即使红色阵营的矿工挖出了一个新的区块n+3,他也不会把这个新区块放在红色区块的后面。 因为,所有矿工总是:选择并尝试扩展代表最大累积工作量证明的区块链,即最长或最大累积难度的链。 至此,区块链分叉问题解决。 也就是说,主链已经确定为绿色区块链。

挖比特币_纸上计算挖比特币_比特币和莱特币能同时挖吗

理论上,区块 n+1 的分叉也是可能的。 但是,当由于先前的分叉而互相反对的矿工几乎同时发现了两个不同区块的解决方案时,就会发生这种情况。 发生这种情况的可能性非常低。 单块分叉每周都会发生,而双块分叉非常罕见。

8.4 共识攻击

比特币的共识机制所依赖的前提是,绝大多数矿工出于自身利益最大化的考虑,将通过诚实的挖矿来维护整个比特币系统。 “理论上,一个区块链分叉可以变得很长,但在实践中,实现一个很长的区块链分叉需要的算力是非常非常大的,随着整个比特币区块链逐渐变大,过去的区块基本上可以认为是无法被叉子篡改。” “一群矿工控制着整个比特币网络51%的算力,如果他们联合起来,就可以攻击整个比特币系统。” 但随着比特币网络的算力呈几何级数快速增长。 上述理论上可行的攻击场景在实践中越来越难以操作。 “理论上,比特币是目前最安全的共识机制系统。

由于时间关系,第9、10章不再讲解,大家可以自行翻阅本书