摘要:区块链元年年,一个叫做中本聪的神秘作家发表了一封名为的白皮书,奠定了比特币的基础,也完全改变了我们看待和理解货币的方式。
正如民谣像一杯酒,有故事的人听不得。深夜失眠的我,无意翻起中本聪的白皮书,就注定了无眠。今夜的我只醉心于技术,别问是真是假。
这是一篇关于区块链基础的笔记,涉及了我认为对于初学者来说,想要进一步深入前需要了解的最重要的几个概念,概括如下图:
在深入了解区块链的技术细节之前,明白它为什么存在对理解它是很有帮助的。
区块链技术,最早是在金融交易领域破土发芽的,但在这之前,金融交易系统已经大体正常运作了许多年。所谓变革的新技术,必定对既有领域中一些核心理念发起了冲击,并提出了自己的解决方案。只在一个行业领域的“兴风作浪”,充其量只能算作改进,若说成是变革,那么这项技术的思想及提供的解决方案,必定能跨越多个行业领域继续“兴风作浪”。
在我们探究金融交易系统的缘起流变之前,先埋下两个问题。
金钱在整个金融系统中已无处不在,它到底有什么价值,让人们不得不去使用它?
在当前的金融系统中,有什么我们可以进行改进的方面?
现有的金融系统假设我们回到金融交易的历史源头,来为人们设计搭建一套金融系统。首先得明白人们的现状和需求:每个人都拥有属于自己并可以提供给他人的产品或服务,同时也存在自己所稀缺的。为了均衡这种稀缺和富余,每个人可以对自己所拥有东西的价值进行评估,以及所要换取的东西进行预期,这便是贸易的开始。
但以物易物的贸易存在一个不争的事实:交易双方需要通过沟通谈判,来确定交易时物品的价值。当从小范围内的交易,扩展到更大范围的贸易时,相对公允的价格参考就需要被呼唤出来了。而像黄金这样,存量稀缺有价值、属性稳定可长存、体积不大便携带的物品,作为价格参考便再合适不过。更进一步地,人们创造出货币代替了黄金。
由于货币属于人造物,自然就需要对于基于此的交易进行记录和管理,已保证人们拥有财富的安全,于是银行作为可信赖第三方便出现了。人们可在银行中安全的存放金钱,信赖基于货币进行的交易,这是非常有价值的。
同时不免想问,银行又是如何做到这一点的呢?
当一个有价值的创新,成为了日常生活中不可或缺的一部分时,它的实现原理与运行机制,对于大多数使用者来说就会变的透明了。
可想而知,在全球贸易如此普遍的今天,银行维持系统正常运作,所需要的子系统及工具绝对成百上千。这里介绍其中一个重要的工具:分类账,它记录的交易信息包括:发送方、接收方、交易时间、交易额度。银行可以利用分类账记录的信息做一些很酷的事情。比如,由于知道谁有钱,谁负债,以及拥有钱的数额,那么便可以确保互不认识的交易双方达成信赖。同时这也帮助解决了所谓的“双花问题”,所谓双花问题就是,某人将同一份笔钱花了不止一次。为使一个金融系统正常运行,这种现象是不被允许的,因为你可以想象,这完全是在印钞呀。银行可以通过分类账上的记录,来避免双花问题,因为银行知道第一次交易发生的时间,那么同笔钱第二次交易时就可以认定为无效。
区块链的改进银行作为可信赖第三方,对于金融交易信息的全知视角,便是我们长期以来解决这个问题的一种途径。但是区块链技术提供了一种不同的,或许是更好的方式。因为现有的金融系统,不可否认地依然存在着一些问题:
交易数据的访问权银行在金融系统中的地位太过重要,它确定拥有我们所有的交易数据,但我们不确定银行是否将这些数据同样共享给我们,这样是否真的合理呢?任何的不公,都是从信息不对称开始的,你说呢。类似于银行所用的分类账,我们可以创建一个共享的分类账来供所有人访问。
解决一个问题的同时,总会有新的问题伴随着产生。
所创建的共享分类账,是否能达到与目前银行同样的安全与信任程度?
类似银行的可信赖第三方并不唯一现在我们有一个转账需求要完成,可采用的途径并非去银行借记一种方式,还可以信用卡、支付宝、微信、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个拜占庭的将军,各自领着一支军队围着一座城的不同方位,他们之间彼此物理隔离,只能通过传令兵进行通信。他们需要达成共识到底是攻打还是撤退,要么一同攻打要么一同撤退,如果有一支军队和其他军队行动不一致,都会造成失败。同时这其中还有更复杂的因素,或许有某个将军已经叛变了,但其他人还不知道,这就意味着叛变的将军会破坏这次决议的投票;同时负责消息传递的传令兵,在路上也可能发生不可测的状况,而导致送达的信息失真,也可能压根没送到。
我们将将军换成区块链网络中的节点,两个场景中面对的问题是类似的,我们需要一种策略来帮助建立,在通信没那么稳定顺畅的情况下用户之间的信任。这便是所谓的共识机制,达成这个目的有许多备选的算法,比如工作量证明,股份证明等等。
工作量证明最早是比特币提出的一种解决“拜占庭将军问题”的方案,基本思想就是利用,前面谈到的区块头部中那个随机数以及哈希值,计算出这个有着特定数量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。
很难避免代表节点存在行为上的欺诈,系统会将代表的历史行为数据,公开给所有选民进行查看。
总的来说,目前还没有完美的共识机制,目测以后也不可能会有,因为这需要根据具体的需求和使用场景进行权衡。同时了解新出现的区块链应用,所提出自己的共识机制,并分析其优缺点,是很开眼界且有趣的。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/24637.html
摘要:书接上回区块链笔记基础概念扫盲,我们讨论了关于比特币以及区块链的许多基础概念,可能通过我略带类比的描述,让你初步有了一些概念,但是对于一个比特币到底长什么样以及如何使用比特币进行交易可能还不是很清楚,说的直白点就是听过猪叫,但没吃过猪肉。 解惑是每个人都在走的一条路,可谁又能解这漫漫无期呢?路上总是麻醉的人多,释怀的人少。 书接上回区块链笔记(1)基础概念扫盲,我们讨论了关于比特币以及...
摘要:介绍了一些关于比特币的概念与机制,为了加深理解,本文基于来实现一个简单的区块链原型,后续再对其进行不断丰富。概述如前所述区块链模型的组成部分,包括区块,区块构成的区块链,以及保存区块链的数据持久层等。 介绍了一些关于比特币的概念与机制,为了加深理解,本文基于JavaScript来实现一个简单的区块链原型,后续再对其进行不断丰富。 1. 概述 如前所述区块链模型的组成部分,包括区块,区块...
阅读 1766·2021-10-11 10:57
阅读 2350·2021-10-08 10:14
阅读 3391·2019-08-29 17:26
阅读 3339·2019-08-28 17:54
阅读 3018·2019-08-26 13:38
阅读 2884·2019-08-26 12:19
阅读 3606·2019-08-23 18:05
阅读 1275·2019-08-23 17:04