汉唐归来
惟有中华

袁岚峰:你完全可以理解区块链|2020-01-04

1

起源

 


 

2008-10-31 一位化名为中本聪的人(Satoshi Nakamoto 目前仍然无法知道中本聪到底是谁,文中埋有一个彩蛋,告诉我们如何找到中本聪)发表了一篇论文《比特币:一种点对点的电子现金系统》,中本聪结合以前多项数字货币发明的技术,提出了一种去中心化共识的解决方案,它使用一种可验证的数据块的链条,解决比特币现金(Bitcoin)数据的防篡改的问题。
 
2009-01-04 2:15 AM,互联网上产生了第一个这样的数据块,它采用了一个严苛的规则对一笔网络转账交易数据(这是一个方便理解但并不严谨的说法)进行了打包。这个高度结构化的数据块被称之为区块(Block),从那之后,大约每10分钟,就有一个区块产生,一直延续到现在(2019-11-09 12:28 PM)是第602941个区块,这些区块按照一个引用规则排列成一条长链,称之为区块链(Blockchain)。这个位于区块链中0位置的区块后来被称之为创世区块,现在的所有有关比特币区块链的软件,都会包含这个创世区块的数据。
 
2010-05-22 美国佛罗里达一位名为Laszlo Hanyecz的程序员,用10,000 BTC(比特币的货币单位,取值范围为10-8 ~ 2.1*107)买了两个“约翰爸爸”(Papa John)的披萨优惠券。这是第一次有人愿意承认比特币在现实世界中具有价值。10,000 BTC按当前的汇率价值88,107,600美元。2018-02-25,Laszlo Hanyecz再次购买了两块价值62美元的披萨,仅花费0.00649 BTC的比特币。
 
2015-07-30 俄罗斯程序员Vitalik Buterin发布了以太坊(Ethereum),把智能合约的概念引入区块链。人们逐渐认识到,区块链的去中心化、可透明溯源、不可篡改等特性,有着远超过比特币本身的潜在应用价值,越来越多的个人、公司、金融机构和政府开始关注和应用区块链技术。
 
2016-12-20 国务院发布《“十三五”国家信息化规划》首次将区块链纳入新技术范畴并作前沿布局,标志着我国开始推动区块链技术的应用和发展。
 
2019-10-25 中共中央政治局提出把区块链作为核心技术自主创新重要突破口,加快推动区块链技术和产业创新发展。

2

公共账本上的转账交易记录——区块链和比特币是什么

 


 

区块链最初是为了实现比特币的交易而发明的技术,比特币的区块链账本是理解其技术原理的最佳方式。

图2-1 比特币交易记录
支付的本质是“将账户A中减少的金额增加到账户B中”,比特币即是隐含在转账交易记录中的数额概念。比特币的持有者通过在一个点到点网络(也称对等网络,这种网络上每一个节点都是平等的)上发布一条公告,把一个地址上的比特币的所有权移交给另一个比特币地址。新的持有者将来若想要花掉这一笔钱,则需要提供一个有效的证明,这个证明类似于在支票上的签名,称之为数字签名,然后再次发布一条带有这个数字签名的公告,把所有权移交给其它比特币地址。任何人通过这个比特币地址即可以验证对应的数字签名的有效性,却不能通过这个公开的比特币地址伪造出有效的数字签名。
 
一段时间区间内的交易记录汇集起来,被装订到一个公开的账本上,本质上这个账本是一个高度结构化的数据块,即区块。新增区块总是链接到前一区块,因此这些区块可以按顺序排列成一条长链,即区块链。
 
对等网络上的每个节点都可以试图把接收到的这些交易记录打包称新的区块,但最后会通过一个竞选机制自动达成共识,从而最终确定一套所有节点都认可的公共账本。该竞争机制同时也使得这些交易记录被永久的刻写在区块链上而不容更改。
 
要如何打包这些交易记录成为区块,以及如何达成共识,生成区块链呢?这主要与哈希算法相关。

3

哈希算法

 


 

哈希算法Hash即哈希函数,哈希算法在区块链的实现中无处不在,准确理解哈希算法的特点,是深入理解区块链技术原理的关键。区块链通过哈希算法确保了每一笔交易的完整性,每个区块的完整性和区块链自身的可靠性。
 
3.1 一个确定的随机值——哈希算法简介
哈希函数把任意长度的输入数据,通过该函数创建一个对应的固定长度的输出,这个短输出称之为哈希值。
 

3-1 哈希函数
不论长度只是一句话,还是包含整本《西游记》内容的数据,经过SHA256哈希函数计算之后的输出值都是256(表示为64位十六进制数)。而且输入数据中哪怕只改变一个字,其输出值也会彻底的不同。
 
