《区块链技术与应用》——共识协议笔记

《区块链技术与应用》——共识协议笔记,第1张

数字货币存在问题 double spending attack(双花攻击):

数字货币和纸质货币区别是其可以复制,即货币持有者可以将其花费两次,叫作double spending attack(双花攻击)。

如何解决问题:

1.第三方机构对货币添加唯一编号(不可篡改),每次支付向货币发行单位查询真伪。其每次交易都需要依赖于第三方机构来判断货币真伪。

2.鉴于网络上第三方机构可信度问题,引入去中心化的解决方法

解决去中心化问题 1.数字货币的发行

比特币的发行是由挖矿决定的。

2.怎么验证交易的有效性,防止double spending attack 依靠区块链这种数据结构。比特币系统中每个交易都包含输入和输出两部分。输入部分要说明币的来源以及公钥,输出部分要给出收款人公钥的哈希。

比特币系统里收款的地址是通过公钥推算出来的,并且收款方的公钥需要收款方提供或者通过渠道获取。并且所有人都需要知道汇款方的公钥(包含在交易里面),代表其身份。不仅是收款方,所有节点都需要知道汇款方的公钥。因为此处汇款方的签名是用私钥签名,公钥验证。每个节点都需要验证该交易的合法性。

(注意与加密区分,加密是用接收人的公钥加密,私钥解密)

安全漏洞:实际中A转账时候提供的公钥需要和铸币交易中公钥对上,防止恶意节点B'伪造A的公钥来“偷”走A的比特币。

3.BitCoin Script(比特币脚本)

在比特币系统当中,前面这些验证过程,是通过执行脚本来实现的。每个交易的输入是一段脚本,包括给出公钥的过程,公钥也是在输入的脚本里指定的。每个交易的输出也是一段脚本,验证交易合法性,就需要把当前交易的输入脚本跟前面交易(提供币来源的交易)的输出脚本拼在一起,然后看看能不能顺利执行,如果能执行说明是合法的。


下面为样例说明:
比特币的发行者A拥有createcoin(铸币权)假如发行10个比特币A(10)分别给B和C各五个——B(5)、C(5) 该交易需要有A的签名,证明经A同意(designed by A),同时还要说明花掉的10个比特币从哪来的。

注:参考下图

上图就构成了一个小型的区块链,里面有两种哈希指针,一种哈希指针是连接各个区块,构成一个链表,即前面学习的哈希指针。在该图中的第二种哈希指针,是指向前面某个交易的指针,用来指明币的来源。

为什么要说明币的来源?证明币不是凭空捏造且有记录,并且防范double spending。第二个方框里A向B的转账,该交易需要A的签名和B的地址(地址相当于银行账号)。

该图对交易系统进行了简化,实际上每个区块(对应图中的每个方框)可以有很多交易,这些交易就组成merkle tree。每个区块分为块头和块身。


4.块头,块身

块头包含的是区块的宏观信息: version(比特币协议版本)hash of previous block header(区块链当中指向前一个区块的指针)merkle root hash(整颗merkle tree 的根哈希值)target(挖矿的难度目标预值)nonce(随机数)

这里的target,就是前面讲到的,整个块头的哈希要小于这个预值,即H(block header)≤target。block header里存的就是这个目标预值的nBits(编码)。

注意:

前一个区块的哈希只算前一个区块的块头,所以前面画的,一个区块引出一个箭头指向另一个区块中间,是不正确的,取哈希时是把块头的所有部分都取哈希。(见上图)

块身里面有transaction list(交易列表)

每个节点都需要验证所有的交易,实际上系统中的节点分全节点(full node)和轻节点(light node)。全节点是保存区块链所有的信息的,验证每个交易,所以全节点又叫fully validating node。轻节点只保存block header的信息,一般来说轻节点没法独立验证交易的合法性。
比如验证一个交易合法性,轻节点没有存以前的交易信息,所以无法验证。系统中大多数节点是轻节点,但轻节点并没有参与区块链的构造和维护,只是利用了区块链的一些信息做一些查询。

区块链里的内容是如何写到区块链里面的呢?每个节点,每个账户都可以发布交易,交易是广播给所有节点的。有些交易是合法的,有些是非法的。谁来决定哪些交易应该被写入下一个区块中呢?按照什么顺序写呢?如果每个节点自己决定可以吗?如果每个人在本地维护一个区块链,那区块链的统一性得不到保证,而账本的内容是要取得分布式的共识(distributed consensus)。


下面的笔记跟比特币的应用关系不大,可以作为了解:

分布式共识一个简单的例子就是分布式的哈希表(distributed hash table)。

比如系统里有很多台机器,共同维护一个全局的哈希表。哈希表中包含了key valve pair(键值对)。假如有人在自己电脑上插入一个键值对,其他人在另一台读的时候也要能把这个读出来,这就叫一个全局的哈希表。

分布式系统有很多impossibility result(不可能结论),其中最著名的是FLP。FLP是三个专家的名字缩写,他们的结论是:在一个异步的(asynchronous)系统里,即使只有一个成员是有问题(faulty),也不可能取得共识。

一个著名结论:CAP Theorem。(CAP是指分布式系统的三个性质,Consistency、Availability、Partition tolerance)。该理论内容是:任何一个分布式系统,这三个性质中,最多只能满足两个。分布式共识一个著名的协议是Paxos,该协议能够保证一致性,即第一个性质。

