<audio id="audio" title="第2讲 | 区块链到底是怎么运行的？" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/c8/06/c8ce24920b5f462b3ff6bea5d91b6706.mp3"></audio>

上一次，我们聊到了区块链的概念及整个行业的发展过程，今天我想稍微深入一下，尽可能通俗地介绍一下：区块链到底是如何运行的？

 这一篇文章我将以比特币区块链为例来进行讲解，理由有两个：

1. 由于区块链发展到目前阶段，各个技术方向都有长足的发展，那么为了方便你理解，我在这里介绍最简单、最容易理解的比特币区块链；
1. 由于大部分区块链都是以比特币区块链为基础进行扩充的，所以首先了解比特币区块链有助于其他项目区块链的后续学习。

## 中心化记账的问题

首先，我们借鉴了一个区块链描述中的经典情景来模拟中心化记账。

假设有一个有百户居民的村子，其中有一位德高望重的村长，村长有一个儿子。村民们都把钱存到村长家，村长负责记账。比如，张三用1000买了李四家的牛，村长就把张三名下的存款减去1000，李四家加上1000。听起来是不是很像银行的操作？

对，我们就是先从中心化的银行记账开始聊起。村民都相信村长，才愿意把钱存到村长家，他们相信村长不会作恶。

可惜好景不长，老村长由于操劳过度，驾鹤西去了。新上任的村长儿子铁蛋很是聪明，但也有个毛病，就是粗心大意。他不但经常算错账，一次还被人偷改了账单。

不过，幸好村民自己都有记账，但是由于铁蛋每次错账后都要和别人核对半天，导致村民对新村长的记账能力十分不满。

时间就这么过着，然而最可怕的事情还是发生了，铁蛋的老婆竟然私下篡改账本，给铁蛋七大姑八大姨的余额全部偷偷加了好多，终于有一天事情暴露，村民们气冲冲地跑到铁蛋家里讨说法，于是一片混乱。

这时候有个叫中本聪的人站了出来，他说他设计了一套系统，可以不依赖任何人记账，于是，众人开始将目光集中到他的身上。

### **1. 公开记账**

中本聪说他的系统稍微麻烦一点，需要干三件事儿。

1. 每家每户都派发一只信鸽。这就是 P2P网络，是一个点对点的分布式网络，如果不好理解，你先不用理会，我会在后面讲到。
1. 每家每户都发一个特殊的印章和一个扫描器。这个扫描器有两个功效，一是识别他人的交易是否真实有效，二是识别这个交易是不是自己账号的，同时识别并解锁未花费的余额。这就是非对称加密。
1. 每家每户可以参与记账，不过不再记余额，而是记交易本身的内容。这就是区块链中的交易，这个“交易”对应的英文单词是“Transaction”，这是个专有名词，专指一笔账，不同于金融交易的Trade。

这三条总体来说其实是干一件事情，就是：

**每家每户都记账，账簿上不再记载每户村民的余额，而只记载每一笔Transaction，即记载每一笔交易的付款人、收款人和付款金额。**

那么问题就来了：如果每户都记账，肯定每户的账都不统一啊，你记你的，我记我的，最后不全乱了么？

这个时候需要大家统一账本，保证大家的账本都是一致的。因为记录的交易是全村所有人有序产生的，所以这就需要有一个广播机制。这个广播机制，我先卖个关子，后面再讲。

中本聪说，其实很简单，我们现在先把全村所有人的资产都加起来。还真巧了，刚好100万。

中本聪接着说：“只要账簿的初始状态确定，并且每一笔交易可靠并按照物理时间自然记录，并且只加不改不删，这样，当前每户持有多少资产是可以推算出来的。”

中本聪说我现在把我的印章给你们看，这个印章很特殊，盖的章有两块标记，第一块是一个可以识别的标记，比如我往纸上一敲，可识别的标记是1MsTg2。

这就是你们的代号，由于我们账本是公开的，使用真实姓名会很危险，所以你们记账的交易单上收款人、付款人都填这个码，不用写姓名。你的扫描器和你的印章生成的代号是关联的，有且仅有持有对应扫描器的人才能花费金额，这一步即为“解开交易”。

刚刚说印章有两块，这第二块内容配合这个扫描器才能看，肉眼看则都是乱码，扫描器一扫就知道第二块内容是否有效，这一步也就是“交易验证”。

并且所有交易大家都能接收，都能看到，但却解不开印章乱码部分的内容，仅仅收款方才能解开，因为你的扫描器和你印章生成的代号是关联的，有且仅有持有对应扫描器的人才能解开交易。

以上就是区块链中“公开记账”的过程。“公开记账”就是全网所有人都可以随时查看一套账本，然后按照规则透明公开地进行记账。

### **2. 创建创世区块**

创世区块是我们生成全村公开账本的第一笔交易的第一个信封，好比一篇文章总得有个开头一样。

于是乎，中本聪说我先生成第一个Transaction，这个交易单的付款人为空，收款人是村长，付款金额是100万，因为是创世区块，产出多少个是可以随意规定的，由于我们上面统计了全村的账目情况，所以我就写了100万，待会儿付款给村长以后，我们可以按照原来的账本给大家发送对应的金额过去。

