主页 > imtoken最新版本下载 > 【区块链学习笔记】3:比特币中的共识协议

【区块链学习笔记】3:比特币中的共识协议

imtoken最新版本下载 2023-03-07 05:07:40

数字货币和纸币的区别

这里肖老师举了一个例子。比如央行要发行数字货币,如果货币的面额等信息直接用央行的私钥签名,然后在使用的时候,用户直接用央行的公钥来验证。签名。不行,因为你可以用这个数字货币再买东西。这被称为双花攻击。签名确保面额和其他信息不能被修改,但这个数字文件可以复制多份。如果是纸币,消费时会丢失。这就是数字货币和纸币的区别。

集中式解决方案

光有面额是不够的,每个数字货币还必须有一个数字。不管去中心化如何,中央银行还维护一个数据库,记录哪个用户拥有每种编号的数字货币。

在这里插入图片描述

支付时,不仅要使用公钥验证签名是央行签名的,还要验证币为央行所有,央行再将币主变更为支付给的用户制作。

不仅数字货币的发行是由央行来做的,每一笔交易的合法性都必须得到央行的确认。该解决方案是集中式解决方案。

去中心化解决方案

改变央行的功能为大量用户共享,即去中心化的解决方案,是比特币等数字货币系统要解决的问题,即:

如何决定数字货币的发行和数量 如何验证交易的合法性,防止双花攻击

比特币系统的第一个问题是由挖矿决定的,后面会学习。

第二个问题的解决方案是像中心化解决方案一样维护一个数据结构,但不再由中央银行维护,而是由所有用户共同维护。这种数据结构不再是关系表,而是区块链。

如下图所示,假设用户A获得了铸币权(发币权),他发行了10个比特币,也就是他获得了10个比特币。然后他将这 10 个比特币转移给 B 和 C,每个比特币分成 5 个比特币。接下来 B 给 C 2 个硬币和 D 3 个硬币。最后,C将获得的7个硬币全部交给E。

在这里插入图片描述

比特币系统中的每一笔交易都分为输入部分和输出部分。输入部分应给出交易的比特币来源和付款人的公钥,输出部分应给出收款人公钥的哈希值。价值。比特币系统中的收件人地址是通过对收件人的公钥进行哈希处理,然后进行转换得到的。

这里涉及到两种哈希指针,一种是图中钴蓝色的一种,它将每个区块链接在一起;另一个是图中暗红色的,就是说明币的来源是哪笔交易。的。

在这里,“指明币源”也可以防止双花攻击。例如,在下图中,B 已经花费了他的 5 个比特币。假设B再次尝试消费,将5比特币转给F,此时沿着区块链查看该区块与源交易之间的区块,发现B已经消费了源区块的比特币,说明此次新交易是非法的,并且不会接受这个块。块进入区块链。

在这里插入图片描述

与银行不提供查询用户银行账号的功能类似区块链可以查提币地址嘛,比特币系统也不提供查询用户公钥或账户地址的功能。向用户转账时,对方需要提供公钥或账户地址。在这种情况下,收件人可以在网站上发布公钥。

但是,当 A 向 B 转账时,除了 A 需要知道 B 的地址外,B 还需要知道 A 的公钥。因为一方面A的公钥代表A的身份,B需要知道转账是谁,另一方面是在比特币交易中验证A的签名(私钥签名公钥验证) ,这意味着所有节点都需要知道 A 的公钥。

区块链上的每个节点都需要独立验证,即使是与交易无关的旁观者也必须验证交易的合法性。

在这种情况下,如何知道 A 的公钥?这里,如前所述,A的公钥是A自己写在交易的输入部分的,也就是付款人自己在交易中声明的。但这会允许其他人伪造 A 来发起交易吗?比如B的同伙B'说他是A,然后用他的私钥签名,把他的公钥说是A的公钥放在交易输入部分,并试图转移A账户中的比特币。

在这里插入图片描述

但是由于币源中的交易(图中铸币交易)的输出部分有接收方A的公钥的hash值,那么B的伪造公钥的hash与接收方的hash配对A 的公钥。不上,所以可以防止这种攻击。

如果B'直接用A的公钥来写,但是因为没有A的私钥,那么就不能用A的公钥来验证签名,这显然是不可能的。

交易的输入和输出部分其实是脚本,A的公钥也写在交易的输入脚本中。公钥的验证过程其实就是把交易的输入脚本和币源的交易输出脚本放在一起,看能否顺利执行。

在前面的图片中,每个区块只花费了一笔交易。在实际系统中,每个区块中可以有很多交易,这些交易构成了上一课学习的默克尔树。

块结构

上节学习的区块链中的节点结构在此补充,详细描述区块头和区块体。

在这里插入图片描述

上图中,块头连接,块体挂在块上。哈希指针和块体不是直接连接的(间接连接是通过默克尔树的根哈希建立的)。

注意,完全验证节点有块体,需要验证所有交易的合法性;轻节点没有块体,无法独立验证交易的合法性。

轻节点不参与区块链的建设和维护,只使用区块链中的部分信息。

系统中的大部分节点都是轻节点,全节点并不多。

块头

区块头存储区块的宏信息。

块体共识协议

另一个问题是每个账户都可以发布交易,而区块链可以看成一个账本,那么发布的交易应该写在哪个区块呢?交易被广播到每个区块,每个人都在自己的本地区块链上写入交易。写完后如何保证一致性?也就是说,账本的内容必须达到分布式共识。

