コードで学ぶブロックチェーン ビットコインで注目される新技術とは?

2016/09/17

Chris Ward

15

Articles in this issue reproduced from SitePoint
Copyright © 2016, All rights reserved. SitePoint Pty Ltd. www.sitepoint.com. Translation copyright © 2016, KADOKAWA ASCII Research Laboratories, Inc. Japanese syndication rights arranged with SitePoint Pty Ltd, Collingwood, Victoria,Australia through Tuttle-Mori Agency, Inc., Tokyo

ビットコインで注目される「ブロックチェーン」とはいったいなんなのか? 概念ではなく実際のコードで理解するためのファーストステップガイド。Webから一歩踏み出してみるのもおもしろいかもしれいませんね。。

数か月前、ベルリンで開かれたブロックチェーン・アワード(Blockchain award)に出席しましたが、そこで受けた印象は、新しいバズワードとなっている「ブロックチェーン」について、起業家や技術者たちはあらゆる分野に投入したいと考えているものの、その背後にあるコンセプトをすっかり理解しているわけではない、というものでした。

この記事を読んでいる人がブロックチェーンを、事業や真に画期的な技術における「まさに新しいバズワード」と確信しているかどうかはともかく、ブロックチェーンのコンセプトをアプリケーションにどのように使えるかについての開発者たちの理解は、往々にしてあいまいです。この点で「Eris Industries」のソリューションは、いくらか分かりやすくなっています。

Eris Industriesでは、より使いやすく、プロジェクトに適用できるように、ブロックチェーンとスマートコントラクトをパッケージで提供しています。この種の技術を使ったプロジェクトは、信頼とセキュリティの分散を必要とするアイデアの実現にもっとも向いています。

記事では、デモアプリケーションとして、仮想状況での特権ユーザー名のライブラリーを作成します。最後のセクションでは、デモアプリケーションを使ってリスト中のユーザー名を変更し、その値をチェックします。

インストールとセットアップ

Erisのインストールは複雑で、Erisのサイトのトップページにある手順ではうまくいかなかったため、同サイトの詳しい手順のページにあるステップに従いました。OS Xで「Docker Toolbox」(Dockerは必須)をインストールすると、ErisがHomebrewとともにインストールされました。

インストールが完了したら、次のコマンドでErisをセットアップして設定ファイルを作成し、必須のDocker images(Dockerイメージ)をダウンロードします(サイズが大きいです)。

eris init

Start Eris Process

Images Downloading

Process Completed

:Erisのドキュメントでは明示されていませんが、このあと紹介するコマンドを実行するのはDocker context内が最善です。Dockerは主にOS XとWindowsに対応していますが、さらに詳しいことはこちらを参照してください。

Gアクセスを許可する

認証用の、Erisの「keys」サービスを次のコマンドで開始します。

eris services start keys

このコマンドで、keysサービスの「the~/.eris/services」フォルダー内での定義に基づいてサービスが開始されます。Erisは、デフォルトで定義済みのアプリケーションタイプ用(たとえばToripfsbigchaindbなど)のキーを作成しますが、独自のタイプでも作成できます

次のコマンドで、特定のユーザーにサービスとアプリケーションへのアクセスを許可するキーを作成します。

eris keys gen

あとで使うためにキーを保存し、キー値をいま作成したものに置きかえます。

eris keys export E0F4BA1E6D15503074239A663101547074889574

次に以下のコマンドを使って、ホストマシンとコンテナでどのキーが利用可能か確認します。

eris keys ls

Erisの「keys」についてもっと知りたい人には、Eris Industriesのkeyに関するチュートリアルをお勧めします。

ブロックチェーンの作成

次に、simplechainタイプのブロックチェーンを「library_chain」という名前で以下のように作成します。

eris chains make library_chain --account-types=Root:2,Full:1 simplechain

隠しフォルダー「~/.eris」にアクセスすると、上のコマンドで生成されたファイルを確認できます。「~/.eris」内には図のような一連のファイルがあります。

Eris Hidden Files

  • genesis.json:ブロックチェーンの「genesis」ステートを与えて、特定のブロックチェーンのインスタンス作成方法をErisに伝える
  • accounts.csvvalidators.csv:genesis.jsonファイルが失われた場合、あとでこの2つのファイルを使って新しいgenesis.jsonファイルを作成できる
  • addresses.csv:ノードのアドレスと「名前」を格納する

次のコードで、ブロックチェーンのインスタンスを作成します。

eris chains new library_chain --dir ~/.eris/chains/library_chain/library_chain_full_000

チェーンが存在し、動作していることを確かめます。

eris chains ls

Chain Existing

コントラクト

「スマートコントラクト」はブロックチェーン関連のポピュラーな用語で、「送信したトランザクションをブロックチェーンが解析することに関する合意」を意味します。簡単なErisでの例として、値をsetし、次いでgetでその値を返すコントラクトを作成します。はじめにアプリケーション用のフォルダーを作成し、そのフォルダーに移動します。

cd ~/.eris/apps
mkdir library
cd library

このフォルダー内に「library.sol」ファイルを作成し、ファイルに次のコードを追加します。

contract Library {
  string storedData;

  function set(string x) {
    storedData = x;
  }

  function get() constant returns (string retVal) {
    return storedData;
  }
}

このファイルは適度に読み取りやすく作成し、string変数とこれに関連したset関数、get関数を定義します。

次に、内部で実行されるjobを探すEris package managerによって読み出される「epm.yaml」ファイルを以下のように作成します。

jobs:

- name: setStorageBase
  job:
    set:
      val: "Book Title"