哈希函数具有以下特点:

根据输入数据在有限的时间和资源内很容易计算出哈希值,这称为正向快速。而根据哈希值,完全无法推断出原始输入数据是什么,这称之为不可逆(或者单向性)。输入数据只需要发生最微小的改变,哈希值也会彻底不同,这称之为雪崩效应(或输入敏感)
 
对于同一个哈希函数来说,相同的输入数据会有相同的哈希值,若哈希值不同,那么输入数据一定不同,这称之为哈希函数的确定性。另一方面,若两个不同的输入数据,得到了相同的哈希值,这种极不可能发生的事件被称之为“哈希碰撞Collision”。只应选用当前还无法人为刻意制造出“哈希碰撞”的哈希函数。由于中国密码学家王小云的卓越工作,证明了MD5SHA-1等函数已不再安全,比特币的区块链使用了目前仍然十分安全的SHA256函数。

 

3-2 真假美猴王
哈希值相当于是对输入数据的一种背书,它承诺了一个对应的原始数据。就像是使用一句咒语,用来验明大圣的真身。
 
3.2 多重哈希——默克尔
哈希值也被称之为数据指纹、散列值或者数据摘要,这是因为可以把这个短的哈希值看成是原始数据的“身份代表”和承诺。如果我们已知某个我们关心的数据的哈希值,就可以用它来验证之后才拿到的原始数据的真实性,哪怕是极小的改动也会导致验证失败。
 
如果需要对很多个这样的原始数据进行真实性确认,那就需要事先知道很多个对应的哈希值,管理很多个哈希值再一次成为了沉重的负担。如果把这些哈希值排布起来,把它们视为一般数据进行迭代哈希,最后可以得到一个“根”哈希值,如下图所示:

 

3-3 默克尔
对每一个原始数据计算哈希值得到HashAHashB……HashH,对这些哈希值两两配对再计算一次哈希值得到HashAB……HashGH,若出现不足两个的情况,则复制一份自身再计算哈希值。重复以上过程,直到最后得到的唯一的哈希值。这些哈希值的排列方法就像是一棵树,被称之为默克尔树Merkle tree默克尔树是一种完全二叉树),树根哈希值称之为Merkle Root
 
有了Merkle Root这个哈希值,对于大量分布式存储的数据也能进行验证。比如我们现在要验证[数据/交易记录D],只需要得到数据本身和它路径上相邻节点的哈希值HashCHashABHashEFGH,计算出HashD并依次与这些值配对,就可以验算最终结果是否等于Merkle Root,即验证了[数据/交易记录D]的真实性。即使包含1000条记录,也只需要额外传输10条哈希值即可验证其中任意一条(想一想这是为什么)
 
简单的说,只需要一个哈希值Merkle Root,就能够用非常小的代价,对默克尔树中的任意一个数据进行验证。在区块链中,可用该方法验证区块中的数据记录。
 
3.3 寻找一个极小哈希值——区块链的信任根基

由于哈希函数的雪崩效应和确定性,如果把哈希函数中的输入数据看成是产生随机数的种子,那么哈希值可以看成是一个随着输入数据的改变而改变的随机值。但对于同一个哈希函数来说,一个确定的“种子”对应唯一确定的“随机值”。
 
既然我们可以把哈希值看成是一个随着输入数据改变而改变的随机值,我们能构造出一个输入数据,使它的哈希值为某个指定值吗?因为哈希函数的不可逆性,寻找特定的哈希值所对应的原始数据这件事情使我们陷入用猴子打印出莎士比亚全集一样的窘境之中,我们唯一能够使用的方式跟那些猴子一样,只能随机输入一个值,然后看看它的结果是什么。
 

3-3《辛普森一家》剧中的猴子打印机
猴子打印机思想实验:让这些猴子在打字机上随机地按键,当按键次数为无穷多次时,就能打印出莎士比亚全集。不幸的是,如果这些猴子从宇宙大爆炸那一刻就开始这项工作,一直不吃不喝的每秒能打印出10个字母,到现在为止还没能打印出这套全集中第一册第一页中的第一句话。

通过随机方式得到一个指定的256位的数,平均需要2255次的尝试才能够成功,以计算机当前的算力,在宇宙时间范围内都无法成功。如果我们只是想要得到一个以0”开头的哈希值呢?这就简单多了,比如,我们简单的在一个字符串数据“something_”后面尝试加上一个NonceNumber>的缩写,在密码学中Nonce是一个只被使用一次的任意或非重复的随机数值)作为输入数据,使用SHA256函数进行哈希计算,看看结果是什么,如下所示:

