United Statesからアクセスのようです。言語設定をEnglishに切り替えますか?
Switch to English site
Skip to main content

Raspberry PiでEthereumを探索する - パート2: プライベートブロックチェーンを作成しよう

blockchain1_ca4d1262260cfbe880952a43aee510691e6a2e06.jpg

事前に用意した資金とピアノードで新しいテストネットワークを構築しよう

本記事は、「Raspberry PiでEthereumを探索する」シリーズのパート2だ。パート1では、Ethereumの基礎について調査した。まずはEthereumがもっともシンプルな仮想通貨であり、スマートコントラクトのための分散プラットフォームの提供について解説している。その次にEthereumのP2Pネットワークに参加するためのgethクライアントのインストール手順と、そのアカウントの作成方法、さらにいくつかのシンプルなコマンドの動作について解説した。

今回はプライベートブロックチェーンを作成するところからEthereumを少し詳しく解説します。新しいブロックチェーンから始めるため、完全に同期することが可能です。そのため、ノードをlight synchモードに設定する必要がないので注意してほしい。

Mainnetとの同期の停止

もしあなたがPart1に沿ってノードがmainnetを利用できるように設定し、light synchronizationモードで動作(--syncmode lightオプションを付けて動作)しているならば、以下のコマンドで動作を停止、スタートアップを無効にできる。

$ sudo systemctl stop geth@pi.service

$ sudo systemctl disable geth@pi.service

新しいアカウントを作成

CP2_geth_account_new_1693fc9832c0f3a39bd49b8862bdd56683f2492d.jpg

今回のテストのために新しいブロックチェーンネットワークの名前を考えよう。そこで、今回は”DesignSpark”という名前を利用することにした。デフォルトでEthereumはあなたのホームディレクトリのサブディレクトリに”.ethereum”という隠しフォルダの中にデータを保存しているはずだ(Linux/BSDの場合)。そこで、今回のテストではプライベートのブロックチェーンを分けたいので、”.designspark”というフォルダを作成し、ここにデータを保存することにした。

新しいアカウントを作成する場合には以下のコマンドを入力しよう。

$ geth --datadir .designspark account new

ここで、作成したアカウントのアドレスをメモしておこう。資金の事前準備のために新しいネットワークが必要になるはずだ。

始まりはblock 0から

CP2_geth_init_5fae5332fb0684c4291662b0931f040fe843c52d.jpg

一般的なチェーン(鎖)には、最初のリンクがないと他のチェーンとつなぐことはできないことは想像できるだろうか。ブロックチェーンでも同じである。ブロックチェーンではネットワークに参加するためのノードの初期のセットが必要だ。これはJSONファイルを利用して設定される。以下はそのファイルの例だ。

