比特币白皮书

原文链接:http://www.8btc.com/wiki/bitcoin-a-peer-to-peer-electronic-cash-system

github链接:https://github.com/GammaGao/bitcoinwhitepaper(但是很难打开)

简书讲解:https://www.jianshu.com/p/ca0c0a0e0faa

两个问题:去中心化的平p2p支付系统;支付要解决的双花问题

要解决双花问题就必须记账核对,那么如何在一个没有中心的p2p系统中记账又受到认同呢,比特币引入了基于时间戳的随机散列,并且让其形成前后文相关的序列,这就是为什么称之为区块链的原因。

这里必须插一句,我认为记账且不可更改是一个比特币的副产品,首先区块链记账不可更改是有前提的,这经常被称为51%攻击,根据原文摘要的这句话“除非重新完成全部的工作量证明,形成的交易记录将不可更改”,由于采用了复杂的POW工作量证明计算,更改交易记录将非常的耗时和需要大量运算,从客观上实现了“不可更改”的目的。

怎么说明某条交易记录是属于某个所有者?

原文
我们需要收款人有某种方法,能够确保之前的所有者没有对更早发生的交易实施签名。从逻辑上看,为了达到目的,实际上我们需要关注的只是于本交易之前发生的交易,而不需要关注这笔交易发生之后是否会有双重支付的尝试。为了确保某一次交易是不存在的,那么唯一的方法就是获悉之前发生过的所有交易。在造币厂模型里面,造币厂获悉所有的交易,并且决定了交易完成的先后顺序。如果想要在电子系统中排除第三方中介机构,那么交易信息就应当被公开宣布(publicly announced),我们需要整个系统内的所有参与者,都有唯一公认的历史交易序列。收款人需要确保在交易期间绝大多数的节点都认同该交易是首次出现。

注解:

我们需要收款人有某种方法,能够确保之前的所有者没有对更早发生的交易实施签名。从逻辑上看,为了达到目的,实际上我们需要关注的只是于本交易之前发生的交易,而不需要关注这笔交易发生之后是否会有双重支付的尝试。为了确保某一次交易是不存在的,那么唯一的方法就是获悉之前发生过的所有交易。在造币厂模型里面,造币厂获悉所有的交易,并且决定了交易完成的先后顺序。如果想要在电子系统中排除第三方中介机构,那么交易信息就应当被公开宣布(publicly announced),我们需要整个系统内的所有参与者,都有唯一公认的历史交易序列。收款人需要确保在交易期间绝大多数的节点都认同该交易是首次出

原文

时间戳服务器(Timestamp server) ——UTXO模型解决双花问题 :时间戳服务器+PoW
本解决方案首先提出一个“时间戳服务器”。时间戳服务器通过对以区块(block)形式存在的一组数据实施随机散列而加上时间戳,并将该随机散列进行广播,就像在新闻或世界性新闻组网络(Usenet)的发帖一样。显然,该时间戳能够证实特定数据必然于某特定时刻是的确存在的,因为只有在该时刻存在了才能获取相应的随机散列值。每个时间戳应当将前一个时间戳纳入其随机散列值中,每一个随后的时间戳都对之前的一个时间戳进行增强(reinforcing),这样就形成了一个链条(Chain)。

注解

那么如何获得一个去中心化的时间呢,我也是后来才搞清楚的,其实方法很简单,还是利用“多数人的正义”,时间来自于连接的其他节点(node)时间的中位数(mean,是个数学概念,比平均值更不受极端数字影响),要求连接的节点(node)数量至少为5,中位数和本地系统时间差别不超过70分钟,否则会提醒你更新本机的时间。同时,在接收到新的block时会拒绝时间与自己差距+2小时和-(前11个block时间中位数)的block

比特币区块链每10分钟出块一次,10分钟有一个节点记账一次,这个记账的节点是怎么获取这 10分钟内的所有的交易呢?或者说这个节点可以记录10分钟内的所有交易吗?

原文

运行该网络的步骤如下:
1)新的交易向全网进行广播;
2)每一个节点都将收到的交易信息纳入一个区块中;
3)每个节点都尝试在自己的区块中找到一个具有足够难度的工作量证明;
4)当一个节点找到了一个工作量证明,它就向全网进行广播;
5)当且仅当包含在该区块中的所有交易都是有效的且之前未存在过的,其他节点才认同该区块的有效性;
6)其他节点表示他们接受该区块,而表示接受的方法,则是在跟随该区块的末尾,制造新的区块以延长该链条,而将被接受区块的随机散列值视为先于新区快的随机散列值。

