区块链开始的地方
相信对于区块链感兴趣的各位肯定听说过一个东西——那就是比特币。2009-2017比特币造就了多少令人疯狂的传说,后面的泡沫的破灭又让多少人跌入谷底,相信大家都有所耳闻。比特币不仅在经济上是一个奇迹,在技术上来讲也是一个重大的创新发明。夸张点说就是比特币开创了一个新的数字货币的时代。下面我们就来看看比特币中的关键技术。
对于想要入坑区块链的同学,这里强烈推荐一本区块链技术领域的圣经——《精通比特币》。这里面详细介绍了比特币的运行原理,是一本很好的入门书籍。
首先在很多地方都都有听说的一些比特币的优点
- 去中心化
无中心机构监管,交易自由,任何人都可以查看所有的交易,透明性高。 - 低风险
交易并不需要某些机构的背书,交易随着新的区块加入,交易越来越可信。一般来说在比特币上6个区块之后,交易被认为不可撤销。
那比特币的这两个特点给我们带来的是什么呢?
是一种无中心权威也可以成立的信任机制——而这可以让现实生活中很多信任机制建立成本很大的活动更加便捷,也能让因为信任问题难以进行的活动简单起来。比如我们的征信活动,金融交易,隐私数据的使用。
什么技术支撑起的比特币
比特币使用的技术都是之前已经成熟应用的技术,总体来说有这么几个比较重要的
- 数字加密技术
- P2P网络技术
- 共识算法
下面就分别介绍这些技术。
数字加密技术
数字加密算法提供给比特币系统的交易安全性。
比如对于转移到你账户下一个比特币地址的比特币来说,数字加密技术保证了只有你所保存的私钥才能对于这些比特币进行下一步的转移操作。
当然这种加密算法有很多,这是属于计算机安全领域的问题,只是被应用到了区块链中来了而已。而比特币系统中就选择了椭圆曲线公钥密码技术,用来生成一个比特币网络上的地址。
比特币中有三个东西是相关联的——私钥,公钥,比特币地址。而他们的关系是:
私钥 --> 公钥 --> 比特币地址
而且中推导关系都是单向的,下面我们来看看怎么来进行这种变换的。
私钥
私钥就是一个256位随机的数字,并没有什么特别之处。理论上你可以通过自己抛256次硬币来得到一个你自己专属的私钥,但是这种方式对于网络上的处理来说太过麻烦了。所以我们都是用电脑的随机算法来生成的。而这里随机算法是否足够随机就很重要了(毕竟涉及了财产保护),这些随机算法往往要获取到足够的熵,一般可能是人工的随机源进行初始化,也可能需要通过几秒钟内不停晃动鼠标等方式进行初始化。这样你就得到了一个足够随机的私钥了。
公钥
公钥可以通过椭圆曲线公钥密码技术来得到,椭圆曲线公钥密码技术保证了这是一个不可逆的过程。生成的过程依靠公式:K = k * G
。其中k是私钥,G是被称为生成点的常数点,而K是所得公钥。其反向运算,被称为“寻找离散对数”——已知公钥K来求出私钥k——是非常困难的,就像去试验所有可能的k值,即暴力搜索。
比特币使用了椭圆曲线,这种椭圆曲线族分布上很随机,很难画图表示。比特币用了其中一个固定的椭圆曲线,和在这个椭圆曲线上的一个固定点——G。
而在椭圆曲线进行加法运算如下面的过程:
在椭圆曲线上取一点P(Xp,Yp),再取一点Q(Xq,Yq),连接P、Q两点作一条直线,这条直线将在椭圆曲线上交于第三点G,过G点作垂直于X轴的直线,将过椭圆曲线另一点R(一般是关于X轴对称的点),R点则被定义为P+Q的结果,既P+Q=R:

而乘法定义为下面的方式:
k*G = G + G + G ... + G(k次)
要是想在一条分布很随机椭圆曲线上反推k次加法,可想而知是很困难的,现如今只有通过暴力搜索的方式,而这种方法在时间上是不可接受的,所以私钥就得到了保护。
比特币地址

P2P网络技术
比特币还是建立在分布式的系统上的,所以需要P2P网络来给比特币提供一个稳健的运行环境。
共识算法
共识算法望文生义来解释的话,就是比特币这么多个节点都在进行交易的话,如何达成所有这些交易状态的认同。虽然说P2P网络提供了所有节点的通信功能,但是有通信还远远不够,如何对网络的状态一致认同才是重点。
比特币采用的方法是PoW算法——也就是基于工作量证明的算法。这种算法看起来很高大上,其实本质上就是一个朴素的道理——谁付出的工作量大就相信谁的。
假设这样一个情景:节点A在原来的区块链上挖出来一个新的块,立即接到区块链上,并赶紧向其他节点进行广播。但是这时候节点B同时挖出来另一个可用的区块,也进行同样的广播。现在区块链就有两个不同的分叉了,网络上出现了两种不同的状态。但是没关系,这只是暂时的,一段时间后,有1000个节点先收到了A的新区块,并在这个新区块上继续挖掘;800个节点在B的新区块上工作(这些节点就算再收到A的区块也无动于衷,因为A生成的这个链的长度并不比我现在工作的链长——应该说是一样长的)。但是总是会有一个阵营又提前挖出了区块,这样一来再次广播的时候,大家就会一边倒向最长的那条分叉。这样就又达到了新的共识。
最长的分叉以为着更多的工作量(计算一个满足要求的区块需要大量的哈希计算)花费在这里,很不幸那些短的链的矿工的工作只能算白费了。
虽然比特币的共识算法很简单,但是却能比较好的完成工作。但是也有一个很严重的缺点就是——用于计算新区块的计算量太大了,消耗了很多的电力,而且这些计算中大部分都是无效的(不能生成新的区块)。对于PoW的一些改进的共识算法就是后面的话题了。