第三节 深入比特币

上节简单介绍了比特币的使用,本节会思考一些更深入的原理问题,比如在一个没有中心的系统中如何产生中心化的效果,并将看到第一节大段的密码学知识是如何来建立整个比特币系统。

(一)去中心化思想

百度百科“比特币”条目下是这样定义比特币的:比特币是一种由开源的P2P(Peer-to-peer,点对点)软件产生的电子货币,是一种网络虚拟货币。比特币不依靠特定货币机构发行,它通过特定算法的大量计算产生,比特币经济使用整个P2P网络中众多节点构成的分布式数据库来确认并记录所有的交易行为。P2P的去中心化特性与算法本身可以确保无法通过大量制造比特币来人为操控币值。

这段描述充斥着计算机技术界的“黑话”,但其最核心思想很清晰--去中心化。去中心化的的意思就是不由某个人或某个群体主导一切,而是大家集体参与,共同决定。在沟通方式低效的年代,这是一件非常奢侈的事情,但由于能保障所有人的权利、能及时纠正可能的错误,人类社会形态也遵从这这个思想从中心化不断迈向去中心化。

进入互联网时代,由于沟通的便利性得到极大的提升,去中心化思想如主场队员一般开始在各领域迅速扩张,任何人都可以在网络上表达自己的观点或创造内容。仅仅在读这本书时,你可能就一边翻着百度百科的条目、一边在豆瓣书评里吐槽、一边在微博搜索别人是怎么评价比特币。总而言之,在去中心化的世界里所有人是平等的,你可以给9分的电影打2分,但无法因此把9分拉低到哪怕8.9分;你可以宣传自己,但无法封杀别人的观点。

网上流传着一张很欢乐的世界几大科技公司的组织架构漫画,可以清楚看到最中心化的苹果和最去中心化Facebook的区别:

图3-10 六大科技公司组织架构图(漫画)

图片来源:http://www.bonkersworld.net/organizational-charts/(图中AMAZON的中文名为亚马逊——著名的电子商务公司,GOOGLE即谷歌,FACEBOOK是世界上最大的社交网站,MICROSOFT即微软,APPLE即苹果公司,ORACLE是世界上最大的数据库软件公司。)

比特币之父中本聪在设计比特币模型时,就将其设定成去中心化,其P2P(Peer-To-Peer,点对点)网络模型正是和Facebook的架构类似。事实上,当技术条件成熟时,把去中心化的思想引入任何领域,都将引爆群体的智慧,都几乎意味着这个领域将产生完全颠覆性的变革。正犹如博客之于出版、微博之于媒体、Facebook之于社交、网游之于娱乐、选票之于政治。就连上图中极度中心化的苹果也是因为其去中心化的开发平台AppStore而大获成功。而比特币的发行总量、发行速度、支付验证方式在一开始就由去中心化的数学模型设定。

(二)P2P架构和安全通信

上网时,我们常遇到的是C/S架构(客户机/服务器架构),例如新浪微博,就是大家一起连接到weibo.com,所有信息都储存在新浪服务器上,我们通过服务器中转信息来交流。这种架构的结构简单快捷,但是容易受到攻击。假如黑客把新浪微博黑了,或者有关部门把新浪微博关了,整个体系就崩溃了。

还有一种架构叫P2P架构(点对点架构),例如下载工具电驴就是P2P架构。这种架构的特点是:服务器并不是必要条件,每一台联网电脑都是一个独立的个体,通过网络串联到其它几台甚至成百上千台电脑,最后全球的电脑能够连接成一个密密麻麻的网络。P2P网络一大特点就是:一旦启动,无法关闭。

在这个P2P网络上的所有电脑都直接或者间接地联通起来,某一个节点上发出的信息,最终可以扩散到全球所有节点。举例而言,A在中国,B在美国,A和B的联通方式可以是直接连接,也可以是通过位于欧洲的C电脑搭桥间接连接起来。

P2P网络联通不成问题,但是信任的问题就出来了。例如,A发出一条信息要给B,B通过P2P网络最终接收到此信息--可以是直接从A电脑传递过来,也可能是通过多台电脑转手传递过来--B会有两个问题:第一,这条信息到底是不是A电脑发送的?第二,信息传递过程中如何确保不被帮忙传递信息的C、D甚至更多人偷窥到信息原始内容。

这就回到了我们讲过的非对称加密技术,刚才的例子中,假如A要发送一条信息给B,确保这个信息只有B才能解密。那么A就用B的公钥(公钥是公开的,整个P2P网络都知道B的公钥)加密原始信息,这条信息传播到整个P2P网络上面,虽然所有电脑都有B的公钥,但是用公钥无法解密这条信息,最后B收到这条信息,用B的私钥就能够轻松地解密这一信息。