3-4 通过改变Nonce值来寻找极小哈希值
当输入数据为something_11”的时候,我们看到哈希值0996c9ed……”满足以“0”开头的要求。那么,如果我们想要得到一个以“00”开头的哈希值呢?我们就不得不进行更多次数的尝试。当输入数据为something_540”的时候,其哈希值“0037891b……”满足这个要求。
 
哈希值前面的“0”的个数可以表示为一个阈值,阈值越小,则难度呈指数迅速增加。当Nonce值为25705014时,才找到一个小于0000000F……”的哈希值,这在我的计算机上花了79秒。虽然寻找满足要求的Nonce值的工作量十分庞大,但别人要验证其对应的哈希值是否小于目标阈值却永远只需要一次哈希计算即可。
 
区块链中把这个阈值用难度目标DIFFICULTY值)来表示,从以上演示我们可以看到,通过约定一个更难的难度目标,找到满足要求的输入数就必须消耗更多的工作量。如果硬件算力大幅增加,我们还是“期望”计算过程必须消耗这么多时间呢?只需要约定一个更难的难度目标就可以了。
 
这种通过添加一个Nonce值,从而使输入数据的哈希值满足难度目标要求的计算,看起来就是一个费时费力又没有捷径可走的无用功。然而区块链正是利用该算法,在打包数据时用工作量设置了一个无法逾越的障碍,使之无法被篡改,这使区块链成为了一个可以建立“信任”的基础设施。下面我们来看看具体是如何做到的。

4

区块链

 


 

依靠网络通讯的电子现金永远存在两个问题:你怎么证明那笔钱是你的(真伪问题);如何保证同一笔钱没有被多次支付给不同的人(双重支付问题)? 金银现钞等实物货币天生具有唯一性,而对于计算机来说,数据的复制品和原数据则是完全等价的。
 
比特币的转账交易记录通过数字签名技术来证明所有权(见附录8.1密码学与数字签名),通过全网对一个无法被篡改的公共账本达成共识来防止双重支付。这个公共账本就是区块链。
 
4.1 把交易记录登记到账本——打包区块

安装了比特币软件的所有用户节点构成了一个点对点的网络,每个用户节点如果收到一条新的交易数据,都会在验证其有效性之后把它广播到全网。这些新交易数据构成了一个交易池,每隔10分钟左右,交易池中的所有新交易记录会被打包进一个新区块,新区块会被加入到区块链的末端。
 
如果我们是比特币网络上的一台计算机,要如何把这些交易记录打包成区块呢?
 
首先应该验证每一条交易数据本身是否有效(见5.3 比特币交易的生成和验证),然后计算其哈希值,把这些哈希值两两配对,构造成一棵完整的默克尔树。如果把每一条交易记录看成是账本中的一页,那么默克尔树就是这个账本的目录页。通过Merkle Root值把这些交易记录紧紧的捆绑到了一起,构成了一本可以验证其中任何一笔交易记录数据的账本。(见3.2 默克尔树)。
 
这很简单,任何人在任何时候都可以用默克尔树打包出一个包含有多条交易记录的账本,如果每个人就这样把自己构建的账本上传到比特币网络,那么网络上很快就会充斥着混乱不堪的各种账本,一笔交易可能在不同的账本中被反复的登记很多次。
 
为了能让全网达成共识,需要对这个账本稍作修改,给这个账本添加一个封面,并通过一项基于工作量证明(Proof of Work简称PoW)的竞赛机制选出唯一的账本。
 
这个封面就是区块头,区块头除了包含有Merkle Root值之外,还包含版本号、时间戳和前一个区块头的哈希值——其中并不包含本区块头的哈希值,因为哈希值无法自我引用而且也不需要自我引用,每次在需要验证时会重新计算该区块头的哈希值。然后在这个区块头数据的最后添加一个合适的Nonce值,使区块头的的哈希值小于一个约定的难度目标。完整的区块头包含如下数据:

 

图4-1 区块链结构图解
通过前文我们知道,在区块头数据中添加一个Nonce值,从而使该数据的哈希值小于一个极小阈值,这需要消耗极大的工作量(见3.3 寻找一个极小哈希值),这使得全网约需要10分钟左右(每2016个区块之后会自动调整一次DIFFICULTY值以适应网络当前算力)才能产生一个合格的区块。最先构造出的新区块即赢得了这场竞赛,这个新区块会被迅速广播到全网,并添加到区块链的最末端,成为这个超级账本中最新的一本。
 
除创世区块外的每个区块头都包含有前一区块头的哈希值,这使区块按照形成的先后顺序,排列成了一条长链,每产生一个新区块,这个链条就会被延长,包含在这个区块链上的总的工作量也相应的增加了。
 
4.2 挖矿竞争——区块链的自动共识机制

