#概要
monacoindに導入されたLua VMについての備忘録兼解説的な記事です。
プラグインの使い方をサンプルコードをチラ見しながら説明します。
#何ができるようになって、何が嬉しいのか
monacoindをインストールするだけでluaで書いたプログラムが実行できるし、monacoindへの操作もできる
ブロックチェーンに直に触ることのできるアプリをmonacoindだけで作れるようになります。jsonRPCに苦しめられる必要はありません。書いて、実行するだけです。
##もう少し具体的に
luaからmonacoindを操作できる
提供されているサンプルを見るとわかりますが、getblock()
やsend_from()
といった情報取得や送金命令などのcoindへの操作を記述出来ます。
jsonRPCやbitcoinjs-libを使わなくてもコインが送れる!
monacoindのイベントに合わせてluaプログラムを実行
monacoindにはイベントが発生します。例えば新しいブロックの更新です。そういったタイミングにおいて、luaプログラムを実行することができます。
自動販売機的なことがmonacoindだけで出来るようになる!
#利用手順
・この拡張はmasterブランチではなくplugin_devブランチに組み込まれているのでそれをビルド。
ブランチの指定さえすればビルドの方法やその後の設定などは通常と同様ですが、getrawtransaction()を使いたいのでmonacoin.confにtxindex=1は入れておくことを推奨
・wallet.datが存在するディレクトリ(~/.monacoin/
だと思います)にpluginディレクトリを作成
・作成した~/.monacoin/plugin/
配下にluaで書いたプログラムを置いて準備完了
・端末からmonacoin-cli loadplugin ファイル名(.luaまで含める)
を実行するとプラグインが読み込まれて実行有効化され
・プラグインが有効な状態でイベントが起きると関数が実行される
・端末からmonacoin-cli unloadplugin ファイル名(.luaまで含める)
を実行するとプラグインを無効化
※testnetを使う場合~/.monacoin/testnet4/plugin/
です
#サンプルコードを見てみる
以下を見るのが全体像をつかむのに適しています。
https://github.com/monacoinproject/monacoin/blob/plugin_dev/sample/plugin/empty.lua
これらの関数を実装しておけば、プラグインが有効化されている限りそれぞれのタイミングで実行してくれます。
OnInit()
とOnTerm()
はそれぞれのタイミングで実行されるだけなので単純です。
OnBlockNotify()
はinitialsync=true状態だと通知が山ほど来てしまうので、スルーしましょう。コード参考
OnWalletNotify()
はmonacoindのウォレット内の自分のアドレスに関係あるトランザクションだけを通知してくれます。
#簡単なプログラムを書いてみた
私のコードです。ブロックチェーンを監視して特定のアドレスに対しての入金を検知したらmonacoindを実行している端末の標準出力に表示します。だからなんだよって言っちゃいけない。
#デメリットというかちょっと手間なこと
Luaってなんですか
今回初めて私はLuaという言語の名前を聞きました、Lua自体を勉強する必要があります。
ですが、簡単なプログラムを書く分にはこの言語は簡単に感じています。関数型?知らんな!と思っていても手続き型でCのようにとりあえずは書けます。真面目に書こうとしたら大変なのかもしれませんがとりあえず動く分には動きます。
本格的なWebアプリを作るにはどうしたらいい?
ユーザーのリクエストに応じてmonacoindを操作するためには、その内容を蓄えておいた外部データベースにmonacoindから持ってくるなどの工夫をする必要がありそうです。簡便さを保持したまま作成できるアプリにはいくらか制限がありそうですね。
#まとめ
monacoindだけでブロックチェーンを使った学習、アプリが出来る!
#注意
とりあえずtestnetを使いましょう。ありがたいことにMonapartyもelectrum-monaもblock explorerもtestnet版が有志によって存在します。これを使わない手はありません。それとtestnetならブロックチェーンの同期も早いのですぐに開発に取り掛かれます。
#参考外部記事
MonacoinにLua VMを組み込んでみました· GitHub
Monacoind の lua 拡張 – Blockchain Engineer Blog – Medium