还是回到那个例子,A怎么证明自己是这条信息的发出者呢?因为在网络上,任何人都可以把自己伪装成任何人,B收到信息时,可能传递信息给B的那台电脑会声称它就是A,那么B是否就轻易相信那台电脑就是A呢?不能,因为很可能那台电脑伪装成A!

A为了申明给B的信息是由自己发出的,也很简单,只要做这两个步骤就行: 第一步,用A自己的私钥对原始信息做第一层加密,第二步,在上一步获得的数据基础上再用B的公钥做第二层加密。第一层加密的目的是为了证明这个信息是由A加密并发出,因为只有A的私钥才能完成这样的加密,这一步也叫做数字签名;第二层加密的目的是确保信息只有B能够解密,因为B的私钥只有B电脑才有。

B收到这个加密的信息后,以相反的次序做两次解密操作即可:第一步,用B自己的私钥解密收到的信息,第二步,在第一步获得的数据基础上用A的公钥再解密一次。第一步顺利完成,可以确保信息只有B自己能够解密,其他人是无法解密的;第二步顺利完成,B就获得了原始信息,同时也表明这条信息确实是有A的私钥加密生成,排除了是被别人伪造的可能。

有了这一技术保障,即使在匿名的互联网环境中,我们也不必再纠结通信的安全性,而可以将注意力集中在比特币的体系架构上来。

(三)比特币的本质

图3-11 比特币宣传画

在网络上看关于比特币的网页时,总是可以看到各种印着“B”符号的硬币,仿佛那就是比特币,实际上那只是爱好者自己铸造的玩具,和比特币完全没有关系。比特币并不是任何有形的硬币,也不是常人所想象的一段数据,同样也没有办法把某些比特币从整个系统中分离出来。比特币的本质是一个互相验证的公开记账系统。这个系统所做的事情,就是记录所有账户发生的交易。每个帐号的每一笔数额流动都被记录在帐本里。而且每个人手上都有一份完整的账本,每个人可以独立统计出比特币有史以来每个帐号的每一笔流动,当然,也能算出任意账号当前余额是多少。

这里最关键的一点在于:每人手上都有完整的账本,这个系统里没有任何人有唯一决定权。这意味着没有任何人可以决定向这个系统增加货币或者改变规则,因为个体的修改会被整个网络否决掉。除非有人可以修改50%以上人手上的账本,这就是比特币系统里所谓的51%攻击。

上一节说比特币客户端Bitcoin-QT使用时会进行大量的数据同步,Bitcoin-QT只告诉我们说这是在进行数据同步,但并不知道这是什么数据、以及为什么要这么做。现在可以知道同步的是比特币世界的所有交易记录,这部分数据保障了整个体系的去中心化和每个客户端的一切知情权。而不需要下载交易数据的轻客户端如Electrum则是去几个提供交易数据查询功能的服务器查询特定账号的记录,由于这些数据全部是公开的且带有严密的校验,任何查询服务器都没有必要也没有可能伪造数据。所以即使轻客户端带来了部分中心化效果,实际上对全局的去中心化并没有什么影响。

比特币还有一个令人很困惑不能理解的问题,就是当我的地址里面拥有一些币,那么它在哪?我备份钱包是把我的币备份了吗?在现实中,我们知道钱是什么,因为可以直接掏出来看;我们也知道自己的钱在哪,要么现金、要么银行、要么其他如证券交易商处。而比特币系统只是所有交易的记录,这里只关心某个帐号里是否有币、有多少币,而“币”本身是什么东西这个概念是不存在的。某个地址拥有的比特币数额存在每个人的客户端数据里,大家都知道你有币就可以了。所以当我们备份钱包,其实只是在备份对自己比特币地址的拥有权。

(四)地址是什么

在现实中如果需要一个银行账户,需要去银行排队开户,然后拿到银行分配的一串数字帐号,才能使用银行提供的功能。而在比特币体系里,我们的账户似乎并不需要谁来开设,只要本地客户端自动生成,也不需要向任何第三方公布,对方就可以直接向我们的账户转账了,而且账户是类似这种奇怪的形式:1H4AG73nXz5to9zWkH4GUZEH1Nuey8EVjJ。

刚接触比特币的用户印象最深的大概就是这一长串乱码般的地址,给人第一感觉是“不明觉厉”(网络用语,意思是“虽然不明白,但是觉得很厉害”。),第二反应就是特别容易输入错误。幸运的是,绝大部分时候并不需要手工输入比特币地址,通常是通过复制粘贴或者二维码扫描的方式,即使万一需要手工输入,比特币地址的校验机制也会提醒你帐号不正常。

