2018年春节过后区块链技术一下子火爆起来了,本人也对该技术十分感兴趣,因此想研究下区块链技术的原理,看看区块链背后那些技术值得去研究。由于自己缺乏实际的开发经验和使用经验,文中难免会有些理解不到位,本文主要的目的还是想将最近的学习梳理总结一下。

一、概述

比特币是存储在计算机里一枚货币,计算机存储的本质就是一串数字,那么存储比特币的这串数字为什么就可以等同于真正的货币呢?而且比特币让人感觉很像黄金,不管这黄金从什么渠道获取(从沙子里掏的,还是自己购买的),人类都会认同它的财富价值。

说到比特币很多文章总结它的特点,例如:去中心化啊,记账系统,安全性好,不过它有什么特点,大家现在几乎都公认比特币可以等同于货币,但是比特币这种货币是有别于现实社会中的各国央行发行发行的法定货币,法定货币的一大重要特点就是需要一个权威的机构(一般是指代表国家的央行)来发行货币,法定货币的价值是由老百姓认同国家的权威性来体现的,不管怎么说法定货币是一种中心化的发行货币机制,法定货币都会受到国家这个中心所控制和约束。比特币的设计理念不同,它想通过一种没有任何权威中心所左右的方式发行货币,让货币只包含经济价值的本质属性。

比特币的价值体现方式是通过交易的记账流程来体现的,具体过程如下图所示:

支付交易从产生一直到最后支付交易被成功写入了区块链,这样支付交易才会被真正确认,比特币的货币价值在这个过程中被体现,公司货币的发行也在这个过程中进行。

这张流程图可能会让很多人费解,为什么本人会说它体现了比特币的货币价值?本人之所以这么概括,主要包含下面的理解:

  1. 该流程包含了比特币的发行,流通,交易的全过程;
  2. 该流程是在没有中心机构参入的情况下进行的,但是该流程和现实货币的价值使用一样的权威有效。
  3. 完整理解了该流程就可以理解比特币可以等同于实际的法定货币的道理了。

下面本人将一个一个环节的解释该流程。

二、支付交易

比特币里如何完成支付交易了,下图是中本聪论文里的交易流程图,如下所示:

说到支付交易就牵涉比特币原理之一的非对称加密以及数字签名技术。在比特币的知识范畴里有一个钱包的概念,钱包的本质就是一对非对称加密的公钥和私钥,如果我们把比特币的使用映射到现实的使用者即人,那么公钥就是这个人对外的唯一身份标识,私钥则是使用者开启钱包使用比特币的钥匙。公钥是对外公开的,在比特币的规则里公钥即代表了网络里钱包使用者的地址。

按照比特币的规则定义,公钥的长度是512个字节,为了方便公钥在网络上的传播,公钥要被转化为160位的数字指纹,数字指纹是二进制编码,转化为字符串就是26到35位的字符。

那么假如A向B支付比特币,那么A就得要知道B的地址,这样A才能把比特币发送给B。下面我将描述下这个支付的流程,具体如下:

A向B支付比特币的交易即A的地址向B的地址转移比特币的过程,下面我们举例说明:

首先是A向B发送数据,这些数据包含如下内容:

  • 上一笔交易的 Hash(你从哪里得到这些比特币)
  • 本次交易双方的地址
  • 支付方的公钥
  • 支付方的私钥生成的数字签名

B收到信息后进行相关验证,验证过程如下:

第一步,找到上一笔交易,确认支付方的比特币来源。

第二步,算出支付方公钥的指纹,确认与支付方的地址一致,从而保证公钥属实。

第三步,使用公钥去解开数字签名,保证私钥属实。

验证无误,B认为该交易是可以执行,注意:这里只是认为该交易可以执行,并没有确认该交易有效成功。

从支付交易的传输数据和验证流程我们可以看到,比特币的支付过程中主要是使用到了支付方即A的交易数据信息以及A的公钥和私钥,被支付方即B只是做验证操作的有效性而已,被支付方B自己的公钥、私钥以及交易信息都没参入支付过程,因此我们可以认为私钥和公钥主要是用于把比特币用花出去的场景。

如果想要交易最终被确认成功,接下来被支付方B就要将该笔交易广播到全网去了,如是流程进入到了交易广播的阶段。

三、交易广播

本人认为从交易广播开始,就进入了时下很火爆的区块链技术范畴了,因为广播出来的交易最终都会被网络里的矿工(矿工即是区块链分布式系统下的各个子节点)接收,作为矿工创建区域链区块的输入。这个过程比较简单,只是数据的传输,但是对于技术实现而言就是技术的难点之一,因为此块技术包含了编程领域里比较复杂的网络通讯技术和高并发技术。不过如果把交易广播作为区块链的输入来理解,那么这里还牵涉跟输入相关的一个重要技术那就是时间戳服务器,时间戳服务器的作用是给同一时间下的交易加上一个时间维度的标识,有了时间戳,我们就可以确定在某个时间点该交易一定发生过。

