BCSkill (Block chain skill )
区块链中文技术社区

只讨论区块链底层技术
遵守一切相关法律政策!

配置EOS同步主网数据到mongoDB

EOS编译安装,请参考 编译EOS主网EOS-Mainnet代码

一. 修改Config配置

先运行下nodeos,将会自动创建~/.local/share/eosio/nodeos/config目录和config.ini文件。
修改config.ini中如下内容

//添加 (2018-8-18 此时可用,如果有想分享的节点,请私聊我)
p2p-peer-address = fullnode.eoslaomao.com:443
p2p-peer-address = mars.fnp2p.eosbixin.com:443
//修改 可忽略
agent-name = "BcSkill"
//如果需要返回错误信息,修改
verbose-http-errors = true
//添加插件支持
plugin = eosio::chain_plugin
plugin = eosio::net_plugin
//修改mongodb插件相关配置
plugin = eosio::mongo_db_plugin
mongodb-uri = mongodb://127.0.0.1:27017/EOS
mongodb-filter-on = *
#mongodb-filter-out = spammer::
mongodb-filter-out = eosio:onblock:
mongodb-filter-out = gu2tembqgage::
mongodb-filter-out = blocktwitter::
mongodb-queue-size = 2048
abi-serializer-max-time-ms = 5000
mongodb-block-start = 1
mongodb-store-block-states = false
mongodb-store-blocks = false
mongodb-store-transactions = false
mongodb-store-transaction-traces = true
mongodb-store-action-traces = true

read-mode = read-only

参考:MongoDB Filtering and Optimizations
参考:issues/5797

二. 安装配置并启动MongoDB

1. 安装MongoDB

