Glueby の block_syncer が始まらないと嘆いているあなたへ

私です。

Glueby と初めましてしてもう2年経とうとしているのに定期的にこれ踏むので戒めをこめた備忘録。

EOFError: end of file reached の場合

$ rails glueby:block_syncer:start rails aborted! EOFError: end of file reached Tasks: TOP => glueby:block_syncer:start (See full trace by running task with --trace)

タスクを細かく実行していくと

> Glueby::Internal::RPC.client.getblockcount EOFError: end of file reached

ここでエラーを吐いていることがわかる。

原因

そもそも Tapyrus ノードと接続できていない。

解決
  • Host 名は間違っていませんか?
    • Docker compose で立ててるならコンテナ名
  • Post 番号は間違っていませんか?
    • dev なら 12381, prod なら 2377
  • RPC User/Password は間違っていませんか?
    • tapyrus.conf を見に行きましょう

NoMethodError: undefined method `int_value' for nil:NilClass の場合

$ rails glueby:block_syncer:start rails aborted! NoMethodError: undefined method `int_value' for nil:NilClass Tasks: TOP => glueby:block_syncer:start (See full trace by running task with --trace)

同様に細かく見ると

> Glueby::AR::SystemInformation.synced_block_height Glueby::AR::SystemInformation Load (0.1ms) SELECT "glueby_system_informations".* FROM "glueby_system_informations" WHERE "glueby_system_informations"."info_key" = ? LIMIT ? [["info_key", "[FILTERED]"], ["LIMIT", 1]] => nil

synced_block_height が nil になることで引き起こされている。

原因

Glueby::AR::SystemInformation が作られていない。

Ridgepole で管理したいから Glueby が作った マイグレーションファイルをコピーしよ〜とかしましたか?そのマイグレーションファイルに、以下の一文があります。

Glueby::AR::SystemInformation.create(info_key: 'synced_block_number', info_value: '0')

マイグレーション時に Glueby::AR::SystemInformation を作っています。これを飛ばして Schemafile に create_table だけ書いて ridgepole:apply しても SystemInformation は作られないので synced_block_height が nil になります。

解決

bin/setup にでも追記しておきましょう。

... puts "\n== Preparing database ==" system! 'bin/rails db:create' system! 'bin/rails ridgepole:apply' Glueby::AR::SystemInformation.create(info_key: 'synced_block_number', info_value: '0') ...

(2023/06/22)以下追記あり

ActiveRecord::StatementInvalid: Could not find table 'glueby_timestamps' の場合

$ rails glueby:block_syncer:start rails aborted! ActiveRecord::StatementInvalid: Could not find table 'glueby_timestamps' Tasks: TOP => glueby:block_syncer:start (See full trace by running task with --trace)
原因

Glueby の導入手順「5. Generate db migration files for wallet feature」にて、「timestamp 使わないしスキップしよ〜」と思いスキップすると踏む。

解決

使う予定なくても作りましょう。

$ rails g glueby:contract:timestamp

余談)token 動かないのが自分の環境のせいなのかバグなのかわからない

$ rails g glueby:contract:token Could not find generator 'glueby:contract:token'. (Rails::Command::Base::CorrectableError) Did you mean? glueby:contract:block_syncer Run `bin/rails generate --help` for more options.
$ bin/rails generate --help ... Glueby: glueby:contract:block_syncer glueby:contract:initializer glueby:contract:reissuable_token glueby:contract:timestamp glueby:contract:wallet_adapter ...

とあるので reissuable_token に名前が変わった?っぽい。

追記)↑ 使ってるGluebyが古かった

当たり前のように Rails7 で作業してたら Glueby のバージョンが 0.4系とかだった。

Rails6 でやると最新の Glueby が入るので timestamp なくても動くし token もちゃんと作れる。