时间戳服务器在中本聪的论文里是这么定义:

时间戳服务器通过对以区块(block)形式存在的一组数据实施随机散列而加上时间戳,并将该随机散列进行广播,就像在新闻或世界性新闻组网络(Usenet)的发帖一样。

由此定义我们可以知道时间戳是对新产生的交易记录按时间维度分组,这样就保证每条实际发生的交易都能正确的被保存下来。

时间戳服务器的作用对于比特币的货币价值至关重要,这里我举一个例子:在传统的交易里往往是没有时间维度的概念,没有时间维度的交易往往会影响到交易的信用评价,例如:甲方和乙方账户里各有100块钱,一天甲方向乙方账户打入了10块钱,第二天乙方账户又向甲方账户打入10块,最终甲乙双方的账户任然是100块,如果交易过程没有被记录,那么我们就很难追溯其中的交易行为,假如甲乙双方进行了违法的交易,最终在检查前让账户平衡,那么危险的行为就会被藏匿。因此时间戳服务器给比特币的交易提供了一种正向的不可逆的交易流程,这就让比特币的区域链技术达到了行为可追溯的功能,能解决沟通中信息不对称的问题,这就是区块链技术能被应用到其他领域一个重要原因。

交易广播后就是交易写入区块的过程了。

四、交易写入区块

交易最终被确认就是要将交易写入到区块链里,而区块链是由一个个区块串联起来的,区块才是记录交易的实体,因此要写入区块链,首先要将信息写到区块里。那么区块是如何产生的呢?

区块的产生是有网络中一个个矿机来完成。但是矿机要产生一个新区块并没有那么容易。这里我们首先讲下区块的数据结构,区块分为区块头和区块体,区块体里存储的就是一条条的交易记录,这些交易记录都是被支付方例如B广播到网络中去的交易记录。

在比特币系统里一个块的大小本指定为1个mb,一笔交易大概500个字节,因此一个区块大概可以存储2000笔左右的交易。区块的里最关键因素在区块头里,区块头里有该区块的很多特征值,比较关键的有

  • 区块生成时间
  • 区块体的Hash值
  • 上一个区块的Hash值

以上值都是外部获取的,除此之外区块头还包含一个难度系数difficulty和Nonce的随机数,矿机系统里还有一个固定的常量值。这里有个公式:

target = 固定的常量值/difficulty

由此可见难度系数越大,target的值就会越小。矿机会对区块头的数据进行hash计算,hash的结果是一串二进制数字,如果最终的hash结果要小于target那么该区块才会被认为有效区块,这个有效区块才能被同步到区块链里,但是计算出一个有效的区块可没有那么容易,需要反复的计算才能得到最终结果。可是由于一个区块特征属性一般都是固定的,为了让每次区块头的每次计算出来的hash值都不同,每次无效的hash结果计算后,矿机程序就会动态调整Nonce的值,让最终hash的值发生变化。Nonce是一个32位的二进制数字,因此它的取值范围就是0到21.47亿。那么命中target就是一个穷举的数学过程了,一个矿机可能幸运很快算出来,也有可能算满了21.47亿次都不能命中,这时候框架就得重新同步区块链数据,重新计算。这就是区块链技术里的工作量证明,可见一个区块产生是相当的麻烦和困难的。

回到区块产生的讲述,由上面流程,我们发现一个区块的产生是非常耗费资源即耗费计算机的算力和电力资源,那么为什么矿机都乐此不疲的想产生区块呢?这是因为每产生一个区块的经济奖励是非常诱人的。

中本聪是这么来设立生成区块的奖励的,比特币系统是2008年运行的,当时产生一个有效新区块的奖励是50个比特币,这个数值每4年减半,也就是说到了2012年后就是25个,2016年后就是12.5个,现在是2018年就是一个新区块的奖励就是12.5个,而时下的比特币价格都超过了1万美金,这个收入是极其可观的。从这个规则我们也可以发现比特币的总有一天是不会在增加的,到了新区块不给新比特币奖励,那么这时就没有矿可以挖了,为了激励框架继续挖矿,中本聪还建立了另外一种奖励措施那就是手续费,区块是记录交易,每个交易被记录都是要付费的,而且每个区块都会根据手续费的高低排列交易,那么没给手续费的或者手续费很低的交易往往很难写入到区块,也就是最终很难写入到区块链,交易就会很难成立,这就可以让矿机有无限动力挖矿。

新区块诞生会奖励比特币,这就是比特币发行的流程,这也就是人们为什么会乐此不疲的做矿工的原因,有巨大的利益驱使的。

