区块链笔记(1)基础概念扫盲
正如民谣像一杯酒,有故事的人听不得。深夜失眠的我,无意翻起中本聪的白皮书,就注定了无眠。今夜的我只醉心于技术,别问是真是假。
这是一篇关于区块链基础的笔记,涉及了我认为对于初学者来说,想要进一步深入前需要了解的最重要的几个概念,概括如下图:
一、金融交易
在深入了解区块链的技术细节之前,明白它为什么存在对理解它是很有帮助的。
区块链技术,最早是在金融交易领域破土发芽的,但在这之前,金融交易系统已经大体正常运作了许多年。所谓变革的新技术,必定对既有领域中一些核心理念发起了冲击,并提出了自己的解决方案。只在一个行业领域的“兴风作浪”,充其量只能算作改进,若说成是变革,那么这项技术的思想及提供的解决方案,必定能跨越多个行业领域继续“兴风作浪”。
在我们探究金融交易系统的缘起流变之前,先埋下两个问题。
- 金钱在整个金融系统中已无处不在,它到底有什么价值,让人们不得不去使用它?
- 在当前的金融系统中,有什么我们可以进行改进的方面?
现有的金融系统
假设我们回到金融交易的历史源头,来为人们设计搭建一套金融系统。首先得明白人们的现状和需求:每个人都拥有属于自己并可以提供给他人的产品或服务,同时也存在自己所稀缺的。为了均衡这种稀缺和富余,每个人可以对自己所拥有东西的价值进行评估,以及所要换取的东西进行预期,这便是贸易的开始。
但以物易物的贸易存在一个不争的事实:交易双方需要通过沟通谈判,来确定交易时物品的价值。当从小范围内的交易,扩展到更大范围的贸易时,相对公允的价格参考就需要被呼唤出来了。而像黄金这样,存量稀缺有价值、属性稳定可长存、体积不大便携带的物品,作为价格参考便再合适不过。更进一步地,人们创造出货币代替了黄金。
由于货币属于人造物,自然就需要对于基于此的交易进行记录和管理,已保证人们拥有财富的安全,于是银行作为可信赖第三方便出现了。人们可在银行中安全的存放金钱,信赖基于货币进行的交易,这是非常有价值的。
同时不免想问,银行又是如何做到这一点的呢?
当一个有价值的创新,成为了日常生活中不可或缺的一部分时,它的实现原理与运行机制,对于大多数使用者来说就会变的透明了。
可想而知,在全球贸易如此普遍的今天,银行维持系统正常运作,所需要的子系统及工具绝对成百上千。这里介绍其中一个重要的工具:分类账,它记录的交易信息包括:发送方、接收方、交易时间、交易额度。银行可以利用分类账记录的信息做一些很酷的事情。比如,由于知道谁有钱,谁负债,以及拥有钱的数额,那么便可以确保互不认识的交易双方达成信赖。同时这也帮助解决了所谓的“双花问题”,所谓双花问题就是,某人将同一份笔钱花了不止一次。为使一个金融系统正常运行,这种现象是不被允许的,因为你可以想象,这完全是在印钞呀。银行可以通过分类账上的记录,来避免双花问题,因为银行知道第一次交易发生的时间,那么同笔钱第二次交易时就可以认定为无效。
区块链的改进
银行作为可信赖第三方,对于金融交易信息的全知视角,便是我们长期以来解决这个问题的一种途径。但是区块链技术提供了一种不同的,或许是更好的方式。因为现有的金融系统,不可否认地依然存在着一些问题:
交易数据的访问权
银行在金融系统中的地位太过重要,它确定拥有我们所有的交易数据,但我们不确定银行是否将这些数据同样共享给我们,这样是否真的合理呢?任何的不公,都是从信息不对称开始的,你说呢。类似于银行所用的分类账,我们可以创建一个共享的分类账来供所有人访问。
解决一个问题的同时,总会有新的问题伴随着产生。
所创建的共享分类账,是否能达到与目前银行同样的安全与信任程度?
类似银行的可信赖第三方并不唯一
现在我们有一个转账需求要完成,可采用的途径并非去银行借记一种方式,还可以信用卡、支付宝、微信、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开头的哈希值比较困难,也就意味着你在为这件事情付出成本(人们往往会为自己付出成本做的事情负责任,反之如果没有任何成本约束,你说你认真负责,我信你个鬼),同时还需要网络中的其他节点验证起来比较容易,这样可行性才会高。
尝试解题计算这个特定哈希值的节点称作矿工,矿工挖矿解题的过程会消耗计算机的电量,如果你在诸多节点的竞争计算中,获得了下个区块写入区块链的资格,那么你消耗的电量是值得的。同时可想而知,那些没有竞争成功的节点,所消耗的电量真的就是打水漂了。
那为什么有那么多节点前仆后继地要参与到这场算力的竞争中呢?因为获得资格成功写入区块链的节点,会获得比特币网络奖励的比特币,并且这是网络产生新比特币的唯一方式。当然矿工除了从这种方式获得比特币外,他还可以从发生的交易中收取小费。
工作量证明存在的问题:
- 高昂的电费;
- 矿工对于网络计算资源的垄断,间接的也会造成整个系统的中心化趋势;
第一个问题如前所述,对于第二个问题,具体来说,由于解出特定哈希值问题快慢的概率,和几点拥有的计算资源大小成正比。也就是说,你拥有越多的资源你就越容易获得写入下一个区块的资格,也就意味着你获得比特币奖励的概率越大。利益的驱使下,全网的算力资源就会逐渐倾向聚集到少数人身上。
8.2 股权证明
股权证明是另一种共识机制算法,这种机制中没有矿工,也不需要投资计算设备用以挖矿获得数字货币,因为从一开始所有的数字货币就已经存在了。取而代之的角色叫做验证者,或者股东,为了验证交易和创建区块,股东需要使用他们的数字货币进行下注,如果他们验证了一个虚假的交易,他们将失去所下注的数字货币,以及未来参与验证的机会,这将会驱策系统只验证正确的交易。
在股权证明机制中,下注越大的股东,获得写入下个区块资格的概率越大。验证者将会按照其下注的比例获得数字货币作为奖励,这就会引出一个问题,对于一个鸡贼的验证者,如果他同时对多个区块进行下注,那么在最后他也并不会损失什么?这无疑是一个潜在的问题,所以网络的策略是对在错误支链上下注的验证着给予处罚,或者对在所有可能的支链上下注的验证者给予处罚。
谁在使用股权证明机制:
- 以太坊
- Dash,也是股权证明的先驱之一,它建立在核心比特币平台之上,同时增加了隐私和快速交易的特性。
- List,旨在允许开发人员创建自己的非中心化应用程序,功能类似于以太坊和NEO,同时允许开发者使用JavaScript。特殊的是,Lisk的共识机制叫做委托的股权证明,网络中只有前101个委托者可以下注,而这些委托者是系统随机选出来的。
8.3 委托式拜占庭容错
Delegated Byzantine fault tolerance,简称DBFT,是一种基于给不同节点赋予角色来协调共识的一致性算法。
DBFT同样没有矿工角色的节点,取而代之的是将节点分成了普通节点和共识节点,网络中的绝大多数节点属于普通节点,只能进行转化或交易资产,但是他们不能参与到区块的验证;只有共识节点有权验证写入区块链中的每个区块,它相当于网络中其它节点的代表,类似于我天朝的人民代表制度。普通节点可以转变成共识节点,但不同的平台需要满足的转变标准又太一致。
当决定往区块链写入新区块的时候,会从所有的共识节点中随机选取一个负责写入。在Neo中,这个被选出来写入区块的共识节点叫做speaker
(报告人),其余共识节点叫做delegates
(代表)。在报告人创建出一个新区块后,并将它提交给诸位代表,如果有2/3的代表证明通过,则这个新区块就被加入到区块链中;如果没有被证明通过,被选择的报告人节点将变成普通的代表,新的报告人节点会被重新选择。
DBFT对比工作量证明更快且消耗的资源更少,同时避免了股权证明可能会出现的区块链分叉现象,这并不是说DBFT就完美无缺了:
- 我们假定有一个不诚实的报告人节点存在(这是可能发生的,因为报告人节点是从所有共识节点中随机选取的),如果发生了,那么网络就需要依赖诚实的代表节点数量能过超过2/3。
- 很难避免代表节点存在行为上的欺诈,系统会将代表的历史行为数据,公开给所有选民进行查看。
总的来说,目前还没有完美的共识机制,目测以后也不可能会有,因为这需要根据具体的需求和使用场景进行权衡。同时了解新出现的区块链应用,所提出自己的共识机制,并分析其优缺点,是很开眼界且有趣的。