可是这一串地址是什么?会不会和别人重复?

这里先回忆一下前面讲到过的非对称加密技术。简单来说就是通过一套数学办法,产生一对密钥A和B,当使用A加密一份数据,必须使用B来解密;而使用B来加密数据,必须用A才能解开;而且根据A可以很容易计算出B,反过来则不行。A就叫私钥,B叫做公钥。顾名思义,A是保密的,B是公开的。

所以,比特币地址其实就是一套非对称技术的公钥,这套技术就是密码学部分介绍过的椭圆曲线算法,而和公钥对应的私钥实际就在钱包文件里藏着。因为公钥和私钥要需要使用特殊的算法成对生成,所以比特币地址不能像普通密码一样人为设置,而且看起来也没有规律性。按照私钥保密公钥公开的原理,所以比特币地址可以给任何人,但钱包文件则必须妥善保管,一旦丢失,钱包就不安全了,而且由于整套体系的去中心化和匿名性,没有任何人有权力或能力找回丢失的比特币。

至于地址有多少?会不会和别人碰上?可以这么形容:如果每粒沙子里面都有一个地球,那么地址数大概等于地球上所有沙子里面的地球的沙子数总和。如果你幸运地生成了一个其他人有余额的地址,那恭喜你真的中奖了!如果愿意,这笔比特币就归你了!

(五)支付的背后

由于比特币不存在现金交易的概念,一切的交易都是依靠账户间的转移,所以比特币的支付概念类似于银行转帐。先看银行的转账过程:我们要做的是先填写对方账号和金额,本地一般会先检查一下余额是否足够,如果足够就把这个转账请求发到银行数据中心,银行确认密码、U盾、对方帐号等信息正确后,就把保存在银行数据库中的我们账号减去一个金额,同时给对方帐号加上一个金额,然后返回成功或失败的信息。

当存在银行这一官方机构时,上面的操作过程毫无疑义,但是比特币体系中并不存在任何类似银行这种可信机构的概念,这里每个人都是平等的,同时每个人都不一定是可信的。回忆我们讲过的安全通信技术,会发现比特币的转账机制也很简单。

假设A有100个比特币,他要转账给B。那么A写一条信息:从A的地址转账100比特币到B的地址,然后用自己钱包里的私钥加密传播到整个比特币网络上,网络上的人都用A的地址(公钥)解密验证这条信息确实是由A发出,而通过历史交易数据计算出A的地址确实拥有100个比特币,于是整个网络公认此次转账操作,A钱包中存款减少100比特币,B钱包中存款增加100比特币。

非对称加密技术使得这个转账过程顺利实现,一切看起来都非常完美。但是其中有四个隐藏的问题:

1)整个网络这么大,什么时候才算转账成功?

2)上面说的是转账体系,那么货币创造体系是什么?没有央行负责发行,A的100比特币最初从哪里来?

3)A如果作弊怎么办?方法一、A如果没有100比特币,而发出转账信息,整个网络则不理会他,因为大家都有网络中所有交易信息,一计算就发现A没有那么多钱,因此转账无效。方法二、A确实有100比特币,但是他同时向网络发出两个转账信息,一个是转账100比特币给B,另一个是转账100比特币给C。由于网络上电脑非常多,网络传递也有随机性,所以有的电脑是先收到转账给B的信息,有的电脑是先收到转账给C的信息,那么最终这个网络以哪条信息为准?

4)所有帐户余额都是基于历史记录算出来的,那么如何确保“历史记录”安全完整?假如有人要攻击比特币体系,他没有办法伪造他人转账信息;但作为比特币体系中的一员,他如果恶意删除自己的部分历史转账记录会怎么样?

比特币系统创造性地发明了“挖矿”的概念,一举解决了上述四个问题。

(六)天才的挖矿

挖矿是比特币体系里让新人特别费解的事情,居然可以从网络上挖出比特币,从哪里挖?拿什么挖?挖矿是干什么?这完全是很科幻的一件事!

我们说过,比特币的本质就是一个互相验证的公开记账系统。而挖矿的本质则是在争夺记账权!从工作内容来看“挖矿”则是将过去一段时间内发生的、尚未经过网络公认的交易信息收集、检验、确认,最后打包加密成为一个无法被篡改的交易记录信息块,从而成为这个比特币网络上公认已经完成的交易记录,永久保存。

