EOS数据与MongoDB插件

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/w7849516230/article/details/83038535

EOS数据

EOS主网上线一百多天,区块数达到2100多万,已经远远超过仅有650多万块的以太坊;即使看交易(Transaction,以太坊和EOS含义不太相同)数量,两者也都达到了3亿的量级。从数据上看,EOS才几个月就已经走完了以太坊几年走过的路。链上数据量这么大,哪些是你需要的?使用何种方式获取?本文记录一些自己的理解和踩过的坑,而且随着数据量的不断增加,之前可行的方法,还需要不停变化。

数据的价值

随着菠菜类游戏DApp的爆发,十一之后,EOS上的日新增用户超过五千,踩着七千,八千往上爬,不过看趋势,这种持续性还不太确定。从dappradar上看,一半的应用是菠菜类的,单个应用24小时交易量也在几十万个EOS的级别,十一期间更是在百万个左右,月流水惊人啊。难怪越来越多的开发者进入,而数据就是个指南针,帮你辨别方向,但是如何走,还得靠你自己决定。
在这里插入图片描述
另一方面,DApp的开发者也面临如何获取链上数据,整理出自己应用的交易信息等数据,是统计信息,也有可能是开奖或者转账的凭证,是不可或缺的。虽然EOSPark等也提供了一些API,但目前还都非常初级,还有很多需要开发者自己摸索。

那EOS主链上有哪些数据,我们怎样获取呢?

数据内容与获取

链上的数据可分为实时的和历史的,实时的提供给业务逻辑做处理,历史的数据可以做统计分析;实时的数据相对容易,历史的数据则根据使用的场景不同,复杂度也有相当大的差异。

首先说实时的数据获取,最典型的就是大家会在自己的服务器上启动一个nodeos,加入EOS主网,同步最新的链上数据,同时就能很方便的执行转账,使用命令行玩各种DApps。(具体的可以参考我之前写的加入EOS主网和测试网cleos使用详解等文章)。当然如果你懒得配置nodeos,也可以使用各个超级BP提供的RPC API。
获取到的最常见的数据就是块(block)信息以及块中的Transaction(翻译成交易不太准确,翻译成事务不太好理解)信息。比如从链上取到的一个Transaction如下:
在这里插入图片描述
只有一部分Transaction信息,完整的可点击链接查看 一个块信息

首先获取到的块是一个json串,在块信息中,包含了块生成的时间,BP名称等基本信息,不细说,看名称就能识别。其中的Transaction信息,看上图,能看到执行的合约是eosio.token,执行的是转账(Transfer)操作,从data中能看到,发送者是vuniyuoxoeub,发送给balance33333,数量是499.9000 EOS,很简单,很直观。一般从区块浏览器中看到这些就够了,转账的确认再加上确认数就可以了。

然而这些是最基本的信息,很多隐藏的合约调用和通知是无法看到的。从eosflare上能看到这部分隐藏信息。同一个块的链接,部分截图如下:
在这里插入图片描述
可以看到同一个转账,其实还分别通知了发送者和接收者。而这些状态信息就是trace信息,是不能直接通过块信息获取的,而是存在了nodeos的state中的数据。这个还不够直观,如果看一个购买RAM或者创建新账号的操作,其实会发现你购买RAM的动作(Action),是你向eosio.ram和eosio.ramfee账号分别转账,然后获得系统给你增加的RAM值;创建账号的动作,更是包含了购买RAM,抵押获取CPU和网络的多个内部动作。

这些信息默认情况下是无法获取的,需要在你启动的nodeos的配置文件config.ini中设置filter-on后才能获取。看下nodeos -h的提示信息如下:

Config Options for eosio::history_plugin:
  -f [ --filter-on ] arg                Track actions which match 
                                        receiver:action:actor. Actor may be 
                                        blank to include all. Action and Actor 
                                        both blank allows all from Recieiver. 
                                        Receiver may not be blank.
  -F [ --filter-out ] arg               Do not track actions which match 
                                        receiver:action:actor. Action and Actor
                                        both blank excludes all from Reciever. 
                                        Actor blank excludes all from 
                                        reciever:action. Receiver may not be 
                                        blank.

