本文目录

  • 1、前言
  • 2、中心化
    • 2.1 交易
    • 2.2 数字货币
    • 2.3 复式记账法
    • 2.4 未消费交易输出
    • 2.5 中心化
    • 2.6 区块与区块链
    • 2.6 创世区块
  • 3、去中心化原理
    • 3.1 分布式存储
    • 3.2 对等网络
    • 3.3 交易池
    • 3.4 挖矿
    • 3.5 创币交易
    • 3.6 工作量证明
    • 3.7 共识与共识算法
    • 3.8 确认
    • 3.9 诚实节点与恶意节点
    • 3.10 区块链分叉
    • 3.11 双重支付
    • 3.12 虚拟机
    • 3.13 矿机和矿池
  • 4、遗留的问题
  • 5、总结

1、前言

本文引自裴尧尧新书《从零开始自己动手写区块链》,书中原创"中本聪"发币故事,通过对比传统交易系统(支付宝、微信等)记账系统与区块链记账的区别,通俗易懂,门槛低,值得一读。接下来,让我们一起来听故事吧。

2、中心化

2.1 交易

有一个世外桃源村,那里住着一群崇尚平等、爱好和平的人们,他们与世隔绝。为了满足各自的生活需求,村民之间存在交易,由于没有发行货币的能力,物与物之间只能交换,偶尔会产生分歧。比如张三想用一头牛换李四的五只鸡,但李四只想换四只,无法达成一致意见,有时候还发生争执。

发生争执的原因?
交易(Transaction)的公平性得不到统一。交易的实质是所有权的转移,常常以货币为媒介,如果桃源村存在某种流通的货币,并且每一件可能作为交换的物品都被定了价格,张三和李四就不再发生争执,交易的问题就迎刃而解。

2.2 数字货币

村里有个叫中本聪的年轻人,想到了一种解决方案。他将全村的人召集到村口,介绍了自己的想法,他的原话是这样的:
“我知道今天张三和李四因为一头牛到底换几只鸡又发生了争执,据说还吵的面红耳赤。为了避免此类事情的再度发生,我想发行一种货币,这种货币不是某种奇形怪状的石头,也不是特定的纸张,更不是稀有的黄金白银,因为我们没有这些可用的资源。这种货币没有实体形式,而是写在账本上的数字,更确切的说是写在账本交易里的数字。举个例子,村里有一个大家都认可的公共账本,记录者村民之间的来往交易。打个比方,李四本来没有钱,但如果账本上突然写上一笔交易:张三给李四转账10元钱,至于张三为什么给李四转账10元钱,也许是因为向李四买了一只鸡或者一筐鸡蛋,我们不用理会,只要双方确认交易并写在了账本中就作数。账本中确实有指向李四的10元钱,李四就能拿这10元钱去消费,所有人都应该认可。如果账本中写了多条交易指向李四,比如还有两条交易分别是:王五给李四转账5元钱,六麻子转账给李四20元钱,那么李四的账户余额就成了35元钱,李四就能拿这些钱去买他想要的东西。当然这些交易可能被记录在账本中不同的页。”

中本聪想要发行的货币没有实体形式,仅是写在账本中的数字,但能在特定团体里及时流通,这就是一种数字货币(Digital Currency)。数字货币是虚拟货币的一种,虚拟货币范围更广,还包括游戏币、小孩玩“过家家”时的“石头”、“贝壳”等。数字货币也有别于电子货币,我们常用的支付宝、微信支付属于电子货币的范畴,虽然他们也是记录在账本上的数字,但有别于数字货币,他们有实体形式的,对应于央行发行的纸币。最成功的数字货币算比特币,可以在现实生活中及时流通。
虽然这个想法听起来很有趣,但也存在一些问题。比如说,账本交易中的“张三给李四转账10元钱”,那么张三的十元钱到底在哪里?张三要给李四转账,账本里应该有指向张三的钱。如何更直观明了的解决这个问题?

2.3 复式记账法

中本聪还定了一些规则:
“为了让我们货币顺利发行,还有以下几点需要大家一起完成。首先,村里的每一件可能交易的物品都有一个统一的定价,这个定价由大家共同商议决定,货币单位采用元、角、分,最小单位为1分钱。”

“其次,每笔交易都有一个编号,而且必须采用输入和输出的标准交易格式记录到账本里。上面提到的第一笔交易:张三给李四转账10元钱,并没有采用标准交易格式记录,应被当作无效交易。我这里有给出一个标准交易格式范本(如上图所示),假如张三从李四手中购买一只鸡要支付10元钱,先在账本里查找有没有指向张三的交易,比如正好账本的第3页有一条编号为13的交易,其第1条输出指向张三,金额为20元钱,大于需要支付的金额10元钱,于是将要创建的交易的输入就应该指向该位置(定位),即为账本第3页,交易编号13,第1条输出,然后将这条指向张三的输出盖上红色印章表示被消费过。由于要花费的钱是20元钱,还有10元钱的找零,所以该笔交易将产生两条输出,一条是指向李四的10元钱,另一条是指向张三的10元钱,这样就完成了这笔交易的记录。这种标准交易格式的好处在于,能查询每一笔钱的来龙去脉。”

中本聪标准交易格式采用了复式记账法(double entry bookkeeping),15世纪形成于意大利,现为世界广泛采用。复式记账法是以资产与权益平衡关系作为记账基础,对于每一笔经济业务,都要以相等的金额在两个或者以上相互联系的账户中进行登记,系统地反映资金运动变化结果的一种记账方法。
这种交易格式就像链条一样,将资金的转移链接起来,如下图所示为张三、李四、王五、赵六的交易链条,区块链中除了区块(账本的页)和区块是相链接的,交易也通过输入和输出紧密链接在一起,从区块链(账本)中的交易顺藤摸瓜,可以清楚的知道资金流动的来龙去脉。这与目前使用的货币是有区别的。举个例子来说,假设张三给了李四1万元现金,李四给了王五1万元现金,王五又给赵六5千元现金。赵六要拿5千元现金去消费,他到底用的谁的钱呢?是来自张三?李四?还是王五?还是属于他自己?我们并不清楚,但是如果采用中本聪的标准交易格式进行记账,是完全可以追查到的,因为王五收到的每一笔钱都是一个独立的输出,当他需要消费时,他使用的哪一个输出都能向上溯源。还比如,张三有1万元可能来历不当,通过合法渠道,将这1万元给了李四,那么李四这1万元就被“洗”出来了。

