
在回答這個問題之前,首先要理清“區塊鏈數據”和“鏈上數據”的概念。
“區塊鏈數據”廣義上包括區塊鏈的區塊數據和區塊鏈的狀態數據:
無論區塊數據還是狀態數據,它們都是由區塊鏈節點使用和存儲的。區塊鏈節點是一個程序,運行在我們的個人電腦、虛擬機或服務器上。多個分布在不同電腦或服務器上的區塊鏈節點,通過網絡互相連接,組成了完整的區塊鏈網絡。
區塊鏈節點通常會把區塊鏈數據存儲在個人電腦、虛擬機或服務器上,存儲區塊鏈數據最常見的介質,就是磁盤。
區塊鏈節點不會直接訪問磁盤,它們會通過特定的數據庫,如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,滿足不同的需求。
版權申明:本內容來自于互聯網,屬第三方匯集推薦平臺。本文的版權歸原作者所有,文章言論不代表鏈門戶的觀點,鏈門戶不承擔任何法律責任。如有侵權請聯系QQ:3341927519進行反饋。