559眼中的BTC白皮书,仅代表个人观点。
在现在互联网的世界中,我们的交易主要是基于信用模式的前提下通过第三方来承担双方的交易评估、担保和资金清算工作(如支付宝、微信等)尽管该交易系统运行的很好,但是仍需忍受基于信任模型带来的缺点:由于第三方的存在,增加了交易的成本,也增加了交易规模,交易金额的限制以及线上支付存在可逆性问题同时我们的个人信息在第三方金融机构里面完全透明。什么是支付存在可逆性呢?我们想想现在的阿里巴巴的退货退款服务就是这种模式,顾客可以向第三方(阿里巴巴)申请退款,而第三方也完全可以在违背商家的意愿下同意该笔退款申请强制划扣商家收入。
基于这个痛点我们思考一下,是否有不可逆的支付方式呢?有的,现金。因为拿到现金的拥有者可以对该现金拥有一切支配权不受到任何第三方管制。但是现金无法做到线上交易,这样又限制了交易范围并且提高了交易成本。
为了可以同时更好的解决以上的痛点一个叫做中本聪的人2008年10月在密码学网站的邮件列表中发表了一篇《比特币:一种点对点式的电子货币系统》的论文,文中中本聪明确表示比特币的目的就是通过构建完全点对点的技术实现一种电子现金系统,达到无需金融中介也无需双方信任的情况下实现在线的电子化支付。中本聪称比特币是一种电子现金系统,因为他跟现金一样是一种不可逆的支付手段,所以比特币支付系统特性:1.通过密码学代替信用 2.去金融中介化 3.杜绝可逆支付,保护卖家不被欺诈,系统也可以兼容第三方担保机制,来保护买方利益。
大胆的想象一下,如果我们在线上支付去中心化后没有第三方承担交易的评估、担保和资金清算工作的话,那么是不是所有人都能随意篡改自己的交易记录账户余额、一笔资金同时支付给多个人等问题?为了解决这些问题中本聪是通过数字签名,随机散列,哈希算法,工作量证明,动态链式存储等技术,设计了一系列的机制,使比特币能够解决电子支付中的双重支付,记录篡改等问题。并最终证明该系统安全有效、稳定可行。
通过解读**《比特币:一种点对点式的电子货币系统》**一步步来了解中本聪是怎么通过各种复杂机制来解决的。首先第二章中说的是交易:看着一章之前先了解一下比特币的记账模式与传统记账模式的区别,在现在的银行app中的记账模式是每个人一个账户,账户里面记录了我们每一笔交易,收入和支出这些交易对应了账户余额的增减,所有交易支出收入相加,总额跟余额应该是相等的。而比特币则是基于utxo的记账模型,这是一种基于交易的记账体系,在这个体系中数据库记录了一笔笔交易,包括收付款双方的信息、余额、上一笔交易哈希值等信息,如果我们要计算某个账户,拥有多少枚电子货币需要在账本中找到其参与的交易来计算该用户当前的余额。
回到文中中本聪说我们将一枚电子货币定义为一条数字签名链;每个拥有者都通过将上一次交易和下一个拥有者的公钥的哈希值的数字签名添加到此货币末尾的方式将这枚货币转移给下一个拥有者。系统收款人可以通过验证数字签名来证实其为该链的所有者。
从图中就能很清晰的理解上面这句话的意思,该图就是由一笔笔交易构成的链式结构,比特币的每一个区块中都存着大量的这种交易数据;图中完成了三笔交易,依次是:由所有者0号转账 -->> 所有者1号转账 -->> 所有者2号转账 -->> 所有者3号 的交易数据。从图二看它的整个交易执行过程是:付款方是所有者1号,收款方是所有者2号;所有者2号的公钥与所有者1号的交易数据拼接生成一个hash值;所有者1号用私钥对这笔交易进行签名,该签名也被打包到这笔交易数据中;收款方再通过付款方的公钥对这笔交易进行验证该签名是否是其本人,因为所有人的公钥都是公开的。这里提及了三个概念:公钥、私钥、数字签名。非对称加密算法会生成一对公钥和私钥,公钥:通常是公开信息,负责数据加密。私钥:是非公开的,只有有解密权的人拥有,用于解密和签名。可以简单的理解成公钥就是银行卡账号,私钥就是银行卡密码。数字签名:签名,接收者只需要用发起者的公钥就可以进行验证
图中就是一次发起者用私钥加密和签名,接收者验证签名有效性的过程,也就是验证这个签名跟发起者的公钥是否匹配。
比特币中用椭圆曲线算法生成公钥和私钥,公钥是公开信息,用于标识用户,验证比特币的所有权;私钥只有持币者拥有,保证了比特币归属权,用于转账交易;比特币的数字签名就是持有比特币的付款方生了一段防伪字符串通过验证这个字符串,一方面可以证明该交易是否付款方本人发起的,另一方面可以证明交易信息再传输过程中没有被篡改。通过数字技术,收款人已经能够验证付款方身份的真实性,但是不能证实付款方没有进行双重支付的问题,也就是说他是否同时给多人支付了这一枚比特币。中本聪说通常这样的问题是引入一个可信任的中央机构或铸币厂由他们来进行发行、清算和审核交易,但是比特币的使命就是不再依赖第三方金融中介所以这种方案显然是不可行的,另一个方案就是说我们不如让收款人知道付款人最近的其他交易这样就可以判断,在这笔交易前付款人没有造成双重支付的其他可疑交易,如果系统不依赖任何第三方来审核账本,那么就需要公开所有的交易数据,让所有的参与者来监督和维护共同的一个账本,并达成一种历史性的公示,最终只有一个有效的、带时间顺序的记账数据并且公之于众这就是比特币使用的分布式记账系统。
第三章是时间戳服务器,主要是强调将时间戳信息纳入区块信息中,让时间见证一切,也让数据几乎无法篡改。
图中就是由一个个区块构成的链,也就是区块链,比特币大概每10分钟产生一个新区块,每个区块中记录了这段时间的所有交易信息,也就是图中的这些项目。当这些区块的所有数据加上前一个区块的hash值再打上时间戳,就构成当前区块的hash,这个hash还要参与下一个区块的运算,这就让所有区块向编年史一样按照时序紧密连接。并同步到所有节点,因此,历史区块信息几乎无法篡改,因为当要修改某个区块数据就要修改其后所有已生成区块的hash数据。还要让大多数节点形成共识,这几乎不可能。
第四章工作量证明,在看这章之前我们先了解一下哈希算法,因为哈希算法有很多种有些哈希算法有缺陷中本聪选择了sha-256的哈希算法,到目前为止还没有任何公开资料显示sha-256有缺陷,sha-256(SHA:Secure Hash Algorithm安全哈希算法,256表示为无论输入什么值这个算法的计算结果是1个包含256位数的二进制数,二进制数是由0和1组成的数)网上有在线的sha-256哈希值生成工具,可以去尝试一下,同样一句话哪怕多一个标点符号或者修改一个标点符号得出的hash值都是不同的。
前面提到整个账本是公开的由全体分布式节点共同维护,那么接下来就面临谁拥有记账权的问题,中本聪通过引入了工作量证明机制公平有效的解决了这个问题。
中本聪设计的工作量证明就是让所有几点去计算一个hash数值,并且尽可能的小满足这么一个不等式,这个计算的复杂程度,随着target目标值的变化而动态调整,目标值越小难度越大,实践中会让这种复杂度维持在合理的计算成本下,大概10分钟左右,计算出来一次的水平。这其实就是矿工挖矿的过程,
也就是大量遍历sha-256哈希数,寻找一个解,这种算法的好处是计算随着目标值减小呈指数增长,但是验证起来却非常简单,只需执行一次哈希即可,为了保证每次工作量证明都是重新计算的每个区块中还会加入一个随机数,正如图中所示每个区块中就包含了前一个区块哈希,一个随机数以及所有交易数据,这样我们的区块结构也逐步在完善。中本聪在这节的最后还解释到工作量证明同时解决了在多数决定中确定投票方式的问题,这点的意思是工作量证明本质上是按cpu算力投票,最长的那条链代表了最多数的投票结构,因为他有最大工作量证明的算力投票到这条链上,如果多数的cpu算力被诚实节点控制,那么诚实的链就会增长的最快,并超过其他的竞争链,前面提到过要修改过去的一个区块信息,那么其后已产生的区块信息都要修改因为他们包含了前面区块的哈希值,从这一章我们知道,修改区块并没那么简单,因为需要记账权,也就是工作量证明这个成本极高,也就是说要修改过去的某个区块,攻击者必须重做这一个区块以及其后所有区块的工作量证明从而才能赶上并超过当时诚实节点以达成共识的最长链接,这种概率会随着后续区块的增长而大大的减小,成本也会远远大于收益,我们会在第11章中证明这一观点。
为了抵消应算速度的增加,以及平衡不同时期运行节点的利益,工作量证明难度会由一种移动平均数法来确定每小时生成区块的个数,这里中本聪考虑到摩尔定律,因为几年或者几十年运算的能力会大大的提升,但是这也没有关系,如果区块生成的过快系统会让区块的生成难度增加,最终还是保持在十分钟的水平。
如何设计有效的机制,来部署整个分布式网络呢?中本聪在第五章网络中给了一个解答,运行整个比特币网络分为6个步骤:
1) 新交易向所有节点广播。
2) 每个节点将新交易收集到一个区块。
3) 每个节点为它的区块寻找工作量证明。
4) 当一个节点找到了工作量证明,就向所有节点广播这个区块。
5) 节点只有在区块内所有交易都是有效的且之前没有被支付的情况下接收这个区块。
6) 节点通过使用这个区块的哈希值作为上一个哈希值,在链中创建下一个区块的方式 表示对这个区块的接受。
他的执行过程基本就是:一笔新的交易发生后,由矿工验证后生成新的区块,矿工把验证好的交易数据放入到自己的生成的区块中,当矿工制作好这个新区块就立即把这个新区快发送给网络的各个节点,网络上的节点接收到这个区块,检查这个新区快是否符合要求,如果符合要求则将这个新区块添加到自己所存储的区块链的末尾,那么问题来了,比特币网上有许许多多的矿工每个矿工都能生成自己的新区快,网络上可能同时生成许多的新区快虽然这些区块包含的交易信息大致相同都是检查好的近期交易记录,但是每个区块具体包含哪些交易记录可能略有区别,而比特币网络仅仅认可和维护同一条区块链,比特币网络的每一个节点都必须选择同一个新区快添加到现有的区块链末尾,但是很难指定统一的一个选择标准至少不能按照到达的时间先后顺序进行选择因为节点分布于世界各地,每个节点接收到的第一个新区块一般不相同比特币网络的解决方案是采用一个巧妙的方法限制单位时间内生成的新区快的数量,如果每隔10分钟的时间,整个比特币网络只有一个矿工能将自己做好的一个新区块发布到网络上就不需要进行选择,所有节点将这个唯一的新区块添加到区块链上,这样可以保证所有节点保存的区块链始终相同,这个巧妙的方法就是,当矿工把检查好的交易记录填入到新区块后还要求矿工做一个额外的工作,矿工成功完成这一个额外的工作后才能把生成的区块发布到网络上。这个额外的工作难度极高,整个比特币网络一般只有一个矿工能在10分钟左右时间成功完成一次,这样每隔十分钟左右的时间,只有一个矿工能将自己做好的一个新区块发布到网络上这个额外的工作分为两步:第一步:前一个区块的sha-256哈希值+这个新区块的基本信息+这个新区块所包含的交易记录组成一个字符串,这里需要注意的是前一个区块的sha-256函数值是值前一个区块的所有内容输入sha-256函数后所得到的结果值每一个区块和它自己的sha-256函数值一一对应,区块的sha-256函数值就代表着这个区块,如果第B个区块包含第X个区块的sha-256函数值,则表示第B个区块的前一个区块是第X个区块,区块链就是依靠各个区块的sha-256函数值将这些区块有序的串联起来。以上是第一步生成一个字符串,第二步是在这个字符串的末尾添加上一个随机数,组成新字符串,将这个新字符串添加到sha-256函数,得到一个256位的二进制数,如果找到这个随机数能使得这个256位的二进制数的前72位都是0,才算成功完成了这个额外的工作,这个额外的工作难度非常高,高到整个比特币网络一般只有一个矿工能在10分钟左右时间成功地找到这个随机数,原因在于sha-256函数的特点是:虽然每个输入值对应每一个输出值,而且每个输出值都是一个256位的二进制数但每次运算的输出值具体是什么完全是随机的,而且无法预测,找到符合要求的随机数的唯一方法就是以最快的速度输入不同的随机数,不停的试。Sha-256有256位数,由0和1组成,第一位数为0的概率是2分之1,那第二位为0的概率是2分之1的2分之1......以此类推,要保证前72位都为0概率是2的72次方分之1,可想而知难度有多高,要找到这个数完全是靠运气,随机的,当矿工找到这个随机数马上添加到新区块中,并发布到网络上,然后节点检查区块的其他方面是否符合要求以及区块中的记录是否符合要求如果都没有问题的话,就把这个新区块添加到网络的末尾。
一个诚实的节点必须要遵从上面6点要求;如果同时有两个矿工几乎同时完成了这个工作量证明并同时广播了下一个区块,由于网络问题,有些节点先收到一个,有些节点则可能收到另一个,如果出现这个问题,比特币网络将会保存两个区块,当在下一个10分钟,谁先在他接收到的节点上延长他时,那么这个僵局就会被打破。因为节点总是认为最长的链为正确的并持续致力于延长它;新交易的广播不必到达所有的节点。只要到达一些节点,不久就会进入到一个区块。 区块广播也是能容忍消息丢失的。如果一个节点没有收到某个区块,它将在收到下一个区块时发现它丢失了一个区块然后去请求这个区块。所以比特币系统他有很强的容错性。
天下熙熙皆为利来,天下攘攘皆为利往。显然想要完成工作量证明,需要大量诚实的网络节点的支持并将一个个新区块的数据不断写入网络中,这个过程对节点来说,需要大量的成本,如果没有利益是显然不现实的。所以论文的第六章中本聪介绍了比特币网络的激励政策:我们约定,区块中的第一笔交易是区块创建者开创一枚属于他的新货币的特殊的交易,时专门用于奖励给区块创建者的新货币,因为这样不仅增加了对网络节点的激励同时也提供了一种分发新货币到流通领域的方法。比特币的激励 = 矿工挖矿 + 交易手续费(也就是找到符合要求的随机数自己制作的新区块被网络上的节点添加到区块链上则矿工会获得来自比特币网络的12.5个(2017年)比特币作为奖励,这一部分是挖矿奖励还有一部分激励是交易费收入:区块中所有交易的交易费,平均约2比特币(2017年),矿工总收入:平均每个区块约14.5比特币 ,大约值26w美元,即170万人民币(2017年的行情),也就是总有一位运气好的矿工在10分钟左右时间收入大约170w人民币。)比特币交易没有强制规定手续费的金额,只要交易的输出值小于其输入值,差价就作为交易费,被加到包含此交易的区块激励中。一旦预定量的货币进入流通领域激励将变为只含有交易费,这样可以避免通货膨胀。如果一个货币可以无限增发的话肯定会通货膨胀,所以中本聪设计实践中比特币发行总量大约为2100万枚挖矿奖励,每4年减半一次。
当产出的比特币越来越少,或者所有币发行完了,挖矿奖励就只靠交易手续费了,这样可以避免通货膨胀,同时激励也会助于鼓励节点保持诚实,比如一个贪婪的攻击者,如果他有能力聚集比所有诚实节点更多的cpu算力,而他的目的仅仅是为了完成一次双花攻击,或者完成一次欺骗交易,是非常不值的,因为他如果有这个能力不如做矿工,它可以获得稳定的收入,所以说在这里,遵守规则往往比破坏系统会有更高的收益。
第七章回收磁盘空间,这张中本聪主要讲如何利用一种叫默克尔树的二叉树数据结构来压缩数据,节约交易数据的存储成本,因为每个完成的节点都需要保存历史交易数据,这个数据量可能会非常的大
图中所示,就是区块链中一个区块的数据结构形式,这是一个默克尔树的树状结构,它是由一个根节点,一组中间节点和一组叶节点组成,叶节点包含存储数据或是它的哈希值,中间节点是它两个子节点内容的哈希值,根节点也是由它的两个子节点内容的哈希值构成,所以默克尔树也称做哈希树,当一笔货币的最新交易被足够多区块覆盖,也就是形成共识的时候,那么在这个区块中,它过去拥有者的交易数据就可以丢弃,只保留最新的数据,以及之前数据根节点的哈希值,同时哈希值不会被破坏,依然可以用来验证数据有效性也就是零知识证明,所谓零知识证明就是说,验证一个事件正确与否,并不需要验证者重现整个事件默克尔树里的哈希值,既不占据空间又能提升索引效率,还能用于零知识证明。(就是把之前的数据运算成一个哈希值,只保存这个哈希值进而减小存储空间,也能通过这个哈希值验证之前数据的有效性)中本聪还通过举例来做了一笔估算,他说每个不包含交易的区块头大约是80个字节,如果每10分钟生成一个区块,那么每年会生成4.2mb的数据,在2008年在售的典型计算机由2gb内存,而且根据摩尔定律来预测,每年内存增加1.2gb,所以就算区块头一定要全部存在内存里,这也不是什么问题。本章的核心就是,将大量数据进行哈希运算后增加其分布式索引的性能,并且通过维持一个较小的高效索引,也就是默克尔路径进而来管理复杂而又大量的数据。
第八章简化的支付验证是指不用运行一个完整的网络节点也可以进行支付验证的方式,我们经常看到一些比特币钱包,介绍自己是spv wallet 或者叫轻钱包,就是这个意思。一个完整的比特币全节点,至少需要几百G的磁盘空间,数据还需要实时的同步更新,这对普通用户来说门槛太高了,因此中本聪介绍了简化支付验证的可能性
实际上用户只要有最长共识链的区块头数据就可以了,他可以通过向其他网络节点查询来保证他有了最长链的数据,然后将交易链接到对应的默克尔分支直到有节点接受了这笔交易,以及后面的区块能确认此交易并最终被整个网络接受,如果面临攻击,这种简化验证就会有较高风险,实际上这种简化认证的钱包客户端也要设计一定的机制来保证安全性,对于高频的收付款的公司或者企业级支付服务商,中本聪还是建议去维护自己的一个全节点。
第九章合并和分割交易额实际上比特币的一笔交易可以有多个输入方和多个输出方,也就是说可以有多个付款方和多个收款方,同时收款方还可以包括付款方自己这就是找零的过程,我们可以看blockchain.com的比特币区块链浏览器左边是输入方,右边是输出方,有的交易是多重输入方和多重输出方,对于用户来说,合并交易的好处不仅可以提升效率,也可以节约手续费。想深入了解的可以参考这篇文章:https://zhuanlan.zhihu.com/p/361854961?utm_id=0
第十章隐私传统机构,比如银行来说,作为交易的中介机构,用户交易信息只有用户本人和银行可以获取和提供,这一定级别的保护了用户隐私,而前面提到比特币不同于传统金融机构,他的账本是完全公开完整的,所有的交易都是公开的,这就涉及了隐私问题
比特币是通过保持公钥的匿名性,来保护用户隐私;用户无需注册和实名审核,在匿名的情况下就可以获得比特币账户,这就打破了真实身份信息和交易之间的关联,公众能看到有人正在发送一定量货币给别人但是他不能将交易关联到某个人,就好比股票交易,每笔交易的时间和交易量也就是行情他是公开的,但是呢别人看不到交易双方究竟是谁。
第十一章本章将通过公式和代码来论证,在实践中比特币网络被攻击成功的概率非常非常低,我们假设一个攻击者试图生成一条比诚实链更快的替代链,假设这个目标达到了又能怎么样呢?能不能凭空创建一个比特币或者说能不能拿走别人的比特币呢?这个答案是不可能的,因为这需要破解别人的账户私钥,这是一个难度极高的数学问题,如果没有私钥,这就是一笔无效交易,诚实的节点是不会接受无效的交易作为支付的,而且诚实节点永远不会接受一个包含无效交易的区块这在第5章网络中提到过,所以说,攻击者只能通过改变他自己的某笔交易来拿回他不久以前已经支出的钱,也就是双重支付通过双重支付来完成攻击本章余下就是通过建立概率模型来估算这种概率关于数学我向来头大,哈哈感兴趣的可以自己研究一下,我们只需要知道结论是,这几乎是不可能的事情。就可以了
论文最后一章是总结,中本聪总结说,我们已经提出了一种不依赖信任的电子交易系统我们参考了通用的数字签名货币体系,这种体系虽然提供了强有力的所有权控制,但是由于缺乏防止双重支付的方法而不够完善,为了解决这个问题,我们提出了一种工作量证明机制并在点对点的分布式网络中记录公开的交易数据,只要诚实节点控制了多数的cpu算力,对于攻击者来说,这种交易历史将很快在计算上变得计划不可更改。他还总结说:这是一个结构简洁而健壮的网络,节点只需要很少的协同就能够同时工作,他们不需要被认证,因为信息不会被发送到某个中心位置,只需要广泛的传播,所以节点可以随时离开和重新加入网络,节点使用cpu算力来投票,通过努力延长有效区块来表达接受,通过拒绝在无效区块上工作来表达抵制,任何必要的规则和激励都可以通过这个共识机制来加强,其实这就是区块链的核心思想,一种去中心化的经济学。
参考文献:
比特币目标去中心化,用数字签名验证付款方的身份以及支付信息没有被篡改,用工作量证明解决双重支付问题及攻击者想篡改历史数据几乎不可能,设计激励机制提高诚实节点的共识。