事实上,复试记账法中交易的输入是和输出应该是单个输入和单个输出的集合。本书中,单个输入和输出,也被称为输入单元和输出单元。
需要注意的是,就目前为止,在本书故事里,交易记录的输入和输出是相等的。在主流数字货币的交易中,会存在一个交易费,即输入金额总和-交易费=输出金额总和。
既然村民所有的钱被分散的记录在账本里,一般都是记录在不同页中,那村民如何知道自己有多少钱呢?

2.4 未消费交易输出

中本聪对交易输出提出了更深刻的解释:
“账本里的输出就是大家的钱,指向谁就是谁的。但是有两种形式,一种是被消费过的,被消费过的被盖上了红章。另一种是未消费过的。如果将指向某个人的所有未消费(未被盖红章)交易输出累计加起来,总和就是这个人的账户余额。”

未消费交易输出的英文名称为Unspent Transaction Output,简称UTXO,从已上交易的定义流程可以看出,UTXO被零散的记录在账本中。一个UTXO是不可分割的,它只有两种状态,未消费和被消费,这也是能溯源的原因。到目前为止,中本聪发明的这种数字货币已初具雏形。但还存在一些问题,比如应该由谁来保管账本,又由谁来记账?

2.5 中心化

中本聪继续介绍到:
“账本由一个可靠的人保管并记录交易。账本不得修改,所以这个人必须是集正直、谨慎于一体,大家都信得过人。我推荐住在我家隔壁的会计老王。老王只记录有效交易。有效交易创建必须满足以下三个条件:
1、交易双方同时出面,交易由买方发起,老王要确保买方是本人无误
2、老王能在账本中找到买方足够的余额来完成支付
3、交易记录后还要由卖方确认无误。”

账本由诚实、正直的老王来保管,交易由老王来记录,老王就是第三方记账中心,或者说记账权威,哪些交易应该被写进账本在很大程度上取决于老王。日常生活中使用的淘宝、京东商城等,都属于中心化(Centralization)记账的代表,用户间的交易通过第三方权威(服务器)进行认证和记录。
那么,是不是只要桃源村里有村民要发生交易,就先去找老王或者叫老王来记账呢?交易的具体流程又该是怎样的呢?

2.6 区块与区块链

中本聪继续说到:
“交易集中进行,交易时间为每周五上午8:00-12:00,交易地点在村口。也就是说,会计老王每周五早上8:00整就会在村口等着大家来交易,交易总量以写满一页账本为止。一只鸡经大家商量后最终定价是10元钱,张三想从李四手里买一只鸡,他们约定好本周五上午9:00整在村口交易。到了周五9点左右,张三和李四一同走向村口,看到老王拿着账本正在等着他们。张三对老王说,给李四转账10元钱。老王看了一眼张三,确定是他本人无疑,然后开始仔细在账本里查找有没有指向张三的未被盖红章的交易输出。一会儿功夫,老王就找到了一笔指向张三的20元钱,而且这笔钱并没有被消费过,足够付给李四10元钱。这是今天的第一笔交易,老王翻开账本,在最新的一页上写上今天的日期,然后认真的写上这笔交易,并在指向张三20元钱的输出上盖上红章(图1.1)。李四看了看账本,交易确实指向自己,金额也为10元钱无误,于是把手上的鸡给了张三,交易成功,大家都高高兴兴回家了。老王今天很想早点回家,因为张三请了老王中午到他家吃鸡。于是老王希望有更多人来交易,因为规定了每次集中交易的数量是写满账本,写满后如果还有人需要交易,就必须要等到下周五,而老王却能提前回家。如果账本没写满,老王就必须等到12:00或者直到写满。”

根据中本聪的描述,每周五上午老王会在账本的最新一页纸上记录一部分交易,交易数量不定,但最多写满整页纸。该页纸上有确定的记账日期、记账人、和页码以及交易记录,在区块链技术中还有一个名称,叫区块(Block),整个账本由连续的页(区块)有序的链接起来,被称为区块链(Blockchain),页码所在的位置被称为区块高度,如图1.2所示,本故事中区块链的本质就是账本(如果区块链技术应用到了其他领域,不一定就是账本,可能有别的称谓)。
需要注意的是,与市场上的主流数字货币(如比特币)不同,到目前为止,故事中的记账人是固定的,账本的最新页(最新区块)是由老王创建,而主流的数字货币的记账人预先是不确定的,主流的数字货币的记账人(区块创建者)又是谁呢?后续故事中将继续讨论。同时,区块的数据结构以及区块与区块之间的链接在故事中也进行了简化。
到目前为止,中本聪发行的数字货币还存在一个问题,账本里没有交易,或者说没有指向任何人的交易输出,也就是所有村民都没有钱,那要如何进行交易?

2.6 创世区块

中本聪宣布货币的发行:
“我之前所有举例都是虚构的。目前我手上的账本是空的,也没有指向任何人的交易输出,也就是说大家都没有钱,是不可能完成一笔交易的。为了确保大家的平等权益,我将会在账本的第一页上写入第一笔交易,这笔交易没有输入,只有指向我们每个人的,金额为1000元钱的输出。从我写完这笔交易开始,也说明我们的货币已经成功发行了。每个人的余额都是1000元钱,从本周五上午8:00整大家就可以自由交易了。”
说完,中本聪写满了账本的第一页纸,这张纸上有且只有一笔交易,记录了村里所有人的名字和指向他们的1000元钱,如下图所示。

