区块链学习笔记 | 比特币的共识机制 (上)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Curry_On/article/details/100125556

​前面我们了解了比特币中的密码学原理以及比特币中的数据结构,今天我们就来了解下如何来设计加密货币。


本文内容:

1、不考虑去中心化,数字货币如何发行?
2、双花问题
3、去中心化下的数字货币方案
4、去中心化下如何防范双花问题?

1、不考虑去中心化,数字货币如何发行?

​ 首先不考虑去中心化的问题,假设有一个大家都信任的中心化机构的存在,比如:央行。如果我们都知道央行的公钥,并让其来发行数字货币,央行该怎么去做呢?

​ 一说到央行,也许大家会马上想到纸币,那数字货币的发行能否类似于纸币呢?就像这样:

在这里插入图片描述

​ 货币上有央行私钥的签名,并且其公钥是我们大家都知道的,所以当我们和别人进行交易的时候,我们可以验证收到的货币是否是央行发行的,这样一来,交易就完成了。

​ 这样做似乎就是把纸币做成了电子版,大家仔细想想,这样做有问题吗?

​ 如果你觉得没问题,那很不错,至少说明你很善良,可不法分子就不会这么想了。

2、双花问题

​ 大家都知道,现在纸币想要作假是非常非常难的,因为纸币的防伪措施做的几乎无懈可击,但是数字货币不同于纸币,说到底它只是一份文件,它是可以复制的呀。意思就是,我有100元的数字货币,虽然上面有央行私钥的签名,可以证明它不是假的,也没办法把100元改成200元,但是我可以把它复制成几份来完成不同的交易。这种问题就是双花攻击(double spending attack)

​ 数字货币面临的一个主要的挑战就是如何防范双花攻击。

​ 那上面的这种方案,能否改进一下呢?

​ 还是由央行来发行数字货币,只不过在每个货币上加一个编号,来保证这个货币的唯一性。为此,央行需要来维护一个数据库,上面记录着每个数字货币在谁手里,也就是每个编号在谁手里。

在这里插入图片描述

​ 那么在这种情况下,如果你要完成一笔交易,该注意哪些问题?

​ (1)需要验证这个数字货币有没有央行的签名

​ (2)向央行核实收到的这个货币以前有没有被花出去过,也就是017这个货币有没有在别人手里,来避免这个货币被同一个人用了两次。

​ 如此就避免了双花问题。

​ 这样的方案是正确的,实践中当然是可行的,这就是不考虑去中心化下数字货币的方案。

​ 每个人进行了交易都需要向央行核实,并且央行数据库要对每一个货币的来源去向做一次修改。可想而知,这么做央行有多累。

3、去中心化下的数字货币方案

​ 那么我们能不能去掉央行这个中心化机构,取而代之的是广大的用户?这就是比特币数字货币系统要做的事情。

​ 一个去中心化的货币系统,要解决两个问题

​ (1)谁有权利发行数字货币?因为没有一个中心机构,那该如何决定货币什么时候该发行,一次又该发行多少?

​ (2)怎么验证交易的有效性,怎么防止双花问题?

​ 对于第一个问题,谁来发行货币,这在比特币系统中是由挖矿决定的,这在后面的文章讲挖矿时会详细讲到。

​ 这篇文章先来讲第二个问题,如何防范 double spending attack ?

4、去中心化下如何防范双花问题?

​ 这个问题的解决方案其实和上面讲到的中心化下央行的解决方案是类似的。同样需要维护一个数据结构来检测一个货币有没有被花过,被谁花过,只不过这个数据结构不是由某一个中央机构来维护,而是由所有的用户来共同维护。

​ 这个数据结构就是区块链。

在这里插入图片描述

​ 上图是一个简化版的区块链,存在两种哈希指针,一种是连接区块与区块之间的指针(图中浅蓝色的箭头);第二种是指向前面交易,说明币的来源的指针(图中红色的弯箭头)

​ 铸币交易:产生10个比特币给 A ,并写入区块链。

​ 随后,A 分别给了 B 和 C 5个比特币;然后 B 又给了 C 2 个,给了 D 3 个,此时,B 的比特币已经花光了,最后,C 把手里的所有家当 7 个比特币都给了E,需要注意的是,此时 C 的比特币有两个来源,2个是 B 给的(编号1),5个是 A 给的(编号2)。

​ 比特币系统中每一笔交易都包含输入输出两个部分。输入部分要说明币的来源,输出部分要给出收款人的公钥的哈希

​ 想想为什么要说明币的来源?如果交易使用的是纸币,那收款方不需要知道纸币是从哪来的,因为纸币是不可复制的。但是在比特币中就必须要知道币的来源才能保证它不是凭空捏造的,是有记录的,这样做才能防范双花攻击

​ 用上图简化版的区块链来举个例子:B的比特币给了C 2个,给了D 3个,自己手里没了,如果他还想在区块链后加一个交易,给F 5个比特币,这样做显然就不合法了,因为其他节点只要按着哈希指针,也就是图中红色的箭头一查B手中比特币的去向,就知道 B 已经没有比特币了。就不会把 B 给 F 5个比特币这笔不合法的交易加入区块链中。

在这里插入图片描述

​ 接下来,我们来仔细地分析一下 A 给 B 5 个比特币这笔转账交易。

​ 这笔交易需要什么信息?

​ 当然需要 A 的签名,来确定是 A 转的比特币;同样 A 还需要 B 的地址,也就相当于是 B 的银行账户,来确定 A 这笔钱转给谁。

​ 那么,B 需要知道 A 的什么信息吗?似乎并不需要,又不是 B 转钱给 A ,B好像并不需要知道 A 的信息。但实际上并不是这样的。

​ 其实 B 需要知道 A 的公钥,来确定 A 的身份,就好比某一天,有个人给你转了 5 个比特币,你当然得知道这笔钱是谁转给你的。事实上,并不只是 B 需要知道 A 的公钥,所有的节点都需要知道 A 的公钥,这样才能通过 A 的公钥来验证 A 的签名,也就是验证图中的 “signed by A”,从而验证这笔交易是否合法,毕竟,没有了银行这种中心化机构,交易需要所有用户来共同监督。

​ 那么问题来了,如何知道 A 的公钥?

​ 前面有说到,一笔交易包含输入和输出,其实 A 到 B 这笔交易的输入不仅包含了币的来源,也包含了转账者 A 的公钥,这个公钥是 A 自己说明的。

​ 那么问题又来了:我们知道,A 的公钥是用来验证身份的,那既然是为了验证身份,那就有可能 A 的身份被冒名顶替。这种问题是存在的,如何避免呢?

​ 实际上,在铸币交易的输出中,就包含了 A 的公钥,这样一来,A 到 B 的转账交易中 A 的公钥就必须和铸币交易输出中 A 的公钥是相同的。这样就避免了冒名顶替的情况出现。

​ 上面这段可能有点绕,大家仔细对着图多读几遍加深一下理解。

​ 这些验证的过程,实际上是执行脚本程序(BitCoin Script)来完成的,后面会专门讲到。


复习回顾:
区块链学习笔记 | 比特币中用到的密码学原理
区块链学习笔记 | 比特币中的数据结构

猜你喜欢

转载自blog.csdn.net/Curry_On/article/details/100125556