节点始终都将最长的链条视为正确的链条,并持续工作和延长它。如果有两个节点同时广播不同版本的新区块,那么其他节点在接收到该区块的时间上将存在先后差别。当此情形,他们将在率先收到的区块基础上进行工作,但也会保留另外一个链条,以防后者变成最长的链条。该僵局(tie)的打破要等到下一个工作量证明被发现,而其中的一条链条被证实为是较长的一条,那么在另一条分支链条上工作的节点将转换阵营,开始在较长的链条上工作。所谓“新的交易要广播”,实际上不需要抵达全部的节点。只要交易信息能够抵达足够多的节点,那么他们将很快被整合进一个区块中。而区块的广播对被丢弃的信息是具有容错能力的。如果一个节点没有收到某特定区块,那么该节点将会发现自己缺失了某个区块,也就可以提出自己下载该区块的请求

注解

网络广播交易并没有要求节点收录所有的交易信息。一笔交易在全网广播并不要求到达所有的节点,交易是怎么公平地相等的到达所有节点,交易到达节点有没有选择性?

本节需要注意的是,白皮书里面没有具体说明交易是如何向全网进行广播的,根据找到的资料比特币使用了类似DHT网络的P2P网络协议进行无中心化的网络连接,这种协议在比特币出现前已经被广泛使用,Kad,eMule、BT等都使用了类似的协议,这可能是中本聪觉得这不是比特币主要特点,没有在白皮书里阐述的原因吧(p2p网络可以参考文后的其他文章)

比特节点通常采用TCP协议、使用8333端口(该端口号通常是比特币所使用的,除8333端口外也可以指定使用其他端口)与已知的对等节点建立连接。你可以理解为有一种机制可以让所有运行比特币代码的节点收到交易广播,而我们需要关心的是,收到交易后要做的事情,这里面有很多问题要解决。

首先,“每一个节点都将收到的交易信息纳入一个区块中”,这句话要明白,这些交易都是加密的,前文有说过,节点是无法更改交易内容的,这就保证了所有人收到的数据是一致的。

第二个问题是,那么谁有权利记录这个数据呢,准确的说是一组时序相关的交易数据,这就用到了上一篇说的POW工作量证明,这就是文中的“每个节点都尝试在自己的区块中找到一个具有足够难度的工作量证明”,只有“运气”足够好的节点找到那个包含多个0的HASH值得节点可以生成这个区块(矿工就是干这事),然后就可以把这个区块广播出去了。

问题又来了,万一有两个节点“同时”运气不错,都找到了呢,从时间原理上来说,是不可能存在“同时”的,总有先后顺序,哪怕是毫秒级的差距或者是网络广播造成的延时,这是个哲学问题”你不可能同时踏进两条相同的河流“,一旦有节点收到了这个区块的广播,那么节点就会进行验证“当且仅当包含在该区块中的所有交易都是有效的且之前未存在过的,其他节点才认同该区块的有效性”;验证通过后,这个节点就不会再接受别的节点的同样区块了,需要注意的是,同时这个节点会终止自己正在进行的包含同样交易的区块计算,也就说不会在进行无用功了,这些节点就会在这个区块基础上启动新的交易区块计算,如此往复,形成链条。

那么问题又又来了,因为网络的复杂性,在同时总有一组节点互相收到交易区块,记录了同样的链条呢,其实原理很简单,这些同样的链条都会被保留下来(分叉),“该僵局的打破要等到下一个工作量证明被发现”,通过一段时间的运行,总有一条区块链条是时序上最长的(还记得前面说过的时序相关吗),那么到最后长的那条就是最终被认可的链条,比特币的区块链条就是在不停的分叉、抛弃、又分叉、又合并的过程中,最终最长的那条才是系统认可的区块链。多么象贪吃蛇游戏啊,看谁最后最长。

其实问题又又又来了,如果有一大批节点(比如矿池),就是要和别人不一样,修改了代码,就是要创造一个他们自己的最长的链条呢,这就是比特币的里面的"51%攻击"

51%攻击是理论上的值,而本人认为,不需要控制51%的算力,除非剩下的49%保持绝对的正义,只要作恶的节点大于正义节点就可以,也就是说,在一个假定的环境,大家组团作恶形成作恶集团,其中一个集团控制的算力最多即可,比如 A集团控制30%,B集团控制25%,C集团控制25%,正义控制20%,那么最终A集团会获胜,这完全是从技术理论出发,一旦形成这种局面,其实就是硬分叉,整个体系会分裂,形成ABC三种新币,那么根据经济学理论,最后整体价值下降对谁都没有好处。之所以说这些是让初学者明白51%攻击是理论值。