因为在比特币的世界里,每大约十分钟会向公开账本上记录一个数据块,这个数据块里包含了这十分钟内全球被验证的交易。因为所有的挖矿电脑都在尝试打包这个数据块提交,但是最后以谁提交的为最终结果,是需要争夺的。争夺记账权有什么好处?最终成功生成那个“交易记录块”的人,可以获得伴随这些交易而生成的交易费用外加一笔额外的报酬。交易费用一般都是转出资金方自愿提供给挖矿者的,因此不是系统新增的货币;额外的报酬是新生成的比特币--这就是比特币系统新增货币的方式。

比特币的有限性就由“额外报酬”数量来控制。依据比特币系统设计,大约每10分钟可以生产一个“交易记录块”,最初每生产一个“交易记录块”可以获得50比特币的额外报酬,这意味着比特币网络每天增加7200个比特币,但是该报酬每4年就会减半,因此最终整个系统中最多只能有2100万个比特币。目前已经经历了第一次减半,当前每个记录块的收益是25比特币。截至2013年11月2日,被生产出来的比特币一共是1194万多个。

随着整个网络计算能力越来越强大,截至2013年11月中,整个比特币网络的计算力已经超过世界Top500超级计算机总和的300倍以上,而且这个计算力还在飞速地上涨。普通电脑的计算力几乎没有任何机会抢到记账权。于是矿工们就自己组成矿池模式,和游戏组队打BOSS(游戏里的终极怪物)一样,如果矿池抢到了记账权,那么按照计算贡献来分配这次获得的收益。

那么电脑们是靠什么机制来争夺记账权?又是靠什么保证在计算力急速上升情况下,整个网络依然能够做到交易块生成速度不被加快,保持在10分钟左右一个?其实电脑们是在玩一个密码游戏,游戏叫哈希,更具体点就是前面介绍过的SHA-256算法。大家比的就是在十分钟内看谁找到一个值和上一个数据块的哈希以及十分钟内验证过的新交易记录合起来可以算出最小的哈希值。谁算出来的最小谁就抢到了记账权。同样至少要小于某个值才被允许有转发权,这个值越小对应的就是比特币网络的难度系数越高。由于哈希值的结果相当随机,无法预知结果大小,所以只能不断苦算,纯拼算力。如果这十分钟内没抢到记账权,就白算了,拿到新的区块后重新进入下一轮。

而之所以计算时要加上上一个块的哈希,是因为这样所有的数据块就被组成了一条可以从前到后不断验证的数据链条,当企图修改中间任何一个数据块的任何交易记录,都会导致从此之后的所有数据块的哈希无法验证成功,而如果企图修改记录后重新找一个合理值算出符合条件的哈希重新打包,那也意味着之后所有的数据块都需要重新寻找那个值来重算哈希,即使都找到了还必须比整个比特币网络计算的更快,才能让网络接受你的结果,这意味着攻击者要拥有超过整个比特币网络正义部分的计算力,换句话说要使用超过整个网络50%以上的计算力才能保证攻击有效。当找到一个有效的哈希值,就要迅速把生成的数据块转发出去,当别的矿工收到后,认为这个块更优秀,就会以这个块为基础进行下一轮的计算。如果期间收到更小哈希值的块,首先以数据链长度为优先,其次以哈希值更小为优先,抛弃之前的结果,在新的基础上继续进行下一轮计算。

刚刚提到的概念里面有一个很重要的叫转发权。比特币挖矿的难度是全网自动调整的,根据的是之前若干数据块生成的平均速度,如果低于10分钟,就把难度提高,如果高于10分钟就自动把难度降低。这是一个默认规则,每个客户端都会独立判断并遵守,并不需要统一的调度和安排。如果不遵守,显然你计算出来的数据块哈希达不到要求是无法得到其他矿工认同的。难度提升很简单,就是降低要求哈希值的下限,由于哈希算法的特性,这会造成计算量的指数级上升。当找到一个数可以计算出一个达到标准的哈希后,就可以把计算出的数据块广播出去,寻求别的矿工的认同,对于一次比特币交易来说,如果你的交易单正好在这个数据块中,就意味着获得了一次确认。当其他矿工在有你交易的数据块上继续工作把数据链延长,每延长一个块就意味着得到的确认加1。比特币网络认为是当一笔交易获得了6次确认,就认为这个交易已经得到了全网的认同,可以认为有效。

有人又会想攻击了,如果我准备6台电脑,为我的虚假交易确认6次有效,不就可以在短时间内骗到别人吗?对不起,当挖矿难度变高,企图用普通电脑为别人确认交易几乎是不可能的。所以比特币早期时Bitcoin-QT甚至自带了挖矿功能,后来随着全网算力的增长,这个功能纯粹变成鸡肋,后来就被取消了。

results matching ""

    No results matching ""