在比特币网络中,每产出一个新区块都会新增一笔比特币。事实上,这也是比特币发行新币的唯一方式,因此人们把这项工作形象的称之为挖矿。挖矿的竞争异常激烈,有时候由于网络延迟或者其它原因导致最新的区块没能及时同步,这时可能会发生不同的矿工用不同的区块分别延长了区块链,这称之为区块链的分叉。因为最长的分叉链上被认为包含了最多的工作量,每个节点接收到分叉的区块时,会自动选择最长链上的区块而忽略较短的链上的区块,这个机制使分叉区块一般会在一两个区块周期内被自动修正,自动重新达成了共识。
 

图4-2 区块链的分叉与重新达成共识
在这个竞争机制下,矿工一旦挖出一个合格的新区块就会立即广播到全网,以免白白蒙受损失。其它矿工一旦接收到有效的最新区块,会立即接受它并更新区块链数据,并马上投入到寻找下一个区块的工作,以免自己的工作量被忽略。
 
每个节点会自动选择累积的工作量最多的区块组成的区块链,这使全网在分叉区块的选择上最终一定能够达成共识,通过这个自动协调机制,最终全网同步了一个公共账本。
 
截止现在(2019-11-09 12:28)比特币的区块链账本上共产生了602941个区块,所有区块的数据总和为232.6GB。任何一个用户节点可以选择保存从创世区块到最新区块的完整数据,这样的节点称为全节点,全节点能直接在本地完成所有验证。也可以选择只保存这些区块的区块头数据并使用简易支付验证(Simplified Payment Verification简称SPV),截止当前所有区块头数据<50MB,且每年会增加4.2MB。
 
4.3 篡改历史交易数据——区块链的验证

基于明确的规则验证的区块结构,对于所有节点来说都是平等的,这使得任何病毒和黑客对于区块链数据都无能为力。现在假设某个与网络上众多节点保持连接且算力异常强大的网络节点,试图偷偷更改历史区块链中某一笔交易的数据,比如把某个未消费的交易输出(见5.1比特币的交易)中的比特币数额添加一个“0”,并尝试把篡改过的数据扩散给其它原本不包含有区块链数据的新节点。
 

这个微小的改动,立即改变了该笔交易数据的哈希值,要使新的哈希值能通过其它节点的验证,那么包含有该哈希值的Merkle Root值就必须改变,Merkle Root值的改变会引起区块头哈希值的改变,这时需要重新挖出一个新的区块,才能使其满足难度目标的要求。
 
然而这并没有结束,因为该区块头的哈希值被链接到了下一个区块头的数据中,所以下一个区块头的哈希值也必须改变……这个连锁反应,使得篡改者必须重新构造所篡改区块之后的所有区块。
 
这个行为本质上等价于从篡改点产生一个分叉链从而与主链竞争。因为主链上的区块总是累积了当时的最大工作量,而且长度仍然在不断增长,这使得恶意分叉的区块会被忽略。如果一个区块后面已添加了五六个新的区块(约需要一个小时),那么其中的交易就可以认为“永远”无法被推翻了。如果只是推翻最新的一两个区块呢?根据共识机制,如果发起攻击的这个节点的算力超过了全网整体算力的51%,那么攻击是有一定几率成功的,但攻击的机会成本十分高昂,因为强大的算力原本可以用来挖矿而正当获利。
 
如果有人用比特币交易了价值数亿元的名画或者房地产,那么不妨等待一个小时,就可以认为该交易已经足够安全了。如果只是一笔价值数万元的交易,只要查看到该交易已被登记到区块链,就可以认为交易已经生效了(约需等待10分钟左右)。如果只是买一本书一杯咖啡这样微小的交易额,只要该交易能通过验证进入交易池,即使尚未被登记进任何一个区块,也可以认为该交易是安全的(立即,不需要等待)。
 
对于比特币网络上的每一个用户,不需要信任除自己之外的任何其它人,不管这些数据来自于谁、通过什么线路、是以什么方式发送的,只要接收的数据满足验证规则(钱包软件可以自动完成这一切),就可以确信它是没有经过篡改的有效数据。

5

再说比特币

 


 

既然任何人都可以查看区块链上的所有交易记录的完整数据,那么比特币的持有人如何证明自己的所有权呢?了解比特币交易的机制,可以更深入的理解区块链是怎样运行的。
 
5.1 什么是货币

除金银等贵重金属外,普通货币为什么被视为货币?现代信用货币理论认为,货币的价值跟用来流通的介质本身的价值无关,而是由于它背后的信用担保。法币一般以国家主权为其进行信用担保。
 
