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

Raspberry PiでEthereumを探索する - パート1: はじめに

Pi_Ethereum1_1fa72be7f086b5bdc06c00c480ed56dd73840657.jpg

 Pi 3モデルBでEthereumのブロックチェーンクライアントをインストールして実行する。

ブロックチェーンは、ここしばらく非常にホットな話題だ。これには、暗号通貨(特に注目すべきはビットコイン)が、その早期利用者に対してわずか一晩で生み出したと思われる富と、暗号通貨が切り開く新しい経済的可能性が少なからず関わっている。

しかし、ブロックチェーンは暗号通貨よりもはるかに多くのものに使用できる。Greigが最近の投稿で指摘したように、ブロックチェーンは、その分散される性質と不正開封防止レコードの取引を検証する機能により、IoTの用途で使用できる。Ethereumプラットフォームの興味深いところは、単純な暗号通貨と安全な取引だけでなく、分散コンピューティングプラットフォームを提供する点だ。

この記事では、Ethereumアーキテクチャを簡単に確認し、主要な概念とコンポーネントをいくつか説明してから、Raspberry Piへのクライアントソフトウェアのインストールに進む。明確化のために言うと、パワフルなGPUが必要だから暗号通貨についてマイニングはしない。ただし、Piを使用して実験用の簡単なサンドボックスを作成でき、これは、組み込みプラットフォームを使用してブロックチェーンテクノロジーを展開することが可能であることも示している。

Ethereum 101

contract mortal {
    /* Define variable owner of the type address */
    address owner;

    /* This function is executed at initialization and sets the owner of the contract */
    function mortal() { owner = msg.sender; }

    /* Function to recover the funds on the contract */
    function kill() { if (msg.sender == owner) selfdestruct(owner); }
}

contract greeter is mortal {
    /* Define variable greeting of the type string */
    string greeting;
    
    /* This runs when the contract is executed */
    function greeter(string _greeting) public {
        greeting = _greeting;
    }

    /* Main function */
    function greet() constant returns (string) {
        return greeting;
    }
}

Ethereumのスマートコンタクトの例。出展: ethereum.org

ブロックチェーンとは、一般にピアツーピアネットワーク経由で管理される分散型台帳だ。レコード(つまりブロック)が連続的に追加されそのサイズが大きくなっていく。ブロックには通常、タイムスタンプと取引データが含まれている。またブロックは、ハッシュアルゴリズムを使用して暗号化保護されているため、データが一度コミットされると、コミットされたデータは変更不可能になる。

Ethereumプラットフォームはetherと呼ばれる独自の暗号通貨を持っているが、さらにブロックチェーンテクノロジーを利用して、スマートコントラクト用の分散プラットフォームを作成する。スマートコントラクトは、コード関数を含み、ブロックチェーン上に存在するオブジェクトで、他のコントラクトとの連携・決定・データの保管・他のプラットフォームへのetherの送信を行うことができる。

スマートコントラクトは、JavaScriptベースのSolidityと呼ばれる言語で実装される。Solidityコンパイラを使用してスマートコントラクトをバイトコードにコンパイルし(JavaScript・Python・Java・Androidなどのコードでコンパイルした後で実行するように)、コンパイルされたスマートコントラクトはEthereum仮想マシン(EVM)で実行される。スマートコントラクトで取引の実行に関わるコストがあるが、これについては今後の記事で説明する。

Ethereumでは、さまざまな多くのクライアントアプリケーションと、Go言語で記述されたオリジナルのリファレンス実装gethを利用できる。etherは、これらのいくつかでマイニングでき、スタンドアロンのマイニングソフトウェアもある。さらに分散アプリケーション用のGUIクライアントとIDEも利用可能だ。

主要なパブリック型Ethereumブロックチェーンネットワークmainnetの他に、実験用のテストネットワークもあります。独自のプライベートネットワークを作成することもできる。

 gethのインストール

CP_geth_make1_ff91cce5e5450ced1866d24248b81b1b8326209c.jpg

Raspbianを既にインストールしている場合は、最初に、インストールされているパッケージソフトウェアを最新バージョンに更新する。

