0%

BTC三---协议

协议

1.需要解决的问题

举个例子,央行可以发行数字货币,每张数字货币上都有央行的私钥的签名

央行的公钥我们大家都知道,所以我收到一个数字货币,我可以验证一下是不是真的,买东西的时候,我把数字货币发给你,同理你也可以验证确实是央行发行的,这就完成了支付的一个过程。

这里用到了密码学中的非对称加密体系,但是没有用到区块链,这样会带来什么问题?

这个数字货币是个文件,我们不能篡改,但是可以复制,可以复制很多份,这和人民币不一样,我把人民币给你了,我就没有人民币了。这就是数字货币和纸质货币的区别

double spending attack(双花攻击),数字货币面临的一个主要挑战,就是防范double spending attack

改进的方案:

央行发行的货币,再每个数字货币上添加一个编号,并且在数据库中保存这个编号对应的货币目前在谁手上,收款方不仅验证数字货币的真实性,还需要验证付款方是否合法,央行的 数据库进而修改017对应的数字货币的所有者。

这样做是没有问题的,但是这是一个中心化的方案,数字货币的发行是由央行统一控制的,而且每次交易也是由央行控制的。

那么有没有去中心化的方案呢?将央行这个职能,改成由广大用户共同承担,这就是比特币,这个数字货币系统要解决的问题。

去中心化的货币要解决两个问题:数字货币的发行(没有央行了,都是普通群众,那怎么决定数字货币的发行:什么时候发行,该发行多少)、怎么验证交易的有效性(如何防止double spending attack)

①谁来发行货币?在比特币系统中,是由挖矿来决定的,这个在后面详细讲

②如何防止double spending attack:也是维护一个数据结构,检测数字货币有没有花过,被谁花过,只不过这个数据结构不是由央行来维护,而是由所有的用户来维护,这个数据结构就是区块链

比如用户A,拥有了发行货币的能力

比特币中的交易都包含输入和输出两部分,输入部分说明币的来源,输出部分要给出收款人公钥的哈希

这里有两个哈希指针,一个哈希指针是用来连接各个区块,把他们串起来构成一个链表,还有一个指针是用来说明币的来源的(用于证明这个数字货币不是凭空捏造的,同时防范double spending attack)

A要给B转钱,需要知道B的地址,这个地址是由B的公钥取哈希,经过一些转换推算得到的,那A要怎么知道B的地址呢?

比特币系统没有提供一种功能去查询某个指定人的所对应的比特币地址,这个需要其他的渠道来获得

A要给B转钱,B要知道A的什么信息?币的来源?(B不需要知道,这个其实是A要知道的)

答案是B要知道A的公钥。B要知道A的身份,好知道这笔钱是哪来的。但是不仅仅是B需要知道A的公钥,所有结点都需要知道A的公钥—->为了验证A的签名,那问题又来了,怎么知道A的公钥?

输入当中不仅要说明币的来源,还需要说明A的公钥是什么

在比特币系统中,这些验证的过程,是通过执行脚本来实现的—–>BitCoin Script

将后面交易的输入的执行脚本和前面交易的输出的执行脚本拼接,如果能顺利执行,那么这个验证就是通过的

每个区块由block header 和 block body组成

block header:保存每个区块的一些宏观的信息,包括

①:用的是比特币哪个版本的协议

②hash of previous block header:区块中指向前一个区块的指针

注意:前一个区块的哈希只算的是区块的块头

③Merkle root hash:整棵Merkle tree的根哈希值

④target:挖矿的难度目标阈值

block header存的就是target的一个编码:nBits

⑤nonce:随机数nonce

block body:

①transaction list:交易列表

貌似所有的结点都需要验证区块链中的每一个交易

实际上区块链分为全节点full node 和轻结点light node 两种结点

full node :保存所有的信息,验证每一个交易,也叫做fully validating node

light node:并不参数验证,只是利用区块链的一些信息做一些查询之类的工作

交易如何写入区块链,按照什么顺序?账本的内容要取得分布式的共识(distributed consensus)

分布式的共识?举个例子,就是简单的哈希表distributed hash table,就是,一台机器在hash表中插入了一条数据(key-value pair),在别的机器也能查询到。

2.分布式系统中的结论和协议

分布式系统有很多的不可能结论impossibility result,最著名的一个叫做FLP impossibility result:

在一个异步的系统里(asynchronous system),网络传输时延没有上限,即时只有一个成员是有问题的(faulty),也不可能取得共识

还有一个结论CAP Theorem:

C:consistency(一致性) A:Availability(可用性) P:Partition tolerance(分区容错性)

