低代码到底是不是行业毒瘤?一线大厂怎么做的?戳此了解>>> 了解详情
写点什么

区块链数据是存在链上还是数据库里?

2019 年 11 月 18 日

区块链数据是存在链上还是数据库里?

在回答这个问题之前,首先要理清“区块链数据”和“链上数据”的概念。


区块链数据

“区块链数据”广义上包括区块链的区块数据和区块链的状态数据


  • 区块数据记录了区块链上发生的每一笔交易,譬如小明给小王转账了 50 元、小王充值了 20 元等类似这样的交易数据;

  • 状态数据记录了区块链上每个账户或智能合约的当前状态,比如小明当前的余额是 50 元、小王当前的余额是 100 元。


无论区块数据还是状态数据,它们都是由区块链节点使用和存储的。区块链节点是一个程序,运行在我们的个人电脑、虚拟机或服务器上。多个分布在不同电脑或服务器上的区块链节点,通过网络互相连接,组成了完整的区块链网络。


区块链节点通常会把区块链数据存储在个人电脑、虚拟机或服务器上,存储区块链数据最常见的介质,就是磁盘。


区块链节点不会直接访问磁盘,它们会通过特定的数据库,如 LevelDB、RocksDB 或 MySQL 等单机或分布式数据库来操作数据。相比于直接操作磁盘,数据库抽象了特定的数据访问模型,对区块链节点更为友好。


因此,当我们说:“区块链数据保存在数据库”时,可以认为区块链节点将区块链数据保存在 MySQL(或其它数据库),MySQL 将区块链数据保存在磁盘。



数据库有独立式嵌入式之分:


  • 独立式数据库,如 MySQL、Oracle 是通常理解的数据库,独立式数据库作为独立的进程运行,需要单独部署和启停。独立式数据库可以与区块链节点部署在同一台服务器,或者部署在不同的服务器,还支持分布式、集群化的部署。无论何种部署方式,独立式数据库都是区块链节点的存储组件,隶属于区块链节点,与区块链网络无关。

  • 嵌入式数据库如 LevelDB、RocksDB,它们以动态依赖库或静态依赖库的方式,与区块链节点整合在同一个进程中,同时启停,用户不会明显感受到它们的存在。


链上数据

区块链数据的区块数据和状态数据并不是凭空产生的。区块数据中的交易,是由区块链的用户生成,用户把交易发送到区块链节点,区块链节点将多个交易打包进区块,区块会在区块链网络上广播和共识,区块链网络对区块达成共识后,认同区块中的交易,将交易的执行结果保存到状态数据中。


假设区块链原本的状态数据是:小明当前的余额是 50 元、小王当前的余额是 100 元,那么执行了“小明给小王转账了 50 元”的交易后,状态数据会发生变化,小明当前的余额会变为 0 元,小王当前的余额变为 150 元。


区块需要进行区块链共识,状态数据是通过执行区块中的交易生成的,这两类数据都直接或间接跟区块链共识有关系,可以将其称为“链上数据”。


那么,“链上数据”的明确定义,就是:链上数据是直接或间接由区块链共识产生的数据。


回到最初的问题


很显然,“链上数据”和“数据库”不是同一个层面的概念,“区块链数据是存在链上还是存在数据库?”这个问题不成立,区块链数据无论是存储在 LevelDB、RocksDB、MySQL 数据库或直接存储在磁盘,只要是直接或间接由区块链共识产生,都可以视为链上数据。


FISCO BCOS 的链上数据

FISCO BCOS 的区块链数据,默认是通过 RocksDB 保存在磁盘中。如果希望把数据保存到 MySQL 数据库,可以先自行部署一个 MySQL 数据库,然后修改区块链节点下的群组配置文件,群组配置文件通常位于区块链节点的配置目录下:conf/group.1.ini


[storage]           type=mysql           db_ip=127.0.0.1           db_port=3306           db_username=root           db_name=db_Group1_A           db_passwd=******
复制代码


其中:


  • type 为区块链节点的存储类型,配置为 mysql,表示使用 MySQL 来存储区块链数据;

  • db_ip 为 MySQL 数据库的 IP 地址,如果部署在本机,就是 127.0.0.1;

  • db_port 为 MySQL 数据库的端口,默认为 3306;

  • db_username 是 MySQL 数据库的登陆用户名;

  • db_name 是 MySQL 数据库中用于存储区块链数据的数据库名,无需先行创建;

  • db_passwd 是 MySQL 数据库的登陆密码。


