区块链与比特币(上)

汪诘
2019-11-01 17:11

区块链,成为这两年最火的互联网字眼,但估计大多数人都只是听着耳熟,并不真正了解。

与区块链一起出现最多的词是比特币,显然,它们之间肯定存在某种紧密的关系。

本文是一篇深度介绍比特币和区块链知识的文章,我努力按照“自顶向下、逐次求精”的原则,将比特币和区块链知识像剥洋葱一样,一层一层地深入下去,让读者每剥下一层都有完整的知识收获。

去中心化

本文图片均来自“读库”微信公众号

区块链原本是一种基于互联网的信息编码、传输、加密、解密、验证技术,但在我看来,现在已经上升到了一种“去中心化”的理念,本质上是一种理念上的革新。而比特币就是这种理念的一个具体应用。

打个比方来说,区块链就相当于电子商务,你想想二十年前有几个人搞得懂什么是电子商务,它本质上也是一种理念,只不过这种理念必须要借助一定的技术手段来实现。而比特币就相当于淘宝网,是电子商务的一个具体应用。

所以,我们要理解什么是区块链,必须先理解什么是去中心化。我举两个例子来帮助你理解:

第一个例子是从网上下载电影。最早的时候,我们下载电影都是到一些知名的电影下载网站,这些网站会把电影文件存放在一台或者一组服务器上,大家都访问这台(组)服务器下载影片。这叫中心化。

在这个游戏规则中,电影网站的服务器就是中心,每一个下载电影的人只不过是这个中心拉出来的线而已。中心化的游戏中,玩家的地位是不平等的,网站主占据绝对强势地位,他想让你下载就下载,想给你限速就限速。

后来,一种去中心化的下载模式出现了,这就是BT下载,也叫P2P(peer to peer)下载。现在我们讲到P2P,一般是指那种个人借贷的网站,但最初的概念是从BT下载来的,P2P就是个人到个人,点到点。BT下载的原理与电影网站完全不同,影片并不是存在某个服务器上,而是大家互相从网络上的每一个人那里去下载这个影片的一小部分,最后拼成一个完整的文件。

在这个游戏中,所有玩家的地位是完全平等的,任何一个玩家都可以随时离场、随时加入,只要还有人在玩,整个游戏就能正常运行,没有人拥有特别的权力。这就叫去中心化。

第二个例子,就是我们每天都在使用的银行卡或者支付宝、微信这些人民币支付手段,现金我们先抛开不谈。我们用无现金的方式支付人民币买东西,就是一个中心化的游戏,它的中心有好多级,比如说,支付宝的服务器是第一级中心,支付宝资金的托管银行如工商银行、中信银行的服务器就是第二级中心,这些银行的再上一级中心就是央行——中国人民银行的服务器。

在这个游戏中,不同级别玩家的权力、地位是不平等的,最大的Boss当然是央行,它甚至能发行货币,它的权力可以大到分分钟就把我们的钱全部抢光,很简单,它只需要突然增发货币就可以了,物价突然上涨一百倍,我们的钱就等于被抢光了。那货币游戏能不能像下载电影一样去中心化呢?也是可以的,比特币系统就是这样一个去中心化的货币游戏系统,你可以把它看成是一个大型的货币实验。

比特币的游戏是这么玩的,就两条核心规则。第一,它的货币发行不是由某个机构说了算,而是公开一套算法,每算出一个符合要求的数字,就相当于挖到了若干个比特币。谁都可以去算,绝对公平,谁也作不了弊,因为算法本质上就是一个个数字去凑,凑出一个算一个。第二,比特币的交易信息不是记在某一台服务器上的,而是所有参与这个游戏的玩家电脑中一人一份,同步记录,这种交易记录在理论上几乎是无法篡改的。

这就是“去中心化账本”。

这样一来,所有游戏玩家的地位和权力就完全平等了,几乎没有任何一个玩家是特殊的。为什么要加上“几乎”两个字呢?因为,毕竟能够有能力挖比特币的那些矿主还是有点特殊的,但这种特殊性并不是太大,而且矿主也没有任何壁垒,只要你买得起好电脑,谁都可以当矿主。

不得不说,比特币的这个“去中心化”设计非常之妙。它的发明人,神秘的中本聪(Satoshi Nakamoto)确实是棵“大葱”。

理解了去中心化,就等于理解了区块链。一个真正的区块链项目,就是通过合理的游戏规则设计,辅以信息技术,来践行去中心化理念的项目。比特币系统就是去中心化理念和区块链技术的一个优秀示范项目。

