链式存储,存储的是固定结构的数据: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,配置好效果如下: