区块链 + 大数据:EOS存储 (3)

链式存储,存储的是固定结构的数据:Block=> Block Header/ transactions=>actions,一个action的结构例子:

{ "account": "eosiotesta1", "name": "hi", "authorization": [{ "actor": "eosiotesta1", "permission": "active" }], "data": { "user": "yeah" }, "hex_data": "0000000000d08cf2" }

这个例子中,我们调用了hello合约的hi函数,data传入的格式是hi函数中自定义的,所以在链式存储中,留给我们发挥的空间也即在此。

StateDB,存储的是一个最终要记录的状态,这个状态数据必须是有意义的,是有人关心的,无关紧要的数据请不要放在StateDB中去,所以StateDB是可以增删改查的,就像一个普通数据库那样,在合约中通过multi_index来操作,具体请参照文章EOS技术研究:合约与数据库交互

很多人搞不明白为什么区块链不可篡改,却在StateDB中好像可以修改还能删除?

其实不是这样的,链式存储的内容会将所有的动作action全部记录下来,是所有的过程数据,是流水帐,元数据,这些数据一旦上链是不可修改,不可删除的。而StateDB只是为了保存一个状态信息,这个状态信息的修改与删除并不影响区块链的不可篡改的特性。

==目前StateDB的主流实现方式是将它放在内存中,而当有些人对StateDB的认识有偏差造成滥用的时候,会引发内存过载,因此一方面我们要非常清楚的理解StateDB的含义,一方面EOSIO帮助我们提供了一个mongodb-plugin插件来同步StateDB数据。==

mongodb 安装

下载tgz安装包

解压安装到/usr/local/bin(或者其他某路径)

sudo mkdir /data/db

普通模式

sudo mongod

mongo

服务模式

我们也可以使用ubuntu系统的服务模式。

曾经我们要定义一个系统启动时自启动服务的方式是在/etc/init.d 目录下写一个脚本来执行,现在在ubuntu的服务模式下,我们可以丢弃那种方式,服务模式的命令是service,而现在的ubuntu系统推崇使用的systemctl命令,他俩的使用方法的区别就在于参数的顺序。

定义一个配置文件mongod.conf

定义一个服务文件,放置在/etc/systemd/system/

sudo vi /etc/systemd/system/mongodb.service

[Unit] Description=High-performance, schema-free document-oriented database After=network.target [Service] User=mongodb ExecStart=['mongod' command location] --quiet --config /etc/mongod.conf [Install] WantedBy=multi-user.target

查找服务状态

systemctl list-unit-files

查询mongodb服务的激活状态

systemctl is-enabled mongodb

激活系统自启动服务

sudo systemctl enable mongodb

启动mongodb服务

sudo systemctl start mongodb

查询mongodb服务状态

sudo systemctl status mongodb

停止mongodb服务

sudo systemctl stop mongodb

调试模式

IDE选择CLion,EOS源码下载最新的,保证本地可以使用脚本编译通过,安装了相关依赖包,然后在CLion中导入EOS,CLion会自动识别CMakeList.txt文件生成makefile文件并make编译执行。编译时可能会遇到错误,一般来讲要么是环境依赖没有配置好,要么就是CMakeList.txt要有修改,例如mongodb-plugin导入时要在总开关配置上开启。

set(BUILD_MONGO_DB_PLUGIN "true")

全部编译成功以后,会自动识别出可以debug的target,与EOS中配备CMakeList.txt的模块一一对应。

安装Mongo Explorer插件

上面我们介绍了MongoDB的安装方法,以及启动nodeos时的配置方法(除了上文提到的总开关,当然要在config.ini文件末尾设置上plugin = eosio::mongo_db_plugin,这部分内容演练多次,这里不再赘述。)链启动开始出块以后,会同步到mongodb中去(注意要预先启动mongod守护进程,可以理解为服务端),通过mongo命令接入可使用mongo命令查询数据,但这样很不方便。可以在CLion中安装mongo-plugin,配置好效果如下:

image

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygxyf.html