金属货币的世界靠天然的产量限制货币发行量,靠天然的化学属性进行防伪,靠天然的珍稀性保证购买力。
纸币的世界靠中央银行的领导和经济专家决定发行多少货币,靠不断提高制作工艺和更高级的验钞机进行货币防伪,靠国家力量来保证购买力。
而在比特币的世界,上面的规则通通失效。数字世界有自己的规则:通过数学,更确切地说是通过密码学保证比特币种种天方夜谭般不可思议的特性。
比特币数学基础
密码学和协议
说起密码学,大多数人想到的可能是摩斯电码、移位加密、字符 替换之类的东西。在各种侦探小说里,“字母e在英文里的出现频率最高”这种基本的破解方法也被很多人熟知。但真正说到密码学的研究内容,大家其实都比较陌 生。密码学关注的事情主要有两点:一是加密解密的数学算法本身,二是如何在现有算法基础上实现各种安全需求。
这两点有什么差别呢?以防止“消息泄露”举例,我们首先想到 的是防止消息在传输过程中被第三方截获,比如说话被偷听、邮件被偷看、网络数据被窃取。而事实上,小偷是防不住的,但我们可以保证数据即使被偷了,窃取者 也无法使用。只要双方事先约定一套加密解密的方法,以密文的方式传输信息,就可以有效地防止信息泄露。
但有时候消息泄露的内涵比这更复杂,加密算法的方案并不适 用。设想一下,公司某小组有10个员工,他们都想知道组内平均月薪是多少,但都不愿意透露自己的月薪数额,公司制度也不允许讨论薪水。有什么办法可以既得 到答案又不泄露各自薪水数额呢?其实办法很简单,甚至不需要用到密码学知识。第一个人随便想一个大数,比如12 345,接着在纸上写下自己月薪与这个数字之和并传给第二个人;第二个人再在这个数字上加上自己的月薪,然后将最新数字写到另一张纸上传给第三个人;直到 最后一个人把纸条传回第一个人,第一个人用字条上的最终结果减去只有自己知道的12 345,就得到了所有人的月薪总和,而且每个人都没有泄露自己的薪水。
以上两类情况分别对应了密码学的两个研究方向:密码学不仅研究加密解密的数学算法,更多时候,它还研究保护信息安全的策略,我们称之为“协议”。
哈希算法
现在设想这样一个场景:爱丽丝和同学鲍伯商量明天早上谁先去 教室打扫卫生。两个人都不想去,于是鲍伯想了一个办法:“我扔一枚硬币,你猜一下是正面朝上还是反面朝上。如果猜对了,我去打扫卫生。如果猜错了,嘿 嘿……”如果爱丽丝和鲍伯此时是面对面地站在一起,那么这个策略当然没有问题,可以说相当公平,甚至可以用更简单的办法,比如石头剪子布。可是,如果他们 是通过网络聊天的方式商量,那爱丽丝显然不会同意这个办法,因为她担心自己无论猜正面还是反面,鲍伯都会说她错了。
有什么办法可以保证通过网络聊天的方式也能做到公平扔硬币 呢?有人会说,那我们给扔硬币的结果加个密吧。现在假设任意奇数都代表硬币的正面,任意偶数都代表硬币的反面。鲍伯随便想一个数,然后乘以另外一个数,把 结果先告诉爱丽丝,比如1 234×531 = 622 254,鲍伯想的是1 234,然后把622 254这一结果告诉爱丽丝,并声称另一个秘密数字531是密钥,由他自己保管。但这样做显然也不行,因为验证结果的时候,鲍伯可以谎称1 234才是密钥,531是原始数字,这样鲍伯依然立于不败之地。但是如果鲍伯事先把密钥公布出来呢?这样也不行,因为爱丽丝知道密钥后就能直接计算出原始 数字,便失去了保密作用。
传统加密方法不能公开的原因是知道了加密方法也就知道了解密方法,只需要反向计算就能解密。那么,有没有一种加密方法,使得即使知道了加密方法,也不能恢复出原文呢?有的,我们只需要在加密过程中加入一些不可逆运算就行了。这次鲍伯又设计了一种新加密方式:
1.鲍伯先设想一个数,并加上123 456。
2.把结果平方,取第3~10位,组成一个8位数。
3.再用这个数除以456 789求余数,然后把这个结果告诉爱丽丝。
4.爱丽丝猜测鲍伯设想的是奇数还是偶数。
5.鲍伯告诉爱丽丝原始数字,爱丽丝按照上面的过程再计算一遍,看结果是否和鲍伯给的结果一致。
假设鲍伯想的依然是1 234,按照上面的过程依次得到:
1 234+123 456 = 124 690
124 690×124 690 = 15 547 596 100
54 759 610 mod456 789=401 719
(Mod表示除法求余数)
爱丽丝拿到的结果是401 719,既可以验证鲍伯有没有撒谎,同时爱丽丝又很难根据401 719反向算出123 456。
这样也不能绝对保证鲍伯不作弊,但如果鲍伯想作弊,他就必须事先找到一奇一偶两个数,它们按照上面的运算能得到一样的结果。这个难度取决于上面算法的难度。
在密码学中,这种会丢掉一部分信息的加密方式被称为“单向加密”,也叫作哈希算法。
一个可靠的哈希算法至少需要满足下面几个条件:
1.对于给定的数据M,很容易算出哈希值X = F(M);
2.根据X很难算出M;
3.很难找到M和N令F(M)=F(N)。
真实世界的哈希算法比上面的过程要复杂得多,但原理是类似 的。而且即使对于很长一段数据,仅仅改变一个字母,也会造成二次哈希结果的巨大差异。被认为安全且在互联网中被广泛使用的哈希算法包括MD5(消息摘要算 法第五版)、SHA-256等。比如“1 234”使用MD5算法计算的结果是“81DC9BDB52D04DC20036DBD8313ED055”,而用SHA-256算法计算出的结果是 “03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F97→←8D7C846F4”。哈希算 法的结果长度都是固定的,从上面看,MD5的结果长度为32个字符,SHA-256则达到64个字符,所以SHA-256看起来更安全一些,更难找到能算 出相同结果的M和N。
这种单向加密算法并不能用来进行普通的信息传输,更多是用来进行传输结果的准确性验证。很多下载网站都提供了下载文件的原始MD5值供校验,以防止文件被病毒修改。常用的BT(比特流)下载也是通过特定的哈希算法来确认每一部分数据是否下载完成。
非对称加密
现在我们来看一下在真正要进行信息传输的情况下应该怎么办。
同样假设爱丽丝和鲍伯要通过互联网传输一份绝密情报,那么, 如何阻止第三方在网络上截获信息呢?如果是一般情况,可能的步骤是使用文件压缩工具,比如WinRAR对文件进行加密压缩,然后通过电子邮件或者QQ把加 密的文件发过去,为了更安全,或许还会发短信或者打电话把解压密码告诉对方。但是作为绝密情报传输的操作人,面对的可能是国家机器,所有的网络和通信工具 都处于被监听状态,如果按照上面的过程,依然会造成信息泄露。如果想办法把密码加密后再发过去,但是给密码加密的方式又该如何确定呢?如果爱丽丝和鲍伯事 先认识,或许可以见面并约定将出生日期加上手机号作为密码,但更多情形下,双方并没有可以利用的公共秘密。
传统密码世界一直需要面对这样一个看似死循环的无解问题。这里我们有两种思路可以尝试解决。
第一种,专门设计一个秘密的加密算法,使对方即使拿到密码也 没有办法解密。如果是绝对的军事需求、能邀请高水平的数学家来确认算法的安全性,这样确实没有问题。但如果是互联网通用技术,如果不公开算法的细节,恐怕 没有人肯使用。密码学世界有一个柯克霍夫原则:即使密码系统的任何细节已为人熟知,只要密钥(key)未泄露,它也应是安全的。无论是在战争时期还是和平 时期,都不能把保密的希望寄托于系统或算法的秘密性。机械可以拆解,软件可以反编译。密码系统的所有细节总会被有心人一一拆解。这个时候,如果系统符合柯 克霍夫原则,那么即使对手拆解了系统但不知道密钥,他也没有办法破译加密的信息。满足这种严苛条件的密码系统才是安全的。
第二种方法更绝。要是有一种加密系统,加密和解密使用不同的 密码,假设有2个密码A和B,使用A对数据M进行加密得到加密数据X = F(A,M)。但是,知道A和X无法解密出M,必须用另一个密码B使得数据还原M = F(B,X)。爱丽丝只需公布密码A,鲍伯使用公开渠道拿到的A对情报进行加密,再通过任意方式发给爱丽丝进行解密,这样一来,即使所有的通信被监听,对 手也不可能拿到情报。当然,这里依然有一个缺陷,即鲍伯如何确定自己拿到的密码A确实是爱丽丝给出的,而没有被别人替换掉,不过这是另一个关于可信认证的 话题,暂时不在这里讨论。
如果使用我们设想的这些神奇加密算法,似乎问题就可以迎刃而解了,但问题是,这样的技术存在吗?听上去似乎并不可能,因为从直觉上判断,知道了加密方法就一定知道解密方法,只需要反过来计算就可以了。加密方法和解密方法是否可能不对称?
有可能!我们来看一个小时候经常在《趣味数学》这类书里看到 的数学小魔术:让对方任意想一个三位数,并把这个数和91相乘,然后说出乘积的最后三位数,就可以猜出对方想的是什么数字。比如对方想的是123,那么对 方就计算出123×91=11 193,并把结果的末三位193告诉我。看起来,这么做似乎损失了不少信息,我可能没法反推出原来的数。不过,我仍然有办法:只需要把对方告诉我的结果乘 以11,乘积的末三位就是对方刚开始想的数字了。可以验证一下,193×11=2 123,末三位正是对方所想的秘密数字!其实道理很简单,91乘以11等于1 001,而任何一个三位数乘以1 001后,末三位显然都不变(例如123乘以1 001就等于123 123)。先让对方用他所想的数字乘以91,假设乘积为X;我再在X的基础上乘以11,其结果相当于我俩合作把原数乘以了1 001,末三位自然就变了回去。X乘以11后的末三位是什么只与X的末三位有关,因此,对方只需要告诉我X的末三位就行了,这并不会丢失信息。知道原理 后,我们可以构造一个定义域和值域更大的加密解密系统。比如,任意一个数字乘以400 000 001后,末八位都不变,而400 000 001=19 801×20 201,于是你乘以19 801,我乘以20 201,一个加密解密不对称的系统就构造好了。我们甚至还可以构造一个更大的系统:4 000 000 000 000 000 000 000 000 000 001=1 199 481 995 446 957×3 334 772 856 269 093,这样我们就成功构造了一个30位的加密系统。这是一件非常酷的事情,任何人都可以按照这个方法加密一个数字,但是只有自己才知道怎么把所得的密文 变回去。
但如果仅仅按照上面的思路,如果对方知道原理,知道我要构造出带很多0的数,根据19 801和8位算法这两个条件其实可以比较容易地穷举出400 000 001这个目标值。要解决这个问题,我们来看看真实世界是怎么处理的。
RSA算法与椭圆曲线算法
直到1976年以前,所有的加密方法都是同一种模式:
1.甲方选择某一种加密规则,对信息进行加密;
2.乙方使用同一种规则,对信息进行解密。
由于加密和解密使用同一种规则(简称“密钥”),这被称为 “对称加密算法”。这种加密模式有一个最大的弱点:甲方必须把加密规则告诉乙方,否则无法解密。这样一来,保存和传递密钥就成了最让人头疼的问题。尤其是 人数多了之后,每两个人都要互相商量一个密钥,复杂性大大提高,而传递密钥则带来更高的安全风险。
直到1977年,李维斯特、沙米尔和艾德曼设计了一种算法, 可以实现非对称加密。这种算法用他们三个人的名字命名,叫作RSA算法。直到现在,RSA算法一直是应用最广泛的非对称加密算法。毫不夸张地说,只要有计 算机网络的地方,就有RSA算法。这种算法为什么这么晚才出现?或许类似的技术一直隐藏在“二战”的迷雾中不为人知。
这一非对称加密模式的流程如下:
1.乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。
2.甲方获取乙方的公钥,然后用它对信息进行加密。
3.乙方得到加密的信息后,用私钥解密。
由于公钥加密的信息只有私钥解得开,因此只要私钥不泄露,通信过程就是安全的。
RSA算法为什么更加安全呢?在数学世界里,有一些公认的、需要消耗极大计算量才能得出结果的难题,比如大数因式分解问题、离散对数问题、椭圆曲线问题。RSA算法正是用到了大数分解这一相当犀利的不对称难题。比如对于我们上面构造过的30位加密系统:
4 000 000 000 000 000 000 000 000 000 001=1 199 481 995 446 957×3 334 772 856 269 093
反过来算乘积非常容易,但是要把4 000 000 000 000 000 000 000 000 000 001分解成后面两个乘数,在没有计算机的时代几乎不可能成功!而一旦数字长达数百位,即使是超级计算机也需要耗费海量的时间来计算才有可能,下面给出两 个近年来的大数分解记录。
大数因式分解记录RSA200,一个共有200位的非特殊数 字,在2005年,计算机花了18个月时间才把它分解成两个素数。2007年3月6日,一个国际组织打破了这个保持了两年之久的纪录,来自3个机构(洛桑 联邦理工学院、波恩大学、日本电话电报公司)的计算机集群在经历了11个月的计算后,终于成功地把一个有名的很难分解的大数——2^1039-1分解为素 数因子。消息爆出后,一个匿名人士在网上贴出了下面的等式:
2^1039-1=p7×p80×p227
p7=5 080 711
p80=558 536 666 199 362 912 607 492 046 583 159 449 686 465 270 184→ ←886 376 480 100\52 346 319 853 288 374 753
p227=207 581 819 464 423 827 645 704 813 703 594 695 162 939 708 007→ ←395 209 881 208\387 037 927 290 903 246 793 823 431 438 841 448→ ←348 825 340 533 447 691 122 230\281 583 276 965 253 760 914 101→ ←891 052 419 938 993 341 097 116 243 589 620 659\72 167 481 161 749→ ←004 803 659 735 573 409 253 205 425 523 689
其中p7是已知的,p80×p227则大概是人类已经分解的最大整数(307个十进制位)。
椭圆曲线算法(ECC)则是另一种著名的非对称算法,在比特币体系里占据重要地位,是比特币钱包安全性的密码学基石,也是比特币被称为密码学货币(Cryptography)的原因。
ECC各方面的性能和RSA比起来几乎完胜:
1.安全性能更高。比如160位ECC与1 024位RSA有相等的安全强度。
2.计算量小,处理速度比RSA快得多。
3.存储空间占用小。密钥尺寸和系统参数与RSA相比要小得多。
4.带宽要求低。
ECC的这些特点使它逐渐取代RSA,成为通用的公钥加密算法。
比特币初接触:客户端的使用方式
客户端下载
首次使用比特币需要先下载客户端,可以在http://bitcoin.org 上选择不同种类的钱包软件。目前,钱包软件包括电脑钱包、手机钱包和在线钱包。从易用性和传承性的角度考虑,这一部分将以最早出现的客户端Bitcoin-QT为例。
下载、安装后,Bitcoin-QT首次运行时需要花费一段 较长时间进行数据同步,目前同步的数据量在10G左右。之所以有这么大的数据量,是因为Bitcoin-QT会下载比特币有史以来的所有交易记录(有些轻 量级客户端可直接从网络实时查询结果,无须同步如此庞大的文件)。待数据同步完毕,“余额”和“未确认”项显示的数据就是最新数据。
比特币地址
将Bitcoin-Qt切换到“接收”菜单,可以看到软件已经自动生成了一个地址,那一长串乱码般的字符就是我们的收款账号。至于这一长串东西是什么意义,凭什么作为账号,后文会统一回答。
比特币支付
为了支付,我们需要创建一个目标地址。可以在“接收”菜单下 通过“新建地址”功能直接创建一个标签为“test”的新地址。然后,在“发送”菜单下填上新创建的地址和要发送的金额,点击“发送”,这笔“钱”就发出 去了。待网络确认完成,将发送到我们的新账户“test”上。在“交易记录”菜单下就可以看到我们的操作记录以及网络确认次数,当确认次数达到6次,此次 交易便宣告成功。
如果需要用手机钱包支付,手工输入这么一长串地址显然是令人 担心的(其实输入错误肯定无法发送成功,因为错误的地址无法通过特定的算法验证)为解决这一问题,Bitcoin-QT提供了二维码的操作方式,直接用 “接收”菜单的“显示二维码”功能就可以另存为图片并把二维码发给对方,让对方通过手机扫描的方式直接支付,甚至可以直接填上希望支付的金额并生成带额度 和消息的二维码。
因为每个比特币地址上的金额流水全部是公开的,如果希望保密或者区分不同的付款人,可以为每个人单独生成一个地址并提供给对方,而不是像现实银行账户那样,要求对方增加一个尾数用于确认。在这里,每个人都可以为自己创建任意数量的账户(地址)。
备份钱包
比特币的钱包数据是保存在本地电脑上的,万一出现系统崩溃或 者中毒事件,导致数据丢失该怎么办?Bitcoin-QT提供了钱包文件备份功能,点击“文件”菜单下的“备份钱包”就可以把钱包文件导出,保存到安全的 地方。而恢复钱包也比较方便,只需把备份文件拷贝回上面的目录,重新打开Bitcoin-QT就可以看到备份钱包中的金额了。
加密钱包
在通常情况下,如果你的钱包文件被别人拿到,那么对方将拥有你所有额度的绝对支配权。这太危险了,尤其是当电脑中毒时。
Bitcoin-QT同样考虑到了这个问题,其应对之策就是 支持给钱包加密。在“设置”菜单下的“加密钱包”选项里可以设置密码,钱包加密功能会保护所有在该钱包中生成的比特币账号。这个密码类似支付宝的支付密 码,付款时需要输入,这样即使对方偷走了钱包文件也只能看余额而不能转账。
比特币再深入
上面简单介绍了比特币的使用,接下来,我们会思考一些更深入的原理问题,比如在一个没有中心的系统中如何产生有中心的效果,并将看到前面大段的密码学知识是如何建立起整个比特币系统的。
去中心化思想
百度百科“比特币”词条是这样定义比特币的:比特币是一种由 开源的P2P(Peer-To-Peer,点对点)软件产生的电子货币,是一种网络虚拟货币。比特币不依靠特定货币机构发行,它通过特定算法的大量计算产 生,比特币经济使用整个P2P网络中众多节点构成的分布式数据库来确认并记录所有的交易行为。P2P的去中心化特性与算法本身可以确保无法通过大量制造比 特币来人为操控币值。
这段描述充斥着计算机技术界的行话,但其最核心的思想很清晰 ——去中心化。去中心化的意思就是不由某个人或某个群体主导一切,而是大家集体参与、共同决定。在沟通方式低效的年代,这是一件非常奢侈的事情,但由于能 够保障所有人的权利、及时纠正可能的错误,所以人类社会形态也遵从这个思想,从中心化不断迈向去中心化。
进入互联网时代,由于沟通的便利性得到极大提升,去中心化思 想开始在各领域迅速扩张,任何人都可以在网络上表达自己的观点或创造内容。比如在读这本书时,你可能就一边翻着百度百科的词条,一边在豆瓣书评里吐槽,同 时还可能在微博里搜索别人是怎么评价比特币的。总而言之,在去中心化的世界里,所有人都是平等的,你可以给9分的电影打2分,但无法因此把9分拉低到哪怕 8.9分;你可以宣传自己,但无法封杀别人的观点。
“比特币之父”中本聪在设计比特币模型时就将其设定成去中心 化,其P2P网络模型和Facebook的架构类似。事实上,当技术条件成熟时,把去中心化的思想引入任何领域都将引爆群体智慧,都意味着这个领域将发生 颠覆性的变革,正如博客之于出版、微博之于媒体、Facebook之于社交、网游之于娱乐、选票之于政治。就连极度中心化的苹果也是因其去中心化的开发平 台App Store(应用商店)而大获成功。比特币则悄悄打开了金融业去中心化的第一扇窗户,这是第一个没有中央银行的货币体系,其货币的发行总量、发行速度、支 付验证方式在一开始就由去中心化的数学模型设定。
P2P架构和安全通信
上网时,我们经常遇到的是C/S架构(客户机/服务器架 构),例如新浪微博。这种架构的原理就是,大家一起连接到weibo.com,所有信息都储存在新浪服务器上,我们通过服务器中转信息进行交流。这种架构 的优点是简单快捷,但容易受到攻击。假如黑客把新浪微博黑了,或者新浪微博关了,整个体系就崩溃了。
还有一种架构叫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收到这条信息,用自己的私钥就能够轻松地解密这一信息。
那么,A怎么证明自己是这条信息的发送者呢?在网络上,任何人都可以把自己伪装成任何人,B收到信息时,可能传递信息给B的那台电脑会声称它就是A,那么B是否就轻易相信那台电脑就是A呢?不能,因为很可能是那台电脑伪装成A。
A要想证明给B的信息是由自己发出的,只需完成下面这两个步 骤:第一步,用A的私钥对原始信息做第一层加密;第二步,在上一步获得的数据基础上再用B的公钥做第二层加密。第一层加密的目的是为了证明这个信息是由A 加密并发出的,因为只有A的私钥才能完成这样的加密,这一步也叫作数字签名;第二层加密的目的是确保信息只有B能够解密,因为B的私钥只有B电脑才有。
B收到这个加密的信息后,以相反的顺序做两次解密操作即可: 第一步,用B的私钥解密收到的信息;第二步,在第一步获得的数据基础上用A的公钥再次解密。第一步顺利完成,可以确保信息只有B自己能够解密,其他人是无 法解密的;第二步顺利完成,B就获得了原始信息,同时也表明这条信息确实是由A的私钥加密生成,排除了是被别人伪造的可能。
有了这一技术保障,即使在匿名的互联网环境中,我们也不必再纠结于通信的安全性,而可以将注意力集中在比特币的体系架构上来。
比特币的本质
在网络上浏览比特币相关的网页时,总是可以看到各种印着 “B”符号的硬币,仿佛那就是比特币。实际上,那只是爱好者自己铸造的玩具,和比特币没有丝毫关系。比特币并不是任何有形的硬币,也不是大家想象的一段数 据,同样也没有办法把某些比特币从整个系统中分离出来。比特币的本质是一个互相验证的公开记账系统,其工作就是记录所有账户发生的交易。每个账号的每一笔 资金流动都被记录在账本里。而且,每个人手上都有一份完整的账本,每个人都可以独立统计出比特币有史以来每个账号的每一笔流动,当然,也能算出任意账号当 前的余额是多少。
这里最关键的一点在于:每人手上都有完整的账本,这个系统里没有任何人拥有唯一决定权。这意味着没有人可以决定向这个系统增加货币或者改变规则,因为个体的修改会被整个网络否决。除非有人可以修改50%以上的人手上的账本,这就是比特币系统里所谓的51%攻击。
比特币客户端Bitcoin-QT启动时会进行大量的数据同 步,Bitcoin-QT只告诉我们说这是在进行数据同步,但我们并不知道这是什么数据以及为什么要这么做。实际上,同步的是比特币世界的所有交易记录, 这部分数据保障了整个体系的去中心化和每个客户端的一切知情权。而不需要下载交易数据的轻客户端,如Electrum则是去几个提供交易数据查询功能的服 务器查询特定账号的记录,由于这些数据全部是公开的且带有严密的校验,任何查询服务器都没有必要也不可能伪造数据。所以,即使轻客户端带来了部分中心化效 果,实际上对全局的去中心化并没有什么影响。
比特币还有几个令人十分困惑的问题,就是我的地址里拥有的那 些币究竟在哪里?备份钱包是把里面的币备份了吗?在现实中,我们知道钱是什么,因为可以直接掏出来看;我们也知道自己的钱在哪里,要么是现金,要么存在银 行,要么在诸如证券交易所一类的机构。而比特币系统只是所有交易的记录,这里只关心某个账号里是否有币、有多少币,而币本身是抽象的,大家并不知道它具体 是个什么东西。某个地址拥有的比特币数额存在每个人的客户端数据里,大家都知道你有币就可以了。所以当我们备份钱包时,其实只是在备份对自己比特币地址的 所有权。
地址是什么
在现实生活中,如果需要一个银行账户,就需要去银行排队开 户,然后拿到银行分配的一串数字账号,之后才能使用银行功能。而在比特币体系里,我们的账户似乎并不需要谁来开设,本地客户端自动生成即可;我们不需要向 任何第三方公布,对方就可以直接向我们的账户转账;账户的形式也非常奇特,比如1H4AG73nXz5to9zWkH4GUZEH1Nuey8EVjJ。
刚接触比特币的用户印象最深的大概就是这一长串乱码般的地址,它给人的第一感觉是不明觉厉[3] ,第二反应就是特别容易输入错误。幸运的是,绝大部分时候并不需要手工输入比特币地址,通常是通过复制粘贴或者二维码扫描的方式。即便万一需要手工输入,比特币地址的校验机制也会提醒你账号不正常,以免出错。
可是,这一串地址到底是什么?会不会和别人的重复?
这里先回忆一下前面讲过的非对称加密技术。简单来说就是通过 一套数学办法,产生一对密钥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个比特币。
非对称加密技术可以使这个转账过程顺利实现,一切看起来都非常完美,但是其中有4个隐藏的问题:
1.整个网络这么大,什么时候才算转账成功?
2.上面说的是转账体系,那么货币创造体系是怎样的?没有央行负责统一发行,A的100个比特币最初是从哪里来的?
3.A如果作弊怎么办?方法一:A如果没 有100个比特币而发出转账信息,整个网络则不理会他,因为大家都拥有网络中所有的交易信息,一计算就会发现A根本没有那么多钱,因此转账无效。方法 二:A确实有100个比特币,但他同时向网络发出两个转账信息,一个是转账100个比特币给B,另一个是转账100个比特币给C。由于网络上电脑非常多, 网络传递也有随机性,所以有的电脑是先收到转账给B的信息,有的电脑是先收到转账给C的信息,那么最终这个网络以哪条信息为准?
4.所有账户余额都是基于历史记录算出来的,那么如何确保历史记录安全而完整?假如有人要攻击比特币体系,他没有办法伪造他人转账信息,但作为比特币体系中的一员,他如果恶意删除自己的部分历史转账记录会怎样?
比特币系统创造性地发明了“挖矿”的概念,一举解决了上述4个问题。
天才的挖矿
挖矿是比特币体系里让新人特别费解的事情,居然可以从网络上挖出比特币,从哪里挖?拿什么挖?挖矿的本质是什么?
比特币的本质就是一个互相验证的公开记账系统,而挖矿的本质 就是争夺记账权!从工作内容来看,挖矿就是将过去一段时间内发生的、尚未经过网络公认的交易信息收集、检验、确认,最后打包加密成为一个无法被篡改的交易 记录块,从而成为这个比特币网络上公认的已经完成的交易记录,永久保存。
在比特币的世界里,大约每10分钟就会在公开账本上记录一个数据块,这个数据块里包含了这10分钟内全球被验证的交易。所有的挖矿电脑都在尝试打包这个数据块并提交,但以谁提交的为最终结果则是需要争夺的。
争夺记账权有什么好处?最终成功生成那个交易记录块的人,可以获得伴随这些交易而生成的交易费用外加一笔额外的报酬。交易费用一般都是转出资金方自愿提供给挖矿者的,因此不是系统新增的货币;额外的报酬是新生成的比特币,这就是比特币系统新增货币的方式。
比特币的有限性就由额外报酬的数量控制。依据比特币系统的设 置,大约每10分钟可以生产一个交易记录块,最初每生产一个交易记录块可以获得50个比特币的额外报酬,这意味着比特币网络每天增加7 200个比特币,但是该报酬每隔4年就会减半,因此最终整个系统中最多只能有2 100万个比特币。目前已经经历了第一次减半,当前每个记录块的收益是25个比特币。截至2013年7月14日,被生产出来的比特币一共是1 140万个。
随着整个网络计算能力越来越强,截至2013年7月中旬,整 个比特币网络的算力已经超过世界前500位超级计算机总和的20倍以上,而且这个算力还在飞速上涨。普通电脑的算力几乎没有任何机会抢到记账权。于是, “矿工”(参与者)们就自己构建矿池模式,和游戏组队打BOSS(难度较大、奖励较高且出现在最后的关键时刻的人物或怪物)一样,如果矿池抢到了记账权, 那么就按照计算贡献来分配这次获得的收益。
那么,电脑是靠什么机制争夺记账权?在算力急速上升的情况 下,它们又是如何使整个网络的交易记录块生成速度,保持在10分钟左右一个?事实上,电脑是在玩一个叫哈希的密码游戏,更具体点就是SHA-256算法。 大家比的就是,在10分钟内谁能找到一个值和上一个数据块的哈希值以及10分钟内验证过的新交易记录合起来可以算出最小的哈希值。算出最小哈希值的那个人 就抢到了记账权。同样,至少要小于某个值才有转发权,这个值越小,对应的就是比特币网络的难度系数越高。由于哈希值的结果相当随机,无法预知大小,所以只 能不断苦算,纯粹是拼算力。如果在这10分钟内没能抢到记账权,那之前的努力就白费了,拿到新的区块后会重新进入下一轮。
之所以计算时要加上上一个数据块的哈希值,是因为这样一来, 所有的数据块就被组成了一条可以从前到后不断验证的数据链条。修改中间任何一个数据块的任何交易记录,都会导致之后的所有数据块的哈希值验证失败;如果企 图在修改记录后重新找一个合理值算出符合条件的哈希值并重新打包,那也意味着之后所有的数据块都需要重新寻找那个值来重算哈希值,其计算速度还必须比整个 比特币网络更快,只有这样才能让网络接受你的结果,这就意味着攻击者要拥有超过整个比特币网络正义部分的算力,换句话说,要使用超过整个网络50%以上的 算力才能保证攻击有效。当找到一个有效的哈希值时,就要迅速把生成的数据块转发出去,其他矿工收到后,认为这个数据块更优秀,就会以这个块为基础进行下一 轮的计算。如果期间收到更小哈希值的数据块,首先考虑数据链长度,其次是哈希值更小,抛弃之前的结果,在新的基础上继续开展下一轮计算。
刚刚提到了一个很重要的概念——转发权。挖矿的难度是全网自 动调整的,其依据是之前若干数据块生成的平均速度:如果低于10分钟,就把难度提高;如果高于10分钟,就自动把难度降低。这是一个默认规则,每个客户端 都会独立判断并遵守,并不需要统一调度和安排。如果不遵守,你计算出来的数据块哈希值就达不到要求,也就无法得到其他矿工的认同。难度提升很简单,就是降 低哈希值的下限。由于哈希算法的特性,这会使计算量呈指数上升。当找到一个可以算出达到标准的哈希值的数字后,就可以把算出的数据块广播出去,寻求其他矿 工的认同。对于一次比特币交易来说,如果你的交易单正好在这个数据块中,就意味着获得了一次确认。当其他矿工在有你交易的数据块上继续工作并把数据链延长 时,每延长一个块就意味着多得到一次确认。比特币网络的规则是,若一笔交易获得了6次确认,就认为这个交易已经得到了全网的认同,可以认定为有效。
有人可能会反驳说,如果我准备6台电脑,为我的虚假交易确认 6次有效,不就可以在短时间内成功骗到别人吗?对不起,当挖矿难度变高,企图用普通电脑为别人确认交易几乎是不可能的。所以,在比特币诞生初 期,Bitcoin-QT甚至自带了挖矿功能,随着全网算力的提高,这个功能纯粹鸡肋,就取消了。
比特币的其他特性
比特币作为纯粹的互联网产物,由于其纯数据特性,故而具有一些和现实货币迥异的、极具颠覆性的特点,为我们带来了另一个维度的思考。
匿名和公开
由于没有传统世界银行的开户行角色,比特币系统是纯匿名的。 虽然我们可以根据本地完整的交易记录查询每个账号的流水信息,但无法将账号和现实的人对应起来。只要愿意,每个人都几乎可以拥有无数个地址。同样,没有任 何人有权力操纵他人账号上的比特币。这是在人类历史上,第一次从技术上保障了私人财产的神圣不可侵犯、不可追踪、不可冻结。
然而,虽然比特币系统是匿名的,但若某个组织愿意公开自己的 比特币账号,那么整个网络都可以随时追踪到该账号的所有流水信息。每一笔的到账时间、数额和支出都可以清晰地看到,相当于直接查询银行内部原始账单!对于 非政府组织来说,这有助于大幅降低账目维护成本,而且能够保证百分百透明。2013年芦山地震时,壹基金就曾接受比特币捐赠,其比特币账目在网络上清晰可 查。
纸钱包和脑钱包
只要拥有对应的私钥,就意味着拥有特定比特币地址上比特币的 所有权。我们通常将私钥藏在钱包文件里,事实上,它经过编码也只是一个字符串,只是比地址略长一些,我们完全可以把它抄下来或者制成二维码打印到一张纸 上,然后放到相对安全的保险柜里。那个字符串就承载了你全部的比特币财富!
基于比特币的一个更有意思的创造是脑钱包,其神奇之处完全超乎想象!在正常情况下,私钥和比特币地址一样难记,而在http://brainwallet.org 上,通过一句话就可以生成一对公钥和私钥。只要能记住这句话,你就可以根据它再次生成私钥,在任何有网络连接的地方提取比特币。这意味着可以把自己所有的 财富储存在大脑里,而不依赖任何外在的东西。但是,生成脑钱包一定要尽量选一句全球唯一的话,不然“撞车”的机会就会大大增加。当然,这其实并不难,比如 想一句:木匠张小明和老婆赵小花的小儿子叫波波。这样一句话大概是很难被别人也想到的。不过由于加入了人工因素,被猜中的概率大大增加,所以脑钱包并不是 特别推荐,除非你明白自己在干什么。
可证明和不可证明
想象一下,假如你使用的是脑钱包,这个世界上将没有任何证据可以证明你拥有这么一笔钱。除非失忆或者死亡,否则这笔钱将一直存在。
同样,非对称数字签名技术可以轻易证明你拥有某个地址上的财富。只需使用私钥加密一条信息并发布出来,大家就可以确认你对该账户的拥有权,而无须把私钥公开,这同样适用于证明一笔匿名支付确实是你操作的。Bitcoin-QT客户端自带这个功能。
丢失不可找回
由于比特币去中心化以及几乎不可破解的特性,如果丢失了钱包文件(私钥),就意味着这个账号上的比特币彻底丢失了,神仙也无能为力。这里可没有拿身份证找回这码事。
当然,如果只是钱包文件的密码忘记了,那还可以尝试暴力破解;但若是钱包文件丢了,那就彻底没辙了。要知道,即使在真实世界里,许多特工的生命安全都是建立在椭圆曲线算法的强壮性上。
[3] 不明觉厉,网络用语,意思是“虽然不明白是什么,但好像很厉害的样子”。
来源:我是码农,转载请保留出处和链接!
本文链接:http://www.54manong.com/?id=218