这两年互联网江湖最火的词是什么?
区块链!
我估计大多数人都是听着耳熟,但并不理解到底什么是区块链,好多人以为是某种跟物流有关的技术,我第一次听到时就是这么以为的。与区块链一起出现最多的词是“比特币”,显然,它们之间肯定存在某种紧密的关系。
没有一定计算机基础的同学,你就算是去查各种百科,我估计你也一时半会儿闹不明白区块链是啥概念,和比特币的关系又是什么?
本文是一篇深度介绍比特币和区块链知识的文章,考虑到篇幅很长,我努力按照“自顶向下逐次求精”的原则,让你将比特币和区块链知识像剥洋葱皮一样,一层一层地深入下去,每剥下一层都有完整地知识收获。
区块链原本是一种基于互联网的信息编码、传输、加密、解密、验证技术,但在我看来,现在已经上升到了一种“去中心化”的理念,本质上是一种理念上的革新。而比特币就是这种理念的一个具体应用。打个比方来说,区块链就相当于电子商务,你想想二十年前,有几个人搞得懂什么是电子商务,它本质上也是一种理念,只不过这种理念必须要借助一定的技术手段来实现。而比特币就相当于淘宝网,是电子商务的一个具体应用。
所以,我们要理解什么是区块链,必须要先理解什么是“去中心化”。我举两个例子来帮助你理解:
第一个例子是从网上下载电影。最早的时候,我们下载电影都是到一些知名的电影下载网站上去下载,这些网站会把电影文件存放在一台或者一组服务器上,大家都访问某台服务器下载影片。这就叫中心化,在这个游戏规则中,电影网站的服务器就是中心,每一个下载电影的人只不过是这个中心拉出来的线而已。中心化的游戏中,玩家的地位是不平等的,网站主占据绝对强势地位,他想让你们下载就下载,想给你们限速就限速。后来,一种去中心化的下载模式出现了,这就是 BT 下载,也叫 P2P(peer to peer)下载,现在我们一般讲到 P2P指的都是那种个人借贷的网站,但是最初的概念是从 BT 下载来的,P2P 就是个人到个人,点到点。BT 下载的原理与电影网站完全不同,影片并不是存在某个服务器上的,而是大家互相从网络上的每一个人那里去下载这个影片的一小部分,最后拼成一个完整的文件,在这个游戏中,所有玩家的地位是完全平等的,任何一个玩家可以随时离场、随时加入,只要这个游戏还有人在玩,整个游戏就能够正常运行,没有人拥有特别的权力。这就叫去中心化。
第二个例子就是我们每天都在使用的银行卡或者支付宝这些人民币支付手段,现金我们先抛开不谈。我们用无现金的方式支付人民币买东西,就是一个中心化的游戏,它的中心有好多级,比如说,支付宝的服务器是第一级中心,支付宝资金的托管银行工商银行、中信银行的服务器就是第二级中心,这些银行的再上一级中心就是央行人民银行的服务器。在这个游戏中,不同级别玩家的权力、地位是不平等的,最大的 Boss 当然是央行,它甚至能发行货币,它的权力可以大到分分钟就把我们的钱全部抢光,很简单,它只要突然增发货币就可以了,物价突然上涨 100 倍,我们的钱就等于被抢光了。那货币游戏能不能像下载有一样也去中心化呢?也是可以的,比特币系统就是这样一个去中心化的货币游戏系统,你可以把它看成是一个大型的货币实验。
比特币的游戏规则是这么玩儿的,就两条核心规则,第一,它的货币发行不是由某个机构说了算,而是公开一套算法,每算出一个符合要求的数字,就相当于挖到了若干个比特币。谁都可以去算,绝对公平,谁也做不了弊,因为算法本质上就是一个个数字去凑,凑出一个算一个。第二,比特币的交易信息不是记在某一台服务器上的,而是所有参与这个游戏的玩家电脑中一人一份,同步记录,这种交易记录在理论上几乎是无法篡改的。这就是去中心化账本。这样一来,所有游戏玩家的地位和权力就完全平等了,几乎没有任何一个玩家是特殊的。为什么要加上几乎两个字呢,因为,毕竟能够有能力挖比特币的那些矿主还是有点特殊的,但这种特殊性并不是太大,而且矿主也没有任何壁垒,只要你买得起好电脑,谁都可以当矿主。
不得不说,比特币的这个设计非常之妙,妙不可言,他的发明人,神秘的“中本聪”确实是颗大葱。
理解了去中心化,你就等于理解了区块链,一个真正的区块链项目就是通过合理的游戏规则设计辅以信息技术,来践行去中心化理念的项目。比特币系统就是去中心化理念和区块链技术的一个优秀示范项目。不夸张地说,我觉得这是一场互联网的理念革命,是人类的又一次平等化革命,上一次是打破了人与人之间在身份地位上的不平等,这一次是打破了游戏规则本身的不平等。正因为这样,所以区块链才能激发人们如此大的热情,这是一个听上去可以颠覆一切旧规则的新生事物。
然而,我这里话锋一转,在我看来,比特币系统并不是一个成功的区块链应用,它是一个天生的残废。我为什么这么说呢?因为,从我前面介绍的比特币两条核心游戏规则就知道,它有以下这些天生的缺陷:
第一, 比特币客户端软件需要巨大无比的存储空间,因为每一个节点都必须要记录下从比特币系统诞生的第一天起所有的交易记录,截止到本文发稿时,这个交易记录文件已经有147GB 那么大了,而且只会增加不会减少。
第二, 为了防止有人作弊,比特币系统有一套很复杂的游戏规则来确保交易记录是真实的,这样就导致每一笔交易的确认时间一般需要一个小时,甚至几天。你想想吧,如果用比特币去街边买杯奶茶,会是什么情况。
第三, 最多只有 2100 万枚比特币,而且,无论有多少人在挖矿,系统规则决定了平均每 10 分钟才能产出若干枚比特币(今年是 12.5 枚)。我想起了那句话:人民群众日益增长的比特币需求与比特币总量不充分之间的矛盾。
但是,比特币不能代表区块链,区块链也不是比特币。区块链在未来可以有哪些应用呢?
实际上,区块链解决的核心问题是信任问题,大家想一下,所有的金融机构,例如银行、保险、劵商等等,让他们赖以生存的根本是信用,我们之所以会放心地买股票、买期货、买纸黄金,那都是因为我们信任充当交易中介的机构,而这些交易中介,就是金融活动的中心,我们宁愿为此付出一定的手续费、交易费,金融机构也因此挣的盆满钵满。但是,当区块链在人们的观念上和技术上都成熟后,这种中心化的金融机构是有可能被颠覆掉的,因为我们可以利用区块链的理念和技术来改写游戏规则,让所有的金融产品交易都不再需要一个中心,而全部都以点对点地方式完成,并且从理论上能够保证信用问题。到了那时,银行还需不需要我不知道,因为银行可能还会涉及到更复杂的国家利益问题,但是,一定会有很多商业金融机构受到区块链的冲击。
再比如,公证也是一个典型的中心化的贩卖信用的机构,区块链完全可以实现对公证行业的改写。关于区块链的应用,后文还会有详细阐述。
到此,我们对比特币和区块链建立起了总体概念,接下去,我就要帮你剥开下一层洋葱皮,了解一下比特币系统的基本原理。
比特币基本原理——数字指纹和非对称加密
我相信,去中心化的账本还是很容易理解的,只要把所有的交易记录都记在每一台电脑的账本上,然后就可以用计算机的强大计算能力,随时随地查出每个人的余额是多少。
但是大家不要忘了,在网络上记账与线下记账不同,网络上都是消息来消息去的,大家根本不见面。如果你收到一条信息,上面写着“A支付 5元钱给B”。这时,你不禁要问:
第一:如何确保这条信息内容的完整性?
第二:如何确保信息的真实性?
解决办法是有的。我们先来看怎么解决第一个问题:确保记账信息的完整性。这里要引入一个概念,就是数字指纹(很多文章也叫数字签名、哈希值,但是我喜欢把它比作指纹)。电脑上的任何信息,按照国际统一的编码标准,最终都被编码成0101来存储,这就是大名鼎鼎的二进制。例如“钱”这个字用二进制表示就是“1001010010110001”,再比如“A支付 5元钱给B”这句话用二进制表示就是:
0100000111001010010111110011101101100000110101101000101000011100101001011000111111101101100101000010
普通人看到二进制往往无法和数字建立联系,实际上,上面这串二进制也可以用一个十进制的数字来表示,他们完全相等:
100000111001010080606408664086260086008422488464406842602666664446622202242228042826680682422068400
看到了十进制的数,很多人才会认为这确实是一个“数字”。这就是数字指纹了吗?还不是。
二进制和原始信息只是一一对应的编码关系,一个英文字母或者数字对应 8 个比特,一个中文字符对应 16 比特,原始信息越长,二进制编码也越长。任何原始信息都可以转换成一串数字,有了数字就可以做数学运算,玩出各种花样了。
现在,我们给数学家提出一个要求:请设计一个算法,将任何一条信息,不论长短,都计算出一个唯一的“数字指纹”与它对应。但有两个附加条件:1. 指纹的长度必须固定;2.只能从“原始信息”计算出“指纹”,谁也无法从“指纹”反向计算出“原始信息”。
这个要求,看似很过分,但是难不倒数学家。1993年,美国国家安全局发布了 SHA算法,全称是Secure Hash Algorithm, 中文一般翻译为“安全散列算法”或者“安全哈希算法”,这个名称估计把你吓到了,听着特学术(我有时候会听人说“嘻哈算法”,忍不住偷笑一下,各位千万别读错)。Hash这个词没有对应的中文意译词,如果让我来意译 SHA 的话,我会翻译为“数字摘要算法”,基本上能表达该算法的含义,就是从目标对象中提取出一个特征摘要,就好像人的指纹一样。SHA 算法从 1993 年发布它的第零代,一直到 2015 年发布第三代,22年间已经升级了四次。比特币用到的是第二代算法,简称为 SHA-256 算法,这里的“-256”表示由这个算法生成的指纹长度固定为 256比特。大家可以很容易在网上找到在线生成 SHA-256 指纹的网页,这个算法是公开的,谁都能用,举例说明:
“钱”字的 SHA-256 指纹是:
0000111010111000011000111100011110001101101000111110001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
“A 支付 5元钱给 B”的SHA-256 指纹是:
1111011110111011001010011011101011011111000001011101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
大家看到,不论原始信息有多长,生成的指纹都是一样长的。而且这个指纹还有两个显著特点:1. 原始信息只要改变一点点,哪怕只改动一个数字,整个指纹就会发生巨大的变化,毫无规律可循。2.截止到本文发稿为止,世界上还没有任何公开的方法可以从指纹反向计算出原始信息,普遍认为理论上无法破解。
不过,在实际的使用中,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(后面我们就把这个公开的钥匙称为公钥,很奇怪的是,字典上说要读成“公月”,实在是别扭,我身边 99%的人都念“公药”,所以,我拒绝按字典的读音,后面都念成“公药”,特此申明),任何人只要用 24479 乘以 11 ,取结果的后三位,就能得到我想要告诉大家的原始信息。不信吗?我们试试看:
24479 x 11 = 269269
哇,好有意思,不但后三位,连前三位都是原始信息。我是怎么加密的呢?很简单,我把原始信息乘以 91 就是密文,而这个 91 就可以叫“私钥”,我私人的加密钥匙。这样就实现了加密和解密是完全不一样的两种算法。
你可以试试看,用任意一个三位数字乘以 91 ,得到的结果再乘以 11,最终得到的结果一定是原始三位数写两遍。例如:218 x 91 x 11 = 218218
如果用任意一个二位数字乘以 91 ,得到的结果再乘以 11,最终得到的结果的后二位数字也一定与原始数字相同。例如:18 x 91 x 11 = 18018,至于它背后的数学原理,你稍微琢磨一下就能想明白了,不再赘述。
但是请记住,我举的这个例子只是让你体会一下什么叫非对称加密,因为这个例子的算法太过于简单,所以知道了公钥是 11 的人,很容易猜出私钥是 91 。但是比特币系统采用的算法比这个要复杂的多了,这个算法确保了任何人虽然知道原文、密文、公钥,但是无法猜到私钥,也就是说,黑客也只能解密,但不会加密,也就无法修改密文。
这么牛的算法也有一个听上去逼格很高的名称,这就是声名远播的“椭圆曲线算法”,简称为 ECC算法。它是在1985年由两位美国人Neal Koblitz和Victor Miller分别独立提出的。在密码学中的广泛使用也就是最近10多年的时间,数学家真的很厉害。
有了这个算法,就能确保去中心化的记账系统中,每条交易记录的真实性。我们来演示一下比特币的去中心化记账系统如何利用 SHA和 ECC 算法确保账本的完整性和真实性。(说明:以下是简化后的原理说明,真实过程还要复杂很多,但原理不变)
需要记账的原始交易信息:A 支付 5元钱给 B(以下简称“原文”)
第一步:利用 SHA 将原文生成数字指纹:
f7bb29badf05d41e60b1036d749f134a901c7a97daef7a1fe4e1e14471bd4833
第二步:随机生成一个私钥,它的格式与指纹是完全一样的,例如:
18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725
第三步:利用 ECC将第一步得到的数字指纹通过私钥加密,得到密文:
869ac57b83ccf75ca9da8895823562fffb611e3c297d9c2d4612aeeb32850078
第四步:根据私钥生成一个公钥:
600FFE422B4E00731A59557A5CCA46CC183944191006324A447BDB2D98D4B408
第五步:将原文、密文和公钥广播到整个比特币网络中
------------------------信息发送发送步骤到此结束,以下是信息接收方步骤-------------------
第六步:接收方利用 ECC 将密文通过公钥解密,得到:
指纹1
第七步:利用 SHA 将原文生成数字指纹,得到:
指纹2
第八步:比对指纹 1是否等于指纹 2
第九步:如果相等,则确认该条信息是合法交易信息,添加到自己的账本中。如果不相等,则抛弃该信息。
-------------------------全部结束----------------------------------------
在真实的比特币网络中,交易双方都是完全匿名的,交易者 A 或者 B 都是账号(有些文章中称“地址”,含义一样),账号背后的主人信息是没有任何记录的,可以是一条狗也可以是一个人工智能,而账号则是根据“公钥”通过一定的算法生成的。
一个公钥可以生成几乎无数个不同的对应地址(接近 2161 个)。公钥是由私钥生成的,所以,私钥是最终的源头,也就是说,谁掌握了私钥,谁就是由此派生出来的所有账号的主人。
在比特币网络中,“私钥”是动用账号中比特币的唯一凭证,如果你的“私钥”被盗了,你就永远失去了它,打官司也要不回来,因为没有任何方式可以证明他的“私钥”是从你这里偷走的。