最速でイーサリアムの分散型プライベートネットワークを作る方法

Home » スマートコントラクト開発 » 最速でイーサリアムの分散型プライベートネットワークを作る方法

2017年1月8日

今回は、スマートコントラクトプラットフォームのイーサリアムを使って、分散型プライベートネットワークを構築する手順について解説します。

geth

イーサリアムの環境構築手順を解説しているブログ記事はたくさんあるのですが、2台以上のgethノードを用いて分散型プライベートネットワークを構築する手順が意外に少ないので、最短で環境構築を終わらせられるように手順を紹介します。

 

今回のお題:2台のgethノードで分散型ネットワークを構築

 

手順の大まかなステップ

 ・ 事前作業

  サーバマシン:ノード間の標準時刻を揃える

  ファイアウォール:通信ポートを解放する

 ・ gethに関する作業

  1.インストール

  2.初期設定

  3.ノード接続

  4.接続確認

 

前提とする環境

  • OSは、Ubuntu Server16.04LTS (14.04LTSでもOK)
  • 2台のマシンがパブリックIPv4アドレスを取得し、インターネット経由で通信する

 

事前作業

  • Gethノードを稼働させる2台のマシンの標準時刻を揃えてください。一方がJST(日本標準時)でもう一方がGMT(グリニッジ標準時)などのようにサーバの時刻が異なると、ノード間の通信ができません

  • インターネット経由で通信するために、インターネット接続用のルータ(及びファイアウォール)の通信ポートを解放してください。今回は1台目が30301(TCP&UDP)、2台目が30302を使用します。もし、これらのポートを他のアプリケーション用の通信で使用している場合は他の番号に変えても問題ありません。TCPとUDPの双方を解放しないと通信ができないという話を聞きますので注意してください。

 

gethに関する作業 

これ以降の作業は、2台のマシンでそれぞれ実施してください。

 

1.インストール

  • まずはgethをインストールしましょう。

ディレクトリの作成

 $ mkdir /home/geth/

 $ cd /home/geth/

インストール

 $ sudo apt-get install software-properties-common

 $ sudo add-apt-repository -y ppa:ethereum/ethereum

 $ sudo apt-get update

 $ sudo apt-get install ethereum

  • 途中でプロンプトが出たらY(Yes)で進めてください。

 

2. 初期設定

  • gethを起動して下さい。

 $ geth  –identity “Test1” –networkid 12345 –datadir “/home/geth”  –port “30301”  –nodiscover –maxpeers 1  console 2>> /home/geth/eth.log