众人一听,中本聪这个想法毫无破绽,纷纷表示赞同,并通过民主投票最终决定由老王来保管账本并记账。中本聪让每个人看一眼账本,在确认自己的名字和1000元钱写进了账本第一页的唯一一笔交易后,才能回家。

桃源村公共账本的第一页也称为创世区块(Genesis Block),创世区块中的交易不需要经过验证,所以从理论上讲金额是任意的,这取决于创造创世区块的人,故事中的创世区块由所有村民共同创造,所以大家拥有共同的余额,失了偏颇将会产生异议。但创世区块中必须有至少一条交易,交易必须至少有一个输出单元,也就是必须至少有一笔指向某个人的钱,不然后续交易将会无法发起。创世区块中的交易也被称为创币交易,但不是唯一的创币交易(比如比特币的“挖矿”奖励交易也是创币交易),交易的输出总额也被称为创世币。
还需要注意的是,从经济学的角度来讲,整个村的经济总量永远是恒定的,即1000元乘以村民数量,可能存在不合理之处。
值得一提的是,与故事中的略有不同,比特币的创世区块只有一笔指向比特币创始人(中本聪)的输出,金额为50比特币。当然,读者自己发行一种数字货币,想在创世区块中给自己、亲戚、或者朋友记录一定金额的输出也是完全可以的。

从此,世外桃源村的数字货币就正式发行起来了。每个周五上午,老王就在村口等着大家来交易,并将有效交易以标准格式记录在账本里的最新一页中。时间一天天过去,张三买多卖少,账本里的余额越来越少;李四卖多买少,余额越来越多。

虽然桃源村的数字货币发行起来了,解决了村民生活中的交易问题,从逻辑上讲是完全合理的,但也存在一些问题。
问题1:
就目前为止,桃源村数字货币的发行是以老王诚实、可靠为前提的。老王是记账中心,如果老王在未写满的区块中“人为”写入实际未发生的交易,可能存在“盗窃”行为。举个例子,张三和老王关系很“铁”,经常请老王吃鸡,眼看着自己余额越来越少,又不想出卖劳动力去挣钱,于是求老王在未记录满的交易页中写入指向自己输出的交易,为了不让别人发现,可以是小额的。如图1.5所示的“人为”交易就是张三试图盗用吴十的1元钱的证据。在实际生活中,这种情况也是可能出现的,比如你使用某种电子货币支付App,记账中心挪用你1分钱,并不容易被你发现。

问题2:
如果老王不小心丢了账本,那大家的钱就没有了,整个交易系统都将崩溃。
问题3:
账本是公开透明的,谁钱多钱少一目了然。会不会出现见财起意的行为。比如大家都知道李四钱多,张三可能会召集其他人强迫李四给他们转账。
以上三个问题中,前两个问题是因为中心化的问题,系统中存在一个权利过大的特殊结构,要彻底解决只能是去中心化。第三个问题是因为账本是公开透明的,转账地址直接与个人信息挂钩,没有进行加密处理。
首先围绕第一、二个问题,也就是如何去中心化的问题,我们继续读故事。

3、去中心化原理

一个阳光明媚的春日午后,中本聪在一阵吵杂声中醒来,家门口挤满了村民,细问之后才得知,老王外出回家在经过进村的独木桥时,不小心将账本掉进了水里,水流湍急,再也找不回来了。账本丢了,等于大家的钱都没有了,又回到了起跑线上。像张三这种人本身余额少的人占了便宜,李四这种余额多的只能吃哑巴亏,都来找中本聪,中本聪感到很愧疚。更重要的是,原本有交易的平衡被打破,整个村都乱了套。
聪明的中本聪意识到自己失败的原因在于中心化,于是苦思冥想去中心化的方法。他并没有学牛顿去苹果树下思考,还是和往常一样,经过不懈的努力,终于让他找到了可行的解决方案。他把大家召集到村里的会议大厅里,介绍自己的想法。

3.1 分布式存储

中本聪是这样说的:
“老王丢了账本,造成大家的损失,这不是老王的错,一是因为天灾人祸,二是因为我设计的货币存在漏洞。这些日子里我总结了我失败的原因,认为罪魁祸首因为交易记录在一个账本里,且由老王保管,老王就像是一个记账中心,如果中心出了问题,整个系统都将瘫痪。所以我的思路是去中心化。经过这段时间的思考,我终于找到了一种解决方案,也希望能解决我们当前的困境。
在之前规则的基础上做了适当的改进。我们的钱仍然记录在账本的交易中,交易还是按照标准格式写入账本,依旧采用集中交易的形式进行,交易时间还是每周星期五上午8:00点整开始,但结束时间不确定。每次的交易也是写满账本最新的一页为止,但交易地点改到会议大厅。还有以下几点不同的地方,以前账本只有一个,由老王保管,现在是村里人手一个账本。”

中本聪的要求是每个人拥有一个账本,也就是将账本分开保管,在互联网中也称为分布式存储(Distributed Storage),账本由老王一个人保管称为集中式存储(Centralized Storage)。分布式存储的好处有两点:一是即使有个别村民的账本丢了,大部分村民的账本还在,该村民可从别的村民处获得副本。二是如果有人想尝试修改账本,那么他需要修改每一个人的账本,我们将会在后面的内容中讨论这些内容。
记账规则还是和以前一样,只要交易写进账本就生效,既然每个人都保管一个账本,就必须保证每个账本数据是完全一致的,否则交易系统也无法健康的运行,这一点中本聪是如何做到的呢?

3.2 对等网络

中本聪继续说到:
“第二,以前交易是老王和需要交易的人参加,现在除了需要交易的人以外,越多人参加越好。以前交易是由买方告知老王,老王直接记录到账本里,然后由卖方确认。现在交易由买方以标准格式写在纸条里,然后将纸条在大厅里传递。传递的规则是,传递有效交易,拒绝无效交易。比如说张三向李四买一只鸡需付款10元,交易由张三创建,张三按照标准交易格式将该条交易写在纸条上,然后把纸条交个李四,李四验证交易有效后就要将纸条传递给大厅的其他人,其他人重复李四的工作,这样写着有效交易的纸条就在大厅内传播开来,直到纸条被大部分人验证过,最终会被放进会议大厅前面的盒子里。在场的每个人都至少有一重身份,那就是当写有字条的交易传递到你手上时,你负责验证交易有效性并将其传递出去。如果你是交易发起者,你将多一重身份。你还要负责创建交易,当然每个人都有权利创建交易。”

