比特币白皮书阅读笔记

比特币白皮书笔记

个人理解,有失偏颇,觉得不太对的地方可以指出来。

Abstract

摘要指出,现有拥有的交易是通过数字签名的方法来保证可靠性,但是数字签名这种解决方案没有解决双花的问题,因为数字签名只能保证这个东西是发送方的,不能保证这个东西以后一定不会发给其他人,因为数据是可以复制的,传统的解决方案还是需要一个信任的第三方来解决这个问题,但是这就又带来了第三方的信任问题。然后提出了区块链的关键点: 时间戳、hash标识、使用hash的工作量证明,按照时间戳链在一起,链来自全网最大CPU的算力,如果想要篡改,必须重做之前的工作量证明。

Introduction

第一段指出,现在没有任何一个系统能在双方在的其中任意一方不被信任的情况下通过沟通渠道来解决

第二段直接说明,我们需要一个基于加密证明而非基于信任的电子支付系统,允许任意双方在不需要信任的第三方直接交易,这篇论文就提出了针对数字签名不能解决的双重支付的问题: 使用一种p2p分布式的时间戳服务来生成交易的时间顺序的计算证明,只要整个系统的诚实的节点大于合作攻击的节点控制更多的算力,就能保证系统是安全的。

一句话总结: 区块链解决两重支付,基础的拓扑结构是p2p,时间戳是确认交易顺序的方式。

Transactions

第一句话将电子现金定义为一连串的数字签名。每一个拥有者交易货币给下一个人通过自己的私钥签署上一个交易和下一个人的公钥的hash并把签署的结果附加在货币的末尾,收款人可以验证这个签名来保证这个链的所有权。附图:

blockchain_1.png

解释一下: 把一个coin给下一个人是通过数字签名的方式,也就是说通过公私钥的方式来证明coin的来源与去处。假设A要和B需要交易一个coin,那么这个过程成为一个交易,比如上图中间的交易,这个交易记录给B多少钱和B的公钥,同时提供A可以操作上一个交易,对这两部分信息共同哈希后,A用自己的私钥签名这个hash,然后加在交易的上边,这个交易被广播到其他节点,此时一个路过的旁观者,他本地具有图中第一个交易之前的所有交易,当矿工看到这笔交易的时候,就用A的公钥去验证这个交易的签名是不是A本人发起的(因为只有用A的私钥签名才能和上一个交易进行验证通过,证明A可以操作第一个交易)。

数字签名的问题解决了,那么怎么解决双花呢,首先只有付款人才会发生双花。双花是这样的,已经发生过一次交易,他想当作这笔交易不存在,他再次使用这个交易去发起另一次交易。所以 最早的交易才是最重要的,我们只关心付款人发起当前这个交易是否在之前已经用过这笔钱了。所以每笔交易需要被广播,让所有节点都知道这个交易发生了,并且让所有人都知道之前所有发生过的交易用来验证这个交易是否在之前发生过,如果没有发生过就证明这个交易的合法的。

Timestamp Server

这章说的就是矿工所作的工作,文中说的items就是指的很多笔交易,然后把这些交易打包成一个区块,并把这个区块打上时间戳并做hash,时间戳能够证明那个数据在某个时间段确实存在,以此来保证时间的先后顺序(时间戳都哈希了,还怎么保证时间顺序?)如下图所示,这张图就是为了说明时间和区块有关系,区块和hash有关系,然后把hash连在一起,这样之前所有的时间戳是不可被修改的。

block_chain_2.jpg

Proof-of-Work

这章就是讲的是区块链系统的核心的一部分,传说中的POW。主要讲了如何运用POW来达成全网共识,比如说某个交易分别以不同的时间先后顺序来到了A、B、C三个矿工这里,让这个三个矿工利用CPU的算力来抢夺记账(区块上链)的权利,区块链是使用sha256算法来进行hash的,区块中有一个值叫做nonce,矿工们就是通过不断的变化nonce的值来证明自己确实付出了CPU的算力,可以拥有记账权,通常要求经过hash后前n位是0来计算的,同样的,如果你想改变前边的区块的信息,你必须要重建工作量证明(到最新块的所有工作量)。关于nonce看下图,这个图和上一个图一样,只是这张图指明一个区块是包含上一个hash的(Prev Hash),并且Nonce是区块中的一个部分。一旦更改Nonce,Prev Hash, Tx其中任意一个,那么这个区块的Hash也会改变,之后的区块也全部都要改。

blockchain_3.png

另外,POW的难度是随整个系统的难度而一起提升的,因为计算机计算的硬件能力是不断提升的,想想现在的CPU挖矿、显卡挖矿、矿机挖矿,这就是POW的精妙之处。

Network

运行这个网络的步骤如下:

  1. 新的交易被广播到全部的节点。
  2. 每一个节点把新的交易收集进入到一个区块
  3. 每一个节点都为自己的那块区块进行工作去找到那个工作量证明
  4. 当一个节点找到了这个块的工作量证明,它把这个块广播给所有的节点
  5. 节点们只能当这个区块中的所有的交易都是合法的并且都没有被花费过才会接受这个块
  6. 节点们通过转向下一个块的工作量证明并使用这个块的hash作为(下一个块的)前一个hash来表示接收这块。

区块链系统的所有节点都默认为最长链正确的,那么为什么全网都会有这个共识,这个是由下一章的激励来保证的。一个区块被承认的关键就是只有当前区块产生了下一个区块,才承认这个区块是合法的,这点比较关键。还有一种特殊情况,因为信息的沟通没有实时性,可能会出现一些节点和其他一些节点认可的区块不同会造成区块链分叉的问题,但是这种情况会在多链几个块后会打破,因为最长链的原则。

