在回答这个问题之前,首先要理清“区块链数据”和“链上数据”的概念。
区块链数据
“区块链数据”广义上包括区块链的区块数据和区块链的状态数据:
区块数据记录了区块链上发生的每一笔交易,譬如小明给小王转账了50元、小王充值了20元等类似这样的交易数据;
状态数据记录了区块链上每个账户或智能合约的当前状态,比如小明当前的余额是50元、小王当前的余额是100元。
无论区块数据还是状态数据,它们都是由区块链节点使用和存储的。区块链节点是一个程序,运行在我们的个人电脑、虚拟机或服务器上。多个分布在不同电脑或服务器上的区块链节点,通过网络互相连接,组成了完整的区块链网络。
区块链节点通常会把区块链数据存储在个人电脑、虚拟机或服务器上,存储区块链数据最常见的介质,就是磁盘。
区块链节点不会直接访问磁盘,它们会通过特定的数据库,如LevelDB、RocksDB或MySQL等单机或分布式数据库来操作数据。相比于直接操作磁盘,数据库抽象了特定的数据访问模型,对区块链节点更为友好。
因此,当我们说:“区块链数据保存在数据库”时,可以认为区块链节点将区块链数据保存在MySQL(或其它数据库),MySQL将区块链数据保存在磁盘。
数据库有独立式与嵌入式之分:
独立式数据库,如MySQL、Oracle是通常理解的数据库,独立式数据库作为独立的进程运行,需要单独部署和启停。独立式数据库可以与区块链节点部署在同一台服务器,或者部署在不同的服务器,还支持分布式、集群化的部署。无论何种部署方式,独立式数据库都是区块链节点的存储组件,隶属于区块链节点,与区块链网络无关。</