
仕事でEthereumを使ったシステムを作ることになったのですが、手数料とかパフォーマンスとかいろいろ考えると、しょうがねぇひとまずプライベートネットワークでもよかろう~ということになったのでそこでやったこととか躓いたとことかノウハウをまとめてみます。
プライベートネットワークなので、関係者以外はアクセスできない、非中央集権制はそこまで求めない、などかなり割り切った仕様で運用する際のノウハウなのでご注意ください。
スマートコントラクト開発にはEmbarkを使いました。Truffleも試したのですが、Embarkの方がサンプルがすぐに動かせたし、ダッシュボード?コンソール?みたいなものが勝手に立ち上がったりして(Truffleにも同様の機能があったらすみません)便利な印象だったのでEmbarkにしました。
まぁSolidityコードが自動でコンパイルされてネットワークにデプロイされるという点ではどちらも同じようなものなので好きなほうで構わないとは思います。
当初、すぐに検索でヒットする入門者用のチュートリアルをもとにネットワークを構築してみたのですが、これが全然パフォーマンスがでませんでした...。使っているマシンスペックのせいもあるのですが、すぐにGasPriceが上昇して安定してブロックを生成することができなくなってしまいました。
そこで知ったのがcliqueモードです。
はじめて知ったときは「Ethereumにこんな機能がっっ!?」と驚いたのですが、EthereumをPoAで動作させることができます。以下の記事をたまたま発見して知りました。
Setup your own private Proof-of-Authority Ethereum network with Geth
詳細な設定方法は上記サイトにお任せしてしまいますが、ここでは補足情報としてパフォーマンスをを上げるためにやったことをメモします。
cliqueモードでネットワークを作成する際に指定します。設定できる最小値は1秒でした。ちなみにここで指定した秒数は後で変更する方法がわからなかったので変更したくなった場合は再度ネットワークを作り直しました。変更できないのかもしれません。
1ブロックで処理できるトランザクション数はGasLimitで制限されるようなので、ネットワークのGasLimitを限界まで上げておきます。
gethのオプションで--targetgaslimit 999999999999999と指定します。
GasLimitは999999999999999よりもっと大きな値を設定できるのですが、web3.js内部(の型変換か何か?)でエラーになったのでこの値にしています。
スマートコントラクトの実行時(ETHを使うとき)、実行アカウントのアンロックをしなければなりませんがアカウントのアンロック処理は意外と重いです。
ただし、gethに--lightkdfオプションをつけて起動してから作成したアカウントは強度の弱い鍵を使用して作成されるのでアンロック処理が速くなります。体感としては2、3倍は速いです。
いわずもがな普通のアカウントよりは脆弱になるので使用するかどうかは十分検討が必要と思われます。
ま、一番速いのはあらかじめアンロックしておく(プライベートネットワークだし...)のが一番速いんですけどね...(闇)
せっかくなので最新のver 1系を使っています。ver 0系と書き方が違う部分が多いので、初めの頃は1系をつかっているのに0系のドキュメントをよんでしまってたりして、あれ? 動かない...といったことが何度かありました。注意です。
ネットワークのGasLimitを上げて処理できるトランザクション数が増えると、次にボトルネックになったのはEthereumネットワークに接続するコネクション数でした。
TCPかIPCソケット通信で接続するのですが、1リクエストごとにコールバック処理をかいてしまうと大量リクエストが一気に来た場合にエラーになるかフリーズするかとにかくまずい状況になります。
なので、以下の2つの方法が有効でした。
1. コールバックを設定せずに、トランザクションが完了したかどうかはeventをsubscribeする。
2. BatchRequestを使い1コネクションで大量のトランザクションを生成する。
ただ、2の方法は受け付けたリクエストをいったんどこかにキューしておかないといけないので少し扱いにくいです。RedisやRDBMSにいったん保存というのは思いつきますが、ブロックチェーンにデータが乗る前に改ざんされるするタイミングを極力なくしたいという理由からやっていません。
現状、自分が構築したネットワークで、1ブロック当たり(ブロックは1秒ごとに生成されるので、つまり1秒あたり)処理できたトランザクション数は数百トランザクションでした。かなりしょぼいスペック(VM、メモリ1GBとか...)でやっているせいもあるとは思いますが、まだ遅い感じもします。
他に何かいい方法があるんじゃないかなぁと思っているのですがなかなか見つけられずにいます。。。
何度か勉強会に出向いて参加者に聞いてみたりもしたんですが、同じような課題に取り組んでいる人には出会うことができませんでした。。。
こっちを使った方が超絶速そうなんですけどまだ試せてません...。
ざっとみるとユースケースが支払いに関することばかりですが任意の処理をかけるのでしょうか???
プライベートネットワークだけでも運用可能???
(もし試せたら何か書きます。)
Plasmaってまだ開発中なんですかね? めっちゃ速そう? 早く使ってみたい。
そこは理解が違う、とかもっといい方法があるなどの情報お待ちしてますm(__)m
ってALISは記事に対するコメントできないんですかね。ぜひTwitterなどへおねがいします!