原文
我们约定如此:每个区块的第一笔交易进行特殊化处理,该交易产生一枚由该区块创造者拥有的新的电子货币。这样就增加了节点支持该网络的激励,并在没有中央集权机构发行货币的情况下,提供了一种将电子货币分配到流通领域的一种方法。这种将一定数量新货币持续增添到货币系统中的方法,非常类似于耗费资源去挖掘金矿并将黄金注入到流通领域。此时,CPU的时间和电力消耗就是消耗的资源。另外一个激励的来源则是交易费(transaction fees)。如果某笔交易的输出值小于输入值,那么差额就是交易费,该交易费将被增加到该区块的激励中。只要既定数量的电子货币已经进入流通,那么激励机制就可以逐渐转换为完全依靠交易费,那么本货币系统就能够免于通货膨胀。激励系统也有助于鼓励节点保持诚实。如果有一个贪婪的攻击者能够调集比所有诚实节点加起来还要多的CPU计算力,那么他就面临一个选择:要么将其用于诚实工作产生新的电子货币,或者将其用于进行二次支付攻击。那么他就会发现,按照规则行事、诚实工作是更有利可图的。因为该等规则使得他能够拥有更多的电子货币,而不是破坏这个系统使得其自身财富的有效性受损。

注解

说以上这些的目的,就是为了告诉您,经过以前积累的经验和探索,不要试图去建立一个没有激励机制的去中心化系统,这已经被证明是行不通的。要维持一个p2p系统的运作,必须要有足够多的节点参与,且这种参与是持久性的而非激情,激励机制可以形成一种纽带关系,而最好的激励机制莫过于直接的经济利益了,以利益纽带维持的系统是最牢固的;纵观大多p2p系统的发展,大部分都是以激情开始以疲劳结束,中本聪肯定看到了这一点,他希望的是”以激情开始,以利益维持“。事实上他的设计做到了,所谓以激情开始,就是系统刚开始运行时,需要在小范围内传播,依靠爱好者或激情兴趣者运行,逐步的通过利益激励传播到更多参与者中,最后形成一种规则共识,保障所有参与人的权利和利益。

原文中”每个区块的第一笔交易进行特殊化处理,该交易产生一枚由该区块创造者拥有的新的电子货币“,这个设计非常的重要,这个设计其实是阐述了如何开始这个激励,从前面几篇文章我们已经知道比特币系统实际上是一个非常依赖CPU算力的系统,需要大量的运算进行POW和交易确认,激励机制的设计最重要的就是要维持系统核心需求,BT下载需要的是带宽和存储,所以PT的激励机制和带宽相关,而比特币需要的是计算,所以自然的就必须要把计算和激励挂钩,这就是为什么比特系统算力越大获得的收益越多的原因。

白皮书另一个说明的就是”交易费“制度,有了前面的分析你也就知道了为什么有这个设计了,原因就是交易的确认也需要足够多的节点参与和运算,如果你设计的系统交易时不依靠大量运算那么你大可不必设计”交易费“激励制度了。

白皮书中”那么激励机制就可以逐渐转换为完全依靠交易费,那么本货币系统就能够免于通货膨胀“,我认为是存在风险的。比特币的发行是总量控制的,这种设计的目的是为了防止货币的通胀不假,但是有一个风险需要注意,这需要有矿机的同学进行一下计算,一旦比特币进入后期,需要单位挖矿的电力成本超过比特币价值时矿场就无法通过挖矿盈利,结果就是矿场只能靠交易盈利,但是如果比特币不能有有效的大规模商业应用,会出现一个问题,就是没有足够的交易量维持计算所需的“交易费”,计算节点就会萎缩,导致交易时间过长,只能不断提升“交易费”,最终导致整个系统崩盘,这绝对不是危言耸听,所以目前比特币进行的闪电网络包括BU分叉都是为了解决这个问题,越到后期越要注意交易成本和确认效率。

最后介绍原文中的“激励系统也有助于鼓励节点保持诚实”,我觉得比较牵强,我读到这里是也是反复思考和假设的,如果作恶者认同比特币的价值这个设计是合理的,但是通过如果攻击者或做恶者拥有绝对多数算力,他可以创造新的规则(新的货币种类),而不是维持原有的比特币,如果新的规则获利更大,那么这个激励机制是无法保证算力绝对优势节点的诚实的,否则目前国际上对于比特币算力过于集中于中国矿池产生的担心也不是空穴来风的了。

 

 

阅读更多

更多精彩内容