任何事物的发展都有其客观原因,区块链也不例外;简单来说,任何技术的发展都是为解决问题产生的:当前存在什么问题?如何解决该问题?----其实这句话是我硕士生导师天天都要说的,这句话就是研究算法的套路,哈哈!
现在我们要看看中本聪这个大神为什么要创造比特币?采用什么技术实现了比特币系统?中文版比特币白皮书请见下面链接:
英文版见以下链接:
Bitcoin: A Peer-to-Peer Electronic Cash System
0. 存在什么问题?
基于信用的模式”(trust based model)交易存在以下问题:
a. 无法实现完全不可逆的交易,因为金融机构总是不可避免地会出面协调争端;
b. 中介的存在,会增加交易的成本,并且限制了实际可行的最小交易规模;
c. 现在中交易需要建立信任,信任建立机制需要成本。
如何解决:
“所以,我们非常需要这样一种电子支付系统,它基于密码学原理而不基于信用,使得任何达成一致的双方,能够直接进行支付,从而不需要第三方中介的参与。”
个人认为这是区块链技术(支持比特币系统)最有价值的地方:基于信任成本高,基于密码学原理使得建立信任的成本趋近于0。
下面进一步分析中本聪采用哪些技术来设计比特币系统的。
1. 交易(Transactions)
个人认为这个概念中文版表述得不太准确,英文版原文为:
“We define an electronic coin as a chain of digital signatures. Each owner transfers the coin to the next by digitally signing a hash of the previous transaction and the public key of the next owner and adding these to the end of the coin. A payee can verify the signatures to verify the chain of ownership.”
如上所示,假设Owner1 转账一定数量BTC给Owner2,Owner1把上一笔自己的UTXO和Owner2的public key执行hash,然后用Owner1的private key 进行签名;Owner2可以使用Owner1的public key验证这笔交易是由Owner1发起的,也就是“A payee can verify the signatures to verify the chain of ownership”。交易验证过程会在后续的文章中详细阐述。
同时基于区块链的比特币系统也能解决“双花”问题。设计A同时一笔UTXO转账给B和C,即
TX1: A->B
TX2: A->C
设计网络中的某个节点先接受都TX1,随后接受到TX2,发现TX2与TX1是同一笔UTXO,节点就会丢弃A->C,从而解决了“双花”问题。
2. 工作量证明(共识算法)
在区块链系统中,由于激励机制每个节点都会争夺记录账本的权利,争夺的过程就是挖矿的过程。过程如下:
旷工搜索一个随机数,经过某种运算(如SHA256)使结果满足某种特性,如运算结果的前N位为0。当某个旷工发现这个随机数时将向网络广播,其他节点确认后就获得了记账权,即产生了一个新的区块。
共识算法的本质是通过算法确认某个节点花费大量算力得出随机数nonce;共识算法应该具有如下特征:
a. 已知output的特征很难推算出input,只能通过无数穷举才能获得;
b. 知道input很容易算出output,进而确认output是否符合某些特征。
POW严重浪费CPU资源,进而推动其他共识算法的产生(如POS,DPOS),以后文章中会详细阐述共识算法。
3. 网络
网络部分白皮书讲得简单明了,不再啰嗦,简单列出如下:
运行该网络的步骤如下:
a. 新的交易向全网进行广播;
b. 每一个节点都将收到的交易信息纳入一个区块中;
c. 每个节点都尝试在自己的区块中找到一个具有足够难度的工作量证明;
d. 当一个节点找到了一个工作量证明,它就向全网进行广播;
e. 当且仅当包含在该区块中的所有交易都是有效的且之前未存在过的,其他节点才认同该区块的有效性;
f. 其他节点表示他们接受该区块,而表示接受的方法,则是在跟随该区块的末尾,制造新的区块以延长该链条,而将被接受区块的随机散列值视为先于新区快的随机散列值。
节点始终都将最长的链条视为正确的链条,并持续工作和延长它。如果有两个节点同时广播不同版本的新区块,那么其他节点在接收到该区块的时间上将存在先后差别。当此情形,他们将在率先收到的区块基础上进行工作,但也会保留另外一个链条,以防后者变成最长的链条。该僵局(tie)的打破要等到下一个工作量证明被发现,而其中的一条链条被证实为是较长的一条,那么在另一条分支链条上工作的节点将转换阵营,开始在较长的链条上工作。
所谓“新的交易要广播”,实际上不需要抵达全部的节点。只要交易信息能够抵达足够多的节点,那么他们将很快被整合进一个区块中。而区块的广播对被丢弃的信息是具有容错能力的。如果一个节点没有收到某特定区块,那么该节点将会发现自己缺失了某个区块,也就可以提出自己下载该区块的请求。
4. 激励机制
激励机制就是旷工挖矿算出符合规则的随机数,产生新的区块,以获得比特币奖励。
个人认为这是比特币系统诸多创新点之一:
a. 可以吸引大量节点功能维护公共账本,提高数据的可靠性;
b. 减少黑客的攻击;因为破坏比特币系统也会伤害自己的利益。
5. 回收磁盘空间与简化支付确认(SPV)
“如果最近的交易已经被纳入了足够多的区块之中,那么就可以丢弃该交易之前的数据,以回收硬盘空间。为了同时确保不损害区块的随机散列值,交易信息被随机散列时,被构建成一种Merkle树(Merkle tree)[7] 的形态,使得只有根(root)被纳入了区块的随机散列值。通过将该树(tree)的分支拔除(stubbing)的方法,老区块就能被压缩。” ----引用来自于白皮书
很明显,这种方案极大地减小了节点存储区块链的磁盘空间。
“在不运行完整网络节点的情况下,也能够对支付进行检验。一个用户需要保留最长的工作量证明链条的区块头的拷贝,它可以不断向网络发起询问,直到它确信自己拥有最长的链条,并能够通过merkle的分支通向它被加上时间戳并纳入区块的那次交易。节点想要自行检验该交易的有效性原本是不可能的,但通过追溯到链条的某个位置,它就能看到某个节点曾经接受过它,并且于其后追加的区块也进一步证明全网曾经接受了它。”
----SPV机制,引用自白皮书
这里有个疑问点“但通过追溯到链条的某个位置,它就能看到某个节点曾经接受过它”,节点如何通过区块链区块header信息追溯到交易的?
6. 价值的组合与分割
比特币的每个交易可包含多个输入和多个输出(当然也可能是单输入单输出),每个输入可以是小额UTXO,输出最多包含两个:一个是支付,一个是找零。这种价值的分割和组合可以提高交易的效率。
疑问点:
a. 白皮书第3部分“Timestamp Server”是什么机制?与区块头中的时间戳有何联系?
b. SPV机制中,节点可以只保存最长有效链,如果验证某个交易的有效性,如何确认该交易在区块中的Merkle的分支路径?在本地区块头中搜索?还是在网络其他节点中获得?
以上即是个人对比特币白皮书的理解,由于能力有限,如有错误欢迎大家指出! 希望和大家一起进步。