3. 区块链的数据结构
这里指出一个普遍存在的误区,区块链技术并不是单一的技术,也并不是一个新兴的技术,而是一系列技术的组合应用,应当以系统性和工程性思维去看待,它可以作为一个基础设施和平台,类似于云计算、物联网等技术。
区块链技术是由许多关键性基础技术融合应用而成,包括P2P动态组网、基于密码学的共享账本、共识机制(在分布式场景下多节点如何达成一致性的问题)、智能合约等技术。这些技术早在区块链提出之前就已被广泛应用,只不过中本聪巧妙地将这些技术组合在一起,并引入激励机制,用经济学原理解决了很多传统技术无法解决的问题,这就是区块链技术的本质。
在前面,我们从整体上了解了区块链技术,下面我们将进入到区块链本身,从其结构的角度看一看区块到底是什么。
3.1 区块
之前提到,区块链就是由存储交易数据的区块组成的链。每个区块一般包含区块头(Header)和区块体(Body)两部分,如图3.1-1所示。
3.2 挖矿
区块通过挖矿生成。
挖矿就是计算出一个随机数,把上个区块的哈希值加上10分钟内的全部交易打包,再加上这个随机数,算出一个256位的字符串哈希值,输入的随机数Nonce使哈希值满足一定条件就获得这个区块的交易记账权,而计算这个随机数的方法就是穷举。
前一个区块Hash值 + 10分钟内全部交易 + 随机数Nonce = 256位字符串哈希值【使哈希值满足一定条件】
新产生的区块会立即广播出去,以便其他节点对其进行验证。
验证依靠每个区块存着的上一个区块的哈希值,不断追溯到源头。经过验证后,才最终能获得区块的交易记账权。
比特币系统会让挖矿的矿工竞争记账权(在主链上链接区块的权利),这个竞争机制就是工作量证明机制。挖矿需要付出大量的能源和时间,谁付出的工作量多就能以更大的概率获得一个区块的记账权。
获得记账权的矿工会将当前区块链接到前一个区块,形成最新的区块主链,之后该矿工也会得到系统奖励一定数量的比特币。
所有的区块连接在一起,形成区块链的主链,从创始区块到当前区块,在区块链之上的所有数据历史都可以比追溯和查询。
3.3 区块链的链接模型
我们说区块链就是由一个个存储数据的区块组成的链。链指的是由各个具有时间戳的块相互关联,相互链接,成为一条不间断且顺序唯一的链式结构。前面我们提到了区块的数据结构,每个区块分为区块头和区块体(含交易数据)两个部分。区块头包括用来实现区块链接的前一区块的哈希(PrevHash)值(又称散列值)和用于计算挖矿难度的随机数(Nonce)。前一区块的哈希值实际是上一个区块头部的哈希值,而计算随机数规则决定了哪个矿工可以获得记录区块的权力。区块链的链接模型如图3.3-1所示。
图3.3-1 区块链链接模型
3.4 UTXO交易模式:基于交易的记账方式
UTXO(Unspent Transaction Outputs)是未花费的交易输出。
除创始区块(区块链中的第一个生成的区块)外,所有的区块中的交易(Tx)都有若干个输入(Tx_in,也称为资金来源,通俗理解成获得的钱)和若干个输出(Tx_out,也称资金去向,也就是花出的钱)。
传统货币的记账方式是基于账户的记账方式:使用账户余额系统,首先需要一个数据库,记录所有人的余额。这里假设全世界使用比特币的用户有10亿人,每个人每天交易10次,那么平均每秒余额变动将达11万次,如果按照这个频次继续下去,用不了多久相关数据就会撑爆线上的服务器。
而比特币中的UTXO是未花费的交易输出,一种基于交易的记账方式,账本记录的是你和对方的地址。账户里没有余额的概念,只有交易的概念。
UTXO是交易的基本单位,不能被分割。举个例子,你有三个UTXO,分别是1,2,5个比特币,现在你要花费4个比特币买一束花,那么交易的过程是:先花费5个比特币,然后再收到一个1个比特币的UTXO。因为UTXO没办法掰开来花,只能全部花出去,然后系统再给你找零。