中本聪的做法就好比搭建了一个对等网络(Pear to Pear Network),也被称为P2P网络、“点对点”或“端对端”网络,位于网络中的每一个节点(计算机)都彼此对等,各个节点共同提供网络服务,不存在“特殊”节点。区块链网络基于国际互联网的P2P(Peer-to-Peer)网络架构,由对等节点(Peer)构成,每个节点以“扁平”的拓扑结构相互连通,不存在任何服务端、中心化服务、以及层级结构,而且必须遵守相同的约定(P2P协议),如下图所示。BT、迅雷下载都是属于对等网络的应用。


大厅里的每个村民就好比是P2P网络中的一个节点(Peer),每个村名享有相应的权利和遵守的规则。例如,每个节点都有创建交易的权利,每个节点都必须验证交易并传播有效交易。P2P网络与传统的“服务器”对“客服端”的中心化网络有较大的不同,中心化网络中的中心节点唯一的信息集散地(如图1.6(b)所示),而且拥有更多的“特权”;而P2P网络中的节点拥有网络信息的副本,且所有节点权利均等。
选择的问题是,每个村民(节点)创建、验证、和传播交易的具体流程到底是这样的呢?

3.3 交易池

中本聪举了一个例子帮助大家理解交易的传播过程。

“我们来看一个实例,每到星期五上午8:00点整,大家都带上自己的账本和草稿本来到会议大厅排排坐好,需要交易的双方请坐在一起。如果张三想从李四手上买一只鸡需支付10元钱,他需要创建该笔交易并以标准交易格式写在小纸条上。大致过程是这样的,张三先在手里的账本中查找属于自己的钱,也就是没有被盖过红章的指向自己的交易输出,比如账本的第3页有一条编号为13的交易,其第1条输出指向张三,金额为5元钱,但是不够支付10元钱,于是他就会继续在账本里查找,很快他又在账本的第5页找到一笔编号为4的交易,第1条输出为指向自己的6元钱,这两笔钱加起来足够支付10元,于是将这两笔钱的在账本中的位置作为当前交易的输入写在小纸条上,并签上自己的不可伪造的签名。输出是给李四的10元钱,和给自己的(5+6-10)=1元钱。(交易纸条范本如下图所示)。”

“张三将交易写进纸条后,先在自己的草稿本上复写该笔交易,然后把纸条传给李四。李四接过纸条,首先检查交易是不是按照标准格式记录,然后对照自己的账本,检查输入和签名是不是匹配,也就是说,交易的输入必须是指向张三的未消费输出,签名必须是张三的签名,而且这个签名不是伪造的。比如交易输入是李四的,签名却是李四的,交易将视为无效交易。确认无误后,李四再核对交易输入和输出金额是否相等(下图为交易验证流程图)。”

作为卖家,李四还要看一眼指向自己的钱是不是也正确。如果李四没有发现任何问题,他会将该笔交易也复写在自己的草稿本上。复写完后李四将纸条传给坐在他旁边的王五。王五重复李四的工作,但王五不是卖方,所以不必特别注意交易的输出具体是指向哪里。当王五确认交易有效,就将此交易也写进自己的草稿本上,然后就会传给下一个人,直到交易传递到了大部分人手上,最终所有写着交易的纸条都被放进会议大厅前面的盒子里(如下图所示)。以上过程每个都是对照自己的账本独立进行验证,其中任意一条不满足,交易将被视为无效交易,无效交易都不得复写到自己的草稿本上,也不得将其传递给其他人。”

验证交易的过程是相互独立的,每一个节点都是对照自己的账本进行,所以也被称为交易的独立验证,区块验证也是如此。
到目前为止,即使是有效交易,也只是被大厅里的村民们复写到了自己的草稿本上,草稿本也被称为交易池(Memory Pool),存放每个节点收到的有效交易。还没有任何一条交易被写进账本,或者说被写进区块链,也可以说所有交易还没有被确认。每个村民的交易池中都有很多交易,可能每个人的交易池还不一样(比如并非每一条交易都传递到每个人手中),那么到底哪些交易应该被大家写进账本,如何保证账本数据的完全一致呢?

3.4 挖矿

继续听中本聪介绍:
“到目前为止,交易只是写进了在座各位的草稿本上,而且每个人草稿上的交易还可能还有些许差别,并没有被写进账本。但我们的规则是将成功写进账本的交易才会被所有人认可,精明的李四在没看到所有人将张三创建的交易写进各自手中的账本里之前,是不会轻易将鸡给张三的。大家都清楚,验证交易的过程是每个人对照自己的账本独立进行的,如果各自的账本不一致,那么如何判别有效交易,所以保证所有人账本的一致性是货币发行的必要条件。如何保证一致呢?我们可以从在座的各位中选出一位,将他草稿本上的交易写进账本,也就是说选出来的人将获得记账的权利,如何才能被选出呢?事实上在场每位的机会都是均等的。”
“在创建交易、传递纸条持续达2小时之后,我将在我的题库里随机找一个数学题,这些题目的特点是,解答比较困难,但知道答案后验证结果却很简单。这些数学题我在以前给大家讲课时都详细介绍过。在场的每一位都可以解题,谁第一个解出答案,告知大家,其他人就可以停止答题,因为本轮记账权的获胜者已经产生。”

对应于比特币,求解中本聪所给出的数学题的过程也叫“挖矿(Mining)”,而解题的人(节点)也被称为“矿工”。“挖矿”到底是要求解一个怎样的具体题目我们在第6章中详细介绍。就好比一场数学竞赛,“挖矿”的本质是为了夺取记账的权利。但问题是,谁会愿意去解枯燥的数学题呢?

