区块链学习笔记(3)BTC协议
假设有一个大家都信任的中心化机构想要发行数字货币。
该机构由用自己的私钥签名后后发行,任何人都可以通过公钥验证该货币是否为真。
买东西的时候,购买者可以将数字货币发送给卖方,卖方可以也可以通过公钥验证该货币为真后即可完成支付的过程。
此方案没有用到区块链技术,使用的是密码学中的非对称加密公私钥体系。
但该方案存在一个明显漏洞:
不同于现实中的货币,交易者可以对手中的数字货币进行复制,使得一张数字货币可以重复使用。
花两次攻击/双花攻击(double spending attack)
数字货币面临的主要挑战就是怎么应对double spending attack。
如果如下图所示,对每一个发行的数字货币进行编号。
同时,货币发行机构维护一个数据库,负责记录每一张数字货币的归属。
如上图,在进行交易的时候首先通过机构核实该货币目前的归属,如果发现该货币已经支付给了别人,则无法进行第二次支付,以此来避免double spending attack。
此方案可以实现,但属于一个中心化的方案。数字货币的发行和每一次交易都需要通过发行机构证明合法性。
能否实现一个去中心化的方案,将货币发行机构的职能由广大用户进行承担?这就是BTC数字货币系统要解决的问题。
一个去中心化的货币需要解决两个问题:
1.数字货币的发行。(谁有权力发行数字货币)
2.怎么验证交易的有效性。(怎样防止double spending attack)
对于第二个问题,解决方法也是需要维护一个数据结构,来检测这个币有没有被花过,被谁花过。但这个数据结构不是由中心化机构来维护,而是由所有的用户来维护。这个数据结构就是区块链。
BTC系统中每个交易都包含了输入和输出两部分。输入部分要说明币的来源,输出部分要给出收款人公钥的哈希。
如上图所示,A拿到了铸币权,发行了10个比特币,接着A给B和C每个人5个比特币,该交易需要A的签名,证明是A同意的。同时该交易还要说明花掉的10个比特币的来源。B接着转给C两个比特币,转给D3个比特币,同样B也要进行签名,同时说明币的来源。C将7个比特币转给E,签字,说明币的来源(两个来自前一个块,5个来自前前一个块)。
此处有两种哈希指针,一种负责连接整个区块,一种负责指向前面的某个交易,为了说明币的来源,防范double spending attack。
值得注意的是,如果A要向B转BTC,A需要向所有人公布自己的公钥,以此来使所有人能够通过A的公钥验证这笔交易(验证A的签名)。
但这里就存在一个问题,假设一个B’,声称自己为A,自己签名后发布自己的公钥声称是A完成的转账,其他人通过B’的公钥可以得到B’的签名,那如何分辨出该交易是伪造的呢?
每个交易分为输入和输出两部分,输入部分要说明币的来源和付款人的公钥,输出部分要给出收款人的公钥哈希。在上述情况中,A的币的来源于铸币交易,coinbase tx,输出里面有A的公钥哈希,因此A的转账中使用的公钥哈希要跟之前的公钥哈希对应,以此来验证是否真的为A发起的交易。
在实际中,每个区块可以包含很多交易,这些交易就组织成Merkle Tree。
每个区块分为块头(Block Header)和块身(Block Body)两部分。
Block Header包含该区块中宏观的信息,比如用的BTC哪个版本的协议(Version),区块链中指向前一个区块的指针(hash of previous block header/只算区块的块头),整个Merkle Tree的根哈希值(Merkle root hash),挖矿的难度目标阈值(target/目标阈值编码nBits)和随机数nonce。
Block Body中包含交易列表。
取hash时将块头的所有部分取hash,Block Body的信息不用管。因为Merkle root hash已经可以保证Block Body的信息无法被篡改。
系统中还分为全节点(full node)和轻节点(light node)。
全节点保存验证所有信息(fully validating node),轻节点(light weight node)保留Block Header的信息,一般来说,轻节点无法独立验证交易的合法性。系统中存在的大多数节点都是轻结点。轻节点没有参与区块链的构造与维护,只是利用区块链的一些信息做一些查询。
账本的内容要取得分布式共识(distributed consensus)。
distributed consensus的一个简单的例子是分布式的哈希表(distributed hash table)。这里需要取得共识包括哈希表中包含了哪些key-value pair。
在分布式系统中包含了很多不可能结论(impossible results),其中最著名的就是FLP:
在一个异步(asynchronous)(网络传输时延没有上限)的系统中,即使只有一个成员是有问题的(faulty),也没有办法达成共识。
还有一个著名结论CAP Theorem:
CAP指的是分布式系统我们想要达成的三个性质:Consistency、Availiability和Partition Tolerance。任何一个分布式系统最多只能满足上述两个性质,无法同时满足三个。
分布式共识的一个比较著名的协议Paxos,该协议可以保持一致性(Consistency),但某些情况下可能一直无法达成共识。
BTC中的共识协议(Consensus in BItcoins):
BTC共识协议需要解决的问题是,有些节点可能是有恶意的。
如果采取投票决定新区块的协议首先要决定membership的问题,谁有资格进行投票。如果说这个membership有严格定义,比如联盟链(hyperledger fabric),只有某些符合条件的大公司才能加入。这种情况下基于投票的方案是可行的。
但是在区块链中,产生一个账户不需要任何人的批准,如果有个恶意节点一直连续不断的产生账户,产生的账户数量超过了要投票账户数量的一半,便可以操纵投票结果。(女巫攻击,sybil attack)
BTC系统中使用计算力代替账户进行投票。 每个节点都可以在本地组装成一个候选区块,把该节点认为合法的交易放入这个区块中,然后就开始尝试各种nonce值。
组装完成后开始测试各种随机数是否满足上述要求,如果某个节点找到了符合要求的nonce,则该节点获得了记账权,即向BTC去中心化账本中写入下一个区块的权利,只有找到nonce,获得记账权的账户才有权力发布下一个区块。其他节点收到区块以后要验证这个区块的合法性。
假设一个区块接收检查后都符合要求,是否一定会被接收?
longest valid chain:
BTC协议中规定,接受的链,应该是在扩展最长合法链。
分叉攻击(forking attack):通过向区块链中间位置插入区块,来回滚某个已经发生了的交易。
在正常情况下,如果有两个节点同时获得了记账权,此时会发现两个等长的分叉。
BTc协议中,如果收到新的区块之后继续向下扩展,则说明认可(接收)了该区块。
如果出现了上述情况,上述情况会维持一段时间,一旦其中一个区块有新的区块向下扩展,另外一个就被丢弃掉了。、
为什么要争夺记账权?
1.有一定的权力,决定哪些交易可以被写入区块链中。(不应成为主要动力)
2.block reward
coinbase transaction是发行新的比特币的唯一方法。其他所有交易都只不过是把已有的BTC从一个账户转移到另一个账户。
挖矿(mining):争夺记账权的过程。digital gold,miner。
笔记合集
原视频:北京大学肖臻老师《区块链技术与应用》公开课