经验分享 区块数据太多,程序不好监控,解决办法

Chain_Wang · 2018年08月17日 · 最后由 imlaochen 回复于 2018年11月17日 · 11832 次阅读

好多做钱包交易所的,检测冲币的时候,大多是扫区块,但是EOS的出块快,有事多线程跑也挺费劲的,可以用filter-on过滤器,过滤掉其他的信息,只保留自己账户的所有操作和信息。

共收到 28 条回复

在配置文件中添加下面配置,只保留自己账户的所有操作,交易所两个账号一个冲一个提的话,就把里面的用户名eosio.token 和eosio这两个系统用户名,改成自己的,两个账号就复制两边,现在程序处理速度可以赶上了,能够轻松处理钱包交易所的需求

History of EOS token transfers

filter-on = eosio.token:transfer: 

Creation of tokens

filter-on = eosio.token:issue: 
filter-on = eosio.token:create: 

History of multisig transactions

filter-on = eosio.msig:propose:
filter-on = eosio.msig:approve:
filter-on = eosio.msig:unapprove:
filter-on = eosio.msig:cancel:
filter-on = eosio.msig:exec:

System Contract Operations

filter-on = eosio:newaccount:
filter-on = eosio:updateauth:
filter-on = eosio:deleteauth:
filter-on = eosio:linkauth:
filter-on = eosio:unlinkauth:
filter-on = eosio:canceldelay:
filter-on = eosio:onerror:
filter-on = eosio:buyrambytes:
filter-on = eosio:buyram:
filter-on = eosio:sellram:
filter-on = eosio:delegatebw:
filter-on = eosio:undelegatebw:
filter-on = eosio:refund:
filter-on = eosio:regproducer:
filter-on = eosio:setram:
filter-on = eosio:bidname:
filter-on = eosio:unregprod:
filter-on = eosio:regproxy:
filter-on = eosio:voteproducer:
filter-on = eosio:claimrewards:
filter-on = eosio:setpriv:
filter-on = eosio:rmvproducer:
filter-on = eosio:setalimits:
filter-on = eosio:setglimits:
filter-on = eosio:setprods:
filter-on = eosio:reqauth:
filter-on = eosio:setparams:

貌似 格式乱了 filter-on = eosio:newaccount: 作为一行 注意加后面的冒号 ":"

filter-on = *
这样就可以了

sauterne 回复

.... 你这个是加载所有账户的 所有数据。。。。 多线程也不一定赶上,而且很麻烦,我发的是 区块上只保留自己的账户的 所有相关信息😃

麻烦请教一下, 如果开启这个filter-on 之后, 查询一个区块的交易详情是否已经过滤掉了无关的交易呢?

还有您说的这句话不是太了解
就把里面的用户名eosio.token 和eosio这两个系统用户名,改成自己的,两个账号就复制两边
我理解的eosio.token 是合约账户, EOS的转账时执行此账户的智能合约。
如果把这个替换了, 那我岂不是监控不到EOS转账了? 😀 😀

wupeaking 回复

1.把无关交易过滤掉了 2.这两个是eos的官方账户,改成自己的就好, 3.例如:filter-on = eosio.token:transfer: 这个意思是监控合约账户的交易信息,也就是所有的交易信息,等于没过滤,但是改成filter-on = 你的账户:transfer: 就是只保留你账户的交易信息,凡是跟你账户有关的交易都会被过滤出来无论是eos还是其他代币交易

wupeaking 回复

像这种。。。。你自己试一下就知道了,我们是在开发中遇到的,你说的监控不了并没有出现。。。线上钱包运行的很稳定,也能监测到所有交易

再麻烦请教您一下, 如果我把filter-on打开是不是要重新同步区块呀。之前没有开启这个功能。

wupeaking 回复

不用啊 Pkill nodeos关掉进程 加上去就好了 然后启动 只要不是那种kill -9 这类的强制关

之前history-plugin没有启用, 现在启用之后报数据不一致的情况。 😂