- name: deployStorageK
  job:
    deploy:
      contract: library.sol
      wait: true

- name: setStorage
  job:
    call:
      destination: $deployStorageK
      data: set $setStorageBase
      wait: true

- name: queryStorage
  job:
    query-contract:
      destination: $deployStorageK
      data: get

- name: assertStorage
  job:
    assert:
      key: $queryStorage
      relation: eq
      val: $setStorageBase

job宣言には比較的分かりやすいものとそうでないものがありますが、詳しくはjob仕様書(job specification document)を参照してください。

次に、Erisがこれらの2つのファイルを参照できるようにし、必要なほかのファイルを生成し、それから以下を実行することが必要です。

  1. コントラクトをデプロイする
  2. トランザクションをコントラクトに送信する
  3. コントラクトからの結果をクエリする
  4. 結果をアサートする

まず、コントラクトをデプロイする場所のアドレスを取得します。

addr=$(cat ~/.eris/chains/library_chain/addresses.csv | grep library_chain_full_000 | cut -d ',' -f 1)

echo $addr

次に、アプリケーションのフォルダー(~/.eris/apps/library)内で、作成したファイルにEris package managerを呼び出し、ブロックチェーンにコントラクトをデプロイします。

eris pkgs do --chain library_chain --address $addr

このコマンドで、宣言したjobが表示され、それらのjobがデプロイされ、この場合は文字列「book title」で、アサーションが実行されたことが返されます。

Assert Results

アプリケーションの作成

今度は、ブロックチェーンとやり取りし、ブロックチェーン上でアクションを実行するコードを書きます。このコードは、ブロックチェーン内のブック用に新しい値を設定し、それから現在の値を確認することをユーザーに許可するシンプルな例です。

例ではNode.jsを使っているので、最初に以下の内容のpackage.jsonファイルを~/.eris/apps/libraryフォルダー内に作成します。

{
  "name": "library_app",
  "version": "0.0.1",
  "dependencies": {
    "eris-contracts": "^0.13.1",
    "prompt": "*"
  }
}

次にapp.jsファイルを作成し、以下を追加します。

'use strict';

var contracts = require('eris-contracts');
var fs = require('fs');
var http = require('http');
var address = require('./epm.json').deployStorageK;

var abi = JSON.parse(fs.readFileSync('./abi/' + address, 'utf8'));
var accounts = require('../../chains/library_chain/accounts.json');
var chainUrl = 'http://192.168.59.103:1337/rpc';
var manager = contracts.newContractManagerDev(chainUrl,
  accounts.library_chain_full_000);
var contract = manager.newContractFactory(abi).at(address);

最初のコードブロックでrequire、abi(ブロックチェーンとアプリケーション間の「翻訳者」)用のEris指定の変数、前述のアカウント(accounts)、チェーンのIPアドレス(ここではboot2docker ip)を設定し、そしてチェーンのmanagerとcontractを開始します。

詳細な点のいくつかは別として、以下のコードの大半はJavaScript領域では比較的なじみ深いものです。ノードサーバーを作成し、リクエストをリスニングし、ブロックチェーンとの間で必要に応じてデータを読み書きします。

var server;
server = http.createServer(function (request, response) {
  var body;
  var value;

  switch (request.method) {
    case 'GET':
      console.log("Received request for details.");
      contract.get(function (error, result) {
        if (error) {
          response.statusCode = 500;
        } else {
          response.statusCode = 200;
          response.setHeader('Content-Type', 'application/json');
          response.write("You have requested details on: " + result);
        }
        response.end('\n');
      })

      break

    case 'PUT':
      body = '';

      request.on('data', function (chunk) {
        body += chunk;
      });

      request.on('end', function () {
        console.log("Received request to set title to " + body + '.');

        contract.set(body, function (error) {
          response.statusCode = error ? 500 : 200;
          response.end();
        });
      });

      break;

    default:
      response.statusCode = 501;
      response.end();
  }
});

server.listen(process.env.NODE_PORT, function () {
  console.log('Listening for HTTP requests on port ' + process.env.NODE_PORT +
    '.');
});

NODE_PORTには、適切な値の設定が必要な場合もあります。

アプリケーションに「curl」コマンドを実行して値をPUTします。

curl --request PUT --data Jane http://localhost:1111
# Or whatever your node IP address is

ここでアプリケーションをGETすると、値が変更されたことを確認できます。

curl http://localhost:1111

「curl」コマンドとNode.jsアプリケーションからの出力を確認すると、バックヤードで進行中の事柄についていくらかはっきりした概念をつかめます。

最後に

最初、Erisを使った基本的なアプリケーションを始めるのは面倒に感じるかもしれません。とはいえ、特に問題が生じなければ、セットアップのステップに実際それほど時間をかけなくても、アプリケーションでブロックチェーンの使用を始められます。

実のところ、ブロックチェーンを使用するアプリケーションのコーディングは、大きく複雑なトピックで、ここでは表面をなぞってきただけにすぎません。次のステップとして、ErisのWebサイトにあるチュートリアルを読みながら、ぜひブロックチェーンの本格的なユースケースをアプリケーションにしっかり実装してみてください。

(原文:Building Your First Blockchain App with Eris

[翻訳:新岡祐佳子/編集:Livit

Copyright © 2016, Chris Ward All Rights Reserved.

Chris Ward

Chris Ward

開発者関連、技術系の執筆・編集、(ボード)ゲームデザイン、教育、解説、ほかにもいろいろ手掛けています。SitePoint.comのモバイルエディターでもあります。イギリス系オーストラリア人で、ベルリン在住。ようこそ(Herzlich Willkommen)!

Loading...