先安装MongoDB 参考(Ubuntu 安装 Mongodb 3+

2. 配置MongoDB

进入到MongoDB bin 目录,可以添加到环境变量,方便操作。

cd ~/opt/mongodb/bin

由于链上数据较大,比如1000W块左右的数据,离线压缩包大约14GB,同步到MongoDB大概需要200GB左右。所以需要将MongoDB数据单独磁盘存储。
修改MongoDB数据存储位置,/mnt/data为我这边挂载的存储盘
新建目录mkdir /mnt/data/mongo/db

3. 启动MongoDB

mongod --dbpath /mnt/data/mongo/db

这时MongoDB服务会默认监听27017端口

三. 下载主网离线数据包

参考 EOS 主网数据更新,离线数据包
因为使用离线包可以加快追上主网的进度,如果从零自己同步到主网进度,难以想象要多久...
假设已经将离线数据下载并解压到了 /mnt/data/data目录下。

四. 启动nodeos开始同步数据

nodeos --data-dir /mnt/data/data --hard-replay-blockchain

如果需要清空mongo数据库的话,添加--mongodb-wipe
相关代码如下eos\plugins\mongo_db_plugin\mongo_db_plugin.cpp

void mongo_db_plugin::plugin_initialize(const variables_map& options)
{
   try {
      if( options.count( "mongodb-uri" )) {
         ilog( "initializing mongo_db_plugin" );
         my->configured = true;

         if( options.at( "replay-blockchain" ).as<bool>() || options.at( "hard-replay-blockchain" ).as<bool>() || options.at( "delete-all-blocks" ).as<bool>() ) {
            if( options.at( "mongodb-wipe" ).as<bool>()) {
               ilog( "Wiping mongo database on startup" );
               my->wipe_database_on_startup = true;
            } else if( options.count( "mongodb-block-start" ) == 0 ) {
               EOS_ASSERT( false, chain::plugin_config_exception, "--mongodb-wipe required with --replay-blockchain, --hard-replay-blockchain, or --delete-all-blocks"
                                 " --mongodb-wipe will remove all EOS collections from mongodb." );
            }
         }

此时已开始,同步中

五. 服务器建议配置

内存:32GB
存储:1T+

编译EOS主网EOS-Mainnet代码

下载主网EOS代码

所谓的主网代码就是EOS-Mainnet维护的EOS分支仓库,相对EOSIO的仓库分支区别就是,EOS-Mainnet对发布的release分支做了进一步测试和审核,测试好后,BP们才部署。也就是基本上BP们都是部署的这个仓库分支,所以如果是同步主网,建议选此仓库分支。避免一些不必要的bug和数据不兼容等意外。

1. 获取代码
git clone https://github.com/EOS-Mainnet/eos.git

如果提示git没有安装,先安装gitapt install git

2. 切换对应的分支

由于主仓库分支较多,切换到当前仓库的最新的分支或者tag
当前最新为(mainnet-1.1.6)

cd eos源码目录
git checkout mainnet-1.1.6
3. 开始编译代码
./eosio_build.sh -s EOS

执行脚本后,脚本会自动安装所需的开发环境工具

4. 执行安装

编译完成后,

执行安装

./eosio_install.sh

安装pdo_mysql支持

sudo apt-get --purge remove php-common
sudo apt-get install php-common php-mysql php-cli

查看已支持的扩展中,是否有pdo_mysql

php -m

推荐一款比Scatter易用的EOS Dapp浏览器扩展

前面有篇文章专门介绍了如何使用Scatter扩展 《Scatter的使用及添加测试网络相关设置
虽然介绍很详细了,但是还有有朋友群里留言说不会用,或者弄不清网络设置,身份等到底是做什么用的,还有在与Dapp交互时一些信息,一脸萌币。
今天推荐一款名为DAppPlay的EOS扩展,可以理解为Scatter的优化版本,并且兼容Scatter已有的DApp,非常适合中国人简而美的需求。

下载安装

下载地址:Chrome 商店下载

简单使用

打开安装后的扩展


界面简洁,和MetaMask类似,可以新建或者导入已有的备份。

主界面


主界面可以看出支持EOS和以太坊,但目前以太坊还在开发中,估计不久将支持。

创建账户


创建账户,也比较简洁

激活账户

点击创建完直接跳转到激活账户

点击激活,自动将账户名和公钥带到了一个激活的网页
https://account.eostore.vip/?name=suroubcskill&publicKey=EOS7zPw6ssjf6t5x6SSVwiVBRHrQoHs2yUN7zb6wNZXoHBK273Rue
网站此时在维护,无法看到效果。可以先使用别的App替代激活。

导入账户

我们还是先手动导入一个已存在的账户吧

导入已有钱包或者激活新账户后,进入EOS钱包主页,这里可以转账充值和查看账户余额,并且还有资源的购买和账户交易记录查看等功能。

账户转账

资源设置


包含了常规的资源买卖等功能。

一些设置

在设置中,还可以进行编辑网络、选择语言、备份等操作

相对优点

相比Scatter,这款拓展有以下几个优点:
1.流程简单逻辑清晰,相比Scatter去除了很多不必要的功能,更便于普通用户使用。
2.有详细的EOS账户注册教程,方便很多新用户。
3.可对EOS的资源(CPU、内存、网络)进行配置。
4.同时支持EOS和ETH上的DApp。


拥有EOS账户并配置好相应的资源后,就可通过DAppPlay来使用EOS上面的DApp了
事实上目前EOS的DApp使用还是有很多问题,对DApp感兴趣,想了解更多DApp信息和EOS资源配比问题的朋友,可以加DAppPlay的官方群参与相关的讨论。
QQ群号:808876107

转载自:http://dappp.com/

EOS error bad alloc

问题跟进中,等测试结束,会删除此提示

当在config.ini中开启 filter-on = * 并且激活 history_plugin插件时,运行一段时间后会出现以下错误

terminate called after throwing an instance of 'boost::interprocess::bad_alloc'
  what():  boost::interprocess::bad_alloc

或者

2018-08-09T07:21:22.037 thread-0   producer_plugin.cpp:331       on_incoming_block    ] Received block adaceec950230d1e... #10209388 @ 2018-08-09T07:19:23.500 signed by helloeoscnbp [trxs: 254, lib: 10209272, conf: 0, latency: 118537 ms]                                       
terminate called after throwing an instance of 'std::bad_alloc'                                                                           
terminate called recursively                                                                                                              
  what():  std::bad_alloc

原因是由于filter-on = *,共享内存映射文件已满。(github

解决方案是

  • 增加 chain-state-db-size-mb 来提高 shared_memory_size,确保您的硬件与您设置的较高值兼容。

还有种错误如下

1733735ms thread-0   controller.cpp:625            push_scheduled_trans ] 3050003 eosio_assert_message_exception: eosio_assert_message assertion failure
assertion failure with message: refund request not found
    {"s":"refund request not found"}
    thread-0  wasm_interface.cpp:930 eosio_assert
pending console output: 
    {"console":""}
    thread-0  apply_context.cpp:61 exec_one
1766924ms thread-0   controller.cpp:153            emit                 ] bad alloc

解决方案

  • 同步似乎已超过可逆块日志的默认大小,即340 MB。通过添加reversible-blocks-db-size-mb = 500 MB(或任何更大的数字)来增加其大小config.ini。(github

注意
您将需要重新同步所有块,因为错误的alloc通常会导致数据库损坏。

如果config.ini开启 filter-on = * ,那么它实际上需要无限量。如果您正在连接到主网并且没有使用任何额外的插件,那么64 GB今天可以使用,但不会长期工作。