$ sudo apt-get update

$ sudo apt-get dist-upgrade

 Ethereumクライアントを初めてコンパイルしようとしたときにメモリ不足になった。メモリ集約型タスク向けにRAMを解放するために、GPUに割り当てられるメモリ容量を削減する。またグラフィカルデスクトップが実際には不要な場合は、コマンドラインから起動するようにシステムを設定する。

$ sudo raspi-config
  • 3 → Boot
  • B1 → Desktop / CLI
  • B1 → Console
  • 7 → Advanced
  • A3 → Memory Split
  • 16 (MB)
  • Reboot

次に、パッケージ化された依存関係をインストールする。

$ sudo apt-get install git golang libgmp3-dev

これに続き、geth用のソース、Ethereumノード用の正式なGo言語実装を入手したら、これらをコンパイルし、実行可能ファイルを/usr/local/bin/にコピーする。

$ mkdir src

$ cd src

$ git clone -b release/1.7 https://github.com/ethereum/go-ethereum.git

$ cd go-ethereum

$ make

$ sudo cp build/bin/geth /usr/local/bin/

アカウントの作成とテスト

CP_geth_account_new_dbe1594a9757b68967faa56511301254750bee1a.jpg

最初に、gethを使用して新しいアカウントを作成する。

$ geth account new

これにより暗号化キーの新しいセットが作成され、プライベートキーがパスワードで保護される。このアカウントを使用して暗号通貨をマイニングし、有意義な取引を行う場合は、キーをバックアップして、プライベートキーがアクセスされないようにする。

次にノードを起動する。

CP_geth-firstRun_51a18f5c62808f7a3ca802da072d51d3fbf918aa.jpg

$ geth --syncmode light --cache 64 --maxpeers 12

引数なしでgethを実行すると、ノードが起動し、パブリック型mainnetブロックチェーン全体を同期しようとする。サイズが50GBを超え、拡大を続けている場合、組み込みコンピュータではうまくいかない可能性があり、代わりにライト同期モードでノードを起動する。これにより、表示されているブロックヘッダーのみが取り込まれ、ブロックチェーンの他の部分は必要に応じて取り込まれる。

ノードを強制的に終了させるには、CTRL-Cを押す。起動時にサービスとして実行するには、以下のように入力する。

$ sudo vi /etc/systemd/system/geth@.service

(「vi」をお気に入りのテキストエディタに変更する)

次に以下を入力する。

[Unit]
Description=Ethereum daemon
Requires=network.target

[Service]
Type=simple
User=%I
ExecStart=/usr/local/bin/geth --syncmode light --cache 64 --maxpeers 12
Restart=on-failure

[Install]
WantedBy=multi-user.target

ファイルを保存する。この後、Ethereumノードを「pi」ユーザーとして実行するには、以下のように入力する。

$ sudo systemctl enable geth@pi.service
$ sudo systemctl start geth@pi.service

CP_gethAttach_db7a4f9b6dc9cb9fccef9219297ae92cd262f979.jpg

Ethereumノードをサービスとして実行すると、以下を使用してEthereumノードに接続できる。

$ geth attach

これにより、インタラクティブなJavaScriptコンソールが表示される。ここから、以下のように関数を呼び出すことができる。

> eth.accounts

これで現在のアカウントのリストを表示する。

CP_gethAttach_admin-peers_9e4b78b6f051577ac537a4304e648a00fc258694.jpg

接続されているピアに関する情報を取得する場合は、以下のようにする。

> admin.peers

ライトクライアントプロトコルはまだ開発中で、やや実験的であり、完全にピア/ノードに依存して機能している。そのため、ライトクライアントプロトコルを使用してEthereum mainnetブロックチェーンで取引を行うことは、執筆時点では全く実用的ではないかもしれません。しかし物事は急速に動いており、それほど遠くない未来に、この状況は簡単に変わる可能性がある。

まとめ

これまで、クライアントソフトウェアのインストール、アカウントの作成、ノードの起動、ピア接続の観察を行った。次の記事では、実際に取引を実行するところを見ていこう。

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