3.5 创币交易

“为了鼓励大家积极参与解题,获胜者将获得5元钱的奖励。奖励以交易的形式写进账本,我们统一将其编号为1,也就是账本最新一页的第一条交易,这笔交易没有输入,只有指向第一名的唯一一条输出,金额为5元钱。”

以上的过程可以从两个方面理解,一是发放了奖励,二是发行了数字货币,实现了数字货币总量的增长。发行货币是通过创币交易(Coinbase)实现,即中本聪描述的账本最新一页(获胜矿工打包的最新区块)中的第一条交易。创币交易格式如图下图所示,没有输入,只有一个指向获胜者的唯一输出单元,且金额为奖励数额。

需要注意的是,故事中的奖励是固定值,仅包括创币金额5元钱。比特币中获胜者获得的奖励除了创币金额外,还包括交易费,同时,比特币的创币金额是衰减的,详见第六章中的内容。
前面提到过,从经济学的角度讲,以老王为中心发行的数字货币总量是恒定的,可能不符合经济学的规律,中本聪将“挖矿”和“创币”结合起来,既激励了村民(节点)参与解题的积极性,也让数字货币更符合经济总量总是在增长的规律。到目前为止,在区块链里,只有创币交易(包括创世区块中的交易)是没有输入的,其他所有交易都应该有指向所有者UTXO的输入。

3.6 工作量证明

中本聪举例介绍保证账本数据一致的过程:
“举个例子,当我宣布解题开始后,愿意解题的人开始解题。假设李四第一个解题成功,他检查多遍答案无误后,向大家公布自己已经找到了答案,此时其他人已经知道自己本轮已经落败,于是停止答题。李四翻开自己的账本,最新页是110页,于是将奖励作为第一条交易写进该页,然后将自己草稿本上的交易进行编号,逐一誊写进该页中。李四需要注意的是,将交易转移到账本上时,算上奖励交易,每次最多只能写满一页账本,多余的交易舍弃。也就是说,如果本周五的交易过多,可能会有不被写进账本的交易,没有成功的交易将只能等到下周五再由买方重新创建并写入纸条,然后继续在大厅里传递。如果本周五交易过少,将所有交易转移到账本上即可,可能会留有空白。交易写入账本后,李四接着将110页的交易一字不差的复写到大厅前方的黑板上,包括页码、记录时间、以及记账人,还要附上解题答案。(如图下图所示)”

通过解题竞赛(挖矿),胜出的李四会将原先草稿本(交易池)中的交易写进账本最新的一页(“矿工创建的最新区块”),然后将区块和解题答案写在黑板上广播出去。如果把“挖矿”当成一份工作,解题答案也被称为工作量证明(Proof of Work,简称POW)。那么李四需要向谁证明工作?

3.7 共识与共识算法

中本聪继续解释:
“当李四将自己账本最新一页上的交易和解题答案工工整整的板书在黑板上后,在场的其他人首先验证解题答案的准确性,前面我们就说过,我所出的题目的特点是得到答案困难,但是验证答案却非常简单,每个村民都能轻易验证答案是否正确。如果正确,检查第一笔交易是不是没有输入,且只有一条输出,金额为5元钱。然后对照自己的账本,和之前一样验证每条交易的有效性。如果解题答案正确,所有交易都有效,那么请翻开自己账本的110页,将黑板上的信息原封不动的誊写到自己的账本里,并拿出自己的红色印章,将每笔交易输入指向的输出盖上红章表示被消费过。”
“整个验证过程是相互独立的,只要中间有任一个环节验证不去通过,则不得将信息誊写到各自的账本中”
“所以需要提醒大家,每一个想获胜的人,都不能试图伪造交易,而且要绝对仔细,因为得到最终的记账权和奖励,必须经过所有人的严格验证,因为无效的信息将导致村民拒绝将这一页写入账本,包括奖励交易”

此时此刻,所有村民(节点)将验证后的110页(最新区块)写入了自己的账本(区块链),这样就保证了每个村民(节点)账本数据的一致性,即所有村民(节点)达成了一个共识(Consensus),这种共识是通过村民验证解题答案(工作量证明)而达成的,采用工作量证明(POW)来达成共识也被称为共识算法(Consensus Algorithm)或者共识机制(Consensus Rule)。工作量证明(Proof of Work)是比特币采用的共识算法,目前常用的共识算法还有:权益证明(Proof of Stake)、委托权益证明(Delegated Proof of Stake)、拜占庭容错算法(Practical Byzantine Fault Tolerance),Raft协议等,将会在第6章中介绍。
所以,可以将区块链技术解决的主要问题总结为,分布式系统如何在没有中心的情况下保证数据的一致性,也就是分布式共识问题。区块链解决了节点之间的信任问题,之前的中心化记账是因为我们信任记帐中心“老王”,而区块链中并有中心,却能保证账本数据一致性。
既然交易已经被写进了账本,也就是卖方的钱已经到位,是不是可以完成交易了呢?

3.8 确认

“交易卖方发现买方创建的交易被写进了账本,就能完成交易,比如李四这时候就可以将鸡交给张三了。如果交易没有被写进账本,交易将等到下周五才能进行”。
“以上还是我虚拟的故事,现在每个人手上都只是有一个空账本,不可能发生交易,所以请大家在自己账本的第一页写上一笔没有输入,输出指向全村人,金额为1000元的交易(图1.2所示),这将是我们每个人的均等启动资金。”

李四发现张三写给他的交易被写进了账本(区块链)中,也就是交易得到了确认(Confirmation),于是就可以将鸡交给张三来完成交易。故事中的例子是交易一旦写进区块链就能得到确认,该区块就不会被更改了。但真实的数字货币中,由于共识算法自身的原因会导致偶然事件的发生,可能会出现区块链数据在接下来几个区块内数据回滚的情况(比如比特币中的偶然分叉),这使得交易的确认变得更复杂,具体请读者参考第六章中的区块链分叉。比特币中交易的永久生效需要在当前区块上继续添加6个区块。简单的讲,李四要想确认张三写给他的交易,必须保证账本在100页的基础上再写上6页。这意味着,交易确认是存在一定“延迟”的。
以上所有过程中,中本聪只是说明了大家都要遵守的规则,但并没有对每个人进行监管,那要是有人不遵守规则又会发生什么呢?

