区块链学习笔记3——BTC协议
数字货币所面临的主要挑战
Double spending attack(双花攻击,同一张数字货币可以复制的使用) 防范:通过一个可信第三方(如央行)维护一个很大的数据库存储每张货币的所有人,对每张货币添加一个唯一编号,当一个人花掉这张货币的时候,这张货币的所有人也会相应的发生变化,
去中心化
- 所谓去中心化即没有可信第三方的参与,那么就需要解决数字货币的发行由谁执行?如何发行?发行多少?什么时候发行?
在传统中心化货币体系中,这些问题我们可以交给第三方机构(如央行)。当引入去中心化思想后,系统中节点平等,交易不通过第三方,那么货币发行权的分配必然是一个需要解决的问题。 比特币通过挖矿来决定货币的发行权,发行量
该问题的解决,依赖于系统中维护的一个数据结构,记录货币的使用情况(是否被花过?被谁花过?)。该数据结构由系统中全体用户共同维护,保证了交易的有效性。该数据结构,便是区块链。
简单的区块链交易模型
在该模型中,A获得了铸币权,发行了十个币,在第一个交易中,A转给了B五个币,转给了C五个币,A对该交易签名,同时,通过一个指针指出了这十个币的来源,后面的两个交易类似。
在进行交易时,需要付款人的签名和收款人的地址,在比特币系统中,该地址即为收款人的公钥的哈希。可以将其视为银行账户,根据此进行转账交易。(虽然公钥可以公开,但实际中更多公开的是公钥的哈希) 在交易中,收款方需要知道付款方的公钥,从而验证A签名是否有效。即A需要提供自己的公钥(实际上其他节点都需要知道付款方公钥,验证交易合法性)实际中A转账时候提供的公钥需要和铸币交易中公钥对的上,这样就防止了恶意节点伪造A的公钥来“偷”走A的比特币。 在比特币系统中,通过执行脚本实现上述验证过程。将当前交易输入脚本与前一个交易输出脚本(说明币的来源的交易)拼接执行,如果可以正确执行,说明交易合法。 在该图中,一个区块仅含有一个交易,实际中一个区块中包含多个交易,交易通过Markle Tree组织起来,在区块中存储。
区块信息
Block header | 区块头 |
---|
Version | 比特币的协议版本 | Hash of previous block header | 区块链中指向前一个区块的指针 | Merkle root hash | 整课Merkle tree的根哈希值 | Target | 难度目标阈值(比特币有关) | nonce | 随机数(比特币有关) |
Merkle root hash保证了block body内容不被篡改,所以只需要计算block header即可保证整个区块内容不会被篡改
Block body | 区块体 |
---|
Transaction list | 交易列表 |
Full node:保存区块链的所有信息,验证每一个交易 Light node:只保存block header,不参与区块链的构造维护
Distributed consensus(分布式共识)
FLP impossibility result 系统网络传输是异步的,网络时延没有上线,哪怕系统中有一个成员是faulty的,那就无法达成共识。 CAP Theorem C:consistency 一致性 A:Availability 可靠性 P:Partition tolerance 容错性 任何一个分布式系统中这三个性质最多只能满足两个。
Consensus in BitCoin(比特币中的共识协议)
存在的问题:系统中存在恶意结点 1.直接投票 某个结点发布交易到区块链中,其他结点检查该区块,通过投票决定是否将其加入到区块链中,如果赞成票数超过一半,则加入区块链。 问题1——恶意结点不断打包不合法区块,导致一直无法达成共识,时间全浪费在投票上 问题2——无激励机制,有些节点不会投票 问题3——网络延迟为止,投票等待时间不确定,效率上会产生问题 女巫攻击——比特币系统允许任何人加入,只需要本地创建公私钥对即可创建账户。这样,恶意用户只需不断产生新的节点,当节点数达到一半以上时就会有区块链的控制权,操纵投票结果。 2.算力投票 算力投票是比特币使用的共识协议,即通常所说的“挖矿”,每个结点都可以自行组装区块,尝试各种nonce值,当找到某个符合条件的nonce时便获得了记账权,从而将区块发布到系统中,其中节点收到区块后可以验证其合法性,如果系统中大多数结点验证通过,则接受该区块。 forking attack(分叉攻击) 如上图所示,A对同时给两个用户转账。在两条链上,发现交易都合法,这是典型的双花攻击。A先给B转账后,通过分叉攻击将交易回滚,把钱又转回来,这在验证上是可以通过的。 但在实际的比特币系统中,这种情况很难发生,因为大多数矿工认可的是最长的合法链,会沿着上面的链继续挖下去,如果A想回退这个记录,就必须使得下面的链比上面的还要长,理论上需要达到51%的算力才能攻击成功,实际中这是很困难的。
如上图所示,在区块链正常的工作中,也可能会发生分叉,当连个节点同时获得记账权时,会有两个区块同时上链,此时会有两个等长的合法链。在缺省情况下,节点接受最先听到的区块,该节点会沿着该区块继续延续,但随着时间延续,必然有一个链胜出,由此保证了区块链的一致性。
Block reward(出块奖励)
出块奖励是比特币中的激励机制,获得记账权的结点在发布的区块中可以加一个特殊的交易(铸币交易),这是发布比特币的唯一方法,不需要指明币的来源。 最开始每个区块可以发布50个比特币,每过21万个区块比特币会减半,现在只有12.5个比特币。
|