关于分布式系统的一些不可能的结论

分布式系统研究中有很多不可能的结果。

FLP 不可能结果

FLP 不可能的结果是,在异步系统中,网络传输的延迟没有上限,即使只有一个成员出现故障,也无法达成共识。

FLP 是三位研究分布式系统的专家的缩写。

CAP定理

CAP 是分布式系统想要的三个属性,一致性、可用性和分区容错性。CAP定理意味着在任何分布式系统中,CAP的三个性质最多只能满足其中两个,不可能同时满足三个。

分布式共识中一个著名的协议是 Paxos,它可以保证一致性。即如果协议达成共识,共识必须是一致的(即系统的两个成员之间不会有共识)。但是,Paxos 协议的概率很小(虽然很小但客观存在),这使得系统无法达成共识。

比特币共识协议

比特币系统中的共识应该考虑到一些节点是恶意的,假设系统中大多数节点是友好的,恶意节点是少数。

一种思路是通过投票将所有交易写入一个候选区块区块链可以查提币地址嘛,然后发送给所有节点。大家验证这个区块中的交易是否合法,然后投赞成票和反对票,根据一定的投票通过后,将候选区块写入区块链。这种思路的问题是成员资格问题。任何基于投票的系统都必须考虑谁有权投票。例如,超级账本结构是一种指定谁可以参与的联盟链协议。

因为在比特币系统中,你只需要在本地生成一个公私钥对来生成一个账户,所以如果你使用这种方法,那么恶意的人就可以进行女巫攻击,只要不断地生成账户,然后大量的投票权可以控制整个区块链。

在比特币系统中,投票不是用账户来做的,而是用算力来做的。每个节点可以在本地组装一个候选块,把它认为合法的块放在这个块中,然后开始尝试各种nonce值(4字节)使得H(blockheader)≤targetH(block header) \leq targetH(blockheader )≤目标。如果一个节点发现了一个符合要求的nonce,它也获得了记账权——将下一个区块写入比特币去中心化账本(区块链)的权利,其他节点收到这个区块后,验证该区块的合法性(例如,检查目标的编码nBits字段是否设置为满足比特币协议规定的难度要求,检查具有nonce的块头的哈希值是否小于目标,

签出的候选块是完全合法的,应该接受吗?

最长有效链

如下图,C转给A,A把这些比特币转给B,然后A发起交易把比特币转给自己。本次交易的候选区块如下,希望挂在图中位置。(在树枝上)。其实A这里做的就相当于回滚A转账给B的交易了被转移到B。

这是一个分叉攻击的例子,它通过在区块链中间插入一个块来回滚已经发生的事务。这样的候选块检测到其内容是合法的,但不应被接受。

在这里插入图片描述

比特币协议规定,接受的区块应该是最长的合法链。

如何知道块插入的位置?区块头有一个哈希指针指向前一个区块的区块头,可以通过这个哈希指针来判断。

请注意,区块链在正常操作下也可以分叉。例如,两个矿工都发布了延伸最长合法链的合法区块,并且都想挂在同一个区块上。在这种情况下,不同节点的选择可能不同。这取决于不同的分布式节点首先收到哪个块,而最先收到的块将被该节点接受。

在这里插入图片描述

这种长度相等,多个最长有效链(分支)的情况会维持一段时间,直到一个分支获胜。如果上面的块首先找到下一个块,那么下面的块就成为孤块并被丢弃。

在这里插入图片描述

在这里,有的节点接受上面的区块,有的节点接受下面的区块,然后相互竞争先寻找下一个节点,最终形成一条共识最长的合法链。

什么是接受块?如果一个节点在接收到一个块后继续沿该块扩展,则该节点接受该块。

第一种激励机制:区块奖励

是什么促使大家争夺记账权?获得记账权的节点本身有一定的权力,比如决定哪些交易写入下一个区块,但这不应该是记账权竞争的主要驱动力,因为比特币系统的设计就是希望所有交易可以公平地写入账本。块奖励机制解决了这个问题。

比特币协议中规定,获得记账权的节点可以在释放的区块中进行一项特殊的交易——铸币交易,其中可以释放一定数量的比特币,即发行比特币(生成新的比特币) ) 没有说明硬币的来源。这也解决了前面提到的去中心化系统中的第一个问题——谁发行比特币,发行多少比特币。

比特币首次出现时,区块奖励为 50 BTC。比特币协议规定,每出块 210,000 个区块后,区块奖励将减半,即 25 BTC。目前的情况是每个区块可以产生12.5 BTC。

因为孤块不在最长的合法链上,所以区块奖励的铸币交易是无效的。

一些问题共识协议所达成的共识究竟是什么?

在常见的分布式系统中,比如分布式哈希表,所达成的共识就是哈希表的内容。在比特币系统中,共识协议获得的共识就是去中心化账本中的交易。

只有获得记账权的节点才能将交易写入区块,而获得记账权的方法就是解决不等式难题。根据第一课所学的散列函数的谜题友好性,解决这个谜题的过程并不容易。捷径只能一一尝试,所以可以作为工作量的证明。算力越强,获得区块奖励的概率越大。因此,据说比特币系统是靠算力来投票的。

算力投票如何避免女巫攻击?

因为投票是基于计算能力的,所以无论创建多少个账户,创建多个账户都不会增加每秒尝试的随机数。

为什么将获得记账权的过程描述为挖矿?