内容概要
现如今说起比特币,相信不少朋友已是耳熟能详了,尤其是这两年随着其价格飙升,甚至超过了黄金 ,超过了房地产,各大财经媒体乃至央视都有所关注报道;
在很多朋友心目中,比特币似乎就是一个类似于游戏币、邮币卡这样的炒作标的物,除了惊叹于它的价格上升速度外,对其了解还是寥寥。
然而,这一切的背后,到底是什么在支撑,现如今除了比特币,还有很多其他的类似系统, 比如莱特币、以太坊、 比特股等等,不胜其多,但凡介绍这些内容的软文, 大体都会提到一个名词:区块链
一切似乎都是由区块链引起的,那么,就让我们剖开迷雾,揭开神秘的面纱,来看看这里头到底是个什么,它有什么特点,能有什么用处。
白话区块链技术栈与应用
导读:本章内容主要介绍区块链本身的含义以及代表性的技术组成,并由此介绍比特币是怎么通过这样的技术产生的。
1. 什么是区块链
1.1 一个有趣的数据记录格式
区块链,拆开来就是“区块+链”,实际上是一种数据的记录格式,软件在处理数据的时候,总是需要按照某种格式来读写,比如我们通常使用的关系型数据库,数据是按照一条一条的记录保存,或者再通俗的说,就像会计记账,将每一笔发生的业务都记在账本中,每一笔记录的账务称之为是凭证,一个月下来,将记录的一堆凭证数据汇总成 一个账簿,每过一个月就月结一下。区块链的格式,跟会计的这种记账方法很类似,所谓区块也就是一大坨数据的意思,我们可以将会计每个月所有记录的记账凭证看成是一个个的区块,区块之间通过年 月串联起来,这样看起来就像是一条数据链一样,区块链其实就是这么简单的一个格式,我们看个示意图:
如图所示,就是区块链格式的样子了 ,在比特币中,不是每个月存储一个区块, 而是大约每10分钟一个区块(注意只是大约,不是精确的10分钟),区块中存储的数据是最近的10分钟内发 生的交易 事务(最近的10分钟这个说法其实并不严谨,现在可以就这么理 解,在下面另有解释),可以理解为就是流水账。
大家看到这样的格式后,不知道是否有些似曾相识的联想,其实这样的数据格式,在生活中是有很多相似的;
比如工厂仓库的出入库记录,这个跟会计账本是类似的,还有家谱或者族谱,每一代人之间的关系是一个区块,到了下一代 又是一个区块,区块之间是父辈与子 女的关系连接,等等;而如果是计算机专业的朋友,一眼看上去,这不就是个线性表吗?是的,这就是比特币软件的主要数据存储格式,也是其他所有基于区块链技术的系统存取数据的格式。
这是一个很有趣的数据格式,它将连续不断的发生的数据分成了一个 一个的数据块,这样每个区块就都有自己的数字编号,也可以有自己的身份证号(通过哈希算法计算得到),在下载同步这些数据的时候,可以并行的从各个节点来获得,无论数据先后,到达本地后再根据区块号或者身份证号来组装起来就行 。
另外,这种格式是一种链条的格式,链条最大的特点就是一环扣一环,很难从中间去破坏, 比如有人篡改了中间的5号区块,那么如果要让数据看起来是完整的,就得同步把5号区块后续的所有区块都要更改掉,这个难度就大了,这也是区块链数据格式不可篡改的其中一个原因(当然了,如果仅仅只是本机的数据,也没什么不可篡改的,区块链系统真正的防篡改能力是通过无数个区块链系统运行的节点网络以及共识算法来实现的,这个在下面再介绍)。
这种格式还要个妙处,如果这个数据总是由一个人来记录的,那自然也没什么,但是如果放到网络中, 大家共同来记录这个数据,那就有点意思了,每个区块数据由谁来记录或者说打包,是可以设置一个游戏规则的,比如说掷骰 子,大家约定谁能连续3次掷出6,那就让他来记这个数据,为了补偿 一下他的劳动投入,奖励给他一些收益, 比特币正是使用了这样的原理来不断的发行新的比特币出来,奖励给打包的那个人的比特币就是新发行的比特币。
说到这里,大家觉得有点意思了吧?
1.2 一组技术的代表称呼
刚刚我们说了,区块链是一种数据的记录格式,可如果仅仅如此的话,实在不算是什么大不了的创新,事实上,在技术上区块链是一组技术的代名词,我们通常都说使用了区块链技术就是这个意思,那么既然是一组技术,那是由哪些技术组合起来的呢?我们来看一组关键词:
- 公开密钥算法
- 网络共识算法(挖矿)
- 梅克尔数据证明
- 可编程脚本合约
- 区块链账本
1.公开密钥算法
属于计算机密码学⾥面传统的技术,公开密钥算法是⼀种不对称的加密算法,拥有两个密钥,可以互相加解密,通常其中的一个密钥是公开的称之为公钥,另外一个密钥是保密的称之为私钥;
2.哈希算法
也是属于计算机密码学中传统的技术,应⽤就更广泛了,主要⽤来对⼀段数据进行计算,得出⼀个摘要信息,通俗点说就是给一段数据⽣成⼀个身份证号;不同的消息生成的摘要数据是不⼀样的(某些抗碰撞能力弱的哈希算法可能在这⽅面会有些问题,但是使⽤广泛的⼀些知名的哈希算法,发⽣碰撞的概率很低),相当于给⼀段数据⽣成了一个身份证号这么个意思,在区块链系统中,哈希算法的使⽤很多,⽐如区块与区块之间,就是通过区块头的哈希关联起来的,⽽区块中的每⼀笔交易事务也都会⽣成⼀个哈希值作为交易易数据的ID,通过这些身份证号可以⽅便的检索或者关联区块,也能⽅便的指定某⼀笔交易事务。
哈希算法还可以用来生成梅克尔树,在下面我们再详细介绍,我们说了,哈希算法的特点是,只要目标数据有哪怕⼀点点的改动,生成的哈希值就会完全不不一样,因此可以⽤用来验证数据是否被改动过。
3.⽹络共识算法
在很久前就有计算机科学家研究过,并且提出过一些模型,⽐如拜占庭容错算法之类,比特币、以太坊这些使用的是⼀种工作量证明算法,其它的一些区块链系统有使用其他各种衍⽣的算法,⽽算法的原理都很简单,就是约定⼀个规则,通过共同执行这个规则,让每个分布式的节点数据都保持最终一致;
4.梅克尔数据证明
这是利用哈希算法将⼀组数据创建为⼀棵哈希树结构,⽤于验证数据完整性的一种结构,同时也应⽤在了轻量级钱包中。不同的区块链系统对梅克尔树的应⽤不尽相同,比特币中是⼆叉梅克尔树,比较简单,通过交易事务的哈希值两两配合生成一棵树,以太坊这种就复杂的多了,称之为梅克尔.帕特⾥夏树,这里暂时不赘述。
5.可编程脚本合约
什么叫合约?就是⼀组约定的规则,⽐如银行的结算系统,⼩明转账100给小王,在这么⼀个过程中,银⾏系统就会根据⼀组规则自动执行,规则包含⽐如检测⼩明的密码是否正确,余额是否⾜够,⼩王的账号是否正确,检测通过则分别更改两者的账户⾦额并写⼊事务⽇志。是的,这就是合约的意思了,当然,如果范围再⼴泛些,各种商业合约也都是这么个意思,因此可编程脚本合约也没什么好稀奇的,然⽽,如果将这种编程合约放到区块链的环境中,就⽐较有趣了,看两个特点:
第⼀个,区块链系统是⽆中⼼的分布式⽹络,没有边界
第⼆个,区块链系统通过⼀系列的技术实现了可信任⽹络
加起来,就是⽆边界的可信任⽹络,在这样的⼀个⽹络中执⾏既定的合约,成本低⽽而且安全,⽐特币在本质上也是属于这么⼀种脚本合约,只不过在⽐特币软件中,合约中处理的事情是⽐特币的转账,如果扩展这个概念,众筹、担保、分润等各种合约种类都能应⽤在这上⾯,⽤户也可以⾃行编写合约规则,以太坊便是这⽅面的⼀个典型代表,并由此带出了智能合约的应⽤。
这些技术的具体解释,我们在下⾯⼀一详述。
其中的【区块链账本】我们已经介绍过了,不再赘述,那么其他的技术都具体是什么意思呢,它们是怎么与区块链账本结合起来的?我们来一一说明一下:
1.3 创世应用“比特币”
说了这么多,我们知道,区块链技术反正就是一套软件开发技术,跟我们平时的网站开发技术、游戏开发技术、手机APP开发技术类似,只不过,与其他的开发技术不同的是,它能开发出一款软件,这种软件能制造“货币”出来,这就让人觉得有些不可思议了,比特币正是区块链技术的第一个应用软件,因此我们称它为“创世应用”。
正是比特币把区块链的技术理念带到了我们的视野中,虽然⽐特币的创始人中本聪⼀直都是⼀个谜,没有搞得清楚他到底是⼀个⼈人还是⼀个组织,但这些都不重要,重要的是⽐特币系统以⼀种极其天才的创新设计,解决了人们⼀直以来都难以解决的问题,那就是异步⽹络环境中实现数据的可信任共识的⽅案。我们抛开⽐特币这个货币的概念,纯粹站在软件或者⽹络的⻆度来看⼀下,假设我们是当初的中本聪,模拟⼀下当时的想法,⾸先,希望实现⼀套系统,可以联⽹,并且通过网络传递数据,如果是使⽤中心服务器这个结构的话,那显然是不够安全的,只要服务器上的数据损坏或者被攻击,系统等于就被瘫痪了,因此,决定采⽤分布式的结构,可是分布式结构有几个问题;
第一个,这些分布式的系统节点运⾏在哪呢,谁愿意提供计算机设施来运⾏行,靠⾃己来部署,那个成本就没底了;
第⼆个,分布式的节点,那么数据的⼀致性就是个问题,没有了服务器,数据来源也就没有权威的保证了;
第三个,怎么来验证⽹络中的数据呢?
对于第⼀个问题,站在经济⻆度,如果系统提供⼀种激励措施,让运⾏节点的⼈有利可图应该就能解决了,因此设计这个系统,得要有⼀个奖励或者激励的规则,在⽐特币中,打包区块的矿⼯工能够获得⼀定数量量的⽐特币奖励,这就是激励措施了。
对于第⼆个,这个问题是个难点,比特币要运⾏在公⽹上,各种情况都有,数据可能被篡改,⽹络可能不稳定,就连节点什么时候运⾏也不在控制之中,如何来解决这些问题呢?得要有⼀个机制,这个机制必须要有公正性,既然网络是可能不可靠不稳定的,那这个机制中就不能有太多对其他节点的依赖,得是⼀个主要依靠本机就能实⾏的⼀个做法。
换成是我,还真的很难想到⼀个好方法,传统的⼀些技术都有些问题,如果是在⼀个节点明确,网络也较为良好的场合,还好处理理⼀些,可是⽐特币的情况要⽐这个复杂的多。著名的CAP原理,阐述了这么⼀个结论:分布式计算系统不可能同时确保⼀致性、可⽤性和分区容忍性。看下这三个术语分别是是什么意思吧:
【⼀致性】:这⾥是指强⼀致性,发⽣在后⾯的事件能看到前⾯事件发⽣导致的结果
【可⽤性】:在有限时间内,任何⾮失败节点都能应答请求
【分区容忍性】:也就是说⽹络有可能发⽣分区,也就是说节点之间的通信不可保障不能同时确保,那就只能靠弱化某⼀个或者某两个特性,⽽而增强其中⼀个特性了。
中本聪在实现的时候,设计了⼀个工作量证明,很有意思,设置⼀个难度值,大家都通过⼀个类似于掷骰⼦的算法来命中⼀个结果,若结果符合预期的要求,就成功,成功者可以获得数据的记账权也就是区块数据打包,打包完毕后⼴广播给其他⼈,其他⼈验证后写⼊⾃己的数据中。
在这个过程中,由于使⽤的算法是⼀个类似于暴力破解的算法,除了靠提⾼计算机算力没有更高的办法去讨巧(这就⼀定程度上实现了⼀定程度的公正,当然了,⼟豪有能⼒购买更高性能的计算机设施,从⽽比普通⽤户更加具有抢得打包权的能力,这也是⼀个问题,不过⼀种技术总是只能解决⼀定范围的技术问题),但是大家需要注意的是,能够算出⼀个命中的值的,可并不⼀定只有⼀个⼈,如果出现了多个呢?那大家就只能进⾏区块的⼴播竞争了,谁被其他的节点接收的多,谁就被最终认可,⽽其他同样挖矿成功的就会被丢弃,从⽽得不到奖励。
因此,比特币中的这种数据⼀致性的算法是最终⼀致性而不是实时的⼀致性,这个大家⼀定要注意了。
对于第三个问题,怎么验证⽹络中的数据,在⽐特币⽹络中,每个节点都是独⽴的验证数据的,在验证过程不需要⽹络中其他节点提供依赖的服务。
2. 区块链技术栈
2.1 记录格式—区块.链
见【1.1 一个有趣的数据记录格式】
2.2 网络结构-P2P
现如今,⼤概很少软件是单机版的了,就连输⼊法⽐如搜狗输⼊法、讯飞输⼊法也都是要通过联⽹来更新词库以及提供其他⼀些智能功能的,那么,既然是联⽹的软件,就避不开⼀个问题,那就是⽹络结构,就好⽐我们要造房⼦,总得设计下房屋的结构吧,砖瓦结构呢还是框架结构,单独的平⽅呢还是连⽚的⼩区。
迄今为⽌,⽆论什么样的⽹络结构,总体来区分⼀下的话,就是两种:客户端-服务器结构、P2P结构。
P2P也就是peer to peer的意思,中⽂点对点,也就是对等的意思。
区块链中的特点之⼀就是分布式,每个节点都维持完整的账本数据,可以独⽴的进⾏数据验证,独立的发送数据接收数据,彼此之间通过共识来实现数据的不可篡改和⼀致性,⽽每个节点都独⽴的按照规则做着⾃己的事情。任何⼀个节点的损坏或者图退出都不⾜以影响整个⽹络的正常使⽤,尤其当节点数量很多的事情,这也就避免了单点故障。
由于不存在⼀个服务器,也因此对等⽹络结构中的节点,是需要有⼀个认识彼此的机制的,这就是⽹络路由功能,简单来说,就是每个节点都会负责为其他节点提供地址信息,同时也会去索取和更新有效的节点地址。
就个⼈理解来说,对等⽹络结构最核⼼的就是⽹络共识机制,每个节点既当客户端也当服务器器,通过共识机制来协同。
2.3 同步机制-共识算法
区块链系统是对等⽹络结构,每个运⾏的节点都各⾃保存⾃⼰的数据副本,那么问题就来了,怎么来保证彼此之间的数据统⼀呢,既然没有⼀个中⼼服务器,⾃然也就没有⼀个传统意义上的权威数据来源了,⽽且对等⽹络中的每个节点都是平等的,那要是彼此的数据不⼀致,以谁的为准呢?这就要使⽤到⼀个同步机制,也就是共识算法。
共识算法的主要⽬的就是通过⼀种机制,使得⽹络中产⽣的数据让⼤家都能认可也就是所谓的共识,⽽对于那些⾮法的⽆效的数据会被丢弃掉,可以说,共识算法是确保区块链⽹络数据同步以及数据安全的重要环节。每⼀种不同的区块链系统都会有⾃⼰的⼀套共识算法,⽐如PoW(proof of work,⼯作量量证明)、PoS(proof of stake,权益证明)、DPoS(Delegated proof of stake,股份授权证明)、PBFT(Practical Byzantine Fault Tolerance,拜占庭容错算法)等等,很多,每种不同的算法也各有特点和优劣。
再具体说明之前,有朋友可能会有疑问,就算是对等⽹络,没有⼀个服务器来权威的提供数据来源,但只要节点之间彼此都连接,随时保持⼀致不就⾏了,如果是在⼀个⽹络良好的局域⽹中,并且运⾏的节点是受到严格的管理的,那⼤概也就没什么问题了,可事实上是,类似⽐特币这样的区块链系统是运⾏在互联⽹上的,⽽且谁也不能保证⽹络是个什么状况,甚⾄就连运⾏的节点什么时候启动什么时候会关闭掉都不知道,⽐如我们使⽤微信聊天,假设没有⼀个微信服务器存在,当⼩明发消息给⼩王时,⼩王正好没开微信,或者⼩王正好在地下停⻋场,没⽹络,那怎么办?种种情况,都不能保证节点之间能够随时连接在⼀起,因此区块链中的共识算法,要解决的是这样⼀个情况异常复杂的⽹络环境中的数据同步问题。
为了让⼤家⽐较能够形象的理解,我们还是以⽐特币为例,⽐特币中使⽤的是⼀种⼯作量量证明算法,其原理很简单,如下:
我们还是以⽐特币为例来说明,⽐特币中的⽹络共识算法的过程原理相对简单,理解了这部分,再去理解其他的共识算法就会⽐较有基础。
在⽐特币中,使⽤的共识算法是⼀种⼯作量量证明算法,说通俗点,⼤家通过⼀种竞争算法来抢夺区块数据的打包权,谁抢到了谁就能将发⽣的交易易数据打包成区块,并且⼴播出去,其他节点验证后没有问题就保存到⾃⼰的区块链账本中,这种竞争算法的原理很简单,系统会计算出⼀个难度⽬标值,然后⼤家通过对区块头进⾏⼀个加入了随机数的哈希计算,直到算出的值⼩于难度⽬标值,那就算是成功拿到记账权了,就跟掷骰子差不多意思,谁掷出了⼀组符合条件的数字谁就赢了。
有朋友可能问,那要是不⽌⼀个⼈算出了那么⼀个数字呢,以谁的为准呢?呵呵,这个时候,就要靠运⽓了,假如A和B都得到了符合条件的⽬标数据,都打包,都⼴播了,这个时候就看谁⼴播的范围最⼤,影响最⻓远了,最后⽐特币⽹络会保留⼴播范围最⼤的那个。
⼤家看到在这个⼩节的标题上放了个“挖矿”的字样,是不是共识算法都称之为是挖矿算法呢?答案是否定的。在这⾥之所以放⼀个“挖矿”的字样,是因为在不少的公链系统中,⽐如⽐特币、莱特币、以太坊等,都是通过这样的⼀个共识算法来发行新币的,怎么发⾏呢,就是奖励⼀定数量量的币给成功挖到区块的矿⼯。
2.4 完整证明-梅克尔树
梅克尔树是一种数据结构,跟区块链账本数据格式一样,是用于维护 一类数据的,区块链的账本格式是一条链,梅克尔树,顾名思义是 一种树结构,梅克尔树的目的是为了实现完整性证明,在不同的区块链系统中,对梅克尔树的使 用不尽相同,比特币中使用的称之为二叉梅克尔树,而比如以太坊系统中使用的则是梅克尔-帕特里夏树,相对来说, 二叉梅克尔树要简单许多,咱们就从简单的开始介绍吧,还是以比特币中的为例 。
既然是树结构,那就有一个个的树节点,那么比特币中的树节点中都是哪些数据呢?实际上,在比特币中,每个区块中都包含有一颗梅 克尔树,我们来看看,这棵树是怎么种出来的。
在每个区块中都包含有很多交易事务,每条事务都有一个身份证号,这是通过哈希算法计算而来的,可以唯一的表示某条事务记录,假如说某个区块中有6条事务记录,那我们就拿出6条事务记录的身份证号也就是哈希值,进行两两配对,然后分别再计算出两两配对的事务哈希值,依次往上,直到最后计算出一个根哈希,我们来看个图示:
在⽐特币中,每个区块都能⽣成⼀颗梅克尔树,是通过什么来⽣成的呢?是通过交易事务,在⼀个区块中,每条交易事务都会被计算⼀个哈希值,假设某个区块有4条事务,则如图所示,Hash1到Hash4就是这4条事务的哈希值,接下来再次对事务的哈希值两两哈希,直到最后⽣成⼀个根哈希,如此,⼀棵梅克尔树就⽣成了。那么,这样的⼀棵树⽣成后有什么⽤呢?
⾸先,⽐特币的节点在进⾏数据同步的时候,会向多个节点下载数据,这个时候,就会有个问题,怎么来验证获得的数据是完整的还是不完整的呢,是有问题还是没问题的呢?在点对点⽹络中进⾏数据传输的时候,显然并不只是从⼀台服务器上下载数据,⽽且其中的⼀些机器还可能是不稳定的,甚⾄是不可信的,这个时候,通过上述的⼀个⼤文件⼀个哈希值的⽅式就不太能起作⽤了。
然后通过梅克尔树,假设图中的2号事务数据下载有问题,则计算出的Hash12必然是与其他节点不⼀致的,很快就能定位到问题块,除了能够快速定位到数据块外,还有⼀个作⽤,就是对SPV(Simplified Payment Verification, 简单⽀付验证)的支持,我们知道,⽐特币核⼼钱包是要搭配完整的区块链数据使⽤的,包含了所有发⽣的交易事务,也因此,可以对接收或者发起的交易事务进⾏完整的验证,⽐如是否包含⾜够的余额,是否双花等,但是这种却也有个很⼤的问题,它必须要带上⼀个数据量很⼤的账本副本,这就限制了⽐特币钱包的使⽤,有时候我们只是想验证⼀下⽀付是否发⽣过就⾏了,完整的交易可以交给核心节点,那怎么办呢?可以通过如下的过程来实现:
1. ⾸先下载完整的区块头数据,注意是区块头不是所有的区块链数据,区块头中包含有区块的梅克尔根
2. 如果是想要验证某笔⽀付交易,则计算出这笔交易事务的哈希值txHash
3. 找到txHash所在的区块,验证⼀下所在区块的区块头是否包含在区块链账本中
4. 获得所在区块中计算梅克尔根所需要的哈希值,注意我们并不需要所有的事务哈希值,如图所示,如果是要校验Hash1的话,我们只需要再搜集Hash2、Hash34即可
5. 计算出梅克尔根
6. 若计算结果与所在区块的梅克尔根相等,则⽀付交易是存在的。
7. 根据该block header所处的位置,还可以确定该交易得到了多少个确认
从中我们可以看到,梅克尔树是相当重要的。⼤家可以设想⼀下,这种结构还能应⽤在哪些场景下。
2.5 账户管理 -公开密钥算法
我们在使用通常的网络服务时,都会注册一个用户名,无论是使用淘宝、京东、微信等,还是玩网络游戏之类,都会去注册一个用户名,那么区块链系统中是怎么来注册用户名的呢?实际上在区块链系统中 一般是没有用户名这个概念的,而只有一个账户地址的概念, 无论是使用比特币还是以太坊还是其他的,基本都是通过一个地址来表示的,对于支持数字货币的区块链系统这个地址也称之为是钱包地址,那么这个地址是从何而来的呢?我们先来了解一下公开密钥算法:
这是⼀种加密算法,通常的加密算法,密钥只有⼀个,举个例子,我们希望对⼀串串数字进⾏行加密,约定将每⼀个数字都加上2,⽐如1,2,3,4,5就变成了3,4,5,6,7,如果有谁知道了这种加密⽅法,那同时也就知道了解密算法,这种⼀般称之为叫对称密码算法;
如果希望加密的⽅法与解密的⽅法是可以独⽴的且⽆无法互相直接推倒出来,那么,这种算法就是不对称加密算法,也就是所说的公开密钥算法,为什么叫公开密钥呢,因为这种拥有两种密钥,⼀个是保密的称之为私钥,⼀个是可以公开的,称之为公钥,使⽤用私钥加密的数据可以通过公钥解密,反过来使⽤公钥加密的数据可以通过私钥解密,⽬目前这种算法应⽤比较多的有RSA算法和ECC椭圆曲线算法,前者是利用了⼤素数分解难度的原理理,后者是利用了椭圆曲线离散对数的计算难度,具体细节基于篇幅这⾥不再展开,区块链系统中,通常椭圆曲线算法应⽤的最多。
以⽐特币为例,⽤户可以在⾃己的钱包中创建地址,这个地址类似于银⾏账号,我们可以将⽐特币从⼀个地址发往另外⼀个地址,那么,这个地址从何⽽来的呢,实际上,从本质上来讲,并没有⽐特币地址这么⼀个东⻄存在,为什么这么说?⽤户在创建钱包地址时,实际上是创建了⼀对公钥和私钥,⽽所谓的地址只是公钥的⼀种格式化表示。 ⽤户通过私钥签名证明⾃己拥有某笔⽐特币,⽽通过公开的公钥可以验证⾃己的身份,只要⾃己通过私钥签名⼀笔交易或者签名⼀笔消息,任何⼈人都可以通过公开的公钥来确认是否是合法的用户。也就是说,公开密钥算法不但⽤来识别某个地址用户,也是⽤来完成交易事务的,不但是⽐特币,其他的区块链系统也是同样的原理。
2.6 智能合约-可编程状态逻辑
这是区块链系统⾮常重要的特点,我们知道,区块链系统可以创建⼀个可信任的⽹络,在这样⼀个可信任的网络中可以放心的通过⼀组代码编写的既定规则,转移数据的所有权,变更数据的状态。⽐特币⽹络中可以转移⽐特币,以太坊⽹络中可以转移以太坊还可以通过其他的智能合约实现按规则的状态变更。
这些到底是什么意思呢?
通常,在⼀个传统系统中,⽐如银⾏行的账户系统,是怎么来表明⼀笔钱是谁的呢?是通过账户和密码,⽐如⼩明转了了100元给⼩王,这100的⾦金金额数值就会写⼊到⼩王的账户,然后扣除掉⼩明账户⾥100,⼩王的账户只有通过⼩王⾃己的密码才能验证通过使⽤,这个逻辑看起来很正常,⼀直以来我们都是来的。然⽽而,区块链系统中却不是这么来实现的。
让我们来站在⼀个⽐较⾼的⻆角度来看待⼀下,以银⾏账户为例,⽆论是转账,存钱还是扣除费⽤等,不管是什么样的业务,对于账户来说,站在数据的层⾯,无⾮就是数据状态的不断变更,⽽每⼀次的变更都是通过⼀系列的规则验证的,这么⼀来,我们可以将这个账户看成是⼀个状态机,如下:
这个图很好理解,那么我们可以看到,最主要的不是状态本身,⽽是状态变更的触发条件,在这个图中,每个状态之间的变更都是有条件的,区块链系统中通常会怎么来实现这么⼀个条件的触发呢?我们以转账来说明:
1. 发送⽅发起⼀个转账交易,类似于开了⼀张⽀票,然后签上⾃⼰的名字(私钥签名)
2. 在⽀票上写上对⽅的账户地址(对⽅的钱包地址,我们知道钱包地址就是通过公钥转换⽽来的)
3. 向⽹络中发送这笔交易,每个节点都可以来验证这条交易是否有效(⽐如发送⽅的余额是否⾜足够,私钥签名是否合法等)
4. 节点如果验证没问题就能通过,这条交易事务最终会被矿⼯打包到区块(相当于正式的记了个账)
5. 接收⽅可以通过⾃⼰的私钥来验证⾃⼰对这条转账交易的拥有权(这句话⼀定要理解⼀下),通过⾃⼰的私钥和⽀票上的公钥转成的地址匹配,若能成功,就表明⾃⼰拥有这条交易事务转账的所有权,那么⾃⼰就能花这笔钱了。
这样的⼀个过程是通过什么来实现的呢,是通过⼀组脚本程序,在⽐特币中是⼀对锁定与解锁脚本,在以太坊中是更为复杂的编程脚本,总之,就是通过这样的程序逻辑实现了状态变更的触发条件,只要脚本程序写好,达到触发条件,程序就会严格的执⾏,刚正不阿,不留留半点情⾯面^_^。
那么,我们可以发现,这个程序,实际上相当于就是⼀份合约,大家约定了⼀个规则,符合规则了就照章办事,⽽具体是什么样的规则,这个是可以事先编写的(⽐特币中功能⽐较受限,⼀般也就能实现转账交易,以太坊则可以⾃定义编写各种合约规则),将这样的⼀份合约放在这样的⼀个去中⼼,分布式的环境中,由⽹络共识来保证不可篡改,这是多么创新的⼀个思路啊,这种可编程合约的思想可以⼴泛的应⽤于各种商业环境之下包括金融领域。
3. 应用特点
3.1 分布式网络
P2P⽹络本身就是⼀个分布式⽹络,区块链⽹络中并没有⼀个真正意义上的服务器,内部的运⾏逻辑也并不假设有服务器的存在。在区块链之前,也有过不少的分布式⽹络系统,⽐如⼤家很熟悉的电驴下载、BT下载,互联⽹初期的时候,⼤家都是到⽹站服务器去下载,下载的⼈多了,速度就会慢,因为占流量了或者说服务器更繁忙了,然而BT下载这种,确实下载的⼈越多,速度越快,我们不来详细的解析BT下载的具体技术细节,就光从⽹络结构上来讲,分布式的⽹络结构,使每个节点都既是使⽤者也是服务的提供者,也就形成了⼈多力量⼤的效果。
分布式⽹络中,首要的⼀个问题就是,如何保证数据的⼀致性,有些对数据的⼀致性要求不⾼⽐如⽹⻚资源,⽂件服务,早点晚点影响也不⼤;有些则希望在⼀个能承受的时间范围内达成⼀致,⽐特币就是这种,通常会建议发送⼀笔交易事务后,等待⾄少6个区块,原因就是6个区块后,数据基本上被⼤部分节点收纳的概率就很⼤了,还有⼀些对⼀致性的要求很即时,⽐如银⾏结算,不可能说要等段时间,账本才能⼀致,那对银⾏来说不能接受。
针对不同的使⽤场景,分布式⽹络也会不同的扩展,⼤家要注意的是,分布式⽹络并不是说完全没有中心,而是说在整个⽹络结构上是分散的,分布式的,但是每个单元还是有可能会存在中⼼的,毕竟在某些效率要求⾼的场合,中⼼结构的效率是最⾼的,这两者之间并不是互相对立的,⽽是互补的。
3.2 数据不可篡改性
我们可以反过来看⼀下,什么情况下数据是可篡改的。
⽐如数据都管理在⼀个服务器上,那⾃然是可篡改的,再怎么设置身份认证之类,只要突破进去就是⼀马平川了;
再⽐如数据虽然不在⼀个服务器上,但是对数据的验证是⼀个人说了了算的,⽐如现在很多的⽹站服务,⽐如各种电商⽹站啊,甚⾄包括银行(当然,不是说这些系统就会被随意的修改,这⾥只是参照⼀个例子),数据的管理权在⼀个管理员⼿中,数据怎么改并不需要得到其他不受⾃⼰控制的系统验证; 数据的记录权限在⼀个管理员⼿中,跟第二点类似,⾃⼰说了算;
区块链系统怎么保证数据不可篡改性的,对于第⼀点,区块链系统是分布式的,因此不存在⼀个明显的服务器目标;第二点,区块数据需要被⽹络中其他节点验证,⼤家都认可才会被记录在账本中由此达成共识,除非控制了大部分的节点,否则是不现实的;
对于第三点,区块链系统中使⽤各种共识算法,记账权不会掌握在⼀家⼿中,⽐如⽐特币的挖矿算法。
这种特性对于⼀些公众数据的记录是很有意义的,⽐如公证类数据,⽐如众筹账务,慈善款项等。
3.3 规则强制执行性
- 代码即法律
- 智能合约的条件执行
3.4 无边界价值转移
区块链网络可以创造一个可信任网络,可信任就表示有信用,而信 用是一切金融传递的基础
区块链系统可以自带金融属性,通过比特币的例子我们也能看到,它可以通过网络在全球各地进行转账交易,通过这种原理,不但可以传递货币,也可以传递其他任何的数字资产。
传统的比如游戏币,游戏道具,某平台的积分等,一定程度上也可以转移价值,但都是很难做到无边界传递的,而且其本身的信用程度也并不高,区块链⽹络⽆无边界,并且可以维持⼀个可信任的网络,这就为资产或者说价值的传递构造了一个成本相当低廉且传播很广泛的⽹络基础设施。
3.5 自治网络系统
这个其实是一个未来的愿景展望,可编程社会的一个基础模型
4. 应用场景
4.1 数字代币
比特币、莱特币、以太坊以及基于以太坊的各种合约代币
4.2 众筹合约
属于智能合约的 一种
4.3 跨境 支付
无边界的价值转移能力以及智能合约的特点,很适合应用在金融的跨境支付领域,目前的跨境支付手续繁杂,等待时间也很长,效率不 高,可以考虑在各国银行之间建立一个基于区块链的支付系统。
R3联盟
swift应用超级正本的fabric建立支付网络
4.4身份证明
使用区块链来构建身份管理系统
4.5去中心交易
目前的案例,Bitshares以及Openledger
基于区块链的交易系统,通过预言机创建链上资产,通过代码规则运行公开透明的交易逻辑
5.主流技术平台
5.1比特币
历史上第一个区块链系统,第一个加密数字货币系统,其他的系统基本都是在比特币的基础上开发的
5.2以太坊
数字货币+智能合约,既是一个数字货币系统,也是一个智能合约的开发平台
5.3超级账本
包含一系列的项目
比较著名的就是fabric,是一个面向商业的区块链系统开发框架,其本身其实并不是一个运行的区块链系统而是一套开发框架,一套开发用的半成品基础设施,是由Linux基金会主导的项目。
from:https://mp.weixin.qq.com/s/kuNtNekdsBYxoTtP6xxQqw