【干货】各区块链底层数据存储分析(一)
来源:互联网 发布:留学中介 知乎 编辑:程序博客网 时间: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)
未完待续......
- 【干货】各区块链底层数据存储分析(一)
- 各区块链底层数据存储分析(二)
- 各区块链架构的横向比较
- 各区块链架构的横向比较
- M1卡修改各区块控制位值和数据
- Oracle逻辑存储结构---(一) 数据块
- Neo4j底层存储分析
- JDK容器学习之LinkedHashMap(一):底层存储结构分析
- JDK源码学习之HashMap (一) : 底层存储结构分析
- 数据的底层存储
- Hadoop源码分析笔记(九):数据节点--数据块存储
- 深入浅出从底层分析 Redis client/server交互流程(干货)
- Shark源码分析(一):数据的存储(1)
- Shark源码分析(一):数据的存储(2)
- zico源代码分析(一) 数据接收和存储部分
- 数据存储(一)
- 数据存储(一)
- HDFS源码分析数据块复制监控线程ReplicationMonitor(一)
- java保留2位小数
- servlet返回数据的方法
- 理解本真的REST架构风格
- app 打包
- 2017,最受欢迎的 15 大 Python 库有哪些?
- 【干货】各区块链底层数据存储分析(一)
- offsetof宏定义分析
- java线程池1-线程池,ThreadPoolExecutor类详解
- 【编译原理】中间代码(二)
- IDEA破解和简单用法(通用)
- Eclipse WTP 插件发布到tomcat时,没有 Maven 依赖项的解决
- rsync限速
- 数据挖掘的相关知识例子
- C#中try catch finally 用法