2022-08-18 22:28 作者 :小品 围观 : 次
全书名:《白话区块链》
作者名:蒋勇
译者名:文延,嘉文
前言自上个世纪电子支付诞生以来,人们就开始探索数字货币,诞生了诸如B-money、DigiCash、BitGold等数字货币的思想和技术。到了2008年左右,一位名叫“中本聪”的神秘人物发明出了比特币(Bitcoin),成为了真正意义上的数字货币。
经过10年漫长的发展,比特币的价格从最开始的几美分一路扶摇直上,最高达到接近2万美金,翻了几百万倍。
在资本疯狂的追逐下,在一个个暴富神话的冲击下,比特币逐渐进入大众视野。之后,以智能合约技术为基础的以太坊诞生,进一步催生出一个新的领域和市场——区块链。
越来越多的创业团队开始在区块链领域耕耘,从底层基础设施,到平台,再到丰富的应用,整个生态可谓百花齐放。而区块链领域也逐渐成为了热门领域甚至风口领域。
那么,区块链到底是个什么东西?它的核心技术是什么?它有哪些应用和发展?以及它存在哪些潜在的问题?
一、什么是区块链1.1记账区块链本质上其实是一种分布式记账的技术,所谓分布式记账,简单来讲就是由多个对等的节点来共同维护一个账本。与它相对应的是传统的中心化记账方式,比如由银行来记账。
为了理解什么是分布式记账,我们先来看个故事,给大家建立一种感性的认识。
一个村里原本有一个账房先生,专门负责记账。村里所有的收入和支出都由这位先生负责记录,村里的账本也由他保管。然后村里会给账房先生一定的补贴,作为记账的奖励。突然有一天,当大家在查看账目的时候,发现数据不对,出入账不平,余额也有问题。
大家都不乐意了,认为这样记账不妥,经过集体讨论,大家决定轮流记账,今天你记,明天我记,账本也轮流保管。就这样记了一段时间,突然有一天,轮到李四记账,他家里正好有急事缺钱。于是,他灵机一动,把公款挪了,然后把账本的一部分烧了,面对大家的质疑,他谎称不小心让蜡烛给烧了。
大家很生气,但也无可奈何,但之后,就出问题了。账本不是今天被烧了,就明天被狗啃了。大家觉得这样也不妥,于是又讨论了一种新方式,就是大家人手一本帐,每人都记账,然后大家保证账本上的记录一致,这样某个人的账本不小心毁坏了,就去其他人那复印一份。
又经过了一段时间,大家觉得所有人都算账记账挺麻烦,于是想,干脆每天由一个人来记,然后其他人就照着抄一下,这样可以节省时间。
那么由谁来记呢,就通过掷骰子来决定。最终,记账方式变成:每天通过掷骰子决定由某一个人来记账,当他记完了,其他人就找他抄一份。为了让记账人有动力认真记账,村里会拿一部分补贴奖励给当天记账的人。
上面这个故事中,村子通过不断进化最终形成了一套分布式记账的体系,这就是区块链中记账方法的雏形。
1.2技术理念通过前面的故事,我们了解了区块链本质上是一种分布式记账的技术。记账的村民是整个区块链网络中的节点,他们彼此联系,形成了一个点对点的网络。
每天记账完成后,记账人都要通知其他节点来确认并复制账目,如果人数众多,就会点对点的广播下去,直到所有的节点都同步,这种互相通信的功能称为“网络路由”。
网络中的节点都是独立记账的,怎么才能保证大家的数据一致呢?就是通过一种规则选出一个记账节点,而这个筛选规则就是“共识算法”,前面故事中的“掷骰子”就属于一种筛选规则。
每当选出一个节点,则一段时间内的记账都以该节点为准,它记好账然后通过网络广播给其他节点,其他节点验证后,如果没有问题,就记入自己的账目中,这就让所有节点的账目都保持了一致。
有人可能会问:“我凭什么要帮大家来记账呢,我又不是慈善家。”的确,在区块链系统中,记账需要打包交易数据,并进行广播以及账本的存储,是需要消耗节点的计算资源以及电力的,如果没有任何激励措施,估计没有人会干这种事。
为了解决这个问题,区块链引入了奖励机制,而奖励就是我们通常所说的数字货币,比如比特币。而通过记账、打包交易数据并获得数字货币的这个过程,我们称之为“挖矿”。
在传统的交易领域,我们每个人都会有一个实名的银行账户,作为自己的身份,来转入或者转出资金。但是在区块链系统中,我们该如何标记一个节点的身份呢?答案是加密算法。区块链系统采用公开密钥算法来实现节点身份的标记。
每个节点拥有一对密钥——公钥及私钥。其中,私钥由节点自己保存。公钥,我们通过一定的编码算法将其转换成一串字符,称之为“地址”,这就是我们在区块链中的身份,它类似于传统交易中的个人账户。
在传统交易中,我们只需要去银行开一个账户,就可以进行转账了,由银行来记账,我们也放心。但是,在区块链系统中,记账者是一个你不认识也不信任的节点,因此,我们在传递有价值的信息以及资产的时候,都需要进行加密。
比如,我向你转一个比特币,我就需要用你的公钥(地址)来加密,以及我自己的私钥来签名,这样,只有你用自己的私钥才能解开,并且通过我的公钥来确认这个比特币是我发的。而这种功能设计在区块链系统中称为“脚本系统”。
总结一下区块链的技术理念,就是大家共同参与记账,通过一定的规则不断选出记账节点,由它进行打包交易,并广播给其他节点进行验证,保持账本数据一致并给予记账节点奖励。每个节点拥有一对密钥来标记自己的身份,通过脚本系统在公共网络中传递有价值的信息。
1.3区块链结构从区块链领域的发展历史来看,大致可以分为三个阶段,分别对应三种架构。
区块链1.0架构,其代表就是比特币,其主要目的就是为了实现数字货币的转账交易。它主要包含核心节点和前端工具。
前端工具,比如钱包、浏览器。钱包用来管理个人的区块链资产,可用于查询余额及交易记录,进行资产转移,并对交易地址进行管理。而浏览器可以查询整个区块链网络的历史交易情况,包括区块高度、资产的转移记录等。
核心节点中最主要是“矿工”,也就是参与记账的节点,它拥有两个作用,一个是通过竞争获取记账、打包交易的权力;另一个是接受系统对于记账的数字货币的奖励,而这种奖励其实也是数字货币增发的方式。
区块链2.0架构,其代表是以太坊,它最大的特点就是在1.0的基础上引入了智能合约。所谓智能合约,是一种旨在以信息化方式传播、验证或执行合同的计算机协议,它允许在没有第三方的情况下进行可信交易。这些交易可追踪且不可逆转。
我们通过开发工具可以自行开发智能合约,并部署到以太坊网络中,从而扩展了区块链的应用。2017年-2018年火热的ICO,几乎全部都是基于以太坊开发。
区块链3.0架构,进一步拓展了区块链技术的应用领域,超越了数字货币以及金融领域的范畴,延伸到诸如供应链、物联网、产权登记、医疗健康等多个领域。它最大的特点就是增加了一个控制网关,提供了很多企业级服务必须的组件,如身份认证、许可、审计等。
随着技术的进一步发展以及架构的进一步成熟,区块链将会延伸到越来越多的领域。
1.4区块链分布根据网络范围,可以分为公有链、私有链、联盟链。
公有链,就是完全公开,大家都可以参与,所有的数据完全透明,通过区块链浏览器都可以进行查询。比如比特币,就属于公有链。公有链没有固定的节点,加入网络以及断开网络完全自由。
私有链是与公有链相对的一个概念,它通常只在企业内部使用,比如银行内部的供应链系统、票据系统,都可以利用私有链的技术来设计。既然是内部,就需要进行身份确认,且需要固定的节点来维护,保证其稳定运行。
联盟链介于共有链与私有链之间,是多家企业或机构联合起来,共同利用区块链技术打造的一套用于数据交换的系统,比如银行间结算、企业间物流。联盟链一般也需要身份认证和权限设置。
根据部署环境,可分为主链和测试链。
主链,就是部署在生产环境的真实的区块链系统,也就是通常软件中所提到的正式版。
测试链,相对于主链,就是部署在测试环境中的区块链系统,主要是为了主链上线之前的测试、或是方便开发者交流学习。
根据对接类型,可分为单链、侧链、互联链。
单链,就是可以独立运行的区块链系统,这些系统拥有完整的组件和功能模块。
侧链属于一种跨链技术,它和主链一样也是一套独立的区块链系统。但是,随着区块链系统越来越多,各系统之间彼此独立,形成了信息孤岛,如果我们能够打通这些系统之间的隔阂,就可以打造很多的新的功能。
比如比特币系统已经很成熟,可靠性很强,如果我们基于比特币系统发展出一条侧链,通过一定的协议与比特币进行互通,可以提高侧链的可靠性,同时丰富比特币的功能。
互联链。我们的生活已离不开互联网,互联网将那些孤立的计算机、服务器、数据库都连接了起来,让全世界的信息数据得以互通和交流,从而改变了我们的生活方式。
同理,在区块链领域,越来越多的区块链系统彼此独立,在不同的行业展现出巨大的潜力,如果我们通过一些协议或技术,将各行业的独立的链条都连接起来,应该就能诞生更为强大而丰富的应用,它有机会进一步塑造我们的生活,甚至改变整个社会的治理结构。
二、区块链应用场景上一部分主要针对区块链的概念、技术理念、架构和分类,通过这些内容,大家对区块链领域应该建立了一个感性的认识。现在,我们主要探讨一下区块链的应用发展,包括以比特币为首的几种主流的数字货币、智能合约以及其他一些新兴的应用场景。
2.1数字货币比特币是区块链领域的第一个成功的应用,可以说是区块链的开山鼻祖,代表着区块链1.0时代,对于整个区块链来讲具有不可替代的意义。
2008年11月,一位名叫“中本聪”的人发布了一篇学术文章,名为《Bitcoin:APeer-to-PeerElectronicCashSystem》,翻译过来就是《比特币:一种点对点的电子现金系统》,这就是我们通常所说的“比特币白皮书”。
这篇文章的发表,标志着比特币在理论上诞生了。
次年,也就是2009年1月3日,比特币软件正式启动,中本聪构造了比特币网络的第一个区块,这个区块被称为“创世区块”,这种提法也被后面许多区块链项目所沿用。
以太坊,是一个开源的、基于区块链技术的、具有智能合约功能的分布式计算平台。智能合约是其最大的特点。通过部署智能合约,很多商业上的合约可以自动刚性执行。可以简单地把它理解成区块链领域的一个操作系统,我们可以基于以太坊构建一些商业应用场景。
2017年-2018年,几乎所有的区块链项目都是在以太坊上发布,项目团队可以通过智能合约,创建一种新的数字货币,在代码中写入一些基本参数,比如发行量、兑换比例等,合约便可以自动执行。这也成了区块链项目融资的最主要的手段。
比特现金,是比特币的第一个分叉币。随着比特币逐渐被人们所熟知,参与比特币交易的人越来越多,交易量也越来越大。由于比特币原始设计中每个区块的容量只有1MB,无法满足日益增长的交易需求。于是,经过全球矿工投票,通过了扩容方案,最终在比特币第478558号区块之后进行分叉,诞生了比特现金。
比特币由原来的一条链变成了两条链,从结构上看,就像是树枝上分出一个分支,因此形象地称为“分叉”。之后,比特币又在不同的区块高度分叉出其他的分叉币,它们都是基于比特币原有的技术架构,作了一些功能上的改进。
莱特币,可以说是比特币的兄弟,它是由比特币的源码进化而来。相较于比特币,莱特币做了一些参数上的修改:发行量为8400万枚,而比特币是2100万枚;区块产生周期提高到2.5分钟,而比特币为10分钟;哈希算法由比特币的SHA-256变更为Scrypt。可以说,莱特币就是比特币的一个简单变种。
零币,也叫Zcash,是基于区块链的一种加密货币。有人可能会疑问,区块链本身不就有匿名性吗,为什么还要加密呢?像比特币,其本身的确有一定的匿名性,我们只知道地址,却不知道地址背后到底是谁。但这只在比特币网络内部有效,如果要将比特币兑换成法币,就需要通过交易所或者场外交易,这样就会暴露身份。
而且,比特币数据全部公开,只要持续追踪地址的交易记录,就大概能分析出背后的身份。而Zcash通过“零知识证明”,解决了这个问题。
所谓“零知识证明”,举个简单的例子:比如你想确认这个保险箱是我的,我可以告诉你密码,你自己验证,但这样密码就泄漏了。
其实我并不需要告诉你密码,我只需要当着你的面(不让你看到密码)打开保险箱就可以了。Zcash运用这个原理,将交易地址和金额都进行了加密,因此几乎不可被追踪。
2.2IPFSIPFS,中文名叫星际文件系统,是一套点对点的分布式文件系统,它所对标的是传统互联网的HTTP体系。
它主要有以下几个特点:
分布式存储。HTTP的站点都是存储在中心化服务器上的,当我们想要打开一个网站,需要通过浏览器访问网站存储的服务器调取数据。一旦服务器关闭或被隔离,该网站就打不开了。而IPFS采用分布式存储,站点数据都是分片保存在不同的节点上,其中某一个或几个节点出现问题,并不影响我们访问网站,我们只需要从其他正常节点下载数据即可。
内容寻址。HTTP系统是通过域名来寻址,我们要打开一个网站,首先要在地址栏内输入该网站的地址。而且,它的文件是分层级的,有些大型网站的层级非常多,要想寻找某一个具体的内容就必须一级一级菜单访问下去,效率很低。而IPFS是基于内容寻址,每一个文件都有相应的哈希值,我们只需要检索哈希值或者关键字,就可以直接访问到具体的文件内容,这更符合我们的检索习惯。
版权保护。在传统互联网领域,由于数据可以轻易复制,网上充斥着大量的抄袭文件和网页,如果遭到举报,抄袭者可以快速删除,毁灭证据。而区块链具有数据不可篡改以及时间戳等属性,上传到IPFS中的文件不能轻易更改,可以有效防止抄袭以及证明文件的来源。
IPFS已经启动了很多年,目前已经有了一些落地应用,很多人都认为IPFS最终会取代HTTP,让我们拭目以待。
2.3可编程社会对于软件应用而言,我们可以粗略的分为两层:下层为协议层,上层为应用层。在传统互联网中,协议层通常是固定的,比如TCP/IP、HTTP等,而复杂的逻辑以及大量的编程都在应用层,比如微信、支付宝等应用软件。
而在区块链系统中,恰好相反,比特币、以太坊等应用层逻辑相对简单,大部分是跟价值有关的产生、流转,编程量少。而协议层体现了区块链最核心的逻辑——价值共识,它的设计需要复杂的逻辑和大量的编程。
这种基于复杂底层协议的去中心化应用正在构建一个可编程社会,它通过分布式账本技术破除了传统社会对于第三方信任机构的依赖,建立了一个可信的价值网络。
目前,各种中心化运作的银行都各自为营,依靠国家背书来获取客户的信任,而对于新兴的“无名银行”来说,要想获得信任并没有那么容易。
如果我们通过区块链技术,让所有银行达成一个联盟协议,共同维护一个公共账本,每家银行成为其中一个节点,那么接入网络的“无名银行”也可以因为这个联盟而获得客户信任。
哪怕“无名银行”真的消失了,用户的资产也不会受到损失,可以在联盟中的其他银行进行存取。
区块链未来可能重构我们这个社会的信用基础,通过底层协议的设计来构建一个不需要第三方信用背书的价值网络。
2.4技术意义数据不可篡改。我们前面说到,区块链本质上是一套分布式记账的技术。也就是说,基于区块链的交易数据也好、资产数据也好、信息数据也好都是分别保存在各个节点上的,每个节点都有完整的数据存储。
这样,如果想要篡改数据,就必须要篡改至少51以上的节点数据。
而节点分布全球各地,规模庞大,要想说服绝大部分节点篡改数据,是一件非常困难的事情。从技术角度来看,由于区块链上所有数据都是按时间链在一起的,想要篡改数据,就意味着需要把该数据所处区块高度及之后所有区块重新算一遍,这需要付出庞大的计算和时间成本。
因此,从理论上讲,区块链数据不可篡改。这对于很多领域具有重大意义,比如金融、审计等。
分布式存储。在生活中,对于重要的电子数据,我们通常会进行备份,存储到多个硬盘内,或者在云端也存储一份,防止由于系统或硬件损坏导致的数据丢失,这其实可以看成一种微型的分布式存储。
相比于集中式存储,区块链系统采用分布式存储可以有效的防止由于单点故障所带来的数据丢失和损坏的问题,一个节点坏了对系统并没有影响,可以从其他节点下载数据,这大大提升了数据的安全性和可靠性。
而且,在区块链系统中,节点可以是普通计算机等闲置资源,不需要像集中式存储那样采用昂贵的设备,有效降低了成本。
匿名性。我们前面提到,诸如比特币等区块链系统,其节点的身份识别依靠的是一套密码学算法,每个用户通过自己的公钥地址来标记身份。
我们在进行交易和信息传递时,是转移到某一个地址,而这个地址并没有像银行账户那样实名,所以我们很多时候其实并不知道这个地址背后到底是谁。这种匿名性在商业交易中可以有效的保护个人隐私。
价值传递。我们所用的法币本身其实是没有价值的,只是一张张印有数字和防伪标记的纸。但通过国家信用背书,且被所有人都接受,这些纸张便具有了价值。我们进行网上支付与消费,我们之所以敢把钱支付给对方,也是因为有银行或者支付宝这种第三方机构来提供信用担保。
在区块链世界,比如比特币,它的发行方就是比特币系统本身,它的信用建立在全球所有节点共识的基础之上。所有节点的“工作量证明”以及交易验证赋予了比特币的价值传递,它不需要第三方机构提供信用担保。
也就是,区块链通过技术手段解决了信任问题,这降低了我们在交易及信息传递中的信用成本,具有重大意义。
智能合约。区块链具有数据不可篡改、传递价值等特性,我们在此基础上引入智能合约,利用代码,让合约自动执行。
部署到区块链上的智能合约,很难被更改,可以刚性执行,这可以满足很多商业上的合约需求,而且更为高效和可信任。
三、区块链涉及的加密算法区块链技术并非仅仅是计算机技术,还包含了诸如博弈论、密码学等多个学科的综合运用。而加密算法,是区块链领域最核心的部分之一。
3.1哈希算法哈希算法在区块链系统中的应用很广泛,比如公钥地址、区块头以及工作量证明等都用到了哈希计算。所谓哈希计算,简单来讲,就是将任意长度的字符串,通过一套算法计算出一个固定长度的值。
这种计算很有效率,而且无法通过这个值反算出原始字符串,如果原始字符串有任何一点微小的改动,计算出的值就会发生变化。
下面我们来看看哈希算法在区块链中的应用:
区块哈希。在区块链系统中,所有的数据信息都被打包成一个个区块,每一个区块有一个区块头,系统对这个区块头进行了哈希计算,得出的值作为这个区块的身份标记。
然后根据区块头的哈希值将区块排列,形成链状结构。就想我们排队一样,我们排在谁谁谁的后面或前面。
这样的结构也是区块链数据难以被篡改的技术基础之一,一旦篡改了某个区块的数据,它的区块头的哈希值就会发生变化,相当于身份变了,那么它之后的区块就链不上了,相当于篡改无效,除非把之后所有的区块重新再计算一遍,而这个难度可想而知。
梅克尔树。梅克尔树是每个区块的基本组成部分,在比特币系统中,每个区块都有梅克尔树,它是通过将本区块内的交易两两进行哈希计算,递归循环,最终得到一个根哈希。它可以用来验证区块数据的完整性。
比如,一个比特币区块中有4笔交易,系统先对这4笔交易进行哈希计算,得到4个哈希值(Hash1~Hash4)。然后两两进行哈希计算,得到2个哈希值(Hash12,Hash34)。然后再对这2个哈希值进行哈希计算,得到最终的根哈希值,存储在区块中。
由于比特币是分布式存储,节点在同步数据时也是与其他对等节点通信来实现,由于网络或其他原因,会出现数据错误的现象。
这个时候梅克尔树就起到了验证的作用,比如某一个节点从上述例子的节点同步数据,计算出的根哈希值不一致,就可以验证Hash12、Hash34,如果是Hash34不一致,再进一步验证Hash3、Hash4,就可以知道是哪个数据出了问题。
3.2公开密钥算法在密码学中,一般分为对称加密和非对称加密两种算法。对称加密,只有一个密钥,它通过一套加密算法将原始数据和密钥一起运算,得到加密密文。
这种加密方式的缺点也显而易见,就是一旦被别人知道密钥和加密算法,逆向运算即可得到原始数据。非对称加密中,有一对密钥,即公钥和私钥,我们一般使用公钥加密,私钥解密。公钥一般在网上公开,而私钥由个人保存。
在区块链领域,几乎都是使用的这种非对称加密。用户的公钥通过运算之后得到地址,类似于银行账户;而私钥则类似于银行卡密码。通过这对密钥,我们就可以转移区块链资产。
人们发现,一些数学函数,比如椭圆曲线函数,非常适合这种非对称加密算法,它有一个很大的特点:就是通过输入计算输出很容易,但反过来从输出推导输入却几乎不可能。
因此,包括比特币在内的很多区块链项目都采用椭圆曲线函数作为公开密钥算法的基础。
3.3应用场景加密算法在区块链系统中有着举足轻重的地位,而区块链的代币也被称为加密货币,那么加密算法究竟在区块链世界中有哪些应用呢,我们一起来看看。
账户地址。按照我们传统的交易习惯,我们转移资产都是从一个银行账户转到另一个银行账户,这个账户必须是可以公开的。而在非对称加密中,公钥是可以公开的,而且可以通过私钥来解密,因此,通过对公钥进行运算得出账户地址,具备天然的可验证性。
价值转移。我们要向某一个人转移一笔数字资产,需要注意两个问题:一个是,我们要让对方能够确认这笔资产确实是我转的,而不是某个冒充我的骗子,毕竟网络交易相对于实物交易更容易出现身份欺诈;另一个是,我必须确保这笔资产只有你能够打开并使用。而非对称加密可以很好的解决这两个问题。
在区块链系统中,我向你的地址转移一个比特币,其实是用你的公钥来加密这个比特币数据,因此,只有你的私钥能够打开,这样,你就确实获得了这枚比特币的使用权。
除此之外,我还用了我自己的私钥对这笔交易进行了数字签名,你通过我的公钥即可验证这笔交易确实是我发送的。
完整性验证。前面我们提到,区块链系统通过哈希算法生成梅克尔树存储于区块中,当其他节点在同步区块数据时,可以用来验证所同步的数据是否完整或准确。
零知识证明。昨天我们提到的零币Zcash,就是通过零知识证明原理,利用加密算法对用户的地址和交易金额进行加密,从而在商业交易中保护个人商业隐私。
3.4一致性所谓一致性,就是保证数据要完整、要同步。在中心化的系统中,一致性问题很好处理,因为存在一个中心服务器,存储了全量数据。子系统、客户端等只需要访问中心服务器就可以同步全部数据。
但是,在区块链系统中,并不存在一个中心服务器,而是由接入网络的所有节点共同维护数据,那么,如果出现系统故障或网络故障,导致各节点之间数据不一致或者不同步,到底以谁的数据为准就成了一个大问题,这个问题直接影响到系统能否继续运行。
因此,对于区块链系统来讲,首先需要解决的就是各节点之间的数据一致性问题,也就是我们通常所说的共识问题。
导致一致性问题主要有以下几个原因:
系统故障。分布式系统由于算法逻辑或设计上的缺陷,导致无法正常运行,那么一致性也没法得到保障。
网络故障。如果节点与节点间的通信网络出现故障,就会造成一些节点无法从其他节点同步数据的问题,这会带来巨大的延迟。
节点性能。对于很多公有链来讲,接入网络的节点既有高性能服务器又有低性能的家用计算机,它们在处理性能上有很大的差距,这样也会造成数据不同步的情况。
理论上讲,一致性要求接入区块链系统的各节点,在没有一个中心服务器发布指令的前提下,产生相同的行为,看起来就像是同一台计算机一样,这是一件难度很大的事。
特别像比特币这种公开的网络,任意计算机都可以接入,谁也不知道这些计算机的性能如何,网络状况如何,也不知道它是否是恶意节点。
然而,在实际应用中,很多时候我们对于一致性的要求并没有那么苛刻,我们可以允许一定程度的不同步,只要在某个时刻最终能达到一致即可。
3.5CAP原理所谓CAP原理,是指:在分布式系统中,一致性(Consistency)、可用性(Availability)和分区容错性(Partitiontolerance),三者不可兼得。
这就有点类似于管理中提到的时间、质量、成本三者间的关系,我们一次最多满足其中两者。
这里的“一致性”是指“强一致性”,表示系统中的节点时刻保持同步。当系统数据更新后,我们任意时刻去访问任意节点,看到的数据都是一致的。
可用性表示在有限的时间内,系统内的节点对于请求都能给予响应。如果我们向某个节点发送同步数据的请求,在有限时间内,该节点无论给出成功或失败的回应,都认为是可用的。而不给出回应,我们则认为是不可用的。
分区容错性,指由于网络故障导致的系统分区不影响系统正常运行。在分布式系统中,节点之间原本都是相互连通的,可能由于一些故障,导致一部分节点断开,这样就形成了分区。如果某一项更新数据只存在于其中一个分区,意味着其他分区就无法同步这项数据,我们认为容错性很低。反之,如果分区后,每个分区依然可以同步更新数据,我们则认为容错性高。
这三者为什么不可兼得呢?在分布式系统中,如果一项新数据只存在一个节点上,那么当发生分区时,只有这个节点所在的分区可以同步该项数据,要解决这个问题,我们可以将数据复制到多个节点,这样,分区后该项数据就可以分布在多个分区里面,容错性就提高了。
但是,复制的数据越多,系统就越难以保证一致性的问题。要保证一致性,就要等全部节点写入操作完成,这需要很长等待时间,而这种等待又会带来可用性的问题。
在区块链系统中,特别是公有链中,比如比特币。由于所有数据公开,无论是高性能服务器,还是低性能家用计算机,无论网络质量优劣,都可以接入网络,且随时可以断开,随时可以加入,因此,一般优先保证整个系统的容错能力,从而弱化了一致性。这也有利于公有链在全球建立大规模的分布式系统。
3.6共识算法前面我们说了分布式系统中的一致性问题和CAP原理,除了节点故障或者网络故障会引发一致性的问题,系统中存在恶意的节点也会对系统达成共识产生影响,这就是我们常说的拜占庭将军问题。
对于拜占庭将军问题的经典描述是:拜占庭的军队按小队划分,每个小队由一名将军指挥,所有将军投票来决定统一的行军计划。由于各小队地理位置分散,因此依靠传令兵相互通信。
但将军中存在叛徒,会对整个行动计划进行误导,那么,要解决的核心问题是,这些忠诚的将军们如何不受叛徒干扰,最终达成一致。
科学家由社会学和博弈论中得到启发,尝试引入了以下机制。
激励机制。比如,给予忠诚的将军(公正节点)丰厚的奖励,而背叛的将军(恶意节点)什么也得不到,以消除背叛的动机。只要激励设置合理,节点们都会倾向于利益最大化,也就是遵守规则,做公正的节点。
随机性。在拜占庭将军问题中,将军们需要达成一致,才能决定下一步行动。在中心化系统中,一般由权威最大的将军作决定。
于是,科学家们思考,能否通过某种合理的规则随机选出一名将军作决定呢?而对应到区块链的分布式记账中,就是如何决定记账权。
一种方式是根据节点(将军)的算力高低来决定。谁的算力更高,谁最先解开某个谜题,谁就可以获得记账权,这就是比特币所用的PoW(ProofofWork)共识机制。
另一种方式是根据节点(将军)具有的资源来决定。非垄断资源,谁投入的越多,谁就拥有记账权,这就是PoS(ProofofStake)共识机制。
3.7PoW共识机制PoW工作量证明机制,是比特币所采用的共识机制。它的主要原理是,系统提出一个数学谜题,各矿工节点通过消耗算力来解答谜题。解答的过程很复杂,但结果很容易验证(就像我们解一个很复杂的方程式,求解的过程很复杂,但把解带回方程式验证等式左右两边是否相等却很简单)。
谁最先解出这个谜题,并全网广播,谁就获得记账权,并获得该区块的比特币奖励。这个过程每10分钟左右重复一次。
比特币中的工作量证明包含三个要素:函数、区块以及难度值。
函数就是这个数学谜题的计算方法,比特币采用的是SHA-256算法。而区块头作为函数的输入,其中包含了这段时间内所有的交易列表的摘要。
系统根据全网的算力总量,每隔一段时间会调整难度值,保证每10分钟左右挖出一个区块。
整个工作量证明的过程可以简单描述为:比特币网络中的交易进行全网广播;矿工节点收到交易广播并打包交易,形成区块头作为工作量证明函数的输入,解答数学谜题;最先解出谜题的矿工节点进行全网广播;其他矿工节点对该结果进行验证;验证正确后,接受该区块,并在这个区块后进行新一轮的挖矿。
PoW共识机制的优点是完全去中心化,节点自由进出。但缺点是需要耗费巨额的计算资源及电力,所有节点都参与挖矿,但最终只有一个节点获得奖励,这就意味着其他节点的消耗都没有获得收益。
同时,这种共识达成的时间较长,这也是为什么比特币转账的速度比较慢的原因。
3.8PoS共识机制PoS,也就是权益证明机制,是以太坊在前期采用的共识机制。它不像比特币的PoW机制那样,随便买个矿机或电脑就可以接入挖矿。想要参与PoS挖矿,就需要手中持有一定数量的币,并放在区块链中,类似于押金。这些押金根据数量和时间,会产生相应的利息。
PoS引入了币龄的概念,1个币每天产生1币龄,比如你持有100个币30天,就相当于3000币龄。这个时候,如果你发现了一个区块,那么你的币龄就清0。每清空365币龄,就可以得到一定数量的币作为利息,我们假设为0.1,那么3000币龄可以获得0.82个币的利息。
PoS运作的机制也相对简单,即系统从这些持币者中挑选一位来生成新的区块,通常是依据持币量的大小来挑选。如果一段时间内没有生成新区块,则重新挑选一位持币者来生成新区块,以此类推。
四、区块链的扩展与潜在问题4.1区块链扩展在传统的互联网中,我们的软件应用开发多采用敏捷型开发的方式,即快速做出一个最小化功能的软件,具备最基本的功能,然后根据客户反馈和需求进行快速迭代开发,不断丰富和完善相应的功能。
由于采用中心化的系统设计,这种迭代相对简单,且周期很短,长则数月,短则数天,有时候甚至一天就可以更新好几个版本。比如我们的手机App,就经常需要去应用商店下载更新。
但区块链不一样,由于采用分布式架构,一旦涉及系统更新,不能简单地依靠升级服务器来处理,且它的大量编程逻辑集中在协议层,因此处理起来会很复杂。
比如比特币的扩容问题。社区为此进行了大量的讨论,提出了诸如隔离见证、直接扩容等多种解决方案。由于比特币具有广泛的代表性,下面我们以比特币为例来具体了解一下。
在比特币源码中,单个区块的容量被限制在1MB,凡是超过1MB的区块都会被认为是攻击而不被系统接受。而在比特币的区块中,除了占用80字节的区块头,剩下的主要就是交易事物。
每条交易事物大约占200字节,按照目前实际情况,每个区块可以包含1700条交易事物,而打包区块的时间为10分钟,也就是每秒可以处理3笔交易。
而我们通常所用的信用卡、银行卡的交易处理速度可以达到每秒几千笔,双十一当天,支付宝系统处理交易的速度更是达到几万笔每秒。
比特币和它们比起来实在差得太远。随着使用比特币转账的人越来越多,整个网络的交易压力也越来越大,转账也越来越慢。为了保证比特币持续健康的发展,扩容已经成为刻不容缓的问题。
根据一般经验,扩容有两条路可以走,要么减少每条交易事物所占的容量尺寸,要么增加每个区块的容量空间。
第一条路所采用的方案就是我们所说的“隔离见证”,在比特币的交易中,我们将自己的比特币(其实是还未花费出去的输出)转给接收方,需要用自己的私钥进行签名,这个签名就是所谓的“见证”。
这就类似于我们日常生活中的转账支票,我们会写上接收方,金额,以及签名,签名(见证)是为了赋予这张支票合法性。在比特币的交易事物中,签名占据了很大一部分容量,如果能把这部分隔离开,就可以达到减少每条交易事物容量的目的。
同时,这种见证是为了确认交易来源的合法性,由矿工节点确认后,这部分数据也就没用了,可以舍弃。
第二条路就是区块的直接扩容,将区块容量空间扩大,比如我们前面提到的比特现金(BitcoinCash),就是对区块进行直接扩容,扩容后的区块大小由原来的1MB增加到8MB。
4.2侧链与闪电网络侧链,是一个独立的区块链系统,它与主链之间遵循相应的侧链协议,可以使资产在主链和侧链间进行价值转换。比如,我们针对比特币系统建立一条侧链,我们可以冻结比特币资产,然后在侧链上激活同等价值的侧链资产。
它主要有两个好处:
可以通过价值转换将比特币主链上的大量交易分流到侧链上,从而降低主链的交易压力;通过这种价值转移,相当于用比特币作为启动资金,去孵化一些新的区块链项目,从而起到了拓展区块链应用的目的。要注意的是,主链和侧链是相对的,比特币既可以作为主链,也可以作为其他区块链系统的侧链。
闪电网络是独立于区块链系统的一个微交易系统,主要针对数字货币的支付,它通过开辟独立的交易通道来完成买卖双方的交易,将交易从区块链系统中剥离出来。
在日常生活中,某些企业或个人之间可能涉及频繁的相互转账,这些转账并不需要每次都实际进行支付,双方可以约定一个期限,在这个期限内,双方的资金转移都只记账,到了约定的时间,再根据最终的账目进行实际的资金支付。
闪电网络正是基于这样的情况,以比特币为例,交易双方可以在比特币上约定一个初始的资金和结算期限,之后所有的交易全部在闪电网络中,通过记账和签名来完成,达到了约定的期限,再在比特币系统中结算。
结果就是,双方可能实际交易了100笔,但在比特币系统中只交易了1笔。这就大大减少了比特币系统的交易量,从而缓解了比特币系统的压力。
4.3潜在的问题分叉。区块链的结构是一个个区块按照一定的顺序被链在一起,由于节点间版本更新不一致的问题、或者社区(矿工节点)出现分裂、或者恶意攻击等原因,会在某一个区块高度产生出两条以上的链接方向,就像树枝分叉一样,这种情况被称为分叉。
比如比特币因为扩容问题而分叉出了比特现金,以太坊因为TheDAO合约漏洞攻击事件而分裂成了以太坊和以太坊经典。这种分叉现象在区块链领域很普遍,但也很严重,可能会改变区块链项目原本的发展路径和初衷。
51攻击。区块链的本质是一个分布式记账系统,我们为了摆脱对于第三方机构作为信用担保的依赖,引入了很多节点共同记账的机制,这样,当某些人想要篡改交易,就很难实现。
但是,如果这个人的权力很大,大到可以控制超过一半以上(51以上)的节点按照自己的想法来记账,那么他就有可能篡改交易账本,从而实现双重支付(即一笔钱花费多次),而这显然是不公平的。51攻击也是区块链分布式记账系统面临的一个比较大的问题。
私钥丢失。区块链中的私钥,就相当于我们的银行卡密码,通过它,我们才能支配我们的区块链资产。但私钥比银行卡密码的使用要求更为苛刻,如果银行卡密码忘了,我们可以拿着身份证去银行修改,如果银行卡密码被盗,我们可以通知银行冻结账户然后修改密码。
但在区块链系统中,并不存在这样一个中心化的机构来为我们服务。一旦私钥丢失,就基本再也找不回来了,就意味着你的区块链资产将被永久封存。
代码漏洞。要说软件代码不存在漏洞几乎是不可能的,哪怕不停的升级更新,也依然会存在漏洞。传统软件中,这些漏洞大多带来的是使用体验上的问题,比如卡顿,闪退或者某些功能无法使用,我们通过下载更新就可以修复。
但区块链系统,天然与资产价值相绑定,一旦出现漏洞,就可能造成极大的经济上的损失,比如以太坊的TheDAO事件,以及时常发生的数字资产被盗事件,需要我们提高警惕。
网络拥堵。区块链技术发展还处于初期阶段,基础设施还不够完善,很多区块链系统目前只实现了基本功能,在性能上还存在很大的提升空间,目前还无法支持大规模并发交易的应用,像之前火爆一时的以太坊游戏Cryptokitties,由于参与人数众多,交易量巨大,一度让以太坊网络陷入瘫痪,转账确认要好几天。
当然,随着技术的发展,区块链系统的性能会越来越高,网络拥堵问题也会逐步解决。
后记总之,区块链目前还处在一个很早期的阶段,充满了各种各样的问题。
但同时,区块链技术创造出了一个不依靠第三方信任机构的可信网络,有机会重构我们整个社会的信任体系,有着相当大的行业前景和发展潜力,因此也充满了机遇,值得我们去探索。