不夸张地说,我觉得这是一场互联网的理念革命,是人类的又一次平等化革命。上一次革命是打破了人与人之间在身份地位上的不平等,这一次则是打破了游戏规则本身的不平等。正因为这样,区块链才能激发人们如此大的热情,这是一个听上去可以颠覆一切旧规则的新生事物。

然而,在我看来,比特币系统并不是一个成功的区块链应用,甚至先天不足。为什么这么说呢?因为,看前面介绍的两条比特币核心游戏规则就知道,它有以下这些天生的缺陷:

第一,比特币客户端软件需要巨大无比的存储空间,因为每一个节点都必须记录下从比特币系统诞生的第一天起所有的交易记录,截止到本文写作时(2018年2月13日),这个交易记录文件已经有147GB那么大了,而且只会增加不会减少。

第二,为防止有人作弊,比特币系统有一套很复杂的游戏规则来确保交易记录是真实的,这样就导致每一笔交易的确认时间一般需要一个小时甚至几天。想想吧,如果用比特币去街边买杯奶茶,会是什么情况。

第三,最多只有2100万枚比特币,而且,无论有多少人在挖矿,系统规则决定了平均每十分钟才能产出若干枚比特币(2018年是每十分钟12.5枚)。矛盾正如那句话:人民群众日益增长的比特币需求与比特币总量不足之间的矛盾。

比特币不能代表区块链,区块链也不是比特币。区块链在未来可以有哪些应用呢?

实际上,区块链解决的核心问题是信任问题。所有的金融机构,银行、保险、券商等等,让它们赖以生存的根本是信用,我们之所以会放心地买股票、买期货、买纸黄金,都是因为我们信任充当交易中介的机构,而这些交易中介,就是金融活动的中心,我们宁愿为此付出一定的手续费、交易费,金融机构也因此挣得盆满钵满。

但是,当区块链在人们的观念上和技术上都成熟后,这种中心化的金融机构是有可能被颠覆掉的,因为我们可以利用区块链的理念和技术来改写游戏规则,让所有的金融产品交易都不再需要一个中心,而全部以点对点的方式完成,并且从理论上能够保证信用问题。

到了那时,银行还需不需要我不知道,因为银行还涉及更复杂的国家利益问题,但是,一定会有很多商业金融机构受到区块链的冲击。

再比如,公证也是一个典型的中心化的贩卖信用的机构,区块链完全可以改写公证行业。关于区块链的应用,后文还会有详细阐述。

到此,我们对比特币和区块链建立起了总体概念,接下来,我要帮你剥掉下一层洋葱皮,了解一下比特币系统的基本原理。

比特币基本原理

数字指纹和非对称加密

去中心化的账本还是很容易理解的,只要把所有的交易记录都记在每一台电脑的账本上,然后就可以用计算机的强大计算能力,随时随地查出每个人的余额是多少。

但是大家不要忘了,在网络上记账与线下记账不同。网络上都是消息来消息去的,大家根本不见面。

如果你收到一条信息,上面写着“A支付5元钱给B”。这时,你不禁要问:

第一,如何确保这条信息内容的完整性?第二,如何确保信息的真实性?这两个问题不解决,去中心化账本的理想就无法实现。解决办法是有的。我们先来看怎么解决第一个问题:确保记账信息的完整性。

这里要引入一个概念,就是数字指纹(很多文章中也叫数字签名、哈希值)。电脑上的任何信息,按照国际统一的编码标准,最终都是以0和1来存储,这就是大名鼎鼎的二进制。例如“钱”这个字用二进制表示就是“1001010010110001”,再比如“A支付5元钱给B”这句话,用二进制表示就是:

0100000111001010010111110011101101100000110101101000101000011100101001011000111111101101100101000010

普通人看到二进制往往无法和数字建立联系,实际上,这串二进制数字也可以用一组十进制的数字来表示,它们完全相等:

100000111001010080606408664086260086008422488464406842602666664446622202242228042826680682422068400

看到了十进制的数,很多人才会认为这确实是一个“数字”。这就是数字指纹了吗?还不是。

二进制和原始信息只是一一对应的编码关系,一个英文字母或者数字对应8个比特,一个中文字符对应16比特,原始信息越长,二进制编码也越长。任何原始信息都可以转换成一串数字,有了数字就可以做数学运算,玩出各种花样了。

现在,我们给数学家提出一个要求:请设计一个算法,将任何一条信息,不论长短,都计算出一个唯一的“数字指纹”与它对应。但有两个附加条件:一、指纹的长度必须固定;二、只能从“原始信息”计算出“指纹”,谁也无法从“指纹”反向计算出“原始信息”。