个人能够提供货币的这种信用担保吗?奥地利经济学派的代表人物之一哈耶克在《货币的非国家化》一书中,从彻底的经济自由主义出发,论证了竞争性货币制度的可行性。他认为政府对货币发行权的垄断,是世界各国通货膨胀的不断发生和加剧以致破坏经济的根源。在此基础上哈耶克提出了货币非国家化的设想。
 
哈耶克的这种观点在现实中成立吗?设想你开了一个连锁理发店,让顾客购买一种理发券,顾客凭券可以到你的店里理发一次,这种券就起到承兑作用。如果是大型连锁超市发行的购物券,则可以承兑种类更多的商品。也就是说,如果一种交易方式具有足够可靠的信用保障,那么它事实上就承担了货币的部分职能。例如,在很多古代文化中,都曾经把贝壳当作货币使用(资费、贵贱、贿赂、财贸等和钱有关的汉字大都含有“贝”字偏旁就是这个原因)。
 
目前美国、欧洲和日本等国家把比特币视为货币,包括中国、印度和俄罗斯等其它国家则把比特币视为一种虚拟商品,不论是哪一种情况,人们对比特币的购买行为,会产生一个“价格”,该价格即可代表比特币的即时汇率。
 
5.2 比特币的交易

比特币本质上只是登记在区块链上的转账交易记录,交易是比特币的核心组成部分,其它部分都是为了确保交易能够被生成、传播、记录和验证。
 
下面是其中一笔交易的详细信息:
https://www.blockchain.com/BTC/tx/61057e09233bb943bcbb50eb890eef76412844f8332da2597f5bac73bb29dab3

图5-1 一笔比特币交易的详细信息
比特币的交易采用了复式记账法,每一笔交易会包含一个或者多个资金输入,并创建一个或者多个未消费的交易输出(Unspent transaction output简称UTXO)。这些UTXO可以用作之后其它交易中的资金输入,这样就完成了价值的转移。上图的交易消耗一个UTXO作为输入,新增了两个UTXO输出。
 
UTXO是比特币交易的基本组成部分,每个UTXO可以包含10-8~2.1*107 BTC之间的任意金额,但不论是什么金额的UTXO都不可再分,而只能作为整体一次性消耗掉。如果需要找零,在交易中增加一笔输出到自己的比特币地址的UTXO即可。
 
比特币的区块链账本中只存在交易而不存在账户,取而代之的是比特币地址。比特币地址是一串数字和字符(例如1KbbroX7dUDeXKaGJQJo4dcgFskqaTet19)。通过软件,每个人可以创建任意多个比特币地址,从安全的角度,建议每一笔交易使用不同的比特币地址。当然,如上图的交易中输入和找零都使用相同的比特币地址也是允许的。
 
UTXO中的金额相当于被锁定到一个比特币地址上,比特币地址不仅充当了收款人的临时账户,同时它也是用来证明所有权的一把钥匙,这需要通过密码学中的数字签名来实现。
 
根据密码学中的公钥数字签名技术,可以定义一对具有特殊关系的数字,其中一个数字完全保密,称之为私钥,而把另一个数字公开,称之为公钥。使用者用私钥对一段数据进行加密,其他人用公钥可以对这段加密数据进行验证,验证成功则表明这段加密数据只可能来自于对应的私钥持有者,这个方法非常类似于在纸质文件上签名,因此被称之为数字签名(见附录8.1密码学与数字签名)。
 
比特币地址就是其中的那个公钥(基于一些原因,比特币地址实际上是以公钥哈希值的Base58Check编码形式出现)。用户若想要消耗锁定在某个比特币地址上的UTXO作为其它交易的资金输入,只需用对应的私钥提供一个有效的签名,即可解锁该UTXO。(彩蛋:当今世上曾有多个人企图证明自己就是中本聪,然而迄今为止,创世区块中包含的UTXO依然没有被消耗掉,谁若能够使用该UTXO进行交易,那么他一定是中本聪。)
 
事实上,比特币定义了一种简易的交易脚本来完成上述操作。每个UTXO可以看成由两部分构成,第一部分是以Sotashi为单位(比特币的基本单位1 Sotashi = 10-8 BTC)表示的比特币金额的数字,另外一部分是一个锁定脚本,锁定脚本中通常包含有公钥哈希值(与比特币地址等价)。
 
比特币的持有者在之后的交易中要消耗该UTXO作为资金输入时,需要提供一个对应的解锁脚本,解锁脚本一般包含由私钥签署的数字签名。仅当锁定脚本和对应的解锁脚本联合执行的结果为真,该笔输入资金才是有效的。锁定脚本相当于在UTXO上设置了一个“难题”,只有拥有对应私钥的人才能够提供解答该难题的解锁脚本,从而确保了资金的安全。
 