3.9 诚实节点与恶意节点

中本聪继续说到:
“如果每一个村民都是诚实可信的,都是遵守规则的,比如创建的交易是有效的,验证交易的流程是符合规矩的。假设纸条传递到了每一位,则每个人的草稿本上应该记录着完全一样的交易。”
“如果创建交易的人不遵守规则,比如张三用指向李四的钱创建交易,签名确是自己的,张三可以将交易复写到自己的草稿本上,但不会被其他诚实村民验证通过,也就不会被写到他们的草稿本上,更别提被写进账本了。”

从中本聪的叙述中可以看出,网络中的节点类型有两种,一种是完全遵守规则的,另一种想干坏事的,或者捣乱的。比如比特币系统中的规则都写在了比特币客户端程序中,普通用户如果想不遵守规则较难实现,但仍然会有个别“程序开发人员”或“黑客”尝试在网络中不遵守规则。遵守规则的节点称为“诚实节点”,不遵守规则的节点称为“恶意节点”。接下来,作者将和读者一起分析“恶意节点”可能存在的“捣乱行为”,并分析这些行为是如何影响区块链运行的。
讨论了以下几种可能的“捣乱行为”。

张三只买不卖,钱越来越少。于是修改自己的账本,比如将指向别人的输出改为指向自己。

这是一种掩耳盗铃的做法,张三修改了自己的账本(区块链数据),自己创建的交易在自己看来是“有效交易”。但其他节点的账本并没有被修改,当交易传播到其他节点时,其他节点无法在自己的账本中找到正确的输入,就会直接拒绝这笔交易,不会将其放进自己到交易池中,如果“获胜矿工”是张三,张三创建的区块将会被拒绝,因为区块中包含无效交易;如果“获胜矿工”来自其他节点,区块中将不包含张三创建的无效交易。张三想让其他节点都能接受他的交易,必须修改所有人的账本,这种工作量是巨大的。

3.10 区块链分叉

张三发现修改自己的账本后,创建的“有效交易”无法被其他人接受,根本不会将交易写进草稿本,更不可能被写进账本。于是开始拉拢部分人一起“捣乱”,当张三的交易传递到“同伙”手中时,要求其将交易写进各自的草稿本上。

现在的情况是,网络中有部分节点的交易池中已经存在“无效交易”,要想将这些“无效交易”写进区块链进生效,必须由获胜的矿工将其写在黑板上(打包并广播),然后接受其他节点的独立验证。
假设张三的同伙的是李四和王五,正好本轮获胜者是李四,由李四将区块打包并广播出去,该区块中包含有张三创建的“无效交易”,其他节点验证李四广播的区块时,会发现张三的交易是“伪造”的,于是都不会将该区块写进自己的区块链中。张三、李四、王五如果将该区块写进了各自的区块链,则他们的数据会与大部分节点的数据不一致,好比是网络中出现了两个“团体”,如下图所示。这种网络中出现节点数据不一致的情形,也称为区块链分叉。分叉后会发生什么呢?


事实上,李四作为获胜矿工的损失是巨大的,虽然获得了记账权,但由于在广播的打包区块中写入了“无效交易”,导致区块没有被大部分节点接受,挖矿奖励也泡汤了,因为当李四使用该笔挖矿奖励创建交易时,会被除了张三、李四、王五之外的其他节点拒绝,这意味着李四只能将该笔钱支付给张三和王五,支付给之外的人的是不可能成功的。所以作为“矿工”,应该通过“诚实行为”来利益最大化。
如果张三与其的“同伙”想继续将“游戏”玩下去,这种分叉实际上是短暂的。假设张三与其“同伙”记录的最新区块编号是120(账本120页),如下图所示。


如果下一个区块创建者来自其他节点(非张三与其“同伙”),广播的最新区块的编号将仍然会保持在120,该区块由于是有效区块会被其他节点接受,如下图所示。

此时,张三与其“同伙”会意识到之前李四创建的区块并没有被其他节点接受,要想继续“游戏”,必须用新的120区块替换旧区块,最终全网的数据将保持一致,如下图所示。


注意:比特币中的区块编号是区块数据的哈希值。
当然,如果张三拉拢的“同伙”越多,区块链分叉节点在增加,但诚实节点仍然不会接受含有“无效交易”区块。如下图所示,如果绝大多数节点都成为了张三的“同伙”,双方的身份是不是会发生互换?张三与其“同伙”变成“诚实节点”?之前的“诚实节点”变成了“恶意节点”?实际上并非如此,因为张三和“同伙”作恶的目的是为了欺骗“诚实节点”,现在却变成了张三和“同伙”之间的“相互欺骗”,显然游戏规则已经发生了改变。“诚实节点”永远“诚实”,而“恶意节点”的恶行将会被“诚实节点”排除在外。

由此可见,区块链技术对网络中的“恶意节点”具有“免疫”功能。当然,现实世界里好人是居多的,坏人是偏少的。事实上,防止节点“作恶”是公有链才需要考虑的问题,详见第五章区块链分类。
问题继续,再分析另一种可能的情形。

“张三并不修改自己的账本,也不拉“同伙”一起“捣乱”,而是用李四的UTXO来创建交易,并伪造李四的签名,如果不被其他村民认出伪造,这将会发生什么呢?”

很显然,张三创建的交易将会被除了李四外的其他所有节点接受,最终极大可能被写进区块链。那么如何才能保障签名不可伪造呢?这属于区块链加密的内容,详见第三章。

3.11 双重支付

还有另外一种情况值得讨论。

