×

***(大鱼)精读比特币白皮书系列(1-6)

96
大圣2017
2017.04.14 14:24* 字数 17023

大纲

2017-08-25 知乎 https://zhuanlan.zhihu.com/p/28786301 大鱼原创系列——

2017-03-29 精读比特币白皮书1(从零开始学区块链 125)
2017-03-30 精读比特币白皮书2:中本聪确实聪明
2017-03-31 精读比特币白皮书3:最宝贵的果然是时间
2017-04-05 精读比特币白皮书4:一切都是从成本出发
2017-04-06 精读比特币白皮书5:Long长Long长,杀伤力强
2017-04-07 精读比特币白皮书6:利益的纽带,比特币激励机制
2017-04-10 Bigfish 你真的了解中位数吗(从零开始学区块链 126)
2017-03-27 InfoQ 比特币的POW机制详解(从零开始学区块链 123)
2017-05-10 BitWiki 关于比特币POW难度调节机制(从零开始学区块链 145)

精读比特币白皮书1

作者按:相信很多人和我一样都读过比特币的白皮书,而且刚开始看的时候也是云里雾里的,我一直想通过我了解的一些知识,对比特币白皮书做一个注解,帮助想学习区块链的朋友有一个比较平滑的学习曲线,如果您对于比特币原理非常清楚,那么这个专题不适合您,本专题主要写给想入门区块链的人。

本专题主要通过仔细分析中本聪的白皮书,并附带我的理解,让您快速入门,框内黑色的字体是白皮书原文翻译,橙色的注解段落是我的理解,希望能帮到你,我一直认为每个学习区块链的人都应该仔细看比特币白皮书,我们从摘要开始:

[摘要]:本文提出了一种完全通过点对点技术实现的电子现金系统,它使得在线支付能够直接由一方发起并支付给另外一方,中间不需要通过任何的金融机构。虽然数字签名(Digital signatures)部分解决了这个问题,但是如果仍然需要第三方的支持才能防止双重支付(double-spending)的话,那么这种系统也就失去了存在的价值。我们在此提出一种解决方案,使现金系统在点对点的环境下运行,并防止双重支付问题。该网络通过随机散列(hashing)对全部交易加上时间戳(timestamps),将它们合并入一个不断延伸的基于随机散列的工作量证明(proof-of-work)的链条作为交易记录,除非重新完成全部的工作量证明,形成的交易记录将不可更改。最长的链条不仅将作为被观察到的事件序列(sequence)的证明,而且被看做是来自CPU计算能力最大的池(pool)。只要大多数的CPU计算能力都没有打算合作起来对全网进行攻击,那么诚实的节点将会生成最长的、超过攻击者的链条。这个系统本身需要的基础设施非常少。信息尽最大努力在全网传播即可,节点(nodes)可以随时离开和重新加入网络,并将最长的工作量证明链条作为在该节点离线期间发生的交易的证明。

大鱼注解