–identity “Test1” ノードにIDを設定します。1台目を”Test1″ 2台名を”Test2″にします
–networkid 12345 プライベートネットワークにIDを設定します。2台とも同じ値にしてください
–datadir “/home/geth” ノードの設定ファイルを保存するディレクトリです
–port “30301” ノードが外部からの通信を受信するために使うポートです。1台目を”30301″ 2台目を”30302″にします
–nodiscover 手動でノードを追加するモードにします
–maxpeers 1 接続できる最大ノード数を設定します
console 2>> /home/geth/eth.log ノードのログを記録するディレクトリ/ファイル名です 

 

 

  • 起動したら、ノードの接続情報を確認します。

 > admin.nodeInfo

 {
enode: “enode://ac2e8c893e4dd345f5e0b3e496eb8aa3d48612c2eee27e4b64a770d9dac5a6d1244ccf0fde2ce81050a152b05c9a48d314de205020b567700822e41e540c06df@[::]:30301?discport=0″,
id: “cc2e8c893e4dd345f5e0b3e496eb8aa3d48612c2eee27e4b64a770d9dac5a6d1244ccf0fde2ce81050a152b05c9a48d314de205020b567700822e41e540c06df”,
・・・以下略・・・

  • 青字の部分を接続IDとして利用するので、テキストで記録しておいてください。
  • IPアドレスが[::]となっていますので、接続情報として利用する際にはこの部分をIPv4のパブリックアドレスに置き換えます。
    例示します。

“enode://ac2e8c893e4dd345f5e0b3e496eb8aa3d48612c2eee27e4b64a770d9dac5a6d1244ccf0fde2ce81050a152b05c9a48d314de205020b567700822e41e540c06df@13.78.1.25:30301″

  • 続いて、Coinbaseアカウントを作成します。このアカウントは、後ほど接続確認の送金テストで使用します。
    ここでは、アカウントのパスワードを”test”にします。

 > personal.newAccount(“test”)

  ”0x90364ea663f61be0eeae11502bddffa3e2086811″

  • gethノードを停止して離れます。

 > exit 

  • 接続確認の送金テストを実施するために1台目のCoinbaseアカウントにETHを初期値として保持させます。この設定は、genesis.jsonのallocに記載します。
    genesis.jsonは2台のノードで完全に同一の内容を設定してください。設定内容が異なると、接続できなくなります。

 $ vi /home/geth/genesis.json

 {

   ”nonce”: “0x0000000000000042”,

   ”timestamp”: “0x0”,

   ”parentHash”: “0x0000000000000000000000000000000000000000000000000000000000000000”,

   ”extraData”: “0x0”,

   ”gasLimit”: “0x8000000”,

   ”difficulty”: “0x2000”,

   ”mixhash”: “0x0000000000000000000000000000000000000000000000000000000000000000”,

   ”coinbase”: “0x3333333333333333333333333333333333333333”,

   ”alloc”: {

         “0x90364ea663f61be0eeae11502bddffa3e2086811”:{“balance”: “10000000000000000000000” }

     }

 }

 (genesis.jsonを保存して閉じてください)

  • 次に、上記の設定ファイルを使って、ブロックチェーンを初期化します。

 $  geth –datadir=./ init ./genesis.json

  • ここまでの作業が完了したら、改めてgethを起動して下さい。

(下記の–identityは1台目のノード用)

 $ geth  –identity “Test1” –networkid 12345 –datadir “/home/geth”  –port “30301”  –nodiscover –maxpeers 1  console 2>> /home/geth/eth.log

  •  gethが起動したら、まずは、コインベースアカウントが保持しているETHの残高を確認します。

    (下記は、送金元のノードの実行結果

 > web3.fromWei(eth.getBalance(eth.accounts[0]),”ether”)

 10000

 (相手側のノードの残高はゼロ)

 

3. ノード接続

  • 続いて、送金元のgethノードに相手となるgethノードの接続情報(”enode://……..”)を登録し、相手側のgethノードに送金元のgethノードの接続情報をそれぞれ登録します。

 > admin.addPeer(“相手の接続情報”)

   true

  • 以上で、設定は完了です。
    ノードの接続設定はgethを停止するとリセットされます。
    永続化する場合は、設定内容をstatic-nodes.jsonに記載します。

 

4. 接続確認

  •  まず、 ノードを接続できているか、それぞれのノードで下記のコマンドを実行し、相手を認識できているか確認します。

 > admin.peers

 (接続中のノードの情報が表示されます)

  • ノード情報が表示されれば、これまでの設定が成功しています。
    続いて、両ノードのコインベースアカウントのロックを解除しましょう。

 > personal.unlockAccount(eth.accounts[0],”test”,360000)

それでは、送金テストを実施します。

 > eth.sendTransaction({from: eth.accounts[0], to: “送金相手のアドレス”, value: web3.toWei(1000, “ether”)})
(この例では1,000ETHを送金しようとしています)

  • 両ノードでマイニングを開始しましょう。

 > miner.start()

  • 相手側のアカウントが1000ETH増加すれば、テストは成功です。 

 

設定がうまくいけば非常に簡単にスマートコントラクト用の分散型プライベートネットワークを構築することができます。
ただ、上記の手順に赤字で記載していますが、いくつか注意点がありますのでお気をつけください。