聪明的张三想到另一种办法,比如他要向李四买一只鸡需支付10元钱,于是他创建了两笔交交易,两条交易的输入指向自己相同的未消费输出,第一条交易的输出指向李四,第二条输出指向自己(如下图所示),并分别将两条交易写在不同的纸条上。张三将写有第一条交易的纸条给李四,李四认为是有效的,将其写在自己的草稿本上并在大厅内传递;与此同时,张三将写有第二条交易的纸条传递给大厅中的其他人,这也是一条有效交易,也会迅速在大厅内传递。

张三的恶行会得逞吗?如果网络中的每个节点在验证交易时,仅检查交易的输入是不在区块链中,很显然张三得逞了,张三将完成双重、三重、甚至N重支付。所以,在前面的故事中,我们漏掉了中本聪的原话:

“当写着纸条的交易传递到每个人手上时,首先要看自己的草稿本上是不是已经写了这笔交易,因为有发生重复传递的可能性。如果交易并没有被写进草稿本,还需要检查交易的输入是不是已经被草稿本中的某条交易使用过,然后对照账本独立验证交易的有效性”

张三试试图使用一个UTXO完成两笔支付,被称为双重支付(Double Payment)。遵照中本聪的规则,来分析一下张三使用相同的UTXO完成两笔支付的最终去向。具体来讲,两条交易分别在大厅内传递过程中,将第一条交易写入到交易池中的节点会拒绝第二条交易,将第二条交易写入到交易池中的节点会拒绝第一条交易,这取决于交易在网络中传播时抵达节点的顺序,先抵达的将会被接受,后抵达的将会被拒绝。于是,两条交易将分别记录在不同节点的交易池中。哪一条交易会被写进区块链,取决于两条交易谁先到达本轮的“获胜矿工”。如果“获胜矿工“的交易池中接受了第一条交易,李四就能完成交易,第二条交易将会作废。如果“获胜矿工”接受的是第二条交易,则李四的交易应该取消,因为第一条交易已经被作废。
从根本上讲,张三并没有完成真正的双重支付,只是“试图”完成,但不可能成功。那么是不是没有完成双重支付的可能性?请读者参考第六章中的51%攻击。

3.12 虚拟机

对照账本验证交易的有效性是一个繁琐的工作,村民稍有不慎就会出错。于是,中本聪发明了一种验证交易的机器,这种机器需要账本和写着交易的纸条。每个村民都有一个属于自己的机器,需要验证交易时,村民将自己的账本和写着交易的纸条放在指定的位置,机器会自动验证交易的有效性。

中本聪发明其实是一种虚拟机,比如比特币、以太坊系统都有自己的虚拟机(比特币中被称为脚本引擎,非图灵完备;以太坊虚拟机功能更强大,图灵完备)。相比故事中的“机器”,虚拟机的作用不仅仅是验证交易、区块的有效性。和“个人”不同,即使没有虚拟机,计算机验证交易也不会出错。那虚拟机的作用是什么?对于一个中心化系统,当系统需要升级、或变更时,直接发行新的版本即可。但对于去中心化系统,每一次升级、变更都需要经过讨论并取得共识。举个简单的例子,比如系统需要有新的交易形式出现时,没有虚拟机的系统可能要进行全面升级。对于有虚拟机的系统,在设计之初就给虚拟机设计了验证该种交易形式的功能,当新的交易形式出现时,系统也能进行验证,增加了系统的适应性。详见第四章中的多重签名。

3.13 矿机和矿池

从此以后,桃源村的交易都会在每周五顺利举行。为了获得奖励,有些人经常往中本聪家跑,向他请教数学知识,提高自己的解题能力。还有一些人组成一个团体,达成协议一起解题来提高自己的竞争力,然后按贡献分配奖金。也有一些人放弃了解题,只参与交易和记账。

比特币解题实质是不断计算满足条件的哈希值(详见第六章工作量证明原理),速度越快获胜的几率就越高,所以涌现出性能更强大的专门为哈希运算而设计的“矿机”。还有一些“矿工”组成队伍,将所有人的计算设备集中起来获得更大的算力,“挖出”区块后根据每个人的贡献进行分红,这种团体被称为“矿池”。“矿池”过大时存在一定风险,就像张三扩大他的队伍一样。

4、遗留的问题

之前故事中,仍然有如下四个问题并没有给予解答。
1、区块链(账本)是公开透明的,张三查看账本,得知李四账户余额多,可能会见财起意,要如何才能做到隐藏用户身份。
2、在创建交易时,输入中需要提供交易创建者的签名。如果签名可以被伪造,则意味着所有人的UTXO都存在被盗用的风险。想象张三是一个书法家,很会模仿他人的签名。于是张三用李四的UTXO创建一笔交易,并伪造李四的签名传递出去,由于李四的UTXO是真实存在的,只要张三将签名模仿得以假乱真,这笔交易就会被其他节点当作有效交易存放至自己的交易池中(需要注意的是,如果是现实场景,不需要考虑故事场景中李四如果在场,可能会发现张三的作弊行为),最终将被写进区块链得到确认。因此,区块链技术中必须有防止“伪造签名”的有效途径。
3、还有一种情况,在同一轮竞赛中,有两个或者更多的节点几乎同时找到解题答案,又应该以谁创建的区块为准?故事场景中可能会比较好解决。但在真实场景中,“矿工”同时广播自己的有效区块,到底哪个区块会被写进区块链?
4、如果李四是一个天才,每次解题都是第一个得到答案,这意味着所有的区块都由李四产生。此时的区块链系统将会退化成类“中心化”的区块链系统?是否有存在的价值?
第一、二个问题实际是加密问题,在本书第三章会讨论到。第三个问题是区块链偶然分叉的问题,由于共识机制的缺陷,导致全网区块链数据可能会存在短暂的不一致,最终如何发展将会在第六章中详细介绍。第四个问题参考第五章区块链的分类。
区块链中的专业术语很多,由于故事本身的缺陷,并不是没个概念都解释到,比如“地址”、“加密”、“钱包”、“哈希值”、“链式连接”、“完整节点”、“SPV验证”、“脚本”、“智能合约”、“软分叉”、“硬分叉”等等,这些在后续的章节中我们会逐一讨论。
经过本章节的学习,相信读者已经初步掌握了区块链的工作原理,带着知识和问题,让我们继续新章节的阅读。

