我所认识的区块链(二)
昨天写我所认知的区块链(一)的时候,比特币价格为$17250,但是还不到一天时间,此刻比特币价格已经突破$20000。现在我对于比特币的价格已经没有什么特别的感觉,我不认为现在的比特币价格已经达到顶峰,比特币的价格长期看还会继续涨,什么时候比特币会变得没有人要那就是什么时候区块链技术不再被人看好。但是我写的不构成对比特币投资的建议,因为短期比特币价格还会继续震荡,但是长期是向上走。但是在这波动中,如果对于比特币没有足够的信心,你肯定是吃不好夜不能寐拿不稳,与其这样还不如继续观望。深入学习区块链技术,可以让你对他有更加深入的了解。
今天继续学习区块链知识,不过今天说道的内容更加偏向于纯技术,但是只要有一颗热爱学习的心,一定也能看懂个大概。正所谓,读书百遍其义自见。
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.接收方可以通过自己的私钥来验证自己对这条转账交易的拥有权(这句话一定要理解一下),通过自己的私钥和支票上的公钥转成的地址匹配,若能成功,就表明自己拥有这条交易事务转账的所有权,那么自己就能花这笔钱了。
这样的一个过程是通过什么来实现的呢,是通过一组脚本程序,在比特币中是一对锁定与解锁脚本,在以太坊中是更为复杂的编程脚本,总之,就是通过这样的程序逻辑实现了状态变更的触发条件,只要脚本程序写好,达到触发条件,程序就会严格的执行,刚正不阿,不留留半点情面。
那么,我们可以发现,这个程序,实际上相当于就是一份合约,大家约定了一个规则,符合规则了就照章办事,具体是什么样的规则,这个是可以事先编写的(比特币中功能比较受限,一般也就能实现转账交易,以太坊则可以自定义编写各种合约规则),将这样的一份合约放在这样的一个去中心,分布式的环境中,由网络共识来保证不可篡改,这是多么创新的一个思路啊,这种可编程合约的思想可以广泛的应用于各种商业环境之下包括金融领域。
其实在么一个转账的过程就是利用哈希算法进行数字签名的过程,目前在电子合同中应用最广泛,但是他是存在于中心化网络之中。区块链技术中使用的智能合约系统是让机器去执行了这样一个过程,很有商用价值。这些技术内容其实多看几遍,还是能够读懂他的一些运行机制。
我正在「言之有吴」和朋友们讨论有趣的话题,你一起来吧?欢迎加入我的知识星球,一起探讨区块链技术。
https://t.xiaomiquan.com/NvznIAQ