从上面的帮助信息中能看到receiver:action:actor是filter-on的配置格式,比如你关心EOS转账,可以配置eosio.token:transfer:*,如果想收集所有traces信息,可以配置filter-on = *,当然这种配置也有非常大的问题,后面会说到;另外还能发现,它属于history_plugin,查询一个账号的Transaction和Action都依赖于此插件,但是在EOSIO的1.3.0版本,已经移除了此插件。那么还有其他地方记录这些状态信息么?请看下面的MongoDB插件

MongoDB插件

EOS上的数据对外输出都直接是json格式的,而MongoDB非常适合存储这样的数据。在EOSIO官方文档中是mongo_db_plugin,查看此文档能帮助你如何使用,更多的信息还得看下它的历史。在EOSIO1.0版本中,其实你是看不到此插件的,而在1.1的版本中才恢复,而且在当时的版本,问题不少,功能也有欠缺;在1.2版本之后才越来越稳定好用。
看看使用该插件都存储了哪些信息:

account_controls
accounts
action_traces
actions(不再支持,变为action_traces)
block_states
blocks
transaction_traces
transactions

完整信息可以看此连接 https://github.com/EOSIO/eos/pull/5066 。在没有action_traces之前,前面说的traces信息主要看transaction_traces,里面包含了所有合约调用交互的细节,比如买卖RAM的所有转账信息。
那如何使用呢,上面的官方文档里面有配置说明,通常在配置文件config.ini中增加如下配置即可,当然还得启动mongodb(下面的参考链接里有)

    abi-serializer-max-time-ms = 5000
    plugin = eosio::mongo_db_plugin
    mongodb-uri = mongodb://localhost:27017/eos
    # 曾经刷测TPS的账号,目前已经停止
    mongodb-filter-out = blocktwitter:tweet:
    # 可以控制存储哪些信息
    #mongodb-store-blocks = false
    # 可以选择从哪个块开始存储
    #mongodb-block-start = 19455000

另外,在新的官方文档中,提供了其他一些插件连接,如TokenPocket的Kafka插件,老猫的ElasticSearch插件,有兴趣的人可以看看 https://github.com/EOSIO/eos/blob/master/plugins/COMMUNITY.md

部分问题说明

EOSIO的代码更新很快,有时候觉得后进入整理数据的人有时候是幸运的,nodeos稳定许多,mongodb_db_plugin插件还增加了更多的功能。不过EOS的链上数据增长也很快,存储blocks的文件夹都已经有61G,mongodb光存储transactions_traces信息都有几百G了。
1.state数据库
早期想保存所有traces信息的人,如果使用filter-on=*配置,简直就不可能。因为traces信息很快将state数据库填满,使你在config.ini中配置的chain-state-db-size-mb不够用,而这也将使nodeos的同步停止,IO飙升,只能升机器的内存,当时用过128G内存的机器,很快就不够用了。这个也和EOSIO使用的状态数据库chainbase有关,有兴趣的可以查查
2.垃圾数据
在主网正式运行后不久,就一直能看到blocktwitter账号执行tweet,来压测整个网络的TPS,导致了大量无用的信息,这也是前面配置过滤该账号的原因。而最近又有部分非常规数据出现,比如账号cryptohongbo,在10月11日左右的数据,Actions虽然不明显,但是在traces中能发现大量数据,还不知道是用来做什么的。
3.新增账号
前面提到块中信息的不完整,导致的一个问题就是新增账号数统计,有可能不准确。比如直接调用系统合约创建账号,那么在块信息中会有体现。但是很多合约如signupeoseos提供了通过转账,自动帮你创建账号的功能。而这些信息是在块中看不到的,只有traces新中才有。

拖了这么久才又更新,真的很惭愧,自己继续加油,慢慢拨开迷雾,看清EOSIO,跟着EOS一同发展。

参考链接:
1.EOS MongoDB支持
2.eosio-mongodb-queries
3. EOSIO 1.2.0 版本发布:MongoDB 插件功能增强,社区插件集成和重放优化

转载请注明出处:http://blog.csdn.net/w7849516230,
欢迎关注微信公众号“编程阳光”
在这里插入图片描述

阅读更多

扫码向博主提问

w7849516230

非学,无以致疑;非问,无以广识
去开通我的Chat快问

没有更多推荐了,返回首页