前言

 本教程面向初学者,仅仅是探讨区块链的入门知识。

 区块链起源于比特币,比特币是一种去中心化的货币。现如今,区块链从其中独立出来,成为去中心化的基础。区块链由一个个节点进行维护,不存在服务器与客户端,其网络部分基于P2P。

 区块链的节点分为 全节点轻节点,从名字上面能够看得出。全节点的功能比较全,具有挖矿、记账和交易的全部功能;轻节点比较轻量,具有交易等功能,但不能挖矿,也不能获取整个区块链的数据。想要获取区块链中的与该节点无关的数据,需要从全节点获取。知名区块链中,存在着诸多的全节点。 不要把全节点和轻节点理解成服务器和客户端。

区块链的网络

 区块链采用P2P的网络,并且使用洪泛法(flood)的方式进行数据传输。因此,在区块链上传输信息不要过大,否则会引起很大带宽的消耗。下面对于区块链的讨论过程中,不要纠结区块链各个节点数据传输的同步性,我们认为区块链更新时候,所有节点的数据都会同步好。区块链的同步性不是本文讨论的内容。

区块链是什么

 区块链是一种特殊的链表,有一个个区块组成,后续区块指向前区块,进而形成一条链,但是不要把区块链与普通链表混为一谈。区块链第一个区块称为创世块,中本聪挖到了比特币的创世块。

 每个区块分为 块头(block header)块体(block body) ,块体中保存着信息,信息的最小单位称为 交易 。这些交易的实现,并非只是简单记录谁转给谁多少钱,而是一些脚本代码。比特币的脚本代码称为 比特币脚本(bitcoin script),以太坊的脚本代码称为 智能合约,使用 Solidity 语言编写。比特币脚本不具有图灵完备性,智能合约是具有图灵完备性的。将一个区块写入区块链之前,需要有机器来将这些脚本代码执行一遍。并且脚本代码是原子性的,只能全部执行成功或者全部执行失败。

 上面对区块链的块体做了解释,区块链的块头包含哪些信息呢?区块链的块头包含一些区块链最基本的信息(如时间、版本等),除此之外,块头还有许多跟挖矿相关的信息以及与交易相关的信息,挖矿和交易将会在下面讲解。

 区块链保存在哪呢?区块链保存在每个全节点的硬盘中,轻节点则不会保存。每个全节点保存的区块链内容由该全节点决定,大多数全节点保存的内容就是整个区块链参与者公认的内容。这个就是区块链的共识。

挖矿

 现实生活中,挖矿就是一些矿老板雇佣了一些矿工或者一些个体矿工在矿场里通过机器或人力不断劳作,挖出矿石,以此来获取收益。在区块链中的挖矿,与之相类似。

 区块链挖出的矿称为 记账权。拥有记账权的全节点,会获得相应的报酬。这份报酬,则是凭空产生,而不是谁对该全节点进行转账。这种报酬机制是比特币以及以太坊的数量增加的唯一手段,比特币限定了这种报酬最大值为21,000,000个,以太坊则没有限制最大值。因此,比特币的总量是有上限的,而以太坊则没有,以太坊是会有适当的通货膨胀的。

 在此之前,我们依旧认为任何全节点都收到了所有的交易,仅仅是收到顺序不同。那么,任何全节点都可以记账,毕竟就是在全节点中对本地的区块链进行更新,也就是添加一个区块。任何全节点挖到这个区块后,会把这个区块通过区块链网络发送给其他所有的全节点,我们也认为这个发送的延时不会影响整个区块链的运行。在这个过程中,我们假设全节点A挖到了区块,其他节点凭什么认可它呢?毕竟挖到区块是有货币奖励的。

 在块头,有字段是限制挖矿难度的字段以及挖矿目标的字段。节点A会先将合法交易打包成一个或者若干个哈希值填入块头中,比特币的称为默克尔树(Merkle tree),以太坊的称为状态数,交易树和收据树。按照区块链起初设置的难度规则对块头的难度字段与目标字段进行设置,块头还有一个随机数字段,则节点A会随机生成一个数字填入这个随机数,之后再计算块头的哈希值,小于目标字段的话就代表这个块头符合要求,节点A会尝试一直更改随机数字段来促使块头符合要求。其他节点收到区块,会检验是否包含非法交易,检验块头是否符合要求。如果都通过,则代表该区块为合法区块,合法区块则会被大多数节点写入本地的区块链,表示该区块已经被挖出来。

 如果有少数节点不认可上述合法区块,但是大多数节点都是认可的,所以大多数节点会继续挖下一个区块,只有少数节点会继续挖当前区块。这会导致,大多数节点挖到区块的概率会大,少数节点挖到区块的概率小,所以慢慢地,大多数节点挖的区块链会越来越长。区块链越长,认可的人越多。这也是共识机制在起作用。

交易

 交易不是仅仅用付款人、收款人与转账金额描述,交易是由一个交易程序来描述。比特币时期,交易只有简单的用途,只能用来记录转账交易。到了以太坊时期,交易则采用图灵完备的编程语言描述,则交易可以复杂化。