クリプト

Ethereumプライベートネットワーク構築

aoi's icon'
  • aoi
  • 2018/05/29 04:04
Content image

仕事でEthereumを使ったシステムを作ることになったのですが、手数料とかパフォーマンスとかいろいろ考えると、しょうがねぇひとまずプライベートネットワークでもよかろう~ということになったのでそこでやったこととか躓いたとことかノウハウをまとめてみます。

プライベートネットワークなので、関係者以外はアクセスできない、非中央集権制はそこまで求めない、などかなり割り切った仕様で運用する際のノウハウなのでご注意ください。



Embark

スマートコントラクト開発にはEmbarkを使いました。Truffleも試したのですが、Embarkの方がサンプルがすぐに動かせたし、ダッシュボード?コンソール?みたいなものが勝手に立ち上がったりして(Truffleにも同様の機能があったらすみません)便利な印象だったのでEmbarkにしました。

まぁSolidityコードが自動でコンパイルされてネットワークにデプロイされるという点ではどちらも同じようなものなので好きなほうで構わないとは思います。



cliqueモード

当初、すぐに検索でヒットする入門者用のチュートリアルをもとにネットワークを構築してみたのですが、これが全然パフォーマンスがでませんでした...。使っているマシンスペックのせいもあるのですが、すぐにGasPriceが上昇して安定してブロックを生成することができなくなってしまいました。

そこで知ったのがcliqueモードです。

はじめて知ったときは「Ethereumにこんな機能がっっ!?」と驚いたのですが、EthereumをPoAで動作させることができます。以下の記事をたまたま発見して知りました。

EthereumのプライベートネットをPoAで構築する

Setup your own private Proof-of-Authority Ethereum network with Geth

詳細な設定方法は上記サイトにお任せしてしまいますが、ここでは補足情報としてパフォーマンスをを上げるためにやったことをメモします。

ブロック生成間隔

cliqueモードでネットワークを作成する際に指定します。設定できる最小値は1秒でした。ちなみにここで指定した秒数は後で変更する方法がわからなかったので変更したくなった場合は再度ネットワークを作り直しました。変更できないのかもしれません。

GasLimit

1ブロックで処理できるトランザクション数はGasLimitで制限されるようなので、ネットワークのGasLimitを限界まで上げておきます。

gethのオプションで--targetgaslimit 999999999999999と指定します。

GasLimitは999999999999999よりもっと大きな値を設定できるのですが、web3.js内部(の型変換か何か?)でエラーになったのでこの値にしています。

アカウントのアンロック

スマートコントラクトの実行時(ETHを使うとき)、実行アカウントのアンロックをしなければなりませんがアカウントのアンロック処理は意外と重いです。

ただし、gethに--lightkdfオプションをつけて起動してから作成したアカウントは強度の弱い鍵を使用して作成されるのでアンロック処理が速くなります。体感としては2、3倍は速いです。

いわずもがな普通のアカウントよりは脆弱になるので使用するかどうかは十分検討が必要と思われます。

ま、一番速いのはあらかじめアンロックしておく(プライベートネットワークだし...)のが一番速いんですけどね...(闇) 



web3.js

せっかくなので最新の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とか...)でやっているせいもあるとは思いますが、まだ遅い感じもします。

他に何かいい方法があるんじゃないかなぁと思っているのですがなかなか見つけられずにいます。。。

何度か勉強会に出向いて参加者に聞いてみたりもしたんですが、同じような課題に取り組んでいる人には出会うことができませんでした。。。



Riden

こっちを使った方が超絶速そうなんですけどまだ試せてません...。

ざっとみるとユースケースが支払いに関することばかりですが任意の処理をかけるのでしょうか??? 

プライベートネットワークだけでも運用可能???

(もし試せたら何か書きます。)



Plasma

Plasmaってまだ開発中なんですかね? めっちゃ速そう? 早く使ってみたい。



そこは理解が違う、とかもっといい方法があるなどの情報お待ちしてますm(__)m

ってALISは記事に対するコメントできないんですかね。ぜひTwitterなどへおねがいします!

公開日:2018/05/29
獲得ALIS:6.30
aoi's icon'
  • aoi
  • @aoi
プログラマー、CGアーティスト。今はEthereumを使用したシステム開発をしています。Twitter: https://twitter.com/core_aoi

投稿者の人気記事
コメントする
コメントする
こちらもおすすめ!
Eye catch
クリプト

Polygon(Matic)で、よく使うサイト(DeFi,Dapps)をまとめてみた

Like token Tip token
236.30 ALIS
Eye catch
クリプト

約2年間ブロックチェ-ンゲームをして

Like token Tip token
161.20 ALIS
Eye catch
クリプト

【DeFi】複利でトークンを運用してくれるサイト

Like token Tip token
54.01 ALIS
Eye catch
クリプト

ジョークコインとして出発したDogecoin(ドージコイン)の誕生から現在まで。注目される非証券性🐶

Like token Tip token
38.31 ALIS
Eye catch
クリプト

コインチェックに上場が決まったEnjin Coin(エンジンコイン)コインを解説

Like token Tip token
21.49 ALIS
Eye catch
クリプト

【初心者向け】JPYCを購入して使ってみました!

Like token Tip token
30.03 ALIS
Eye catch
クリプト

17万円のPCでTwitterやってるのはもったいないのでETHマイニングを始めた話

Like token Tip token
46.60 ALIS
Eye catch
クリプト

バイナンスの信用取引(マージン取引)を徹底解説~アカウントの開設方法から証拠金計算例まで~

Like token Tip token
3.50 ALIS
Eye catch
クリプト

CoinList(コインリスト)の登録方法

Like token Tip token
15.55 ALIS
Eye catch
クリプト

Bitcoin史 〜0.00076ドルから6万ドルへの歩み〜

Like token Tip token
947.13 ALIS
Eye catch
クリプト

2021年1月以降バイナンスに上場した銘柄を140文字以内でざっくりレビュー(Twitter向け情報まとめ)

Like token Tip token
38.10 ALIS
Eye catch
クリプト

Uniswap(ユニスワップ)で$ALISのイールドファーミング(流動性提供)してみた

Like token Tip token
59.99 ALIS