首页 > 新手入门 > 正文

第三课:共识协议——《区块链技术与应用》一课学习笔记

分类:教程记录人陆凌燕鹿鸣于野UMU 2020-02-14 16:21

  

  一、央行发行数字货币之讨论

  (一)中心化方案讨论:

  不考虑去中心化问题,有一个大家都信任的中心化机构央行发行数据货币:

  每人都有央行的公钥,可以用来验证央行发行的货币为真。

  风险:

  但央行的私钥可能会泄露,央行发布的文件(发行的货币)可以无限复制(花两次攻击,double spending attack)——也是数字货币所考虑要防范的风险。

  改进:

  央行发行的货币上打了编号,央行对货币、编号作了储存,记录某个货币在谁手上。

  货币接收者要和央行验证:1、数字货币上是否有央行的签名,是否为真;2、这个货币是否已经花过一次,发出者给了甲,同时又给了乙。

  改进中的问题:

  正确性没有问题,实践也能操作,但太麻烦,每笔交易都需通过央行确认。但这是一个中心化方案,发行由央行统一控制,每次交易都需经过央行确认才能证其合法性。

  (二)去中心化方案讨论:

  一个去中心化方案,需考虑两个问题:1、数字货币的发行权;2、如何验证交易的有效性,防范花两次攻击问题,double spendingattack。

  1、发行权问题

  发行权在比特币系统中是由挖矿决定的,后面的课程会讲。

  2、如何防范花两次攻击

  防范的数据结构不再如中心化方案中一般由央行维护,而是由所有用户通过区块链来维护。

  (1)比特币交易的流程

  甲拥有了铸币权,他发行了十个比特币,create coin,A将其中五枚给了B,这笔交易里有A的签名,signed by A,证明该笔交易已经A同意。同时,这笔交易里还要说明币的来源。

  A、比特币交易分两步

  输入和输出,输入部分中有币的来源,输出部分要给出收款人公钥的哈希(在后面收款人作为付款人付款出去时,这个哈希也可以用来验证,这个哈希既是这一步付款的对象,又是下一步付款的来源验证)。

  B、两种哈希指针的存在

  一、把整个链表串起来的哈希指针;二、指向前面某个交易的指针,为了说明币的来源,为什么要说明?为了防范double spending。

  

  第三课:共识协议——《区块链技术与应用》一课学习笔记

  

  C、收款人的地址

  A把钱转给B,不仅要有A的签名,还要有B的地址。比特币中收款的地址,是通过公钥给推算出来的,B的地址就是B的公钥取哈希,并经一些转换。地址相当于银行账户。

  很多比特币地址在网站上就是二维码,供人扫码。

  (2)收款人对交易的验证

  B需要知道A的信息。A的这个转账信息要写入区块链,还需要一些其他的条件,B也要知道A的公钥(代表A的身份),用来证明币的来源(如A要确实拥有这些货币),所有后面的节点也都要知道A的公钥,用来证明的A的签名(私钥签名,公钥验证,公钥、私钥即是相应的一对)。

  B至C的输出脚本与A至B的输入脚本验证,以证明其中B的公钥确为同一个,以防止有B‘用自己的公钥冒充B的公钥,盗取B的数字货币。BitCoin Script

  上图中是作了简化,只有一个交易,但实际系统中,每个区块中可以包含很多个交易。

  A、区块的结构分解

  (a)关于块头

  每个区块有着块头和块身,block header中是宏观的信息,比如用的是比特币哪个版本version的协议,还要区块链中指向前一个区块的指针harsh of previousblock header,和指向merkle tree的根哈希值merkle root hash,还有和挖矿相关的难度目标阈值target和随机数nonce。

  H(block header)≤target,即整个块头的哈希要小于等于目标阈值。实际上哈希指针仅仅是指向Blockheader的。

  Block header里会存在目标阈值的编码,nbits

  (b)关于块身

  而block body里有交易列表transaction list,

  块头里的Merkle root hash已经能保证tansaction list是无法被篡改的。

  B、两种节点的存在与验证

  我们在讨论时,假设每个节点都需要验证所有的交易,但在实际中,系统的节点分为全节点full node和轻节点light node。

  全节点中有所有交易,因此全节点又叫做fullyvalidating node,轻节点light weight node,一般轻节点无法独立验证交易,如是否是double spending,轻节点无法验证,因为没有存以前的交易,系统中大多数节点是轻节点。我们这节课主要是围绕全节点来讲的。轻节点不参与区块链的构建与维护,只是利用轻节点进行一些查询。

  二、分布式共识

  这些内容是如何写入区块链的?哪些要写入,可否每个节点独立决定?但问题就是账本要有统一的说法,如果账本内容不一致,会有冲突。

  账本的内容取得分布式的共识,distributedconsensus,一个简单的例子是分布式的哈希表distributed hash table.

  系统有很多机器,共同维护一张哈希表,这里要取得的共识内容是哈希表中包含哪些key-value-care。

  (一)分布式系统的不可能结论及Paxos协议

  分布式系统中有很多不可能结论,最著名的是:FLPImpossibility result,在异步系统里asynchronous,网络传输迟延没有上限,即使只有一个成员有问题faulty,也不可能取得共识。

  第二个著名的不可能结论:CAP theory。

  CAP是分布式系统中的三个理想性质consistency,availability,partition tolerance,这三个性质最多只能满足两个,不可能三个都满足。

  分布式系统中一个著名协议Paxos,这个协议能保持一致性,这个协议如能达成共识,成员的共识一定是一样的,不会出现一个成员认为的共识与其他成员认为的共识不一样,但有些情况下Paxos一直达不成共识,实际中可能小,但可能存在。

  (二)比特币中的共识协议。Consensusin BitCoin

  比特币系统存在的问题是有些节点存在恶意。假设大多数节点没问题,小部分存在恶意。该如何设立共识协议?

  一种想法是直接投票,由节点提出候选区块,进行大多数投票。

  任何基于投票的方案,首先要确认谁有投票权,membership,如联盟链hyperleger fabric,只有某些符合条件的大公司才可以加入。

  但比特币系统中创建账户很容易,别人无法得知,除非转账,恶意节点可能用超级计算机不断创设账户,超过大多数、从而取得话语权,即女巫攻击sybil attack。

  1、比特币中的投票机制

  第二种想法,是比特币中设立的投票机制,是用计算力进行投票,每个节点都可以在本地组装出一个候选区块,把它认为合法的交易放到这个区块中,然后就开始尝试各种nonce值(4bytes),我们之前讲过的competitional puzzle。如果哪个节点找到这个Nonce,就认为它获得了这个记账权,即在比特币去中心化的账本中写入下一个区块的权利,只有找到Nonce获得记账权的节点,才有权利发下一个区块。

  2、其他节点对发布区块的合法性验证

  其他节点收到区块后,就要验证区块的合法性以及交易的合法性。

  (1)区块的合法性

  区块的合法性,比如这个block header里的内容是否正确,如nBits域,实际上是目标阈值的编码,是否符合比特币协议规定的难度要求,选出的nonce是否是block header的哈希,是否≤target,即是否真的有权利发布区块、是否真正拥有记账权,就是把blockheader里的几项都查一遍。

  (2)交易的合法性

  假设都符合要求,然后再看block body里的交易链,验证一下每个交易都是合法的,第一要有合法的签名,第二以前没有被花过,如果有任何一项不符合要求,那么这个区块是不能被接受的,要放弃掉的。

  假设一个区块,经过检查,都是符合要求的,是否就一定要接受它?

  合法是说区块的内容没有包含非法的交易,即以上两点都符合要求。

  (3)节点验证后插入

  收到一个区块后,我怎么知道该插在哪?根据前一个区块的指针hash of prev block,即根据前一个区块的指针,来判断插入位置。

  3、防范花两次攻击的判断方式

  判断是否是double spending,是看这个区块所在的分支,在这个分支上币有无被花过,从当前这个币到币的来源这中间的区块,有无已经把这个币花过。

  (1)恶意的分叉攻击

  A把币转出去后,又把币转给自己(分叉攻击,forkingattack,在区块链中间插入一个区块,来回滚某个已经发生了的交易),那么第二步自己转自己就不在最长合法链(longestvalid chain)上,该第二步就是不被接受的。比特币协议中,接受的区块应该是在扩展最长合法链。

  第三课:共识协议——《区块链技术与应用》一课学习笔记

  

   

  (2)正常状态下同时获得记账权导致的分叉攻击

  区块链在正常状况下,也会发生分叉攻击,两个节点可能同时获得记账权,并同时发布区块,就会出现两个等长的分叉,比特币协议中缺省状态下每个节点接受它最早收到的内容,因此不同节点根据它在网络中的位置不同,接收和记载的区块也会不同。

  (3)最长合法链的竞争

  如何区分是否接受?收到区块后继续扩展,就表明它认可了这个区块,不扩展就是没认可。

  因此等长分叉会维持一段时间,直到其中一个胜出,被丢弃的哪个就是orphan block,随之产生的比特币就无用了,因为大多数诚实的节点是不会接受它的。

  4、争夺记账权的意义

  为什么要消耗这么多资源去争夺这个记账权,有什么好处?

  (1)获得记账的权利

  获得记账权的节点本身有一定权利,决定哪些交易可以被写入下一个区块中去。

  但我们设计协议时不应让此成为争夺记账权的主要动力,因为我们希望凡是合法的交易都应被写入区块链中。

  只有获得记账权的节点才能往里面写东西,如何获得记账权,只能通过解上述的puzzle。

  (2)获得出块奖励

  比特币中的应对机制:出块奖励,block reward,在发区块时可以有个特殊的权利,铸币权,coinbase transaction(创币交易)是比特币系统中发行比特币的唯一方法,其他所有的交易都不过是把已有的比特币从一个账户转移到的另外的账户。

  (3)获得交易费

  每次交易都要交一笔交易费,以鼓励矿工进行记账。虽然交易费与出块比例相比很少,但大量交易积少成多,整个金额也很客观。

  三、本课总结

  共识机制中要取得的共识是什么?是去中心化帐本里的内容。

  那谁来决定帐本里的内容?只有获得记账权的节点。

  那如何获得记账权?就是解这个puzzle。Puzzle friendly 决定了求解这个puzzle没用捷径,只能通过计算来求取的。所以我们说比特币中靠算力来投票。

  比特币系统中不是靠帐户、计算机数来投票,每秒能试多少个nonce,我们称之为hash rate,这个决定了投票的权重。你这个节点的hash rate越高,获得记账权、得到出票奖励的概率就越高。

  那该如何防范sybil attack(即帐户直接投票会导致的后果),对此,比特币是通过算力来投票,创建多少个帐户不会对harsch rate或算力产生影响。

  比特币争夺记账权的行为叫挖矿,mining,因此比特币又被称之为数字黄金digital goal。

  

  课程学习笔记往期索引

  第二课:数据结构——《区块链技术与应用》一课学习笔记

  第一课:密码学原理——《区块链技术与应用》一课学习笔记

  

上一篇:第二课:数据结构——《区块链技术与应用》一课学习笔记

下一篇:如果硬件钱包丢了怎么办

猜您喜欢
关于我们联系我们作者投稿APP下载