{
    "config": {
        "chainId": 555,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
    "difficulty": "20",
    "gasLimit": "2100000",
    "alloc": {
        "1fd4027fe390abaa49e5afde7896ff1e5ecacabf":
        { "balance": "20000000000000000000" }
    }
}

‘chainId’はネットワークを識別するための数値だ。現在のそれらのパブリックネットワークのリストはここで確認してほしい。今回はプライベートDesignSparkネットワークのために555というIdにしたが、もちろんほかの数値でも大丈夫だ。

その他のパラメータについて

  • homesteadBlock: HomesteadはEthereumリリースとチェーンを示しており、0に設定されている。
  • eip155Block: 今回のチェーンはEIP155にハードフォークしないので0にセット。
  • eip158Block: 今回のチェーンはEIP155にハードフォークしないので0にセット。
  • difficulty: 自分たちの場合のマイニング難易度をここで設定する。今回はこれをリーズナブルに低くした。
  • GasLimit: ブロックごとのGasコストの制限。
  • alloc: アカウントの事前に用意した資金のアドレス。

Ethereum Improvement Proposals (EIPs, Ethereum改善提案)では、Ethereumプラットフォームの標準について述べている。新しいものが発行されると、その問題点などについての指摘が行われる。ネットワークが成長するにつれて、ある時点においてEIPsを取り入れることが可能になる。これは、今回のようなプライベートネットワークにおいては気にする必要がないものであるが、EIP155がmainnetでどのように実装されたか、何をしているかなどの詳細についてはSpurious Dragonを参照して欲しい。

Gasはいわゆる“賃金”である。ブロックチェーン上では、あるアカウントがどれくらい仕事をしたか、そのアクションの対価として賃金を支払う必要がある。マイニングに対してももちろん賃金を支払う必要があるが、スマートコントラクトについても同様だ。このスマートコントラクトとはコードの機能やブロックチェーン上でほかの契約者とやりとりしたり、意思決定をしたり、データの保存や、Ethereumをほかの人に送ったりするオブジェクトだ。今後の記事で、さらに細かく解説する予定だ。

Allocは事前の資金の用意(事前資金割り当て)だ。私たちが事前に作成しておいたアカウントのアドレスをここに入力しておく。

このように作成した設定ファイルをdesignspark.jsonという名前で保存し、以下のコマンドでネットワークを初期化する。

$ geth --datadir .designspark init designspark.json

このように、今回私たちのgenesis block(生成ブロック)を書くだけで新しいネットワークを始めることができるのだ。また、後からノードが参加する場合にも同様の方法で初期化され、メンバーとして参加することも可能だ。

最初のノードを始めよう

CP2_geth_console_8fccd195c1af8dc8deb3ddc80fdf6590b9e92dec.jpg

JavaScriptコンソールで最初のノードを始めるために以下のコマンドを入力しよう。

$ geth --identity chainpi --rpc --rpcport 8080 --rpccorsdomain "*" --datadir .designspark --port 30303 --nodiscover --rpcapi "db,eth,net,web3" --networkid 555 console

これらのパラメータの意味については以下の通りだ。

  • indentity: Ethereumノード識別子のセット
  • rpc*: 様々なRPC設定を行う。利用可能なAPIとそれらに誰がアクセスするか、について記述する。
  • datadir: 以前作成したデータを保存しておくディレクトリを指定する。
  • nodiscover: 私たちのノードは発見可能ではないことを意味している。
  • networkid: インストール中に設定したネットワークIDの数値。

CP2_get_balance_66003dcc5217ec50d8776fdbec1b7105449c55b0.jpg

一度コンソールへ入力すると、eth.accountsを利用して利用可能なアカウントをリストアップできるようになる。また、eth.getBalanceではBalance(残高)を確認できる。

> eth.accounts

> primary = eth.accounts[0]

> balance = web3.fromWei(eth.getBalance(primary), “ether”);

返ってきた数値はdesignspark.jsonによって割り当てられた数値よりも非常に小さいことに気付くだろうか。これはEthereumとしてのBalanceが返ってきたためだ(用意したBalanceがEthereumの値に変換されている)。初期化時の割り当てはWeiという最小単位にて指定されている。

2番目のノードの作成

CP2_getbalance2A_891aa71a81d6843c3856bd83f2c44b8670579d42.jpg

ノードが一つしかないブロックチェーンネットワークはあまり役に立たないだろう。そのため2つ目のノードを作成しよう。今度はDebian/Ubuntuを実行するラップトップやデスクトップPCなど、少し余裕のあるPCの利用を推奨する。現在はマイニングしていないが、将来マイニングのためにマイナーを実行したい場合の必要となる可能性が高いためだ。

さて、要約するとステップは次の通りとなる。

  • gethをインストール
  • 先のコマンドを実行してアカウントを作成
  • 先のJSON構成ファイルを利用して初期化
  • 以前と同じようにノードを起動するが、そのとき指定するIDは別のものを指定

これらを実行してノードを起動、開始するとJavaScriptコンソールにドロップされ、新しいアカウントのBalanceをもう一度確認することができる。

> eth.accounts

> primary = eth.accounts[0]

> balance = web3.fromWei(eth.getBalance(primary), “ether”);

今回、Balanceが0であることが確認できる。これはアカウントに資金を用意していないためだ。

ピアとの接続

CP2_nodeinfo_d3658c62f3995350236ea292095f9ed75cb6761e.jpg

私たちのノードは今回プライベートであるため、発見可能にしたくない。そのためnodiscoverオプションを付けている。このとき、ピアに接続するためにいくつかの設定を行う必要がある。そこでdatadir(今回は.designspark)にstatic-node.jsonと呼ばれるファイルを作成する。

まず初めに、各システム上のJavaScriptコンソールから各ノードのenode URLを取得する必要がある。

> admin.nodeInfo.enode

以下のようなStatic-nodes.jsonファイルが生成されるはずだ。

[
"enode://01f5ecc7c232f7571175bffc71c4e1608e1308e2ce7fd6ed3ae17d5e97e2d5253dcaa854286f99991d671788127f7902fa56d20875eabae49665a515da105047@10.100.1.196:30303", "enode://5156218119a3697389a34bf0a19ceca49d9f3d06948836b8cc6c206c9f7b7081e64537eeb0f9c059561736a8e7cb6ebbe438028dd949d0f69f4cab642c11d46c@10.100.1.229:30303"
]

ご自身の環境ではIPアドレスが置き換えられ、discport=0が後ろに付くだろう。

CP2_adminpeers1_8cde8942fb963973ec0a1ffadf5df59752491122.jpg

一度、このファイルが両方のノードで作成されると、gethをCtrl+Dで終了し、コンソールを再起動しても問題ない。以下のコマンドを最初のノードで入力すると、2番目のノードの詳細を確認することができる。

> admin.peers

CP2_adminpeers2_e574e1344263b390830b64ee97aa027696f700d9.jpg

これを同様に2番目のノードで行うと、最初のノードの詳細を確認することができる。

そう、以上のように私は“自分のためのブロックチェーン”を持つことができるようになった。この2つのノードはお互いに同じアカウントで制御されており、1つの資産が割り当てられているのだ。

シリーズのパート3ではネットワークのやり取りについて見てみよう。資産の転送(送金)、スマートコントラクトとEtherマイニングの実行について紹介する。

Andrew Back

Open source (hardware and software!) advocate, Treasurer and Director of the Free and Open Source Silicon Foundation, organiser of Wuthering Bytes technology festival and founder of the Open Source Hardware User Group.
DesignSpark Electrical Logolinkedin