如果该协议达成了共识,那么这个共识一定是一致的,即每个成员所认为的共识相同。但是,某些情况,该协议可能永远无法达成共识,这种可能性比较小但是客观存在。


consensus in BitCoin(比特币中的共识协议)

比特币系统中会存在恶意节点,在系统中大多数节点是好的这个假设前提下,讨论如何制定共识协议。

1.直接投票 实现方式:某个节点打包交易到区块,将其发给其他节点,其他节点检查该候选区块,检查若正确投赞成票,若票数过半数,加入区块链。存在问题: 恶意节点不断打包不合法区块,无法产生投票结果,导致一直无法达成共识。是否投票为自愿,会有些人直接不投票,导致区块链瘫痪问题。网络延迟事先未知,达成共识效率或高或低。更大问题——membership。如果是联盟链(hyperledger),对加入成员有要求,可以基于投票。但比特币系统,任何人都可以加入,且创建账户及其简单,只需要本地产生公私钥对即可。有些人可以不停的创建账户,当超过账户总数的一半时就有了控制权,这种称为sybil attack(女巫攻击)。

注:创建账户,只能代表存在,但不代表别人已知,因为只有在交易的时候,才会公开知道这个账户。

2.按算力投票

每个节点都可以在本地组装出一个候选区块,把它认为合法的交易放在里面,然后开始尝试各种nonce值(占4bytes),看哪一个能满足不等式H(block header)≤target的要求。如果某个节点找到了符合要求的nonce,它就获得了记账权。
记账权,就是往比特币账本里写入下一个区块的权利。只有找到这个nonce,获得记账权的节点才有权利发布下一个区块。其他节点收到这个区块之后,要验证这个区块的合法性。

比如先验证括号里block header的内容填的对不对;block header里面有一个域,叫nBits域,实际上它是目标预值的一个编码,检查一下nBits域设置的是不是符合比特币协议中规定的难度要求;选出的nonce成否满足该不等式是否成立。假设都符合要求,然后检查block body 里面的交易列表,验证一下每个交易都是合法的:①要有合法的签名②以前没有被花过。如果有一项不符合要求,这个区块就是不能被接受的。

如果所有条件都符合,也不一定接受。(出现分叉)见下图:

假如生成了一个新区块,怎么知道新区块插在了哪里呢?根据生成区块的指针。

有可能就存在一个问题,这两个交易指A转账给B,以及A转账给自己。这种情况是合法的,不是double spending。

判断一个交易是不是double spending ,是看这个区块所在的分支,在这个分支上币有没有被花掉两次。

如图,一直到第三个区块,币都没有花过,所以这个交易是合法的。

验证交易是否合法,只会检查本身所在链。

虽然该交易是合法的,但是它不在longest valid chain(最长合法链)上。这种称为forking attack(分叉攻击)。此时接收的区块应该是扩展最长合法链。

区块链在正常情况下也可能出现分岔:两个节点同时获得记账权。

每个节点在本地自己组装一个它认为合适的区块,然后去试各种nonce,如果两个节点在差不多同一个时间找到了符合要求的nonce,就都可以把区块发布,这时会出现两个等长的分岔。这两条都是最长合法链,那该接受哪条呢?比特币协议中,在缺省(默认的意思)情况下,每个节点是接受它最早收到的那个。所以不同节点根据在网络上的位置不同,有的节点先听到新生成的其中一个区块,那就接受这个区块;有些节点先听到另一个区块,那就接受另一个区块。

 如何判断接收了一个区块?

比特币协议中用到了implicit consign,如果沿着这个区块往下继续扩展,就算认可了这个发布的区块。比如在新生成的其中一个区块后面又拓展一个区块,表明就认可了这个新区块。


等长的临时性的分岔会维持一段时间,直到一个分岔胜出。这两个新区块有可能会各自拉拢,两个区块链看谁的算力强,有时候也是看谁的运气好,就会胜出。也就是哪一个链抢先一步生成了新的区块,哪一条就是最长合法链。另一个作废的就叫orphan block。并且当一个区块胜出后,另一个作废的区块得到的比特币是没有作用的,其他诚实的区块是不会承认的。

竞争记账权的好处

首先获得记账权的节点本身有一定的权力,可以决定哪些交易写到下一个区块里。但这些不应该被设定为竞争记账权的动力,所以建立了一个机制:block reward(出块奖励)。
比特币协议中规定获得记账权的节点在发布的区块里可以有一个特殊的交易:coinbase transaction(铸币交易),在这个交易里可以发布一定数量的比特币。

货币如何发行?coinbase transaction铸币交易是比特币系统中发行新的比特币的唯一方法,后面的交易都是比特币的转移。这个交易不用指出币的来源。

那么能造多少币呢?开始时比特币刚上线的时候,每一个发布的区块可以产生50BTC(BTC就是比特币的符号)。协议规定,21万个区块以后,初块奖励就要减半,就变成了25BTC。再过21万个区块,又要减半。


课堂问题小结:

比特币系统中要取得什么共识?去中心化的账本。

谁能决定账本的内容?获得记账权的节点。

怎么获得记账权?就是解pow(挖矿)。按照算力记票,算力可以用每秒能试多少nonce数值表示。

怎样防范女巫攻击?按算力记票,即使创建再多的账户,也无法使算力增强。


比特币争夺记账权的过程叫作挖矿(mining),比特币被称为数字黄金(digital gold),争夺记账权的节点被称为矿工(miner)。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/2992047.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-23
下一篇 2022-09-23

发表评论

登录后才能评论

评论列表(0条)

保存