writer: Satoshi Nakamoto @ 2008 在2008年的作者看来,BTC系统最大的魅力在于:“在不需要第三方可信机构”的前提下,实现“抵抗双花攻击”+“交易不可逆”。这篇论文感觉对很多机制的具体工程实践细节方面,没有很清晰的描述,但是让我感到很舒服的一点就是,你能够跟着作者的思路,看看为了设计比特币这样一个系统,他考虑了哪些方面。
1. 交易(Transaction)
????首先,作者考虑了如何记录一笔交易。收款人的收款地址,可以用对方的公钥的表示。于是,将上一笔交易与收款人公钥进行哈希,将哈希用汇款人的私钥进行签名,即可表示一笔交易。并且下一笔交易可以继续引用当前的交易,从而形成一条完善的交易链。请注意,这里的链并非BTC区块链,而只是交易形成的链,可以用它来记录数字货币在交易过程中的来龙去脉,就好像一枚硬币被花来花去一样。
????然后,作者又考虑到,如果只是这样的机制,那么没有办法确保一枚币是否被花了两次,即双花(double-spend)。他给出的解决方案是,既然硬币的一次花费过程可以被表示为一次交易,那么就让人记录下所有的交易,对于这枚币的某个拥有者而言,我们只认可这枚币第一次被花费的交易。 ????每个交易,最重要的两个参数便是输入和输出。输入指定了花费的币从何而来(是之前某个交易的输出),输出指定了币发给谁(然后收款人可以用这个输出继续去消费)。
2. 时戳服务器(TimeStamp Server)
????BTC采用的是P2P网络,交易产生之后会在全网进行广播,那么我们怎么确认交易的发生前后关系呢?作者的解决方案是提供时戳服务器,来确定交易的时间先后顺序。
3. POW共识协议
????比特币作为一个分布式系统,所有节点之间势必要达成某种共识。要尽可能避免不同节点,区块链的内容不同的情况,这就要求禁止任何人在任何时刻都有发布区块的权力。因此作者采用POW作为BTC的共识协议,该协议要求所有节点必须通过求解符合要求的nonce值来争夺出块权力。只要你块里的交易没问题,nonce值也符合要求,其他节点就认可,随着确认节点增多和时间推移,你出的块里交易内容、顺序都将成为共识。
4. 网络
????作者在这一小节给出了比特币网络的运行步骤: ????① 向所有节点广播新交易。 ????② 每个节点将新交易收集到一个块里。 ????③ 当节点找到POW所需要的nonce值时,它会块打包好,并广播给所有节点。 ????④ 只有当块中的所有交易都有效,且交易中的输入都未花费时,节点才会接收该块。 ????⑤ 节点通过创建链中的下一个块,并引用当前块来表示对该块的接受。 ???? 作者考虑到,可能有两个块甚至更多同时出块,这些块被所有节点的接受程度也不一样,但是在任何时间,所有节点都认为最长链是合法的。因此一旦接受到在更长链上拓展出的块后,节点就会抛弃当前链,而转换到最长链上。
5. 激励机制
????在BTC网络中,参与的节点越多,也就越安全。但是如何调动社区的积极性,让大家自愿投身出块任务呢?作者设计了两方面的奖励。其一就是出块奖励,每一个成功出块的节点,都可以在该块中包含一个特殊交易(CoinBase铸币交易),该交易没有输入,只有输出指向出块人自己,这也是比特币唯一的发行方法,新创建的这些比特币都归出块的矿工所有。其二,每一笔交易(除了铸币交易),都有输入输出,如果输出比输入大,那么多的这部分比特币将作为交易费归出块矿工所有。 ????铸币交易奖励的比特币最开始是50个BTC,每21万个区块(大约四年)削减一半,由此可以预见终有一天比特币将被挖干,到那时,作者说交易费将成为唯一的激励机制。
6. 硬盘空间回收机制
????BTC网络的平均出块时间被设定在平均10分钟。由此可见,随着链上数据的不断增多,系统占用的磁盘资源也将越来越多。但是考虑到不是所有节点都有挖矿的打算,因此作者给出了解决方案:轻节点只保存块头即可,块头中没有交易列表,只有交易列表merkle tree的根。只有全节点才需要承担完整的存储压力。
7. 简单交易验证机制(SPV)
????因为轻节点没有全部数据,因此轻节点如何验证交易的真实性是一个问题。作者给出的解决方案是:通过向全节点请求目标交易所在merkle树分支,只需要很少的merkle树节点,便可以通过计算哈希值验证交易完整性。此外,当全节点检测到无效交易时,会主动警示轻节点下载完整的块来完成验证目标交易。作者在本节最后吐槽道,商用公司希望可以自己创建全节点加入BTC网络,验证的时候最好都能问自己人,这样又快又安全。
8. 币的合并与分裂
????比特币没有完整的账户概念,每份比特币无论面额大小,都以UTXO(未花费的输出)的形式存在着。一个交易,需要引用这些UTXO作为输入,产生新的UTXO输出,而作为输入的UTXO将作废。比如A有10个BTC,给B转5个,那么A要在交易中引用所拥有的总面额大于10BTC的UTXO作为输入,然后产生给B的5BTC的新UTXO和给自己的5BTC的新UTXO(找零)作为输出,差额将送给交易费当矿工。由于BTC存在这样的拆分合并机制,因此作者规定一个交易可以有多个输入,类似古代的碎银子,需要凑很多块才能达到规定面额,但是最多只能有两个输出,一个给收款方,另一个用来给自己找零。
9. 比特币隐私性
????比特币账户由一对公私钥组成,私钥用来做签名,公钥用来收款。链上交易的内容是每个节点都可以查验的,交易之中包含收款者的公钥,但是一般不会有人知道公钥的所属者,这也是BTC匿名性的最大保障。但是保不准会被别人给分析出来,因此作者推荐用户最好有几个公钥轮着使用。另外,作者提到,如果你在一个交易里引用了很多UTXO,那么别人就可以据此推断出这些UTXO所属交易的收款方都是你,这也是某种程度上的隐私泄露。
|