插件是 插件。。。这个就是个过滤器

你有试过把history plugin禁用吗?

我把history plugin禁用之后。 历史action和历史交易均查询不到了。

wupeaking 回复

...我只开 plugin = eosio::chain_api_plugin
plugin = eosio::history_plugin
plugin = eosio::history_api_plugin
plugin = eosio::chain_plugin
plugin = eosio::bnet_plugin
这几个插件

刚才我把filter 打开之后, 获取区块交易详情的时候(get block blocknum), 返回的依然是所有的交易详情。 这样我扫块的时候还是数据量很大呀。

wupeaking 回复

看下你的filter-on配置文件

Chain_Wang 回复

或者说 你打开后 获取的是以前的区块交易 获取打开后同步的区块试试

可不可以把你们的配置文件借我参考一下呢。 😍

Chain_Wang 回复

你好,我添加了这个过滤,然后重新同步查看到还是从2018-06-09T12:22:46.000开始同步,我这个账号前天开通,昨天测试交易了一笔,怎么会同步这么多数据呢

这是我的过滤配置还有什么问题吗,请帮忙看一下,万分感谢。

我用http://159.138.3.186:8888/v1/chain/get_info400错误,端口是打开的这个接口也是显示

@Chain_Wang 能否把交易所的配置文件 共享一下,你们的节点启用mongodb的 plugin了没

@Chain_Wang 我的微信 278808284 能否方便加一下,谢谢了

riyue 回复

没有用mongodb,多线程跑的

filter-on = eosio.token:transfer:
这样监控的只是eosio.token这个账号发行的代币吧。
别人发行的代币肯定使用自己的账号,那样是不是filter-on=(xxx列出来所有eosio.token的合约账号):transfer:

你好,请问这个是get transaction时候过滤的返回信息吗?如果我要查询sellram,是不是要设置filter-on = 我的账户名:sellram呢 ?那么每次换个账户都设置一次么?

gk5 回复

我又看了几遍官方文档,这个receiver不是账户名的意义,应该是“合约账户”的意思。
看这个transaction,JungleTestNet 24029617这个block。

"actions": [
            {
              "account": "eosio.token",
              "name": "transfer",
              "authorization": [
                {
                  "actor": "yangjj111113",
                  "permission": "active"
                }
              ],
              "data": {
                "from": "yangjj111113",
                "to": "yangjj111111",
                "quantity": "1.0000 EOS",
                "memo": "0"
              },
              "hex_data": "30420821bcc7a6f110420821bcc7a6f1102700000000000004454f53000000000130"
            }
          ]

上面这个transaction中,receiver=eosio.token(合约),action=transfer, actor=yangjj111113。

又比如JungleTestnet 24031632 这个区块

{
              "account": "eosio",
              "name": "buyrambytes",
              "authorization": [
                {
                  "actor": "eosio",
                  "permission": "active"
                }
              ],
              "data": {
                "payer": "eosio",
                "receiver": "collinskarma",
                "bytes": 4096
              },
              "hex_data": "0000000000ea305560e435104f17234500100000"
            },

上面这个transaction中,receiver=eosio(合约),action=buyrambytes, actor=eosio。

所以,我理解的是EOS的基础是智能合约,所有的操作都运行在合约之上,包括sellram, sellram的receiver应该是eosio这个系统自带的智能合约,至于是哪个account在sellram,应该是data参数部分。

这是我最近两天的理解不知道对不对。

imlaochen 回复

我的理解和你的一致,你有在本地环境确认么?

所以,如果想监控所有指定account的交易,应该把配置写成:

--filter-on= *:transfer:kazaff    // 不确定星号是否必须,待测

这种?

这几天我搭建好环境试一下也~

kazaff 回复

我在本地测试了,理解的receiver,action,actor是对的。

--filter-on= *:transfer:kazaff    // 不确定星号是否必须,待测

看官方文档,没提及通配符,所以我也不确定。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册