任何一篇白皮书或论文摘要部分都非常重要,其实摘要最重要的是告诉潜在读者,我发现了什么问题,并且通过什么办法解决这些问题,且说明了解决这个问题的主要方式和优势。我看过一些白皮书,基本上摘要部分连问题都没有抛出,就开始介绍自己的东西,这是不恰当的(顺便普及如何写白皮书

其实你只要仔细看了比特币白皮书摘要部分就知道中本聪抛出的问题了,“一个需要第三方支持的点对点电子现金支付系统是没有价值的”这容易和传统上的p2p形成误解,很多p2p系统其实是需要一个第三方支持的,比如有些p2p系统需要一个或多个索引服务器,迅雷下载就是比较典型的,他需要一个中心化的服务器帮助点对点建立连接,所以我们要搞清楚p2p与去中心化的p2p,知道了这些,比特币以及其他竞争币就可以一句话进行概括了,“一个去中心化的p2p支付系统”,既然是支付系统就当然要解决双花问题,这和是否是去中心化没有关系,只是中心化的系统更容易解决双花问题而已。

那么通过摘要我们就知道了,比特币系统要解决的两个主要问题,一个是去中心化的p2p系统,一个是支付要解决的双花问题,所以整个白皮书提到的技术方案都是围绕这两个问题展开的,其实中本聪在写这篇论文时,有关去中心化的p2p系统已经有比较完善的解决方案了,所以白皮书的重点都放在如何通过p2p系统解决双花问题。

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

这里必须插一句,我认为记账且不可更改是一个比特币的副产品,首先区块链记账不可更改是有前提的,这经常被称为51%攻击,根据原文摘要的这句话“除非重新完成全部的工作量证明,形成的交易记录将不可更改”,由于采用了复杂的POW工作量证明计算,更改交易记录将非常的耗时和需要大量运算,从客观上实现了“不可更改”的目的,但是从业务设计的角度,这是一个缺陷,如果更改是交易双方认同的而且合法的,或者说被绝大多数节点认同的呢?由于技术的限制比特币系统进行了取舍,所以不得不保留了这个缺陷(参见CAP原则),同时在白皮书中把这个缺陷讲成了一个特点,这是中本聪先生非常聪明的地方。

其实比特币后来的一些事实证明,比特币的滥用也是因为这个缺陷,基于暗网的非法交易,网络勒索,包括黑客盗用比特币,“门头沟”交易所跑路等,都是利用了这个缺陷,其实根据“多数人正义“这点来讲,这些交易都应该撤销,但是这个要回滚交易的代价实在太大,大到不可实现(需要分叉),看到这里你就知道比特币系统不是你想象中那么完美了吧

摘要中还透露一个比特币系统的重要特点“这个系统本身需要的基础设施非常少”,因为没有了中心化的服务器存在,相关的维护、备份、容灾、管理等成本会大大降低,这都是在比特币白皮书中需要仔细关注的,关于具体的技术解决方案,我们慢慢往下看:

  1. 简介
    互联网上的贸易,几乎都需要借助金融机构作为可资信赖的第三方来处理电子支付信息。虽然这类系统在绝大多数情况下都运作良好,但是这类系统仍然内生性地受制于“基于信用的模式”(trust based model)的弱点。我们无法实现完全不可逆的交易,因为金融机构总是不可避免地会出面协调争端。而金融中介的存在,也会增加交易的成本,并且限制了实际可行的最小交易规模,也限制了日常的小额支付交易。并且潜在的损失还在于,很多商品和服务本身是无法退货的,如果缺乏不可逆的支付手段,互联网的贸易就大大受限。因为有潜在的退款的可能,就需要交易双方拥有信任。而商家也必须提防自己的客户,因此会向客户索取完全不必要的个人信息。而实际的商业行为中,一定比例的欺诈性客户也被认为是不可避免的,相关损失视作销售费用处理。而在使用物理现金的情况下,这些销售费用和支付问题上的不确定性却是可以避免的,因为此时没有第三方信用中介的存在。
    所以,我们非常需要这样一种电子支付系统,它基于密码学原理而不基于信用,使得任何达成一致的双方,能够直接进行支付,从而不需要第三方中介的参与。杜绝回滚(reverse)支付交易的可能,这就可以保护特定的卖家免于欺诈;而对于想要保护买家的人来说,在此环境下设立通常的第三方担保机制也可谓轻松加愉快。在这篇论文中,我们(we)将提出一种通过点对点分布式的时间戳服务器来生成依照时间前后排列并加以记录的电子交易证明,从而解决双重支付问题。只要诚实的节点所控制的计算能力的总和,大于有合作关系的(cooperating)攻击者的计算能力的总和,该系统就是安全的。

大鱼注解

我是这样看待简介的,中本聪很清楚比特币系统因为妥协所造成的缺陷,就是刚才说的不可更改,所以在简介中就阐述了可更改的弱点,这也是我认为最有争议的地方,“如果缺乏不可逆的支付手段,互联网的贸易就大大受限”这点有些牵强。

但是,简介中说明的通过数学,通过密码原理代替中心化中介信用(金融机构)使交易达成却是革命性的,这也是比特币最有研究价值的地方,这里面需要注意的是比特币系统代替的是中心化中介的信用,并不能保证交易双方的信用,相反一旦交易的某一方出现信用问题这笔交易是无法撤销的,对于初次接触比特币的人一定要尤为注意,也就是说和传统银行交易不同,一旦你确定支付,哪怕对方是骗了你,你的交易损失是无法追回的。这里面又一个悖论,你是信任中心化中介的信用还是信任你的交易对方的信用,这就要仁者见仁了,如果你选择后者那么比特币系统是你的好选择,如果你选择前者,那么传统的中心化支付是你的选择。

总之,白皮书第一节传达给我们的就是,你需要一个去中心化中介,并且主要保护卖家的系统,如果你需要保护买家,你任然需要一个第三方担保机制,"而对于想要保护买家的人来说,在此环境下设立通常的第三方担保机制也可谓轻松加愉快"

而对于系统的安全性完全通过攻击算力成本保障,这是一种算力的比拼,你可以简单的理解为,正常的算力是大于想作恶的算力这个前提的。了解了这一点,你就会知道如何选择合适的数字货币,避免山寨币陷阱了。

后记

写到这里我觉得有些话过于科普了,这些东西我觉得非常简单,这算是个小尝试吧,我并不知道我的读者是否需要这样一个系列专题,我需要你们的反馈以决定是否需要将这个专题继续,请给我留言。


精读比特币白皮书2:中本聪确实聪明

我们继续尝试用最简单的语言来注解比特币白皮书,今天开始涉及的专业知识就会比较多,我会努力用易懂的语言来解释,本文不适合对比特币原理熟悉的同学。

本专题主要通过仔细分析中本聪的白皮书,并附带我的理解,让您快速入门,框内黑色的字体是白皮书原文翻译,橙色的注解段落是我的理解,希望能帮到你,我一直认为每个学习区块链的人都应该仔细看比特币白皮书,这是第二期,开始讲交易:

  1. 交易(Transactions)

    我们定义,一枚电子货币(an electronic coin)是这样的一串数字签名:每一位所有者通过对前一次交易和下一位拥有者的公钥(Public key) 签署一个随机散列的数字签名,并将这个签名附加在这枚电子货币的末尾,电子货币就发送给了下一位所有者。而收款人通过对签名进行检验,就能够验证该链条的所有者。

大鱼注解

白皮书的这张图非常重要(翻译有很多错误建议看下面的原图),它说明了比特币的交易记录方式,是一个基于时间序列的链式结构,如果说是链式结构可能有人理解起来有困难,你可以把每笔交易想象成一条记录,这条记录记录了付款人和收款人以及交易数据等重要信息,如果您有数据库基础,那么这每条记录是非常容易理解的,如果没有数据库技术,你可以想象成为是纸上记录的条目,比如“王二麻付给大鱼2块钱”

有意思的来了,我们还是用简单语言来举例,如果是数据库或者纸上的记录,那么很容易更改,所以必须用加密的方法保障这条记录不被更改,于是比特币系统采用不对称加密算法对这条记录进行加密,不对称加密算法有个特点,公钥(public key)可以公布出去让所有人知道,这也就是常说是比特币钱包地址(当然比特币钱包地址会对公钥重新编码不影响实质),那么“王二麻付给大鱼2块钱”这条记录就是王二麻同学用大鱼的公钥进行了加密,其内容只有大鱼用私钥才能解开,换言之也就是大鱼拥有了这条“记录”

那么如何证明这条记录是王二麻创建的呢,这里面稍微有点绕,因为王二麻在创建这条记录的时候通过自己的私钥对这条记录进行了签名(一串HASH数据),同时又在交易末尾公布了自己的公钥,如果你熟悉不对称加密算法就知道,通过王二麻的公钥进行计算,如果得到的值和签名一样,你就知道这是王二麻用自己的私钥创建的数据了,因为别人是不知道王二麻的私钥的

原文中“我们定义,一枚电子货币(an electronic coin)是这样的一串数字签名”,很容易让人误解的是这里的电子货币是个具体数字,其实它是一条加密的记录(数据),也就是说你拥有的交易记录才是你的数字资产,这里面你需要注意的是,这条记录里面没有你的姓名、身份证号等这些中心化系统中常见的识别所有者的字段,唯一表示你身份的是你的公钥(钱包),证明你所有权的是你的私钥(密码)

要注意图中的那个“随机数列,下面的所有者公钥”,这是个翻译错误,估计害了不少人,原文是HASH,用来产生所有者的签名,这是英文版原图:

英文版原图

当你拥有支付一条记录时,你就拥有了一定数量的所谓比特币,这时候你就可以创建一条新的记录把它花出去,那么会重复图中的过程,你需要用别人的公钥创建一条新的新的记录,这里需要注意的是,这条新的记录里面包含了你从别人那里收到这条记录的信息(图中的签名过程其实为了证明你确实拥有过这条记录,这是不对称加密算法的特点,公钥可以加密数据或验证数据,私钥可以解密数据或对数据签名),如此循环往复形成了一个交易链条。

通过公开公钥就可以知道这条记录的来路,直至最终到最初的所有者(很多改良的数字货币为了强调匿名交易和不可追踪,修改了交易结构,让这个过程无法进行),这就是我们说的上下文相关,如果你要篡改记录是很困难的,你需要修改所有这个链条上的交易,而且这些交易记录都是加密的,且在数字加密上是循环相关的。

那么第一笔交易如何来的呢,这就是我们说的“挖矿”这是对矿工进行POW工作量证明的奖励,简单讲就是不停的进行HASH计算碰运气了,得到最原始的“随机数列”,这个以前有文章说过

下面我们继续看原文提出的问题:

该过程的问题在于,收款人将难以检验,之前的某位所有者,是否对这枚电子货币进行了双重支付。通常的解决方案,就是引入信得过的第三方权威,或者类似于造币厂(mint)的机构,来对每一笔交易进行检验,以防止双重支付。在每一笔交易结束后,这枚电子货币就要被造币厂回收,而造币厂将发行一枚新的电子货币;而只有造币厂直接发行的电子货币,才算作有效,这样就能够防止双重支付。可是该解决方案的问题在于,整个货币系统的命运完全依赖于运作造币厂的公司,因为每一笔交易都要经过该造币厂的确认,而该造币厂就好比是一家银行。

大鱼注解

这一段话里面最重要的是提出了关于双重支付(双花)的问题,我们前面说过,根据这个交易链条,我们可以知道之前的每位所有者,但是有一个东西是不知道的,那就是某位记录的拥有者是否同时创建了两条或多条新的记录,将他的比特币花出去,如果没有一个机制来保证一切都会乱套。

“通常的解决方案,就是引入信得过的第三方权威,或者类似于造币厂(mint)的机构,来对每一笔交易进行检验”中本聪在白皮书指出了传统的两种方法,并且说明了他们的坏处。

第三方权威验证就是典型的中心化系统,这个和设计初衷违背pass掉了。

造币厂模型其实也是中心化的系统,中本聪也将其pass掉了,但是中本聪创造了交易公布模型,即人人都可以参与验证是否双花的过程,在比特币系统中存在功能不同的节点,如果你参与到交易的验证过程中那么你也就是一名“矿工”了,通过矿工模型你不但可以挖到新的比特币,也可以参与验证计算获得奖励,这就是为什么比特币交易过程中你需要花费手续费的原因了,下面我们接着看中本聪提出的如何解决造币厂中心化问题:

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

大鱼注解

这段话里面最需要理解是这句“从逻辑上看,为了达到目的,实际上我们需要关注的只是于本交易之前发生的交易”,前文我们知道比特币的交易是一个时间序列的链条,在产生一条新的交易记录时永远有先后顺序,即便是双花你总有先后顺序,你不可能同时创造两笔交易,那么我们只需要证明其中一条是有效的即可,并且将其记录到交易链条上即可,那么其他的交易就是无效的了(这也就是比特币的交易确认原理,交易确认是需要时间的),多么聪明的原理啊,中本聪确实聪明。

要证明其中一条是有效的又不允许中心化从存在,那么只有一个办法了,就是发动所有的人参与这项活动,进行“多数人的正义”,所以原文中“那么交易信息就应当被公开宣布(publicly announced)”这句话就容易理解了,如果你不公布交易信息,其他人怎么进行交易验证呢。

比特币就是在交易创建时将信息公布出去,如果有多数人优先确认并将其记录下来,这个过程就完成了,举个简单地例子,比如5个人在一起同时用纸记录一个交易,现在有人说“王二麻给大鱼2块钱”,这里面有三个人都同意这件事并将其记录下来,并把记录的纸复印5份,人手一份,那么他们就有唯一受到认可的记录了,也不知道这个比喻是否恰当。

我发现要用通俗的语言讲清楚一件事情还是挺难的,今天就到这里吧,很累了。


精读比特币白皮书3:最宝贵的果然是时间

继续用简单的语言精读比特币白皮书,今天带来第3期,本节白皮书虽然非常短,但是很重要,其中关于时间戳理解需要仔细品味,本专题不适合熟悉比特币原理的同学。

本专题主要通过仔细分析中本聪的白皮书,并附带我的理解,让您快速入门,框内黑色的字体是白皮书原文翻译,橙色的注解段落是我的理解,希望能帮到你,我一直认为每个学习区块链的人都应该仔细看比特币白皮书,这是第三期,开始讲时间序列:

比较高兴的是本节白皮书非常短,但比较让人生畏的是,当初我在这里陷进去了,有几个原理一直到很久以后才搞清楚,下面看原文:

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



    为了消除翻译问题也附上原图:


大鱼注解

我当初看到这里的时候就懵了,“时间戳服务器!!”,不是说比特币系统是去中心化的吗,为什么会有服务器这种中心化的概念存在?

时间戳很容易理解,以前有文章说明(参考文末延伸阅读),原文中说“时间戳服务器通过对以区块(block)形式存在的一组数据实施随机散列而加上时间戳”,加上时间戳容易,但是如何取得时间呢,如果是加上本机时间,那么每个节点的时间都不统一,况且有人恶意更改本机时间呢。

如果不是本机时间,去网络上取国际标准组织的时间似乎是可行的,但是,这是典型的中心化操作啊,和中本聪倡导的去中心化理念不符。

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

由此我们知道了这个时间的正确来源了,还是利用大多数人的机器时间,其实比特币的核心理念一直是认为“多数人是正义”的,我一直在想如果从一开始比特币的系统时间就比实际时间快1年的话,其实对整个系统是没有影响的,原因很简单后加入的节点都会按照前面多数人的时间中位数更改自己的节点时间,最后成为比特币系统自有的时间模式(如果大多数人都光着屁股跑,穿衣服的可能就不正常了,呵呵),好在比特币系统运行刚开始,时间还是比较准确的,不过我一直认为这个时间机制有漏洞可以钻。

详细的了解要看以下的比特币源码了
https://github.com/bitcoin/bitcoin/blob/master/src/util.cpp#L1325
https://github.com/bitcoin/bitcoin/blob/285cf7a1a6cb660b57cbc75f63e49736b51d705e/src/main.cpp#L2056
https://github.com/bitcoin/bitcoin/blob/285cf7a1a6cb660b57cbc75f63e49736b51d705e/src/main.cpp#L2129

了解比特币时间戳的机制后,后面的就容易理解了,将一段时间内,准确的说是,两个区块的产生间隔中的所有交易进行Hash运算,再盖上时间戳,这样我们就有了一个按时间序列产生的所有交易的记录了,区块链就这样形成了。

因为时间是线性增长的,所以区块链是按照时间先后顺序组织起来的,所以核心代码中关于时间的机制异常重要,我认为这是安全上比较脆弱的环节。

ok,今天的白皮书段落比较短,我也可以早点休息了。


精读比特币白皮书4:一切都是从成本出发

继续用简单的语言精读比特币白皮书,今天带来第4期,本节白皮书内容主要是工作量证明,以前发过很多这方面的文章,本篇用简单的语言来解释,本专题不适合熟悉比特币原理的同学。

本专题主要通过仔细分析中本聪的白皮书,并附带我的理解,让您快速入门,框内黑色的字体是白皮书原文翻译,橙色的注解段落是我的理解,希望能帮到你,我一直认为每个学习区块链的人都应该仔细看比特币白皮书,这是第四期,开始讲工作量证明:

由于POW工作量证明的文章很多,本不想写,但是考虑到完整性和延续性,还是用简单的语言来注解下,我会用不同于以前文章的语言来注解,尽量让没有基础的同学看懂,另外中译本的白皮书图片部分有很多错误,从今天开始全部使用英文版原图,下面来看看这一节的第一部分原文:

4、工作量证明(Proof-of-Work)
为了在点对点的基础上构建一组分散化的时间戳服务器,仅仅像报纸或世界性新闻网络组一样工作是不够的,我们还需要一个类似于亚当•柏克(Adam Back)提出的哈希现金(Hashcash)。在进行随机散列运算时,工作量证明机制引入了对某一个特定值的扫描工作,比方说SHA-256下,随机散列值以一个或多个0开始。那么随着0的数目的上升,找到这个解所需要的工作量将呈指数增长,但是检验结果仅需要一次随机散列运算。我们在区块中补增一个随机数(Nonce),这个随机数要使得该给定区块的随机散列值出现了所需的那么多个0。我们通过反复尝试来找到这个随机数,找到为止。这样我们就构建了一个工作量证明机制。只要该CPU 耗费的工作量能够满足该工作量证明机制,那么除非重新完成相当的工作量,该区块的信息就不可更改。由于之后的区块是链接在该区块之后的,所以想要更改该区块中的信息,就还需要重新完成之后所有区块的全部工作量。

注解

在第三讲我们知道了比特币的时间戳机制,可能还是有人有疑虑,虽然比特币取多个节点和前几个区块的中位数时间作为标准,但是还有一个问题就是,如果有人恶意更改时间,同时修改比特币源码造跳过时间检测机制怎么办或者恶意构造交易(图中的Tx)实现双花,这就需要一个机制来保证

这个机制就是POW工作量证明,简单讲就是提升作恶的成本,当然这样也让正常的操作要付出更多的计算成本,初学者大可不必去了解哈希现金原理,这里我来举个更简单的例子,我们经常会在论坛发现各种机器灌水帖子,只需要启动程序就可以简单实现对于正常内容的干扰(可以视为攻击),这些东西干扰了我们的正常阅读,一般论坛会引入人机识别机制,就是常见的图片验证码,包括12306使用的更复杂图片验证码,这些验证码你可以想象成是一种提升作恶成本的机制,所不同的是人识别这些东西会很快,而机器是识别需要更复杂的算法或者在某些领域这些机器识别技术还无法完成,这就完成了“真人证明”,这个机制的后果就是,恶意发帖的人,说能发帖的频率和真人一样了,那么在一个大多数人正常的论坛,干扰信息就是少数,保证了正常信息的发布。

比特币的POW证明思路一样,需要一种机制来保证正常节点和恶意节点付出一样的成本来生成区块,而不同于“真人证明”的是,我们面对的都是运行的程序,这就牵涉到如何保证正常的程序和恶意程序付出一样的多的成本,程序的复制和传输不需要太多的成本,要让程序运行最大成本就是硬件(CPU、内存)和消耗(电力),所以比特币引入SHA256算法(你可以不用了解原理),你只需要知道进行SHA256运算需要消耗大量的CPU时间和电力,这不像进行加法运算那样在一瞬间就可以完成

POW利用了信息安全的另一个特点,就是安全和成本相关性,这是我以前文章一再强调的,这个世界没有绝对安全一说。安全有三个延伸层面可管理、可察觉、攻击成本,比特币的系统利用了其中两个可管理与攻击成本,通过原文“随机散列值以一个或多个0开始。那么随着0的数目的上升,找到这个解所需要的工作量将呈指数增长”实现可以管理,通过SHA256碰运气实现攻击成本提升,所以比特币并不关注可察觉性,你可以作恶但这不重要,因为没有人会花100块钱去获取1块钱,这属于经济学原理

可能有人会问,如果大多数人都作恶呢,我可以举个例子,比如骗子的存在是为了骗好人的钱,假设每个骗子需要花1块钱去骗好人1块钱,需要5个骗子才能达成骗1个好人,那么每次每个骗子需要花1块钱去获得0.2元钱,这样的系统有意义吗。

说个题外话我以前看过一篇生物学文章,讲的是在进化过程中其实是存在一种可以无限分裂的长寿细胞,也就是说存在过一种长生不老的生物,为什么这种生物不存在了呢,是因为老的生物永远不死,挤压了新生代的生存空间,同时没有变异最后被自然界淘汰,而现存的癌细胞是典型的可以无限分裂的细胞遗留,结果是癌细胞无限分裂最后导致个体死亡,癌细胞也就over了

这和比特币系统多么类似啊,如果一个51%攻击达成,攻击者会达成目的,但是整个系统的价值会崩溃掉,那么攻击中获取的比特币也没有任何意义了,攻击者付出的大量硬件投资和电费就没有意义了,所以发动51%攻击的人要考虑的是,是否要把自己变成癌细胞最后导致系统死亡

我花了大篇幅讲POW意义就是告知初学者这个攻击成本原理和攻击结果的经济学原理,理解了原理后其实技术很容易学习,有很多介绍pow的技术文章可以去看,篇幅原因这里就不在复述了(请看文后的延伸阅读)

下面继续看我认为白皮书中值得思考的部分:

同时,该工作量证明机制还解决了在集体投票表决时,谁是大多数的问题。如果决定大多数的方式是基于IP地址的,一IP地址一票,那么如果有人拥有分配大量IP地址的权力,则该机制就被破坏了。而工作量证明机制的本质则是一CPU一票。“大多数”的决定表达为最长的链,因为最长的链包含了最大的工作量。如果大多数的CPU为诚实的节点控制,那么诚实的链条将以最快的速度延长,并超越其他的竞争链条。如果想要对业已出现的区块进行修改,攻击者必须重新完成该区块的工作量外加该区块之后所有区块的工作量,并最终赶上和超越诚实节点的工作量。我们将在后文证明,设想一个较慢的攻击者试图赶上随后的区块,那么其成功概率将呈指数化递减

另一个问题是,硬件的运算速度在高速增长,且节点参与网络的程度会有所起伏。为了解决这个问题,工作量证明的难度(the proof-of-work difficulty)将采用移动平均目标的方法来确定,即令难度指向令每小时生成区块的速度为某一预设的平均数。如果区块生成的速度过快,那么难度就会提高。

大鱼注解

本节阐述了为什么不使用基于IP地址的投票权问题(IP地址共识机制),原因很简单因为IP地址分配是一个中心化问题(IP地址的分配受ICP控制,政府组织可以很轻易回收和控制这些ip地址资源),可以看出中本聪设计的一切都在为去中心化考虑,包括很多细节。

其实基于CPU也是有缺陷的,但在当时来看中本聪的设计还是非常完美的,毕竟中本聪不是神,比特币诞生后的大量竞争币也是着重改良了POW机制包括引入POS机制力求完善数字货币,到目前为止,我认为前期POW机制+后期POS机制是一个比较好的选择(个人观点),可以有效避免算力集中实现藏富于民;这也是为什么现在比特币BU的争议需要争取获得大量矿场的支持,而普通比特币用户基本上属于吃瓜群众的原因了,等什么时候一个数字货币需要听取每一个用户的声音时,那么DAC就真的实现了。

本节白皮书传达的另一个重要信息时,根据比特币“大多数人正义”的设计,比特币区块链只认可最长的那条链(交易记录),因为这是一开始正义的人构造的,后来者需要付出指数级的成本才能更改,验证了POW的有效性

另外白皮书中“另一个问题是,硬件的运算速度在高速增长,且节点参与网络的程度会有所起伏”需要了解,也就是说中本聪在设计的时候考虑今后几年硬件摩尔定律的增长,可能到某一天具有海量运算能力的硬件会非常便宜,以前需要计算一天的工作量可能1秒就完成;中本聪的解决方案非常巧妙,算力的增长会让区块生成的数据加快,那么我们就要让区块的增长和计算难度相关,通过前一节的“碰撞SHA算法的0”来实现,越到后来你需要找到的连续0的数量就越多,根据SHA算法原理,你需要消耗的计算能力也是成指数增长的,这样就抵消了硬件计算成本的下滑,也就是说,你以前花1000块钱买个486机器可以干的事情,你现在还是需要化1000块钱买个小型机才能干。

本节白皮书最需要理解的就是经济学的成本概念,理解了计算、作恶和成本相关,同时这个成本也是考虑到单位计算能力成本的不断下降与抵消,你就理解了比特币POW的核心思想。


精读比特币白皮书5:Long长Long长,杀伤力强

继续用简单的语言精读比特币白皮书,今天带来第5期,本节白皮书内容主要是比特币网络广播记账原理,关于P2P网络以前有文章详细说明,本篇用简单的语言来解释,本专题不适合熟悉比特币原理的同学。

本专题主要通过仔细分析中本聪的白皮书,并附带我的理解,让您快速入门,框内黑色的字体是白皮书原文翻译,橙色的注解段落是我的理解,希望能帮到你,我一直认为每个学习区块链的人都应该仔细看比特币白皮书,这是第五期,讲比特币网络:

前面一章说过,为了达成所有人参与对交易的验证验证和记录,就需要将交易广播出去,但是广播出去后,如何实现同步和内容统一呢,白皮书里是这样说的:

5、网络
运行该网络的步骤如下:
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%攻击是理论值。


精读比特币白皮书6:利益的纽带,比特币激励机制

继续用简单的语言精读比特币白皮书,今天带来第6期,本节白皮书内容主要是比特币的激励机制,本专题不适合熟悉比特币原理的同学。

本专题主要通过仔细分析中本聪的白皮书,并附带我的理解,让您快速入门,框内黑色的字体是白皮书原文翻译,橙色的注解段落是我的理解,希望能帮到你,我一直认为每个学习区块链的人都应该仔细看比特币白皮书,这是第六期,讲比特币的激励机制。

比特币的激励机制在以往的P2P应用中并没有上升到一个高度,很多年前我曾经在屏保中运行过NASA的寻找外星人计划,包括后来的BT下载都没有明确的激励机制,更多依靠道德或所谓的”信仰“,先来看看白皮书原文怎么说的:

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

注解:

说句实话,在没有看到白皮书时,我当时单纯的认为比特币的激励机制只是为了解决算力问题,因为在此之前的p2p系统都没有完善的激励机制,NASA的寻找外星人计划,基本上依靠的是纯粹的爱好,利用对一件事物的热情分享你的CPU算力,但是热情很难持续的保持,最终知道这个分布式计算项目的人都是激情爱好者,包括我自己后来也不再运行这段程序了。

最类似的激励探索我认为是PT分享机制,混过PT站的人都知道,不同于BT分享,PT站有着严格的制度保障有足够多的人分享他们的带宽和资源,PT是一种以你需要的资源为代价的带宽激励机制,你必须有足够的上传量才能获取下载量,这种激励制度保障了PT站点的长期存在,因为激励规则的存在PT站点比单纯的依靠道德建立起来的BT站点活的更久,资源更丰富,系统良性循环更有效。

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

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

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

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

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

我一直倡导,了解一个东西需要知道其原理,了解原理和设计思想后需要你自己对结果进行判断,可能大多数人更愿意直接听结果吧,也许这样省事但不是好选择!

2017-04-10 你真的了解中位数吗(从零开始学区块链 126)

在精读比特币白皮书第三章里面,提到比特币网络取时间的时候,提到了“中位数”,有不少朋友问什么是中位数,以及为什么不取平均数,今天介绍一下中位数。

中位数、平均数、众数的相同点

平均数、中位数和众数这三个统计量的相同之处主要表现在:

  • 都是来描述数据集中趋势的统计量;
  • 都可用来反映数据的一般水平;
  • 都可用来作为一组数据的代表。

中位数、平均数、众数的不同点

它们之间的区别,主要表现在以下方面:

1、定义不同
  • 平均数:一组数据的总和除以这组数据个数所得到的商叫这组数据的平均数.
  • 中位数:将一组数据按大小顺序排列,处在最中间位置的一个数叫做这组数据的中位数 .
  • 众数:在一组数据中出现次数最多的数叫做这组数据的众数
2、求法不同
  • 平均数:用所有数据相加的总和除以数据的个数,需要计算才得求出.
  • 中位数:将数据按照从小到大或从大到小的顺序排列,如果数据个数是奇数,则处于最中间位置的数就是这组数据的中位数;如果数据的个数是偶数,则中间两个数据的平均数是这组数据的中位数.它的求出不需或只需简单的计算.
  • 众数:一组数据中出现次数最多的那个数,不必计算就可求出
3、个数不同

在一组数据中,平均数和中位数都具有惟一性,但众数有时不具有惟一性。在一组数据中,可能不止一个众数,也可能没有众数。

4、呈现不同
  • 平均数:是一个“虚拟”的数,是通过计算得到的,它不是数据中的原始数据.
  • 中位数:是一个不完全“虚拟”的数.当一组数据有奇数个时,它就是该组数据排序后最中间的那个数据,是这组数据中真实存在的一个数据;但在数据个数为偶数的情况下,中位数是最中间两个数据的平均数,它不一定与这组数据中的某个数据相等,此时的中位数就是一个虚拟的数
  • 众 数:是一组数据中的原数据 ,它是真实存在的
5、代表不同
  • 平均数:反映了一组数据的平均大小,常用来一代表数据的总体 “平均水平”.
  • 中位数:像一条分界线,将数据分成前半部分和后半部分,因此用来代表一组数据的“中等水平”.
  • 众数:反映了出现次数最多的数据,用来代表一组数据的“多数水平”.

这三个统计量虽反映有所不同,但都可表示数据的集中趋势,都可作为数据一般水平的代表

6、特点不同
  • 平均数:与每一个数据都有关,其中任何数据的变动都会相应引起平均数的变动.主要缺点是易受极端值的影响,这里的极端值是指偏大或偏小数,当出现偏大数时,平均数将会被抬高,当出现偏小数时,平均数会降低.
  • 中位数:与数据的排列位置有关,某些数据的变动对它没有影响;它是一组数据中间位置上的代表值,不受数据极端值的影响.
  • 众数:与数据出现的次数有关,着眼于对各数据出现的频率的考察,其大小只与这组数据中的部分数据有关,不受极端值的影响,其缺点是具有不惟一性,一组数据中可能会有一个众数,也可能会有多个或没有
7、作用不同
  • 平均数:是统计中最常用的数据代表值,比较可靠和稳定,因为它与每一个数据都有关,反映出来的信息最充分.平均数既可以描述一组数据本身的整体平均情况,也可以用来作为不同组数据比较的一个标准.因此,它在生活中应用最广泛,比如我们经常所说的平均成绩、平均身高、平均体重等.
  • 中位数:作为一组数据的代表,可靠性比较差,因为它只利用了部分数据.但当一组数据的个别数据偏大或偏小时,用中位数来描述该组数据的集中趋势就比较合适.
  • 众数:作为一组数据的代表,可靠性也比较差,因为它也只利用了部分数据.在一组数据中,如果个别数据有很大的变动,且某个数据出现的次数最多,此时用该数据(即众数)表示这组数据的“集中趋势”就比较适合.
区块链观点大碰撞
Web note ad 1