这个要求,看似很过分,但是难不倒数学家。1993年,美国国家安全局发布了SHA算法,全称是Secure Hash Algorithm,中文一般翻译为“安全散列算法”或者“安全哈希算法”,这个名称估计把你吓到了,听着特学术(我有时候会听人说“嘻哈算法”,忍不住偷笑一下,各位千万别读错)。

Hash这个词没有对应的中文意译词,如果让我来意译的话,我会翻译为“数字摘要算法”,基本上能表达该算法的含义,就是从目标对象中提取出一个特征摘要,好像人的指纹一样。

SHA算法从1993年发布它的第零代,一直到2015年发布第三代,二十二年间已经升级了四次。比特币用到的是第二代算法,简称为SHA-256算法,这里的“256”表示,由这个算法生成的指纹长度固定为256比特。大家可以很容易在网上找到在线生成SHA-256指纹的网页,这个算法是公开的,谁都能用,例如,“钱”字的SHA-256指纹是:

0000111010111000011000111100011110001101101000111110001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

“A支付5元钱给B”的SHA-256指纹是:

1111011110111011001010011011101011011111000001011101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

大家看到,不论原始信息有多长,生成的指纹都是一样长的。而且这个指纹还有两个显著特点:一、原始信息只要改变一点点,哪怕只改动一个数字,整个指纹就会发生巨大的变化,毫无规律可循;二、截至本文写作时,世界上还没有任何公开的方法可以从指纹反向计算出原始信息,普遍认为理论上无法破解。

不过,在实际的使用中,256位的二进制数据太长了,使用起来极不方便,还很容易看花眼。于是,指纹通常用十六进制来显示,反正二进制到十六进制是一一对应的。

“钱”的十六进制指纹是:

0eb863c78da3e38b6b92d1f3999566e5d8e17a6f700a112c8993cf6bfc48f70b

“A支付5元钱给B”的十六进制指纹是:

f7bb29badf05d41e60b1036d749f134a901c7a97daef7a1fe4e1e14471bd4833

这样看起来就简洁多了,我们可以试一下把“5元钱”改为“6元钱”,看看指纹的变化有多大,下面是改后的指纹:

1d48da12b0fb29efe6f690185922f96d259bd887343735898bfc3901a83b58c3

看到了吧,仅仅改动了一个数字,但指纹几乎没有一位是相同的。这就是SHA算法的神奇之处,也确保了指纹没有规律可循,无法被反向破译。

有了数字指纹,就可以解决第一个问题:确保记账信息的完整性。怎么做?很简单,我们只要做出一个规定,任何发出信息的一方,必须同时发出原始信息的指纹。那么收到信息的一方只需要用公开的SHA-256算法把原始信息也生成一个指纹,和收到的指纹比对一下,如果一致,就说明收到的信息是完整的;如果不一致,说明收到的原始信息由于某种原因被修改过了,这个原因可能是数据传输过程中的错误,也可能是被人篡改了等等。

那会不会有一种巧合,原始信息和指纹都因为某些传输错误发生了改变,恰好错误的指纹数据就是出错后的原始信息指纹,也就是负负得正了?这事当然不是绝对的不可能,但是从概率上来说,想要自然发生,大概等到宇宙灭亡了也不会发生一次,概率已经低到可以彻底忽略。

不过,你可能也想到了,还有一种可能性,就是黑客恶意篡改。因为SHA算法是公开的,如果有一个黑客拦截了原始信息和指纹,他把原始信息修改掉,比如把“A支付5元钱给B”改为“A支付5元钱给C”,同时生成新的指纹发送给你。这该怎么办呢?这就是我们要解决的第二个问题:如何确保信息的真实性?解决这个问题,等于也解决了信息发送方想抵赖的问题。

解决第二个问题的关键就是给指纹加密,但是,这种加密还不能是我们在谍战剧里看到的那种电报加密的方式。大家不妨回忆一下看过的谍战剧,我地下工作者收到一封电报,上面写着2352,于是他从书架上拿出一本书,翻到第23页,再数到第52个字,写着一个“撤”字。这就是组织上通知这位同志马上撤退,有人叛变了。这种加密方式的坏处在于,只要敌人也掌握了密码本,不但可以破译电报,还能发送假电报钓鱼,原因就在于加密和解密的方法是完全一样的,能解密就能加密,所以,这种加密方法被叫作“对称加密”,解密的过程只不过是加密的逆过程而已。

