共计 5847 个字符,预计需要花费 15 分钟才能阅读完成。
正如民谣像一杯酒,有故事的人听不得。深夜失眠的我,无意翻起中本聪的白皮书,就注定了无眠。今夜的我只醉心于技术,别问是真是假。
这是一篇关于区块链基础的笔记,涉及了我认为对于初学者来说,想要进一步深入前需要了解的最重要的几个概念,概括如下图:
一、金融交易
在深入了解区块链的技术细节之前,明白它为什么存在对理解它是很有帮助的。
区块链技术,最早是在金融交易领域破土发芽的,但在这之前,金融交易系统已经大体正常运作了许多年。所谓变革的新技术,必定对既有领域中一些核心理念发起了冲击,并提出了自己的解决方案。只在一个行业领域的“兴风作浪”,充其量只能算作改进,若说成是变革,那么这项技术的思想及提供的解决方案,必定能跨越多个行业领域继续“兴风作浪”。
在我们探究金融交易系统的缘起流变之前,先埋下两个问题。
金钱在整个金融系统中已无处不在,它到底有什么价值,让人们不得不去使用它?
在当前的金融系统中,有什么我们可以进行改进的方面?
现有的金融系统
假设我们回到金融交易的历史源头,来为人们设计搭建一套金融系统。首先得明白人们的现状和需求:每个人都拥有属于自己并可以提供给他人的产品或服务,同时也存在自己所稀缺的。为了均衡这种稀缺和富余,每个人可以对自己所拥有东西的价值进行评估,以及所要换取的东西进行预期,这便是贸易的开始。
但以物易物的贸易存在一个不争的事实:交易双方需要通过沟通谈判,来确定交易时物品的价值。当从小范围内的交易,扩展到更大范围的贸易时,相对公允的价格参考就需要被呼唤出来了。而像黄金这样,存量稀缺有价值、属性稳定可长存、体积不大便携带的物品,作为价格参考便再合适不过。更进一步地,人们创造出货币代替了黄金。
由于货币属于人造物,自然就需要对于基于此的交易进行记录和管理,已保证人们拥有财富的安全,于是银行作为可信赖第三方便出现了。人们可在银行中安全的存放金钱,信赖基于货币进行的交易,这是非常有价值的。
同时不免想问,银行又是如何做到这一点的呢?
当一个有价值的创新,成为了日常生活中不可或缺的一部分时,它的实现原理与运行机制,对于大多数使用者来说就会变的透明了。
可想而知,在全球贸易如此普遍的今天,银行维持系统正常运作,所需要的子系统及工具绝对成百上千。这里介绍其中一个重要的工具:分类账,它记录的交易信息包括:发送方、接收方、交易时间、交易额度。银行可以利用分类账记录的信息做一些很酷的事情。比如,由于知道谁有钱,谁负债,以及拥有钱的数额,那么便可以确保互不认识的交易双方达成信赖。同时这也帮助解决了所谓的“双花问题”,所谓双花问题就是,某人将同一份笔钱花了不止一次。为使一个金融系统正常运行,这种现象是不被允许的,因为你可以想象,这完全是在印钞呀。银行可以通过分类账上的记录,来避免双花问题,因为银行知道第一次交易发生的时间,那么同笔钱第二次交易时就可以认定为无效。
区块链的改进
银行作为可信赖第三方,对于金融交易信息的全知视角,便是我们长期以来解决这个问题的一种途径。但是区块链技术提供了一种不同的,或许是更好的方式。因为现有的金融系统,不可否认地依然存在着一些问题:
交易数据的访问权
银行在金融系统中的地位太过重要,它确定拥有我们所有的交易数据,但我们不确定银行是否将这些数据同样共享给我们,这样是否真的合理呢?任何的不公,都是从信息不对称开始的,你说呢。类似于银行所用的分类账,我们可以创建一个共享的分类账来供所有人访问。
解决一个问题的同时,总会有新的问题伴随着产生。
所创建的共享分类账,是否能达到与目前银行同样的安全与信任程度?
类似银行的可信赖第三方并不唯一
现在我们有一个转账需求要完成,可采用的途径并非去银行借记一种方式,还可以信用卡、支付宝、微信、PayPal 等等。无论你选择哪种,你都需要给他们提供相关必要的信息。而若当你尝试进行更加复杂的交易时,可能涉及中间环节的公司也会越来越多,这必然会产生额外的费用以及交易延迟。这也是区块链技术尝试解决的一点。
区块链技术发展迅速,想法和工具都会层出不穷,只有我们牢牢抓住目标,我们才能做出明智的取舍。
二、关于比特币
区块链现在已经是一个跨越许多平台和行业的热门话题,每天都有许多更新层出不穷,如果我们要去对区块链追根溯源,比特币是一个不容忽视的里程碑。它的相关概念和想法影响着所有后来的其他区块链应用,所以我们可以通过了解比特币,来明白它的核心思想,是如何帮助建立起今天所熟知的区块链的。
比特币使用块的概念,来分组和验证交易信息,将若干个交易打包到一个块中进行管理。这个想法对比特币乃至区块链来说都非常重要,但却不是比特币首先提出来的,早在 1991 年,Haber 和 Stornetta 发表了一篇名为 How to Time-stamp a Digital Document 的论文,提出了一种验证文档的新方式:采用文档更新的时间戳,将不同的版本按此顺序组成一个文档连。如此看这两位老铁也算是区块链的先驱了。
区块链元年 2008 年,一个叫做中本聪(Satoshi Nakamoto)的神秘作家发表了一封名为 Bitcoin: A Peer to Peer Electronic Cash System 的白皮书,奠定了比特币的基础,也完全改变了我们看待和理解货币的方式。接着在 2009 年 1 月 3 日,中本聪发布了比特币软件,同时将第一个比特币带到了这个世界。
中本聪的这篇白皮书真是读一读神清气爽,开篇第一句就开始描述,点对点电子现金系统如何绕过对中心化银行的需求。通篇谈及了交易、时间戳、工作量证明、网络以及许多关于比特币如何运作的概念,或许目前你对于这些概念的技术细节还不是很清楚,不过没关系,当我们初次面对一个新技术的时候都这样。
让我们怀着以下问题,继续往下探索:
比特币尝试在解决什么问题?
它提出了怎样的解决方案?
开发这个新系统都用到了什么组件?
三、Hashing
目前我们对区块链技术的起心动念,已经有了一个大体的了解。接下来我们逐一简介,上图区块链框架中的各部分组件,首先是哈希和一个特殊的哈希函数 SHA256。
哈希值可以被当做是信息的数字指纹,它是由字母和数字组成的唯一字符串,用以代表或者说是对应一组数据,哈希函数的作用,就是完成给定数据到唯一哈希值得映射。SHA256 是一个特殊的哈希函数,SHA 是 Secure Hashing Algorithm 的缩写,256 表示其输出的哈希值是 256 位的。除此之外还有许多不同的哈希函数,比特币从中选择了 SHA256 函数,来计算区块链上每个区块的哈希值,这样做的原因是方便对区块的引用,以及完整性的校验。更详细的使用方式可以参考 JS 类库 crypto-js。为了理解哈希值是如何将数据组成为链的,我们需要对区块和区块链的概念有更多一点的了解。
四、区块
如字面意思,区块就是保存区块链上一定量交易信息的容器。如前所述,区块链是一个在网络中存储所有交易记录的共享分类记账单,当我们让它无限地运行下去时,就意味着这个记录所有交易的账单会变得非常庞大。那么将所有的记录作为一个整体来使用或管理,都会非常困难,明智的方法便是化整为零,来存储这些交易信息于许多个小区块中。
那这样包含数量有限交易信息的小区块长什么样呢?一个区块大体分为主体和头部,交易信息存储在主体中,而头部包含了一些额外信息诸如:
前一个区块的哈希值。各个区块也就是通过该值相连构成链状结构的。
区块被创建的时间戳。每个区块创建的时间,能够帮助我们确定某项交易生效的时间,这将有效地解决前面讲到的双花问题。
Merkle root。是一个代表区块中每个交易的哈希值。一个哈希值如何代表区块中所有的交易呢?这里的骚操作是这样的:所有的交易对象两两取哈希值,然后再对得到的哈希值再两两取哈希值,以此类推,所得到的最后一个哈希值即是 Merkle root,说白了就是一个二叉树的根节点。这么做的原因是,可以快速查找出区块中不一致的交易,不一致的产生可能是因为传输损坏或篡改。
Nonce 随机数。在创建区块时,网络中可能会存在许多个体同时发起请求,想要创建该区块,这其实就是所谓的“挖矿”,那么区块链网络该如何决定由谁来创建一个区块呢?这就是所谓的创建区块的复杂度问题。解决方案的关键就是这个随机数,比特币系统要求每个想要创建下一个区块的请求方,都要提供一个特定的哈希值,这个哈希值由区块所包含的内容 blockData 和这个随机数 nonce,即 SHA256({blockData, nonce}),通过哈希函数计算得到。额外的要求是,所得到的哈希值需要以特定数量 0 开始,这就需要重复的取哈希值一遍又一遍的计算,直到满足要求。也可以看出,该特定哈希值开头要求得 0 数量越多,创建该区块的复杂度就越高,反之亦然。
区块大小。顾名思义,就是一个区块能存储信息的大小,这是由开发者在区块链创建时定下来的,当一个区块写入的交易信息达到该区块大小的限制时,就是该创建新区块的时候了。
五、区块链
区块链是一个共享数字分类账,它包含了发生在网络上的所有交易的历史信息,存储在区块链上的信息永久保存且不可改变。构成区块链的两个重要因素是:区块和哈希值,每一个区块包含自己的哈希值,以及一个指向前一个区块的哈希值,通过哈希值将所有区块按照创建顺序连接成区块链。区块链这种由哈希值链接而成的结构,带来了一个有趣的性质:不易更改。当想要更改一个区块的内容时,由于哈希值得完整性,该区块的哈希值也必将更改,又由于该区块的下一个区块的头部中,包含了指向该区块的哈希值,后继区块哈希值的计算包含了指向前序区块的哈希值,前序区块哈希值得更改,就必然连锁的更改所有后继的哈希值。
区块链不易更改的性质,造就了其安全性。
六、分布式点对点网络
运行区块链的网络比较特殊,叫做分布式点对点网络。为了能够清楚地理解,就字面可以拆成两块来看:点对点网络和分布式网络。
所谓点对点网络,就是允许网络中的任意两个节点,可以相互直接通信,而不需要通过什么中心化的节点。举些例子,微信,Google 的环聊,Skype 都属于点对点网络。而分布式网络,允许在许多用户间进行信息传递。这样的定义,我第一次看到也很费解,为了更好地理解,最好的方法论就是比较与鉴别。我可以把中心化网络,非中心化网络以及分布式网络拿到一起来看。但在细看之前,需要明白一点,每一种网络都有他们各自的优势和使用场景,我们在区块链中采用分布式网络,只是由于比较来看,分布式网络更适合于区块链应用。在中心化网络中,所有的信息都集中于一个节点上,其他节点都与中心节点相连。可以拿图书馆的例子来类比,将所有图书都集中保存在唯一的一个图书馆中,人们需要查阅资料或借阅图书,都来这个图书馆就好。好处是书籍与资料集中后便于管理,但问题也是显而易见的:其一,容灾性较差,假如这个唯一的图书馆失火或遭到破坏,由于所有信息只有这里独一份,损失后便无法恢复。其二,对于用户来说,非常不方便,所有人都需要到图书馆才能获取信息,无论你在何处。
于是就有了非中心化网络的改进方案,备份出全部或部分图书馆中的资料,建立多个地区或区域性的图书馆,这样便有了一定的灾备性。而分布式网络,则是把这个思路做到了极致。不需要图书馆了,每个人家里书架摆上 50 来本树,如果没有的话再相互借。把上述例子中的图书换成交易数据,就是我们比特币网络的样子,每个节点虽然不一定存储了所有的数据,但是通过这个分布式点对点网络,他们可以获取到区块链的所有数据。
七、内存池
我们随时的起心动念都可以产生一个交易,但这并不意味着网络处理交易的速度,能够实时的跟上交易产生的速度。也就是说,一定时间内,产生交易的数量可能会超过网络处理交易的数量,那么对于那些暂时未确认写入区块链的交易,就需要一个地方来存储这些信息,这个地方就叫做:内存池。
交易信息被写入区块之前,需要经过网络的确认与验证,这个工作是由区块链网络中一些叫作“矿工”的节点来完成的。具体到如何挖矿稍后介绍,这里先大致有一个概念。blockchain.info 这个站点提供了一些比特币区块的专业服务以及加密货币钱包,除此之外,还有一些区块状态的神仙图标可以免费查看。比如我们可以来关注一下,当前未确认的区块情况:图中和日期一行的字符串,是一条交易的哈希值;和绿色箭头一行的字符串,是交易双方的钱包,可以类比电子邮箱,只不过这里是用来发送比特币的。
一条交易信息离开内存池的原因,除了由矿工校验过后加入区块,还有一些其他原因:
一条交易信息在内存池中停留的过久,若超过 14 天还没有被矿工写入区块,则会被移除。
在内存池的堆栈中,所有的交易都是按照小费的大小,由高到低排序的。当内存池的存储空间达到上限的时候,此时来了一个小费大于目前内存池中最少小费的交易,那么小费值最少的交易将会被移除内存池。这个小费的额度,是是由发起交易的人确定的,如果希望自己的交易信息被矿工更早的写入区块,可以适当提高小费值。当然并不是不给小费,你的交易信息就不会写入,这要看节点的具体情况。
如果区块中已经有了该交易信息,在写入验证阶段,会将重复的交易信息移除内存池。
如果将要写入的交易信息,和目前区块链中的交易存在冲突,也将会被移除。
八、共识机制
先来看一个著名的问题:“拜占庭将军问题”。假设有 9 个拜占庭的将军,各自领着一支军队围着一座城的不同方位,他们之间彼此物理隔离,只能通过传令兵进行通信。他们需要达成共识到底是攻打还是撤退,要么一同攻打要么一同撤退,如果有一支军队和其他军队行动不一致,都会造成失败。同时这其中还有更复杂的因素,或许有某个将军已经叛变了,但其他人还不知道,这就意味着叛变的将军会破坏这次决议的投票;同时负责消息传递的传令兵,在路上也可能发生不可测的状况,而导致送达的信息失真,也可能压根没送到。我们将将军换成区块链网络中的节点,两个场景中面对的问题是类似的,我们需要一种策略来帮助建立,在通信没那么稳定顺畅的情况下用户之间的信任。这便是所谓的共识机制,达成这个目的有许多备选的算法,比如工作量证明,股份证明等等。
8.1 工作量证明
工作量证明最早是比特币提出的一种解决“拜占庭将军问题”的方案,基本思想就是利用,前面谈到的区块头部中那个随机数以及哈希值。计算出这个有着特定数量 0 开头的哈希值比较困难,但网络中的其他节点验证起来比较容易。
工作量证明存在的问题:
高昂的电费;
矿工对于网络计算资源的垄断,间接的造成整个系统的中心化趋势;