假设有一个大家都信任的中心化机构想要发行数字货币。
该机构由用自己的私钥签名后后发行,任何人都可以通过公钥验证该货币是否为真。
买东西的时候,购买者可以将数字货币发送给卖方,卖方可以也可以通过公钥验证该货币为真后即可完成支付的过程。
此方案没有用到区块链技术,使用的是密码学中的非对称加密公私钥体系。
但该方案存在一个明显漏洞:
不同于现实中的货币,交易者可以对手中的数字货币进行复制,使得一张数字货币可以重复使用。
花两次攻击/双花攻击(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发起的交易。
未完待续
原视频:北京大学肖臻老师《区块链技术与应用》公开课