新区块产生了就要将新区块加入到区块链里了。

五、区块写入区块链

新区块并不是简单的加入到区块链的,因为区块链是一个没有中心管理员的分布式数据库,那么不可能有个权威机构来做加入链条操作的,新区块加入到区块链的过程是一个集体协商的过程,具体的过程如下:

矿机成功产生了一个区块,矿机就会把该区块在全网进行广播,有完整区域链数据备份的服务器就会接收到该信息,并将新的区块加入到区块链的末尾。及时新的区块加入到了区块链的末尾也还没有说明新区块加入区块链是成功的,这里我们把成功加入区块链的区块给个名字叫做节点,只有新区块被加入到了最长的链条即最正宗的链条才能叫做节点,这个规则产生的原因是因为在相同时间下可能会有多个新区块加入到区块链,到底那个才是有效的,需要一个判定机制,这个机制一般是那个新区块最先获得了连续的6个新区块,那么该链条就是正宗链条,即可确定该区块为区块链的一个新的节点了。

不过一个新区块加入区块链的时间间隔是被严格控制的,比特币系统里是每10分钟才有一次机会把新区块加入到区块链里,在加上后续需要6个新区块加入气候才能最终确认区块链的新区块加入成功,这就说明一个交易被确认成功最快也需要1个小时左右,我们还可以这么算下,一个区块存储最多2000比交易,10分钟也就是600秒,平摊下来1秒钟比特币系统也就只能处理3到5比交易,这也就是比特币交易时间长的一个重要原因。当然时间间隔之所以设立还有一个重要原因,限制区块的产生的数量,控制新区块的数量也就是控制比特币的总量,也就是说比特币的总数量其实是固定的,总有一天会发完的。

交易被成功写入区块链后,被支付方B同步区块链的数据,B如果在区块链里找到了自己的交易记录,那么交易就被认为有效。

以上就是比特币的完整交易流程了。

六、总结与疑问

由以上对于比特币原理和流程分析,我们就可以理解比特币为什么能等同于法定货币了,本人认为理由如下:

比特币的唯一性,比特币在网络里是唯一,而且这种唯一性很难被篡改;
比特币的总量恒定,比特币不会发生通货膨胀的问题,因此比特币有保质的作用,这个跟黄金很类似;
比特币的安全性很高,比特币是基于记账原理来产生价值,比特币的交易情况是全网透明的,每笔交易都可以追溯,而且交易记录机制安全可靠,很难有外部的非理性原因影响到比特币的价值。

这里还有一些疑问需要重点说明下:

问题一:比特币为什么很难被篡改?

这主要是比特币产生的载体区块是非常难以产生的,需要大量的工作流证明,而且区块的有效性又是和区块链里该区块的下游区块相关,如果要篡改一个比特币,那么跟该比特币交易相关的下游区块都要更改,这就倍增篡改比特币的难度。当然理论上如果有实体掌握了区块链全网51%的算力是可以篡改比特币的,但是在公网下这种情况基本很难实现,不过要是区块链做成私有的这就很难说了,私有的区块链引入了中心机构,但是这样的区块链就不是真正意义的区块链了。

问题二:为什么现在挖矿是越来越难了?

挖矿其实就是在做hash运算,我们知道产生一个新区块需要大量的hash运算,只有拥有强大算力的实体才能获得先机,工作量证明的hash运算从CPU发展到GPU到现在的基于硬件的专业化的矿机,因此普通人很难有那么大的财力在算力竞争下获胜,所以个人挖矿目前是一件几乎无法完成的事情了。

问题三:区块链为啥现在会特别火?

这个问题我没法回答,其实区块链目前很火还是一种炒作,毕竟区块链技术除了比特币还没有什么重量级的应用出现,但是区块链技术里面的很难更改的记账系统机制是非常有前景的,目前国家,大型企业都涉猎其中,相信区块链的前景是非常不错的,这也是本人为什么花精力研究区块链的原因所在。

七、区块链的相关技术

研究区块链的原理还是想为自己做技术研究做准备,这里大概总结下自己学习中发现的区块链的一些底层技术,具体如下:

  1. 非对称加密技术,这个使用开源技术即可;
  2. Hash计算的技术,主要是SHA技术;
  3. 数字签名或者叫做数字指纹技术,这个其实也是HASH技术,不过HASH出来的值一般是二进制,很难传播,因此需要一些签名技术将二进制转化成可以阅读的字符技术,例如把公钥变成地址(字符串),这里应该牵涉到一些字符置换的技术例如Base58
  4. P2P相关的网络通讯技术,分布式系统里的一个节点如何广播信息,节点如何轮询接收广播出来信息的技术,还有就是同步区域链数据的技术;
  5. 跟区域链相关的各种算法了,例如工作量证明的算法,Merkle树的算法等等。