任何一个分布式系统CAP三个性质最多只能满足两个,不可能三个性质都满足。

分布式共识的一个重要协议:Paxos,这个协议能够保证Consistency,如果这个协议达成了共识,那么这个共识一定是一致的,不会说一个成员认为的共识和另外一个成员认为的共识不一样。但是,某些情况下,Paxos协议有可能一直没有办法达成共识,这种可能性在实际系统中是比较小的,但是是客观存在的

3.比特币系统中的分布式共识协议

需要解决的问题是,某些节点可能是有恶意的,我们假设系统中大多数节点是好的,如何去设计共识协议?

一种想法,既然大多数结点是好的,那直接投票行不行,比如说:某一个结点提出一个候选区块,他根据收到的交易信息,选一下那些交易是合法的,然后把这些交易按照某个顺序打包到一个区块里,候选区块发布给所有的结点,每个结点收到这个区块之后,检查这里面的交易是不是都是合法的,如果都是合法的,那么这个结点就投赞成票,如果有个交易是非法的,就投反对票,最后算出得票,如果超过半数,就将这个候选区块正式接受,写道区块链中

会带来什么问题?

①某个结点提出候选区块,万一这个节点是有恶意的呢,就不停的产生一些非法的交易让系统一直投票,会阻塞系统的发展

②并不能强迫每个节点都投票(行政不作为)

③效率的问题,网络的延迟状况不是很清楚

最大的问题:所有基于投票的方案,首先要确定谁有投票权(需要有membership)。如果这个系统的membership是有严格定义的,不是谁都可以加入的,比如hyperledger,只有某些符合条件的大公司才能加入,这种情况下,基于投票的方案是可行的。

但是比特币系统不是这样的,比特币系统中创建一个账户是很容易的,在本地产生一个公私钥对其他人其实都不知道,只有在你和外部交易的时候别人会知道,这种情况下,有恶意的结点,用一台超级计算机,不停的创建账户,当账户超过总数的一半时,就会对投票产生控制权,这种攻击叫做女巫攻击(sybil attack)。

所以简单的随机投票是不行的

比特币中采用了一个巧妙地机制来解决这个问题,也是投票,但不是按照账户的数目投票,而是用计算力来投票,每个结点都可以在本地组装出一个候选区块,把他认为合法的交易放在这个区块里,就开始尝试各种nonce值,看那个结点可以满足不等式的要求,求出的hash落在指定的范围之内,如果某个节点找到了符合要求的nonce,我们就说他获得了记账权(向比特币这个去中心化的账本里写入下一个区块的权力),只有这样的结点,才有权力发布下一个区块,其他节点要先验证这个区块的合法性,block header 中的nBits(挖矿的难度要求)是否正确,然后验证nonce,总的来说,就是先查询block header中的各种值,然后验证block body中的交易是否合法(是否有合法的签名、是否被花过)

有没有可能这个区块的所有内容都符合要求,但是我们仍然不愿意接受他?

分叉攻击,通过像区块链中间插入一个区块,来回滚某个已经发生的交易,但是区块链在正常情况下也会出现分叉,

如果同时有两个结点获得了记账权,就有可能发生,可能会出现两个等长的分叉

比特币系统中,缺省情况下,每个结点是接受他最早收到的那个,不同的结点在网络中的位置不同,接受的结点可能也不同,什么叫做接受?在接受一个区块之后会向后扩展区块

那么为什么要争夺记账权?

记账的结点可以拥有某些权力,决定那些交易被写到区块链里,但是设计的时候不应该让这个权力称为争夺记账权的主要动力,因为我们希望所有的合法的交易都应该被写进区块链里

比特币系统规定,获得记账权的哪个结点,在发布的区块里可以有一个特殊的交易,就是铸币交易,可以发布一定数量的比特币。coinbase transaction(交易)

比特币系统要解决两个问题,一个是谁来决定发行货币,另一个是验证交易的合法性,回过头来说明第一个问题:

coninbase transaction (交易)是比特币系统中发行货币的唯一方法,其他所有的交易都是把已有的比特币从一个账户转移到另一个账户,coinbase transaction不用指明币的来源,那能铸多少个币呢

比特币刚上线时,每一个新增的区块可以铸50 BTC,但是每21万个区块之后,这个奖励就要减半,现在的情况就是12.5 BTC

注意:orphan block中的奖励的比特币就无效了

4.总结

最后,那么比特币要取得的共识是什么?去中心化账本中的内容要取得共识,只有获得记账权的结点才能往里面写东西,

我们通过算例来获得记账权,每秒钟能够试多少个nonce的数目(hash rate),hash rate越高,得到出块奖励的概率越大