5、总结

以上就是《从零开始自己动手写区块链》一书中对区块链原理和相关术语的介绍。是不是很容易搞懂?
故事中的区块链系统实质就是一个记账系统,与微信、支付宝等记账系统不同的是,他是没有中心服务器的,他通过代码建立了一种中介信任。因为传统的交易系统是以用户信任微信、阿里为前提的。
除了原理部分外,该书从底层揭示区块链技术,同样通俗易懂,深入浅出。同时,作者也为该书专门写了配套学习程序,github开源地址为:
[1]: https://github.com/YaoyaoBae/simchain
并附上京东和当当销售链接。
[2]: https://item.jd.com/12456395.html
[3]:http://product.dangdang.com/25580666.html

小学生都能读懂的区块链原理和术语介绍(故事图文)-引自《从零开始自己动手写区块链》相关推荐

  1. 小学生都能读懂的网络协议之:WebSocket

    文章目录 简介 webSocket vs HTTP HTTP upgrade header websocket的优点 webScoket的应用 websocket的握手流程 WebSocket API ...

  2. 小学生都能看懂,彻底解决环境搭建难题,一步一截图,再无VMware网络难题

    小学生都能看懂,彻底解决环境搭建难题,一步一截图,再无VMware网络难题 原创 韦东山 百问科技 1周前 上周四我们预告了这周要发布环境搭建的终极解决方案,经过一周的努力,终于写好了文档,Ubunt ...

  3. 《小学生都能看懂的快速沃尔什变换从入门到升天教程》(FWT / FMT / FMI)(最最严谨清晰的证明!零基础也能得学会!)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 0x00 卷积 0x01 多项式 0x02 卷积的定义 0x03 卷积的基本性质 0x04 位运 ...

  4. 小学生都能看懂的FFT!!!

    小学生都能看懂的FFT!!! 前言 在创新实践中心偷偷看了一天FFT资料后,我终于看懂了一点.为了给大家提供一份简单易懂的学习资料,同时也方便自己以后复习,我决定动手写这份学习笔记. 食用指南: 本篇 ...

  5. 人人都能读懂的react源码解析(大厂高薪必备)

    人人都能读懂的react源码解析(大厂高薪必备) 1.开篇(听说你还在艰难的啃react源码) ​ 本教程目标是打造一门严谨(严格遵循react17核心思想).通俗易懂(提供大量流程图解,结合demo ...

  6. 《小学生都能看懂的生成函数从入门到升天教程》《生成函数全家桶》

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 小学生都能看懂系列 目录 0x00 生成函数 0x10 例题引入 0x11 ExampleA\tt E ...

  7. 《小学生都能看懂的三类斯特林数从入门到升天教程 》(含性质完整证明、斯特林反演、拉赫数)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 真的特别简单,我尽量讲的详细一些,本文包含了几乎所有性质定理证明,老少皆宜 ~ 内容过多,质量过硬,建 ...

  8. 《小学生都能看懂的群论从入门到升天教程》 《群论全家桶》

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 小学生都能看懂系列,小学生:我太难了   群论.置换.Bunrnside引理.Pόlya定理等概念是群 ...

  9. 一文读懂视频编解码原理[通俗易懂]

    一文读懂视频编解码原理[通俗易懂] 引子 谈到视频的编解码,我们会自然地想到H.264.HEVC/H.265这些权威的视频编解码标准:谈到标准,有人觉得这个是有专门机构去研究的,我们关心应用就好:即使 ...

最新文章

  1. 搭建nginx服务器及文件的配置
  2. 解决spring-security session超时 Ajax 请求没有重定向的问题
  3. “云时代架构”经典文章阅读感想十二
  4. 软件开发依据的标准或法律法规_第178篇丨直真科技:官宣!定制软件开发不应该采用完工百分比法确认收入...
  5. 易语言单窗口单ip软件源码_好人多窗口同步器:多台电脑同步视频演示
  6. 【面试招聘】 美团提前批通关之旅
  7. 新疆克拉玛依有没有考计算机一级的,新疆维吾尔自治区克拉玛依2018年3月计算机等级考试公告...
  8. 第一、三、四届(2010、2012、2013)山东省ACM
  9. Windows Server 2008 R2更新永恒之蓝 补丁包方法
  10. Keysight WIFI6测试培训笔记
  11. 软件人员kpi制定模板_员工绩效考核制度模板(餐厅绩效考核方案制定)
  12. 《批处理:节省时间,减轻压力的20个小技巧》读书笔记(其实是一篇文章)
  13. 学生php作业,作业作业作业作业作业
  14. 公司服务器架设邮箱服务器,如何搭建企业邮箱服务器
  15. 颠覆麦肯锡、BCG,这家公司的AI商业决策系统能做到吗?
  16. SA(需求分析师)笔试题目整理
  17. PyTorch+PyG实现图神经网络经典模型目录
  18. PMP考试关键词(二)
  19. nc报销系统用的什么java_财务NC系统是什么?
  20. Ci2451无线MCU芯片2.4GHz射频芯片集成8位RISC内核集成无线收发器和8位RISC(精简指令集)MCU的SOC芯片

热门文章

  1. 谷歌浏览器 打开网页出现 out of memory
  2. 一种基于模板匹配的图像配准方法
  3. 学习沐神课程 自用深度学习笔记05 线性回归基础优化算法
  4. 杰奇python采集器_极速杰奇采集器
  5. 百度被黑事件,成互联网最热话题
  6. 基于区块链的价值交易和管理系统
  7. python 统计哈姆雷特词汇频率
  8. BGP服务器是什么,BGP服务器跟三线服务器有什么区别
  9. 下周上市公司重大事项
  10. FANUC机器人启动方式RSR和PNS的区别