好了，我们有了第一笔交易，第一个信封也已经做好了。现在让村长把信封传给张三，张三复印一份，然后传给李四，李四继续传下去，一传十，十传百，直到传给全村人，这个步骤也就是“同步区块”，也就是全网都拿到这个信封，以及信封里面的Transaction。

### **3. 交易**

由于上一节我们的创世区块把100万交给了村长，那么我们假设张三在村长那里的存款余额是10万，这时候村长要根据原来的旧账本，把这10万发送给张三，然后把旧账本上的账划掉。下面我们讨论一下如何构造这笔交易。

中本聪开始教村长写交易单，把100万分成两部分，第一部分10万，收款人是张三；第二部分是90万，收款人是自己；这样一个Transaction就做成啦。

前面我们说了，不能直接写名字，要写代号，这个代号也就是你的钱包地址，我们需要把收款人写名字的地方，让收款人拿出自己印章，把代号读出来，然后告诉村长即可。

100万  　10万，张三
      <br>　　　　      90万，自己

村长写好 Transaction 以后，还需要拿出自己的印章，在Transaction上盖章，这个盖章的过程也就相当于区块链中的签名。这个章，全村人都可以拿扫描器扫一下验证是否有效，即验证付款人的章是否有效。

100万  　10万，张三的印章（1s25vR）
 <br />   　　　　 90万，村长的印章（13gYip）

就这样，村长一共写了10份Transaction，分别代表了发送给不同人的交易，张三一笔10万，李四一笔1万，等等。

### **4. 打包 Transaction （挖矿）**

现在我们有了Transaction，但是还需要东西把Transaction装起来，我们用一个特殊的信封把Transaction装起来，这个信封就是区块链中的“区块”，这个封装过程就是“打包交易”。

为什么要封装起来呢？是为了让打包交易的人能够在信封上署名，表示这次打包是由某某某打包的，其次全村的交易可能非常多，需要装配标号，方便大家查询。

我们看到上述的Transaction虽然已经生成，但是有个问题，就是没有规定谁有权利把Transaction封装到信封里。

我们在开篇的故事中看到了中心化操作肯定是不行的，假设在全村人中，这时候如何筛选出这些打包的人呢？

中本聪这时候说了，由于我们村的人口增长，100万未来可能不够，我们暂定150万，那多余的50万，我们就当奖励给这些装信封的人了，当然不能一次性给，谁装一次信封就领3个币。

这时候大家伙儿来劲了呀，只要装信封就能够领钱了，我们在这里把符合条件的人称作“矿工”。

但是中本聪又说了，要获得这个装信封的权利，是有条件的。我给大家出一个难题，谁先解出这个难题的答案，谁就有权利把Transaction装到一个信封中，并且要在此信封上盖上自己的章。

这个难题是这样的，它有两大特性，第一是容易验证，第二是计算过程非常复杂。

例如，有种棋牌类游戏叫作“24点”，玩法就是给出任意4个整数，通过整数运算得到24，比如现在给出2、9、1、5四个数，答案是（5-2）*（9-1）= 24。当然，本处仅是举例，“24点”游戏的答案空间非常小，是远远不够生成信封的。

答案非常好验证，但是计算过程是一个尝试的过程，需要耗费大量的精力。而在真实的比特币中，采用的是寻找符合条件的目标哈希，这也就是比特币矿工所做的事情。

好了，这时候大家开始计算给出的难题，刚好李四第一个计算出来，那么这次装信封的操作就由李四完成，李四把10份Transaction装到信封中，也就是打包Transaction，并且要在信封背面写上一个信封的摘要信息。

比如上一个信封中的第一个交易是什么、信封封面长什么样，最后要在信封上盖上章，也就是“签名”，矿工签名的目的是为了领币，也就是 Coinbase 交易。

以上过程在区块链领域称作“打包 Transaction”，也就是大名鼎鼎的“挖矿”。

### **5. 广播交易**

来说说上文提到的广播交易，广播是为了让全村人知道当前时刻你产生了一笔Transaction，或者是你装好了一个信封。

广播的内容分两种，一种是广播Transaction，一种是广播信封。第一种广播是意味着还有未被打包的Transaction，而第二种广播信封则意味着这个Transaction已经被某个矿工确认。

收到了广播的通知后，大家先验证信封上难题的答案是否正确，这样便可以验证出信封是否被伪造，接着验里面的每笔交易，最后还要验证信封背面的内容，即上一个信封的摘要是否正确。因为上一个信封大家都已经确认，所以这样可以极大地规避作弊的可能。如果觉得没问题，就可以存入本地数据库中了。

至此，全村人的记账问题就差不多解决啦。

## 总结

今天我用非常浅显的例子与你聊了比特币区块链，其中包括区块链中公开记账、创建创世区块、交易、打包Transaction、广播交易的几个步骤。

因为篇幅所限，在表述上可能会有不精确的部分，但是大体意思是相通的，相信读完文本，你已经对区块链的原理有了一个大致的了解。

你也可以针对每个模块进行扩展，比方更换矿工的计算方法，可以推导出PoS共识机制，不知道你还能想到哪些扩展呢？欢迎留言探讨。

感谢你的收听，我们下次再见。

本文叙述模式参考链接：
<br>
[http://www.8btc.com/bitcoin-story?_t=1520884553](http://www.8btc.com/bitcoin-story?_t=1520884553)


