自分だけのEthereum(イーサリアム)作ってみた【第一回:準備編】

ブロックチェーン

自分だけのEthereum(イーサリアム)作ってみた【第一回:準備編】

おはようございます。平野羽美です。
今回から複数回にわたって、時価総額2位の仮想通貨であるEthereum(イーサリアム)をローカル環境上で動かし、「自分だけのEthereum」の構築方法をまとめていこうと思います。

本記事では、ローカル環境でGo言語実装のEthereum(Geth)を実行するまでを紹介していきます。


Ethereumとは

Ethereumは、分散アプリケーションを構築するためのプラットフォームで、ブロックチェーン技術がベースとなっています。
ここでいうプラットフォームとは、OSやミドルウェアのようにアプリケーションやソフトウェアが動作する基盤の仕組みを指しています。
分散アプリケーションについてはこちらのサイトに詳細や定義が記載されています。
これまでの一般的なシステムとは異なり、特別な権限を持った管理者がいない状態でシステム全体が信頼性を保てる(非中央集権)ようにできています。

ブロックチェーン技術を利用した例としては「Bitcoin」が有名かと思います。
EthereumはこのBitcoinと似た特徴も持ちつつ、ある契約に紐づく処理をプログラムできるスマートコントラクトという仕組みなどが追加されたプラットフォームとなっており、仮想通貨としての時価総額もBitcoinに次いで第二位となっています。

Ethereumの詳しい解説はこちらのページが参考になるかと思います。
なお、ブロックチェーン技術自体の解説は、過去の記事もございますのであわせてご覧ください。

Ethereumがいっぱい?

いざEthereumを使ってみよう、となった時におそらく戸惑うのが、実装方式の種類の多さかと思います。
下記のリンクからEthereumのオープンソースプロジェクトを探せるのですが、いくつも種類が出てきてどれをインストールすれば良いのか初見では分かりづらいです。
https://github.com/ethereum

公開されているソースをよく見ると中にはGo言語やC++、pythonでの実装など、複数の言語で実装されたEthereumが存在します。

Ethereumの実装例

  • Go言語:go-ethereum(Geth)
  • C++実装:cpp-ethereum
  • python実装:pyethereum

実はEthereum自体はアプリケーションではなく、プロトコル(決まり、規則)のようなもので、Ethereumの仕組みを扱うための機能を備えていればどんな言語でも実装することができるようになっています。

今回は、公式で推奨されている環境であるGo言語実装のEthereum(Geth)を利用していきます。

実践、Ethereum起動

さて、ここからはEthereumを使えるようにするための手順を紹介します。
コマンドの紹介が多くなるので、少し技術的な内容になりますのでご容赦ください。

Gethのインストール
Gethのインストールは実はかなり簡単です。
ubuntu等のLinux環境を利用している場合、以下のコマンドでインストールできてしまいます。
$ sudo add-apt-repository -y ppa:ethereum/ethereum
$ sudo apt-get update
$ sudo apt-get install ethereum

また、Mac環境を利用している場合は、Homebrewを利用してのインストールも可能です。
$ brew tap ethereum/ethereum
$ brew install ethereum

[少し上級者向け]
インストールするGethのバージョンを指定したい等の理由がある場合、gitから直接コードを取得する方法もあります。
個人的にはこちらの方が扱いやすかったりはします。
git clone -b release/1.7 https://github.com/ethereum/go-ethereum
gitからソースコードを取得します。
※今回はGeth 1.7を例に紹介しています。

cd go-ethereum
make geth

取得したソースコードを元にmakeコマンドでGethをインストールします。

・・・
github.com/ethereum/go-ethereum/les
github.com/ethereum/go-ethereum/ethstats
github.com/ethereum/go-ethereum/contracts/release
github.com/ethereum/go-ethereum/cmd/utils
github.com/ethereum/go-ethereum/cmd/geth
Done building.
Run "$ETH_HOME/go-ethereum/build/bin/geth" to launch geth.
>$

こちらのような実行結果が出ればmakeは完了です。

プライベート・ネットへの接続
Ethereumは時価総額二位の仮想通貨として常に実行中の環境(ライブ・ネット)が存在します。
上の手順でインストールしたGethを利用してこの環境に接続することもできます。
…が、ライブ・ネットでは、個人的なやりとりやテストが実施しづらいため、
今回はローカル環境(プライベート・ネット)で実行してみます。

  1. genesisファイルを作成する
  2. プライベート・ネットの最初のブロックであるgenesisブロックの情報を記載したファイルを用意します。
    なお、詳しい説明は省略しますが、genesisブロックとは新しいブロックチェーンを作った時に各ブロックが繋がっていく最初のブロックであり、このファイルに記載された内容によって次につなげるブロックの特徴も変わってきます。

    {
    “config”: {
    “chainId”: 10,
    “homesteadBlock”: 0,
    “eip155Block”: 0,
    “eip158Block”: 0
    },
    “alloc” : {},
    “coinbase” : “0x0000000000000000000000000000000000000000”,
    “difficulty” : “0x400”,
    “extraData” : “”,
    “gasLimit” : “0x2fefd8”,
    “nonce” : “0x0000000000001234”,
    “mixhash” : “0x0000000000000000000000000000000000000000000000000000000000000000”,
    “parentHash” : “0x0000000000000000000000000000000000000000000000000000000000000000”,
    “timestamp” : “0x00”
    }

    上の例はgithub上のサンプルを活用しています。
    今回の例では、サンプルソースからnonce、difficulty、chainIdの3箇所を変更しています。
    difficultyはマイニングの難易度を示しており、今回のテストではあえて難易度を下げてすぐにマイニングが成功するようにしています。
    > ETHが全然もらえないと面白くないので…

    上記の内容を記載したファイルは「myGenesis.json」として任意のディレクトリに配置します。

  3. genesisブロックの初期化
  4. geth --datadir $ETH_HOME/testNet init $ETH_HOME/testNet/myGenesis.json

    `–datadir`オプションで指定したディレクトリ以下に`geth/chaindata`ディレクトリが新しく作成されて、
    その中にgenesisブロックのブロックチェーン情報が保存されます。
    ※$ETH_HOMEはGethをインストールしたディレクトリのPathを省略しています

  5. Gethコンソールの起動
  6. geth --networkid "10" --nodiscover --datadir "$ETH_HOME/testNet" console 2>> "$ETH_HOME/testNet/geth_err.log"
    `Welcome to the Geth JavaScript console!`と出ればOK
    コンソールからは`exit`で抜けられます


さて、ここからいよいよEthereumを使っていくのですが、続きは次回とします。
今回はローカル環境でGo言語実装のEthereum(Geth)を実行するまでを紹介してきました。

一見ハードルが高そうなブロックチェーンの構築も、意外とすぐにできたりしますので、興味のある方はチャレンジしていただければと思います。

以上、平野でした。


参考サイト