图5-2 P2PKH的解锁脚本与锁定脚本
比特币内置了五个标准交易脚本:P2PK、P2PKH、MS、P2SH和OP_Return。在上一节的交易详细信息中,观察两个UTXO中的Pkscript字段,可以看到第一个使用了P2SH锁定脚本,第二个使用了P2PKH锁定脚本。(见附录8.2 比特币的交易脚本)
 
5.3 比特币交易的生成和验证

创建和管理比特币地址及对应私钥的软件被形象的称之为钱包,比特币网络上绝大多数节点都包含钱包功能。钱包可以计算你能够解锁的资金总额(对应传统的账户余额)、生成交易、传输数据和进行交易验证。
 
在创建一笔新交易的时候,钱包会自动选择自己能够解锁的最合适金额的UTXO作为交易输入,并按照以下清单的要求构建交易数据,为交易提供有效的数字签名,然后把它发送给与自己相连的节点。
 

图5-3 交易有效性验证清单

全节点的钱包软件含有区块链的完整数据,可以对任何一笔交易独立的进行验证。它会把区块链中所有的UTXO数据收集起来放到内存中等待交易,称之为UTXO池。当接收到其它节点传来的交易数据之后,会按照以上清单逐项检查,包括验证其输入UTXO是否在等待交易的UTXO池中,解锁脚本是否有效。有效的交易会被广播到全网,矿工会把这些新的交易收集起来,打包到区块链中。其它节点在接收到新的区块数据后,会把已经消耗的UTXO从内存的UTXO池中清除,但区块链中的数据不会受到影响。无效的交易会被简单的忽略,不会对它所引用的UTXO造成任何影响。
 
对于只保存了区块头数据的钱包来说,可以使用简易支付验证(SPV),它从对等网络上其它节点获取相关信息来构建交易,并等待和观察该交易是否被区块链接受。相当于让其它全节点帮忙验证了交易的有效性。最基础功能的钱包仅保存密钥,甚至可以打印在纸上,与任何计算机和网络都脱离联系,这被称为冷钱包,冷钱包仍然可以接收资金输入。
 
需要说明的是,钱包本质上与区块链数据没有直接的关联,用户可以选择任何一种自己喜欢的钱包软件。
 
5.4 比特币的新币发行机制

最初的比特币是从那里来的呢?
 
每个区块中包含有一笔称为COINBASE的特殊交易,比特币规定该交易仅包含新增UTXO,而不需要消耗其它的UTXO作为输入,早期的区块该交易输出中新增50 BTC的比特币,每210000个区块之后(约需4年)该值减半,当前每个区块的COINBASE交易输出新增12.5 BTC比特币,按当前汇率价值110,134.5美元。预计在2020-05-13左右该值会再次减半为6.25 BTC。你可能已经注意到在正常的交易中,交易输入的总额也并不等于交易输出的总额,这个差额作为交易手续费也会被计入到COINBASE交易中,成为矿工收入的一部分。
 
矿工会把该笔交易输出到自己的比特币地址上,这也是打包区块的工作被称之为挖矿的原因,这笔不菲的收入使得挖矿成为一个极具竞争性的行业,每年比特币的算力都在呈指数增长。比特币规定每2016个区块之后,会根据之前2016个区块的出块时间自动调整一次DIFFICULTY值,无论算力的增减,使全网都能保持在约每10分钟产出一个新区块。
 
这项把经济激励与打包区块相结合的机制,是比特币的一大创举,使之得以实现了彻底的去中心化的运营模式,同时也使得比特币的区块链账本累积的算力无法被推翻。
 
COINBASE交易使比特币的总量不断增加,事实上这也是比特币发行新币的唯一方式,发行量减半的机制使比特币的总量最后会收敛于一个固定值21,000,000 BTC。到目前为止区块链上已产出18,036,775 BTC的比特币。
 

图5-4 已开采和未开采的比特币数量

6

总结与展望

 


 

回顾区块链的核心算法,它通过哈希值保证每一条[数据/交易记录]的完整性,通过默克尔树把这些哈希值变成一个整体,通过工作量证明(PoW)来选举区块,通过引用前一区块头的哈希值使所有区块连接起来,由高度结构化的区块组成了一条可验证、防篡改的区块链。
 
区块链相当于定义了一条时间轴,确保记录在这条时间轴上的数据可以被查询但不可更改,建立了一种基于算法、可被验证的“信任”。在区块链之前没有任何其它技术可以做到这一点。对于比特币来说,区块链相当于把每个时间段形成的账本按时间顺序一本一本的串联起来,形成了一套完整可查而又不容篡改的超级公共账本。
 
