0%

读论文之比特币-一种点对点的电子现金系统

比特币:一种点对点的电子现金系统

比特币的经典文章必须好好研读一下

交易

转出者将该币的前一个交易地址与转入者的公钥打包后签名

首要的问题当然是转入者没法验证转出者是否双花,传统的解决方法是让可信任的权威机构或银行来检查每笔交易以防止双花,每笔交易的币都需要由转出者给到银行、再由银行给到转入者。这一方法的问题是整个系统都高度依赖于中央银行。

我们需要让转入者能独立验证交易的合法性,这要求转入者知道所有的交易信息,因此每笔交易都需要在网络上公开。我们还需要让所有参与这笔交易的人对这笔钱的历史交易信息有共识。转出者需要让每笔交易都能被大部分节点承认。

timestamp server

timestamp server记录一系列的包含时间戳的区块并将其哈希值广泛公开。每个时间戳都包含了前一个区块的哈希值。在这样的一条链上,每加入一个新区块都会巩固前面的区块

Proof-of-Work

为了在点对点的基础上实现这样的分布式timestamp server,我们需要使用工作量证明(Pow)机制。工作量证明机制需要通过枚举找到一个值,这个值在被某些哈希算法转换后(如SHA-256)得到的哈希值以数个连续的零开头。找这个值所需要的时间与零值的个数要求呈指数关系。但一旦找到,其他节点验证这个值的合法性则很快。(跑一遍SHA-256即可)

在这样的一个时间戳网络内,我们不断枚举nonce值直到这个区块的哈希值以一连串符合要求的0值开头。有了这样的算力投入,要想篡改区块就必须付出同等的代价。由于后面的区块包含了前面区块的哈希,因此篡改单个区块后还需要篡改其后面的所有区块。

Pow机制帮助大家形成对代表的共识。如果每个IP地址都有一个投票权(one-IP-address-one-vote),那么投票肯定会被购买了大量IP地址的人所操控。Pow本质上是(one-CPU-one-vote)。系统中的最长链就是大家的共识,大家在这条链上投入了最多的算力。只要主要的算力由诚实节点所控制,那么合法的链条就一定会增长得最快。为了修改一个过去的区块,攻击者必须投入该区块以及其后所有区块上曾被投入的算力,并且必须赶超诚实节点所维护的最长合法链。我们将稍后展示一个稍慢一步的攻击者(指没来得及挖出最新区块)追上最长合法链的可能性将随着后续区块的增加指数下降

为了适应增长迅速的硬件处理速度和随时间变化的挖矿收益,挖矿难度是随过去一段时间内每小时挖出区块的平均值决定的。如果区块产生的速度过快,挖矿难度将自动升高

Network

这个网络的运行有以下步骤:

  1. 给所有节点广播新的交易信息
  2. 每个节点将自己收到的交易信息放进区块中
  3. 每个节点投入算力来找到符合工作量证明难度的哈希值(挖矿)
  4. 当一个节点挖到了矿,它将其广播给其他所有节点
  5. 只有一个区块内的所有交易都是合法且有效的时候,节点才会认为这个区块合法并承认它
  6. 一个节点承认一个区块的表现是它在这个区块后挖矿

节点总是承认最长合法链并一直投入算力来延长它。如果两个节点同时广播了两个不同的区块,其他节点分别会率先接收到其中一个。这样的话,这些节点就会在自己第一个接收到的区块后挖矿,这样的平衡不会维持很久,因为总会有新的区块被率先挖出来,这样的话其中一个分支就会变得更长,工作在更短分支上的节点也会立刻转入新的最长合法链

新的交易信息不需要直接发送到所有节点。只要它被发送到了足够多的节点,这些信息很快就会被写入区块。这样的广播也能适应丢失消息的情况。如果一个节点没有接收到某个区块,在接收到下一个区块的时候它会发现自己少接收了一个

Incentive

按照惯例,区块内的第一笔交易是一笔铸币交易,给新区块的创造者发行了新的币。这样的设计能给节点更大动力来维持比特币网络的运行,并且提供了一种发行货币并流通的方式,这样不需要任何中央机构就能发行新的比特币了

交易费同样也是动力之一。如果一笔交易的输出小于输入,其差额就是支付给区块挖出者的交易费。只要一个预先确定的定量金额的比特币进入了市场,挖矿的动力就完全转换成了交易费,系统也就不会再有通胀了

Reclaiming Disk Space

只要一个币的最近一次交易被写入了足够多的区块,为了节约磁盘空间,在其之前的交易信息就可以被抛弃。为了尽量节约空间而不打破区块的哈希,交易将被以哈希形式存储在默克尔树上,只有根哈希被包含进了区块头的哈希。过去的区块能通过将除了根哈希外的所有分支都除去从而大大节约磁盘空间,因为这些分支上的哈希都没有存储的必要

一个不包含具体交易信息的区块头大约是80字节。我们假设每十分钟挖出一个区块,80 bytes * 6 * 24 * 365 = 4.2MB/year。2008年的计算机基本都有2GB的内存,并且摩尔定律预测现在的增长速度可能是1.2GB/year,因而就算区块头必须被放在内存中,也并没有存储问题

Simplified Payment Verification

不运行一个全节点也是可以验证交易合法性的。一个用户只需要通过询问网络中的其他节点来获得最长合法链的所有区块头,并且获得这个交易所在的默克尔树的区块及其路径。用户不能自己检查交易是否正确,但只要这个区块后接了足够多的区块,他就能确定整个网络承认了这个交易

实际上,只要诚实节点控制着网络,这样的验证就是可信赖的,但如果恶意节点掌控了整个网络,它就会变得很脆弱。网络上的节点可以自己验证交易合法性,但只要攻击者一直掌控着网络,上面这种简化的验证过程则很容易被攻击者所伪造的交易信息所欺骗。对抗攻击者的其中一个策略是从网络上其他节点中接收警报,这驱使用户的软件下载下全节点的信息以及危险的交易来确认警报。一些经常处理交易的公司可能会想运行自己的全节点来保证独立性和安全性,还能保证更快的验证

Combining and Splitting Value

尽管控制单个币的流动是可行的,但在交易中写明每个币的流向将会很累赘。为了让价值能够被拆分与合并,每笔交易都能包含多个输入与输出。一般情况下既可以让一笔大交易的输出成为当前交易的唯一输入,也可以让多笔小交易的输出成为当前交易的多个输入。最多只能有两个输出,一个用于支付,另一个用于返还,如果需要的话,返还给转出者

需要注意的是依赖于之前多笔交易的扇入过程并不麻烦,因为不需要将前向交易的完整信息复制到当前交易中来

Privacy

传统的银行模式通过限制人们获取其他人的信息来实现某种程度的隐私保护。由于比特币网络天然需要公开所有交易,因而这样的方法无法复用,但是隐私仍然可以通过打破信息在某个地方的流通来实现保护:保持公钥的匿名性。公众能看到某个节点给另一个节点转了帐,但不能将这笔交易联系到任何具体的人身上。这有点像股票交易的信息流通方式-每笔买入或卖出的时间与数额都是公开的,但不能得知是谁进行了这样的交易

除此之外,每笔交易都可以通过引入新的公私钥对来防止某些交易跟一个共同的拥有者相联系。在一些扇入交易中有些联系仍然是不可避免的,因为这会揭示这些输入的交易所在节点被同一个人所拥有。其中的风险在于如果某人与其公钥对应起来了,这样的联系会告诉我们其他的很多交易也是属于同一个拥有者的

Calculation

数学证明略。。。