“对称加密”用在我们想要的去中心化账本系统中就不好使了,因为我们既要让网络上的每一个信息接收者能够解开密文知道原始信息,又要让黑客即使拿到密文也只能干瞪眼,无法篡改密文。

个中关键,在于加密和解密的方法必须不一样。所以,就要求数学家搞出一种全新的加密算法,这种算法是非对称的,加密、解密不是互逆的过程。

能不能搞出这样一个巧妙的加密算法呢?当然是能的,否则就不会有比特币了嘛。下面我用一个简化版的非对称加密算法模拟一下我们想实现的效果。

原始信息是一组数字:269。

现在,我用一种只有我自己才知道的加密算法得到一个密文:24479。

然后,我把24479告诉所有人的同时,还宣布:解开我这条密文的钥匙就是数字11(后面我们就把这个公开的钥匙称为公钥),任何人只要用24479乘以11,取结果的后三位,就能得到我想要告诉大家的原始信息。不信吗?我们试试看:

24479×11=269269

哇,好有意思,不单后三位,连前三位都是原始信息。我是怎么加密的呢?很简单,我把原始信息乘以91就是密文,而这个91就可以叫“私钥”,我私人的加密钥匙。这样就实现了加密和解密是完全不一样的两种算法。

你可以试试看,用任意一个三位数字乘以91,得到的结果再乘以11,最终得到的结果一定是原始三位数写两遍。例如:218×91×11=218218。

如果用任意一个二位数字乘以91,得到的结果再乘以11,最终得到的结果后二位数字也一定与原始数字相同。例如:18×91×11=18018,至于它背后的数学原理,稍微琢磨一下就能想明白了。

但是请记住,我举的这个例子只是让你体会一下什么叫非对称加密,因为这个例子的算法太过简单,所以知道了公钥是11的人,很容易猜出私钥是91。但是比特币系统采用的算法比这个复杂多了,那个算法确保了任何人即使知道原文、密文、公钥,也无法猜到私钥。也就是说,黑客只能解密,但不会加密,无法修改密文。

这么牛的算法,就是声名远播的“椭圆曲线算法”,简称为ECC算法。

它是在1985年由两位美国人尼尔·库伯利兹(Neal Koblitz)和维克托·米勒(Victor Miller)分别独立提出的。在密码学中的广泛使用,也就是最近十多年的时间,数学家真的很厉害。有了这个算法,就能确保去中心化的记账系统中,每条交易记录的真实性。我们来演示一下比特币的去中心化记账系统如何利用SHA和ECC算法确保账本的完整性和真实性(以下是简化后的原理说明,真实过程还要复杂很多,但原理不变)。

需要记账的原始交易信息:A支付5元钱给B(以下简称“原文”)。

第一步:利用SHA将原文生成数字指纹:

f7bb29badf05d41e60b1036d749f134a901c7a97daef7a1fe4e1e14471bd4833

第二步:随机生成一个私钥,它的格式与指纹是完全一样的,例如:

18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725

第三步:利用ECC将第一步得到的数字指纹通过私钥加密,得到密文:

869ac57b83ccf75ca9da8895823562fffb611e3c297d9c2d4612aeeb32850078

第四步:根据私钥生成一个公钥:

600FFE422B4E00731A59557A5CCA46CC183944191006324A447BDB2D98D4B408

第五步:将原文、密文和公钥广播到整个比特币网络中。信息发送步骤到此结束,以下是信息接收步骤。

第六步:接收方利用ECC将密文通过公钥解密,得到指纹1。

第七步:利用SHA将原文生成数字指纹,得到指纹2。

第八步:比对指纹1是否等于指纹2。

第九步:如果相等,则确认该条信息是合法交易信息,添加到自己的账本中。如果不相等,则抛弃该信息。至此全部结束。在真实的比特币网络中,交易双方都是完全匿名的,交易者A或者B都是账号(有些文章中称“地址”,含义一样),账号背后的主人信息是没有任何记录的,可以是一条狗,也可以是一个人工智能,而账号则是根据公钥,通过一定的算法生成的。

一个私钥几乎可以生成无数个不同的对应公钥,也就意味着可以生成几乎无数个不同的对应账号。谁掌握了私钥,谁就是账号的主人。

在比特币网络中,私钥是动用账号中比特币的唯一凭证,如果你的私钥被盗,你就永远失去了它,打官司也要不回来,因为没有任何方式可以证明他的私钥是从你这里偷走的。

(未完待续,请看下篇)

(作者汪诘为科普作家,本文原刊《读库1802》,微信首发于公众号“读库”(ID:dukubook),澎湃新闻获授权转发。)

    责任编辑:蔡军剑