从区块链的技术原理来看,虽然它是为了实现比特币的交易而发展出来的一项技术,但是对于在区块链上记录什么种类的数据并没有特殊的要求。这使得区块链可以和其它多种技术结合,从而为其它应用提供区块链的这种独一无二的无法被篡改的信用特征。用户可以使用区块链来记录自己感兴趣的任何数据,甚至可以只记录这些数据的哈希值而不记录数据本身,这其实是把哈希值也看成是普通数据。近些年来,人们正尝试把区块链用于公证、金融结算、数字政务、数据服务等多种用途。
 
比特币作为最早、最典型的区块链应用,也有它的局限性:

 
针对经典区块链的这些不足,过去10年出现了成百上千种竞争币或者竞争链。除了比特币使用的基于工作量证明(PoW)机制以外,还有基于权益证明(PoS:Proof of Stake简称PoS)、股份授权证明(Delegated Proof of Stake简称DPoS)等的区块链。致力于提供分散式应用程序托管、智能合约功能与分散式储存的企业方案的EOS.IO平台等。
 
中国2016年发布的《“十三五”国家信息化规划》首次将区块链纳入新技术发展规划。2016-12-20 平安集团、招商银行、微众银行等 40 多家金融机构共同成立首个中国深圳FinTech 数字货币联盟。2019-08-10 中国人民银行支付结算司副司长穆长春在金融四十人伊春论坛上介绍央行法定数字货币的实践。外界普遍猜测中国将发行自己的数字货币(Digital Currency Electronic Payment简称DCEP),推断DCEP将具有如下特性: 

 

从经济学的角度看,“信任”会产生实实在在的社会成本,区块链技术作为一种信用基础设施,可以在经济活动乃至社会管理中发挥重大的作用。

7

参考资料

 


 

《Mastering Bitcoin: Unlocking Digital Cryptocurrencies》Andreas M. Antonopoulos

《Bitcoin: A Peer-to-Peer Electronic Cash System》

《密码学基础教程:秘密与承诺》 [美] Philip N. Klein  机械工业出版社

《应用密码学:协议、算法与C源程序》[美] Bruce Schneier 机械工业出版社

《货币的非国家化》 [英] 弗里德里希·冯·哈耶克 新星出版社

《区块链技术指南》邹均等 机械工业出版社

https://cloud.tencent.com/developer/article/1046761

https://en.wikipedia.org/wiki/Blockchain

https://en.wikipedia.org/wiki/Bitcoin

 

8

附录

 


 

8.1 密码学与数字签名

密码学是一门以数学为基础的学科,它继承了数学的严谨性。密码学假设通信线路上永远潜伏着不怀好意的窃听者,默认一切都是不可信任的,并以此为前提,用数学方法来重建可以被信任的通信。
 
8.1.1 对称加密

假设Alice要传输一个字母’a’给Bob,而在通讯线路上潜伏着窃听者Eve,我们知道在计算机里一切都是表达为二进制,字母a表示为01100001(受影视剧影响,可能有人认为变为二进制这就叫密码,其实它是一种ASCII编码,莫斯“密码”其实也只是一种编码,对于计算机来说它就是字母a),现在Alice和Bob共同拥有一个密钥01011010,Alice把字母a与这个密钥进行一个叫做“异或”的二进制运算(异或运算符为⊕)。异或的运算规则是,两个相同的值异或结果是0,两个不同值异或结果为1,该运算只有四种情况,如下图所示:

如果对字母a和密钥进行按位异或运算,可以得到密文00111011,通过通信线路传输该密文,Bob收到密文之后,把它与密钥01011010再次进行按位的异或运算,我们惊奇的发现结果又还原成了01100001,即字母a。
 

图8-1 异或运算
对于不知道密钥的人来说,密文00111011可以代表任何值,它只有与对应的密钥解密之后才具有意义。真实的密钥长度通常为256位或者512位,而明文比密钥要长得多,最简单的方法可以把明文切分成很多段与密钥一样长的小段,对每一段明文分别进行加密。实际加密方法比这还要复杂一点,这里不再赘述。
 
在这种加密和解密过程中,因为加密和解密使用同一个密钥,密钥的使用具有对称性,因此也叫对称加密。对称加密和解密过程如下图所示:
 

图8-2 基于异或运算的对称密钥系统
对称加密系统最大的问题是Alice和Bob需要共用一个相同的密钥,如何传输密钥是一个很大的问题。如果能够及时安全的传输密钥,那么为什么不直接安全的传输它的明文呢?这在很长一段时间里,是所有使用密钥来传输信息的人们面对的一大困扰。
 
8.1.2 非对称加密

