简单来说,区块链是一个链式存储结构。学过数据结构的人们可能更为了解一些,顺序存储结构和链式存储结构是计算机中的两种存储方式:在顺序存储结构中,要求存储数据元素的物理地址是连续的,即划分一块连续的物理存储区域用于存放数据,相邻数据元素拥有相邻的物理地址;在链式存储结构中,不需要划分一整块物理存储区域,数据元素可以分别存储在不同位置,通过指针的形式将数据元素的位置进行标识,即在存储数据元素的同时,存储相邻数据元素的物理地址,可以根据物理地址找到下一个(或上一个)数据元素,这样就可以知道不同数据元素之间的逻辑关系。
在区块链中,区块就是链式存储结构中的数据元素,区块链由区块相互连接形成单向链式结构,其中第一个区块被称为创始区块。
首先,我们来介绍下什么是区块。每个区块的大小被规定不能超过1M,它的结构分为两部分,区块头和区块体。
区块头共80字节,分为6个部分:version,prevBlockHash,merkleRoot,time difficultyTarget,nonce。
version:大小为4字节,记录了区块头的版本号,用于跟踪软件/协议的更新;
prevBlockHash:大小为32字节 ,记录了该区块的上一个区块的Hash地址;
merkleRoot:大小为32字节,记录了该区块中交易的merkle树根的哈希值;
time:大小为 4字节,记录了该区块的创建时间戳;
difficultyTarget:大小为4字节,记录了该区块链工作量证明难度目标;
nonce:大小为4字节,记录了用于证明工作量的计算参数。
区块体的内容是该区块的交易信息,包括交易数量和交易数据。区块体共分为三部分:
numTransactionsBytes,numTransactions,transactions。
numTransactionsBytes:大小为1字节,记录了交易数量占用的字节数;
numTransactions:大小为0-8个字节,记录了区块内的交易数量;
transactions:大小不确定,记录了区块内存的多个交易数据。
在区块体部分中,numTransactions(记录区块内交易数量)是存储交易信息的重要字段,将numTransactions(记录区块内交易数量)部分使用压缩存储方式,这样可以大量的节约存储空间。numTransactionsBytes字段的存在是为了指出numTransactions在区块体中存在的部位,为读取交易数量而做准备,因此,应最先读取numTransactionsBytes字段值,并根据该字段值的不同做出如下规定:
如果numTransactionsBytes字段值小于253,则交易数量为numTransactionsBytes字段值作为;
如果numTransactionsBytes字段值等于253,则交易数量为numTransactionsBytes字段值之后的两个字节;
如果numTransactionsBytes字段值等于254,则交易数量为numTransactionsBytes字段值之后的4个字节;
否则,交易数量为numTransactionsBytes字段值之后的8个字节。
这就是区块链的数据层结构。
实际上,区块链系统共有六层结构,自底层开始分为:数据层、网络层、共识层、激励层、合约层和应用层组成。 其中,我们已重点介绍了数据层的结构,总体说来,数据层以区块为数据单元,存储了时间戳和与加密相关的各种数据和算法;网络层则是在数据层的基础上规定了区块链的分布式组网机制,数据的传播和验证方式在其中有了具体体现;共识层包含了各种共识类的算法,以网络节点为通信个体,规定了它们的共识协议;激励层将技术体系与经济体系相结合,体现了如何发行和分配经济激励;区块链系统具有编程特性,它的基础在于合约层中封装的智能合约等各种算法;区块链的应用则被封装在应用层中,同时介绍了各种案例。
总体说来,区块链数据模型,是一种去中心化的分布式数据库,该数据库在基于时间戳的基础上,形成单向链式的存储结构,同时,区块之间包含与前一区块的链接信息。区块链中的各个区块根据链接信息排列成一张列表,新的区块可以持续不断的增加至这张列表中来,形成排列整齐的记录。在这张列表中,有一个最重要的特点,一旦区块增加至这张列表,数据将不可更改。