Incentive

这部分说明了一个重要的问题,币从哪里来,其中比特币的总数是确定的,比特币的产生就是给抢到记账权的账户给予一定的货币奖励,这就是货币的发行,每个区块的都有一笔特殊的交易,这个交易没有发送方,直接对矿工给予奖励,激励的另外一部分就是交易的手续费收入,区块链的精明之处就是这个激励机制,他让诚实的节点更加诚实(因为这样有利可图),遵守规则会比破坏规则所带来的收益更大。

Reclaiming Disk Space

现在区块链的总是已经超过了100G,对于这么大空间,普通公众使用是不可能的,区块链是这样解决的:区块链不存储交易,而是使用Merkel Hash Tree的方式存储Root Hash(达到0知识证明),也就是个人并不需要这个区块的全部,只需要有这个区块的hash就行了,有一些公共节点、信任度高的节点来帮助存储区块,等到需要的时候向节点请求就可以了。Merkel树的结构如下:

blockchain_4.png

一个剔除交易的区块头大概会是80byte大小。如果我们假设区块每10分钟就生成一个,那么80bytes 6 25 * 365 = 4.2MB 每年。2008 年PC系统通常的内存容量为2GB,按照摩尔定理预言的每年增长1.2GB的大小,即使将全部的区块头存储在内存之中都不是问题。

Simplified Payment Verification

因为上一章为了节省磁盘空间,以Merkle树的形式存储,在区块中只存储根的哈希值,其余的叶子节点直接剪掉,不需要自己存储,但是一个节点是这样存储的时候,必然需要一个对应的支付确认方案,来验证某个交易,这个验证就是本节标题,简化支付验证。

因为区块有Merkle Root的hash,这就相当于有一个索引,然后就可以从其他节点请求到原始信息,来支付,具体可以看下图:

blockchain_5.png

Combining and Spliting Value

这一章主要讲了比特币的面额(价值)是可以合并和分解的,可以让交易更方便,但是这一章更重要的目的是介绍比特币系统独特的记账体系,以及一个非常重要的概念——UTXO(Unspent transaction output),每次的交易必须被花完,只不过是所有input的综合,其中一部分给了收款方,而找零则是全部返回到购买者上。

注意一点:一个交易是由前面的交易进行验证加上转移数目和目标地址构成的,inputs就是之前所有交易的outputs。对所有的inputs进行验证,就可以得到交易的付款者的余额是否大于要转移的数目。

blockchain_UTXO.png

Privacy

这章主要讲如何保护隐私:使用公钥匿名的方式,别人只能看到有一个发送了一笔钱给另外一个人,但是没有人能和公钥和链下的人联系在一起,但是随着量子计算机的发展,基于椭圆曲线的加密还是有可能被破解,所以作者就建议,一次转账就使用一对新的密钥,就可以保证每次都是使用新的公私钥进行交易。

Calculations

假设一个场景,某个攻击者正在试图生成一个比诚实链更快的替代链。就算他成功了,也不会使当前系统置于模棱两可的尴尬境地,因为他不可能凭空制造出价值,也无法获取从未属于他的钱。网络节点不会把一笔无效交易当作支付,而诚实节点也永远不会接受一个包含这种支付的区块。攻击者最多只能修改属于他⾃己的交易,进而试图取回他已经花出去的钱。

诚实链条和攻击者之间的竞争我们可以使用二项随机漫步来描述(与二项分布差不多???),成功的标志就是诚实链条添加了一个新的区块,区块数+1,而失败标志刚好相反。假设一下定义:
blockChainMath1.png
两种节点找到下一个区块的事件相互独立,所以就有:
blockChainMath2.png
这个公式也就是说,如果p<q那么攻击节点一定会超过诚实节点,但如果p>q,那么攻击节点追上的概率就会随着z的增加而指数下降,如果攻击节点没有在早期赶上,那么他成功的追上的概率会小很多很多。

下边部分就是说明了一个交易被充分确认多少次,能让付款方无法再更改交易,经过假设和概率计算得等6个区块形成后是决定无法修改的。

Conclusion

就是总结一下,所以直接放原文。

We have proposed a system for electronic transactions without relying on trust. We started with
the usual framework of coins made from digital signatures, which provides strong control of
ownership, but is incomplete without a way to prevent double-spending. To solve this, we
proposed a peer-to-peer network using proof-of-work to record a public history of transactions
that quickly becomes computationally impractical for an attacker to change if honest nodes
control a majority of CPU power. The network is robust in its unstructured simplicity. Nodes
work all at once with little coordination. They do not need to be identified, since messages are
not routed to any particular place and only need to be delivered on a best effort basis. Nodes can
leave and rejoin the network at will, accepting the proof-of-work chain as proof of what
happened while they were gone. They vote with their CPU power, expressing their acceptance of
valid blocks by working on extending them and rejecting invalid blocks by refusing to work on

  1. Any needed rules and incentives can be enforced with this consensus mechanism
文章名: 《比特币白皮书阅读笔记》
文章链接:https://blog.hrhr7.cn/index.php/archives/27/
联系方式:tensor7@163.com
除特别注明外,文章均为Cupidr原创,转载时请注明本文出处及文章链接
Last modification:August 9th, 2019 at 12:09 pm
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment