【干货】各区块链底层数据存储分析(一)

来源:互联网 发布:留学中介 知乎 编辑:程序博客网 时间:2024/06/07 02:03

互联网的中心化发展模式是传统网络安全的的软肋,区块链作为一种去中心化、集体维护、不可篡改的新兴技术,是对互联网底层架构的革新,是对当今生产力和生产关系的变革。区块链也被誉为是继蒸汽机、电力、信息和互联网科技之后,目前最有潜力触发第五轮颠覆性革命浪潮的核心技术。


目前市场上主流的区块链系统有比特币,Ripple,以太坊和 Hyperledger Fabric 。本文的主要目的就是分析当前主要流行的区块链的存储技术以及他们之间的不同。

区块链简介

区块链(英语:blockchain  block chain)是用分布式数据库识别、传播和记载信息的智能化对等网络也称为价值互联网。中本聪于2008年在《比特币白皮书》中提出“区块链”概念,并在2009年创立了比特币社会网络,开发出第一个区块,即“创世区块”。区块链包含一张被称为区块的列表,有着持续增长并且排列整齐的记录。每个区块都包含一个时间戳和一个与前一区块的链接,这样设计区块链使得数据不可篡改,一旦记录下来,在一个区块中的数据将不可逆。


其数据结构大致如下:

区块链结构

数据存储1比特币

比特币(英语:Bitcoin)是一种去中心化、全球通用、不需第三方机构或个人,基于区块链作为支付技术的电子加密货币。它由中本聪于2009年1月3日,基于无国界的对等网络,用共识主动性开源软件发明创立,是加密货币及区块链的始祖,也是目前知名度与市场总值最高的加密货币。


比特币存储系统由普通文件和 kv 数据库(levelDB)组成。普通文件用于存储区块链数据,kv 数据库用于存储区块链元数据。


用于存储区块链数据的普通文件以 blk00000.dat , blk00001.dat 文件名格式组成,如图2所示,其中 index 目录存储用于存储区块元数据。

(图2)

为了快速检索区块数据每个文件的大小是128 M Bytes。每个区块的数据(区块头和区块里的所有交易)都会序列成字节码的形式写入 dat 文件中。


在序列化的过程中,如果检测到当前写入文件尺寸加上区块尺寸大于 128 M Bytes,则会重新生成一个 dat 文件。具体的序列化过程如下所述:

•获取当前 dat 文件大小 npos,并将区块大小追加写入至 dat 文件中

序列化区块数据和区块中的交易数据,并将序列化的数据追加至 dat 文件中。

 在写入数据的过程中,会生成区块和交易相关的元数据。


区块的元数据格式如 <blockHash,xxxxx+npos> 格式, 其中 xxxxx 为 dat 文件序号,npos 为区块写入 dat 文件的起始位置。


 交易的元数据格式如 <txHash, xxxxx+npos+nTxOffset> 格式, 其中 xxxxx、npos 和上面的描述一致,nTxOffset 为写入 dat 文件的起始位置(基于npos 位置)。


上述所有元数据都将写入 kv 数据库中,其中 blockhash/txHash 将作为后续查询具体数据在 dat 文件中的索引使用。


综上所述,在获取链数据的时候只需传入区哈希或是交易哈希,就能很容易的定位到区块数据或是交易数据。

2瑞波币

Ripple 是世界上第一个开放的支付网络,通过这个支付网络可以转账任意一种货币,包括美元、欧元、人民币、日元或者比特币,简便易行快捷,交易确认在几秒以内完成,交易费用几乎是零,没有所谓的跨行异地以及跨国支付费用。


Ripple 的区块链数据存储系统是由关系型数据库(sqlite)和 kv 数据库组成,其中关系型数据库用来存储区块头信息和每笔交易的具体信息, kv 数据库主要存储区块头、交易和状态表序列化后的数据。 Ripple 这样处理的主要目的是单纯在查询区块头信息和具体每笔交易的时候,可以直接从关系型数据库中查找;而要构造整个区块数据的时候,除了从关系型数据库构造区块头信息外,还要依据区块头里的交易根哈希和状态表根哈希从 kv 数据库中获取具体的交易和状态表信息。这是 Ripple 和其他三种类型区块链系统唯一最大的不同。


区块头信息的序列化具体步骤:

用区块的哈希作为 Key;

序列化区块高度、区块哈希、前一个区块哈希、交易根哈希、状态表根哈希等生成的数据作为 value;

将 <key, value> 存储至 kv 数据库中。

交易的序列化具体步骤:

用区块头中的交易根哈希作为 Key;

序列化交易哈希、交易类型、交易数据和 MetaData 等生成的数据作为 value;

将 <Key, value> 存储至 kv 数据库中。


下表分别是 Ledgers Transactions 表结构。

列名

类型

含义

LedgerHash

CHARACTER

哈希值

LedgerSeq

BIGINT UNSIGNED

Ledger 序号

PrevHash

CHARACTER

前个 Ledger 的 Hash 值

TotalCoins

BIGINT UNSIGNED

当前网络上的 XR P总数(交易会销毁 XRP )

ClosingTime

BIGINT UNSIGNED

关闭时间

PrevClosingTime

BIGINT UNSIGNED

前一个区块的关闭时间

CloseTimeRes

BIGINT UNSIGNED

ledger 关闭时间的解决方案(2-120 S)

CloseFlags

BIGINT UNSIGNED

标识 ledger 的关闭方式,一般都是0

AccountSetHash

CHARACTER

stateMap 根结点 hash

TransSetHash

CHARACTER

txMap 根节点哈希

(表1:Ledgers


列名

类型

含义

TransID

CHARACTER

交易 hash

TransType

CHARACTER

交易类型

FromAcct

CHARACTER

交易的发起账户

FromSeq

BIGINT UNSIGNED

交易在账户中的序号

LedgerSeq

BIGINT UNSIGNED

交易落在哪个区块上

Status

CHARACTER

交易的状态 V 表示“共识过”

RawTxn

BLOB

交易序列化数据

TxnMeta

BLOB

交易 metaData 的序列化数据

(表2:Transactions

未完待续......

原创粉丝点击