其它未提及的配置项,可保留默认值不修改,完成这些信息的填写以后,确保数据库运行正常,然后重启区块链节点,区块链节点就会将区块链数据保存到 MySQL 数据库中。


FISCO BCOS 的区块链,无论是保存在 RocksDB 还是 MySQL 中,都可视为链上数据。


使用 MySQL,可以方便地查看链上数据的大小、结构等信息,如区块的大小、账户的大小等等。


总 结

FISCO BCOS 提供了灵活的数据存储机制,对于追求便利与性能的场景,可以使用默认的 RocksDB;对于偏重审计和治理的场景,可以使用 MySQL,满足不同的需求。


本文转载自 FISCO BCOS 开源社区


2019 年 11 月 18 日 21:441445

评论

发布
暂无评论
发现更多内容

去了解一下区块链

空城机

区块链 笔记 区块链发展

全球视野下的云上“夺旗赛”:京东云飞驰在产业赛道

脑极体

从一道美团春招笔试题目出发,揭开树DP的神秘面纱

面鲸

面试 数据结构与算法 笔试题

Three.js杂记(八)—— 文本几何体

空城机

前端 WebGL 3D渲染 3D可视化 three.js

如何减少加班导致的离职?

石云升

项目管理 28天写作 职场经验 管理经验 3月日更

Three.js杂记(五)——坐标轴、光源

空城机

前端 WebGL 3D渲染 3D可视化 three.js

工程方法事例实战

风翱

软件工程 3月日更

moviepy音视频剪辑:moviepy中的剪辑基类Clip的属性和方法详解

老猿Python

教你如何用霍夫变换完成扭曲车牌识别

程序媛观澜

机器学习 图像识别

js逐步教实现表单系统(html逻辑 css逻辑 js逻辑)

js逐步实现原生控制系统(html逻辑 css逻辑 js逻辑)

js

js逐步教你实现原生古诗匹配系统(html逻辑 css逻辑 js逻辑)

js

JS逐步教你做(自己版本)的视频播放器(html逻辑 css逻辑 js逻辑)

js

Three.js杂记(六)——3D模型

空城机

前端 WebGL 3D模型 3D可视化 three.js

真香!Github一夜爆火,阿里性能优化不传之秘终于开源

互联网架构师小马

Java 性能优化 JVM 性能调优 调优

Three.js杂记(十)——贴图

空城机

前端 WebGL 3D渲染 3D可视化 three.js

moviepy简介及安装

老猿Python

Python 编程语言 音视频 Moviepy PyQt

FastApi-01-初识

Python测试开发

Python Web FastApi

moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解

老猿Python

Python 编程语言 音视频 Moviepy

js逐步教实现音乐系统(html逻辑 css逻辑 js逻辑)

js

不吹不黑,这是我近年来见过的最全的面试题库了(Java岗)

Java王路飞

Java 程序员 架构 面试 分布式

12|PPT 教程|页面设计原则

青城

Three.js杂记(七)—— 全景效果制作·上(含python爬虫偷碎图,canvas重组图片)

空城机

前端 WebGL 3D渲染 3D可视化 three.js

go训练营毕业总结

伊灵

Three.js杂记(十一)—— 精灵与粒子(绘制中国地图)

空城机

前端 WebGL 3D渲染 3D可视化 three.js

js逐步实现原生flex系统(html逻辑 css逻辑 js逻辑)

js

域名和服务器的购买和配置

空城机

阿里云 轻量级服务器 云翼计划

h5逐步实现 <<canvas系统>>(html逻辑 css逻辑 js逻辑)

js

Three.js杂记(九)—— 练习:地球

空城机

前端 WebGL 3D可视化 three.js

DCGM:监控Kubernetes集群的GPU资源

DCOS

kubernetest

Three.js杂记(十一)—— 精灵与粒子(绘制中国地图)

空城机

前端 WebGL 3D渲染 3D可视化 three.js

2021 ThoughtWorks 技术雷达峰会

2021 ThoughtWorks 技术雷达峰会

区块链数据是存在链上还是数据库里?-InfoQ