1977年发明的RSA非对称密钥可以说是密码学上具有里程碑意义的事件,与对称密钥系统不同,非对称密钥提出了一种算法,该算法定义了一个密钥对,使用其中的一个密钥加密,只能用另一个密钥才能解密(所以称之为非对称密钥),如此一来,人们可以公开其中一个密钥,称之为公钥,而保密另外一个密钥,称之为私钥。
 
比如Alice需要向Bob发送一段消息,Alice不需要事先和Bob共享一个密钥了,而是直接用Bob公开的公钥,对消息进行加密之后传输,该密文只有拥有私钥的Bob才能解密,其它任何人都无法根据密文还原出原文。相同的道理,Bob如果要向Alice发送消息呢?就换用Alice的公钥进行加密之后再传输。如下图所示。
 

图8-3 RSA非对称加密密钥系统
 
8.1.3 数字签名
利用非对称加密的这个原理,甚至可以完成更加复杂的事情。比如现在Alice的需求并不是要加密传输任何信息,而是需要向其它人说明,这个文件的确是我Alice发出的,这个需求非常类似于在纸质文件上签名,因此被称之为数字签名。
 
数字签名是如何实现的呢?如下图所示,首先Alice在网络上公布了自己的公钥,让所有人都知道这个公钥是Alice的。
 

图8-4 数字签名
现在Alice把她需要签署的文件计算其哈希值,用私钥对该哈希值进行加密,该加密数据称之为Alice对原文的签名,然后Alice把文件原文和该签名一起公布出来。任何人接收到该数据后,用Alice的公钥对该签名进行解密,会得到一个哈希值,然后计算原文的哈希值,如果这两个哈希值相等,那我们就可以十分肯定的说,该密文的计算只有拥有Alice私钥的人才能完成。因此可以肯定是说,这个文件的确是拥有Alice私钥的人签发的,这就是数字签名的原理。需要说明的一点是,使用同一对公钥和私钥,对不同的数据产生的签名数据是不一样的,但都能够被公钥正确解密通过验证。
 
为了方便理解,我们使用了RSA算法来讲解非对称加密和数字签名。在比特币区块链中实际采用的是椭圆曲线数字签名算法ECDSA,相同强度下该算法比RSA的密钥要更短,理解起来稍微复杂一些,但最后实现的目的和效果是一致的。
 
8.2 比特币的交易脚本

比特币定义了一种基于堆栈的非图灵完备的简易脚本,专门用于对交易的验证。交易脚本由两部分构成,创建UTXO时使用一个锁定脚本,锁定脚本一般包含有一个公钥。要消耗该UTXO作为交易输入时,需要提供一个对应的解锁脚本,解锁脚本一般包含有一个数字签名,该数字签名是由对应的私钥对交易数据进行签名产生。锁定脚本和对应的解锁脚本联合执行的结果为真,才能通过交易验证。交易脚本可以完成非常复杂的交易验证,比特币内置了五个标准交易脚本:P2PK、P2PKH、MS、P2SH和OP_Return。
 

P2PK(Pay-to-Public-Key)是最简单的标准交易脚本。

 

该脚本只是简单的调用CHECKSIG操作符,检查该数字签名是否正确。因为只有比特币的持有者才拥有对应的私钥,才能提供正确的数字签名,从而证明了自己对该UTXO的所有权。
 

P2PKH(Pay-to-Public-Key-Hash)是比特币网络上用得最多的脚本。

 

 
它包含有一个公钥的哈希值,公钥的哈希<Public Key Hash>与我们很熟悉的比特币地址是等价的,但我们看到的两者的字符串并不相同,这是因为比特币地址为了方便日常交流使用进行了Base58Check编码。公钥的哈希值隐藏了公钥本身,而且字节数要少得多。
 
MS(Multiple Signatures)表示多重签名。多重签名脚本设置了这样一个条件,假如记录在脚本中的公钥个数为N,则至少需提供其中的M个公钥才可以解锁。这也被称为M-N组合。多重签名可以用于公司组织等设置复杂的支付条件。
 
P2SH(Pay-to-Script-Hash)是2012年引入的一种强大而同时又保持了简洁的交易类型,它把复杂的锁定条件简化为一个哈希值代替,缩短了交易的字节数,减轻了区块链的负担。是推荐使用的一种新型交易脚本。

 
OP_RETURN是一种非交易型的输出,它被设计用来仅仅返回一个小于40字节的数,常常用来返回一个哈希值。OP_RETURN创建的输出不能作为其它交易的输入,该输出虽然包含在区块链的数据中,但是不会被包含在UTXO池中。简单说来,它还是会占用硬盘,但是不会占用内存,这降低了区块链的负担。

 

赞(0)
请您分享转发:汉风1918-汉唐归来-惟有中华 » 袁岚峰:你完全可以理解区块链|2020-01-04

评论 抢沙发