目次


はじめての Blockchain

Comments

はじめに

最近、「ブロックチェーン (Blockchain)」という言葉を目にしたことがある方も多いと思います。ただ、実際には「とりあえず取引に使うもの」のような漠然とした認識の方が多いのではないでしょうか?

この記事では、ブロックチェーンにはじめて触れる方を対象に、Bluemix 上の Blockchain サービスを使いブロックチェーンの概要について説明します。

  1. ブロックチェーンのキホン
  2. Blockchain サービス概要
  3. 触ってみようブロックチェーン
  4. おわりに
1

ブロックチェーンのキホン

1-1. ブロックチェーンとは?

ブロックチェーンはデータを管理する仕組みの一つです。データの管理といえば限られた場所に保管する「中央集権」の管理方法が一般的ですが、ブロックチェーンは複数台のコンピューターにデータを管理する台帳を持たせ、ネットワーク越しに各コンピューター上の台帳を同期させるのが特徴です。金銭や不動産といった「資産」が誰に所有されているかを記録することに適していると言われています。

「台帳」というと「A さん:残高 100 円、B さん:残高 200 円」といった表のようなものを想像する方が多いと思いますが、ブロックチェーンでは、下図のように台帳が「A さんが B さんに 10 円送金」といったやりとりの 1 つ 1 つがチェーンのようにつながったもので出来ています。このような「10 円送金」というやりとりは「トランザクション」と呼ばれ、トランザクションと管理に必要なデータとを合わせて「ブロック」を作成し、順次つなげています。ブロックがつながって「チェーン」のようになることからブロックチェーンの名が付いています。それぞれのブロックには前のブロックの要約となるデータを含んでいるため、ブロックの改ざんが困難になっています。

図 1. ブロックチェーンのネットワーク概要
ブロックチェーンのネットワーク概要図
ブロックチェーンのネットワーク概要図

1-2. ブロックチェーンのメリット

ブロックチェーンのメリットは、従来のシステムに比べてデータを管理するコストが低いとされています。

非ブロックチェーンである従来のシステムでは、下図のように取引履歴を保持するために 1 つのコンピューターがデータを書き込む台帳を持ち、台帳を「中央集権」のように集中管理しています。取引の窓口となるコンピューターはシステム内に複数ありますが、台帳のデータが必要であれば台帳を持つコンピューターから取得します。台帳が改ざんされてしまうとシステムの信用に影響するので、台帳を持っているコンピューターを厳重に管理するためのコストが必要です。

図 2. 従来のシステムにおけるデータ管理
従来のシステムにおけるデータ管理の図
従来のシステムにおけるデータ管理の図

ブロックチェーンを使ったシステムでは、「中央集権」となるコンピューターは置かず、ネットワーク内の全てのコンピューターが同じ内容の台帳を持っています。新たに取引が発生してブロックを追加する場合は、全てのコンピューターが追加されようとしているブロックが正しいかどうかを検証し、一定数のコンピューターで正しいと判断されたブロックのみ台帳に追加される仕組みになっています。そのため、一部のコンピューターが不正なデータを追加しようとしても阻止されるので、個々のコンピューターを厳重に管理する必要はなく、データを集中管理するよりも管理のコストは低くなります。

データ管理のコストが低くなることで、例えば銀行の場合では、手数料が低価格となり、従来実現できなかった数円単位での小額取引も実現可能になるのではないかと考えられています。

1-3. ブロックチェーンを使った取引の流れ

ブロックチェーンの取引の流れとして、「A さんが B さんに 10 円送金する取引」を考えます。

ここでは、複数の台帳管理用コンピューターがブロックチェーンのネットワークを形成していると想定します。ユーザーはブロックチェーンネットワーク外の ATM を経由し、台帳管理用コンピューターの一つにリクエストを送信します (下図の右下参照)。

ここで、A さんはネットワークのコンピューターa に対し、B さんに 10 円送金したいというリクエストを送信したとします。

図 3. ブロックチェーンの取引の流れ (1)
ブロックチェーンの取引の流れ (1)
ブロックチェーンの取引の流れ (1)

コンピューターa は A さんのリクエストを受け取ってブロックを作成し、他のコンピューターにもブロックを配信します。各コンピューターは台帳に追加してよいか確認してから台帳に追加します (下図参照)。

※確認方法によっては、全てのコンピューターでブロックを追加していいと確認した後でないと、ブロックを追加できない場合もあります。

図 4. ブロックチェーンの取引の流れ (2)
ブロックチェーンの取引の流れ (2)
ブロックチェーンの取引の流れ (2)

全てのコンピューターでブロックが追加された後は、ネットワーク内のどのコンピューターも同じデータを持っている状態です。例えば、下図左下のように 10 円の送金先のユーザーB さんがコンピューターb から残高を確認すると、10 円増えています。

図 5. ブロックチェーンの取引の流れ (3)
ブロックチェーンの取引の流れ (3)
ブロックチェーンの取引の流れ (3)

1-4. 不正なブロック追加防止の仕組み

1-2 で触れましたが、ブロックチェーンには不正な取引データを含むブロックの追加を防止する仕組みが備わっています。不正なブロックの追加を防止する方法は様々なものがありますが、有名なものは「Proof of Work」で、ブロック追加にハードルを設ける方法です。ハードルを設ける方法も様々なものがありますが、ブロックの作成に難しい計算が必要な状態とするビットコインの UTXO が有名です。この場合、一番速く作成されたブロックを正当なものとして承認し、各コンピューターが台帳に追加します。ネットワーク内のコンピューターのうちどれかがブロックの作成に成功すると、他のコンピューターは計算をやり直します。複数のコンピューターが同時に計算を終えた場合はチェーンが分岐する形でブロックが一旦追加されますが、その後多くのコンピューターに支持されて長く延びた分岐を正当なものとし、他の分岐は削除されます。そのため、1 台のコンピューターが不正なブロックの追加に一旦成功しても、不正なブロックを選んでチェーンを延ばすことは困難です。他に正当なブロックの分岐があれば、その間に他のコンピューターが次々と正当なブロックの分岐にブロックを追加するので、下図のように不正なブロックの分岐はいずれ削除されます。

しかし、この方式の問題としては、計算にコストがかかることと、多くのコンピューターが結託すれば不正なブロックでチェーンを伸ばすことができてしまうことが挙げられています。

図 6. Proof of Work における不正防止
Proof of Work における不正防止
Proof of Work における不正防止

これから紹介する Bluemix で提供している Blockchain サービスでは、別の仕組みである「PBFT(Practical Byzantine Fault Tolerance)」を使っています。こちらは 2 章で説明します。

1-5. ブロックチェーンの利用例

ブロックチェーンはいまだ活用に向けて、色々な試みが行われている状態です。上記の取引の流れの説明で扱った通貨の取引のほか、ブロックチェーンを「記録簿」として利用し、身分証明 (例: ShoCard) や医療データの記録 (例: エストニア政府) に活用しようという取り組みもあります。

ShoCard

エストニア政府

2

Blockchain サービス概要

Bluemix で提供している Blockchain サービスでは、上記のようなブロックチェーンを実現するネットワークが用意されています。ここでは、Bluemix の Blockchain サービスの特徴について説明します。

2-1. Hyperledger プロジェクト概要

Blockchain サービスは、Hyperledger というオープンソースのソフトウェアを使っています。Hyperledger はブロックチェーンネットワークを形成するための基盤を作成するためのもので、IBM を含む複数の企業が参加しています。ビットコインが「匿名の不特定多数のコンピューターがネットワークを形成している」のに対し、Hyperledger では、信頼がおけるコンピューターを決まった台数だけ用意してネットワークを形成することを前提としています。そのため、個人で使うというよりは「銀行間取引」のような企業での利用に適しています。また、金融業界に限らず、様々な業界で使えるような設計となっています。

Hyperledger Project

2-2. Hyperledger の特徴

Hyperledger の主な特徴を説明します。

ネットワークの構成

Hyperledger では、1 章で説明した通り複数のコンピューターが台帳を持っているネットワークを作るのですが、コンピューターによって役割が異なります。主な役割は以下の 4 つです。

  • Non-validating peer (非検証ノード)

    トランザクションを実行するリクエストを受け付けるコンピューター

  • Validating peer (検証ノード)

    トランザクションを検証するコンピューター

  • Membership Services

    ユーザー管理をするコンピューター

  • Application Backend

    ユーザーの操作を受けつけ、トランザクション実行リクエストを生成するコンピューター

台帳は Non-validating peer および Validating peer が持っています。Non-validating peer はリクエストの窓口となっていて、受けたリクエストを各 Validating peer に転送します (下図参照)。Non-validating peer は Validating peer への負荷を分散する役割があり、Validating peer にリクエストを分配したり、台帳を更新する処理は Validating peer が実施し、台帳の照会は Non-validating peer でも実施できるようになっています。また、Non-validating peer を設置せず、Validating peer と Membership Services だけでネットワークを構成することもできます。

図 7. Hyperledger のネットワーク
Hyperledger のネットワーク図
Hyperledger のネットワーク図

チェーンの構造

ブロックは 1 章で説明したものと基本的な構造は同じですが、トランザクションそのものではなく、トランザクションデータの要約 (ハッシュ値)、UUID、実行結果を格納しています (下図参照)。ただし、トランザクションの UUID および実行結果はブロックのハッシュ値を計算する際は除外されます。また、1 つのブロックに複数のトランザクションの情報を格納できるようになっています。詳細は Hyperledger のプロトコル仕様を参照下さい。

Hyperledger のプロトコル仕様

図 8. Hyperledger のブロックおよびチェーン
Hyperledger のブロックおよびチェーンの図
Hyperledger のブロックおよびチェーンの図

Hyperledger では、このようなブロックがチェーン状になったもののほか、ハッシュ値でないトランザクションの記録と、これまでのトランザクションの結果現在どうなっているのかを示す「ワールドステート」の 3 つで「台帳」を構成しています。「ワールドステート」は Hyperledger の重要な特徴で、データを「キー」と「値 (Key-Value)」 (例えばキーが「A さん」、値が「残高 10 円」) で保存し、現在の状態を比較的容易に取得できるようにしています。たとえば、現在の A さんの残高を確認する場合では、ワールドステートがない場合は取引履歴から残高を計算する必要がありますが、ワールドステートとして A さんの残高を保存している場合はそのまま残高が確認できます。なお、「ワールドステート」を保存しているものは「Key-Value ストア」と呼ばれています。

チェーンコード

Hyperledger の場合、「送金」「残高照会」などの処理は予め関数として定義します。関数を定義しているものは「チェーンコード」と呼ばれ、目的毎に作成します。例えば銀行であれば、「預金管理」を目的として 1 つのチェーンコードが作成され、その中に「預け入れ」「引き出し」「残高照会」といった関数を定義します。1 章でブロックチェーンでは「A さんが B さんに x 円入金」といったやりとりを「トランザクション」として扱うと説明しましたが、Hyperledger のトランザクションは、使うチェーンコードおよび関数と、関数で処理する値が格納されます。

チェーンコードの実体はソースコードであり、各 Validating peer にデプロイして使います。デプロイされたチェーンコードは各 Validating peer で共通の ID を付与され、各 Validating peer は仮想マシン (Docker コンテナ) を作成し、その中でチェーンコードの処理を実行します (下図参照)。1 つのネットワークには複数のチェーンコードをデプロイすることが出来ます。チェーンコードは ID で特定されるので、チェーンコードを呼び出す際には ID で指定する必要があります。

図 9. チェーンコードおよび台帳
チェーンコードおよび台帳の図
チェーンコードおよび台帳の図

PBFT(Practical Byzantine Fault Tolerance)

1-2 で Blockchain サービスでは「不正なブロックの追加を防止する仕組み」として「PBFT」という仕組みを使っていると述べました。このような仕組みは「コンセンサス (合意)」と呼ばれています。Hyperledger はデフォルトで PBFT が使えるようになっています (他のコンセンサス方式も使えますが、Bluemix の Blockchain サービスは PBFT のみ使用できます)。

PBFT は一部のコンピューターが障害で停止したり、不正を働こうとしたりしても、合意形成ができるような仕組みです。処理の流れは次のようになっています。

  1. まず、Validating peer のうち 1 つをリーダーとし、Non-validating peer からのトランザクションをリーダーのみが受け取ります。
  2. リーダーは他の Validating peer にトランザクションを転送します。トランザクションは複数まとめて転送されることもあり、その場合はトランザクションに順番を付加します。
  3. リーダー以外の Validating peer は、リーダーから転送されたトランザクションが改ざんされていない事を確認したら、結果を自分以外の Validating peer に配信します。
  4. 各 Validating peer は規定の台数から「トランザクションが改ざんされていない」という結果を受け取ったら「トランザクションは全員に正しく配信されている」と判断し、その旨を自分以外の Validating peer に配信します。(「規定の台数」は PBFT のアルゴリズムで算出されます。)
  5. 各 Validating peer は、規定の台数から「トランザクションが全員に正しく配信された」という結果を受け取ったらトランザクションの処理を実行します。
  6. 実行結果を台帳に反映します。台帳の更新が終了したら、その旨が Non-validating peer に送信されます。
  7. Non-validating peer は、規定の台数から台帳更新処理が終了したことを受け取ったら「トランザクションが完了した」とします。

上記 PBFT の流れを図で表したものが下図です。

図 10. PBFT の流れ
PBFT の流れの図
PBFT の流れの図

1 章で触れた「Proof of Work」ではチェーンに分岐ができてしまう欠点がありましたが、PBFT ではチェーンに分岐はできません。また、難しい計算をするわけではないので算出コストも比較的少なくなります。

多くのコンピューターが結託すれば不正が成功するという欠点は「Proof of Work」と同様ですが、Hyperledger では信頼の置けるコンピューターでネットワークを形成していることを前提としているので、問題とはなり得ません。

2-3. Blockchain on Bluemix でできること

※こちらは 2016年 8月時点の情報です。画面や仕様は変更されている場合があります。

Bluemix の Blockchain サービスでは Validating peer4 台、Membership Services1 台の計 5 台のサーバーと、ユーザー22 人分の ID およびパスワードが用意されています。ユーザーはアプリケーションは別途用意する必要があります。コンセンサス方式は PBFT を使用しています。Bluemix のコンソールからモニター画面を表示することができ、モニター画面の各タブからサーバーの状態を確認したり、提供されている REST API を試すことが可能です。

ここでは、モニター画面の機能を紹介します。

  • Network タブ (図 11)

    サーバーおよびデプロイされているチェーンコードの一覧が表示されます。サーバーの稼働状況や、サーバーの停止/再起動はこちらの画面から実施します。

    「Routes」列には REST API 利用時または Discovery に利用するホスト名およびポートが表示されます。

    図 11. モニター画面-Network タブ
    モニター画面-Network タブの図
    モニター画面-Network タブの図
  • Blockchain タブ (図 12)

    自分のブロックチェーンネットワーク内で共有されているチェーンの状態を表示します。

    ブロックをクリックすると、ブロックに関連したトランザクションの情報が表示されます。

    図 12. モニター画面-Blockchain タブ
    モニター画面- Blockchain タブの図
    モニター画面- Blockchain タブの図
  • Demo Chaincode タブ (図 13)

    チェーンコードのサンプルをデプロイし、トランザクション実行のリクエストを送信することができます。(リクエストの内容は決まったものが送信されます)

    「Deploy」ボタンをクリックすると、該当するチェーンコードが Validating peer にデプロイされます。その後、デプロイされたチェーンコードを指定して「Transfer from A to B」等の処理ボタンをクリックすると、処理に応じた内容のリクエストが送信されます。リクエストおよびレスポンスは画面下部に表示されます。

    図 13. モニター画面- Demo Chaincode タブ
    モニター画面- Demo Chaincode タブの図
    モニター画面- Demo Chaincode タブの図
  • APIs タブ (図 14)

    Blockchain サービスで用意されているユーザー一覧 (Network's Enroll IDs) と、提供されている REST API 一覧が表示されます。Validation peer を選択し、「Try it out」ボタンをクリックすると実際にリクエストを送信できます。

    図 14. モニター画面- APIs タブ
    モニター画面- APIs タブの図
    モニター画面- APIs タブの図
  • Logs タブ

    各サーバーのログを表示します。

  • Status タブ

    Blockchain サービス全体のステータスやお知らせが表示されます。

    (表示される内容は Blockchain サービスのステータスページと同じです)

  • Support タブ

    Blockchain サービスのステータスページと、問題があった場合の報告先 (IBM Blockchain 用 GitHub の issue ページ) へのリンクが表示されます。

3

触ってみようブロックチェーン

Blockchain サービスを利用したサンプル・アプリケーションが GitHub で公開されており、誰でも自由に利用することができます。ここでは、サンプルアプリケーションを通じて Blockchain サービスを利用する方法と、ブロックチェーンの処理を定義している「チェーンコード」について説明します。

なお、Blockchain サービスの利用には IBM Bluemix へのユーザー登録が必要です。まだ IBM Bluemix のユーザー登録をしていない方は、ぜひ無料のトライアル・アカウントを取得してお試しください。

IBM Bluemix フリートライアル参加手順

3-1. サンプルアプリケーション概要

今回はサンプルアプリケーションの 1 つ「Marbles」を使います。他のサンプルも Blockchain サービスの資料にて紹介されておりますので、ぜひお試し下さい。

Marbles

Blockchain サービスの資料 - Sample apps and tutorials for Blockchain

Marbles はユーザーBob とユーザーLeroy の間でビー玉を交換するというアプリケーションです。操作の流れは下記のようになっています。

  1. Bob と Leroy のビー玉を作成する。
  2. Bob と Leroy が所有しているビー玉を確認する。
  3. Bob と Leroy のビー玉を交換する。

上記操作に伴い、Bluemix 上の Validating peer が 2 章で説明した「チェーンコード」に基づいて台帳を更新しています。

3-2. サンプルアプリケーションの準備

ここでは、サンプルアプリケーションを稼働させるため、ご自分の Bluemix スペースにサンプルアプリケーション Marbles をデプロイし、Blockchain サービスのインスタンスを作成します。

なお、この手順ではサンプルアプリケーションのデプロイと同時に Blockchain サービスのインスタンスを作成していますが、Blockchain サービスのインスタンスのみ作成することも可能です。詳しくは Blockchain サービスの資料をご覧下さい。

Blockchain サービスの資料 - Getting Started

3-2-1. Marbles のデプロイおよび Blockchain サービスインスタンスの作成

  1. Bluemix にご自分の ID でログインし、自分のスペースが存在することを確認します。

    スペースが無い場合はログイン後にスペースの作成画面が表示されるので、任意のスペース名を入力して「作成」ボタンをクリックして下さい。

    Bluemix

  2. IBM DevOps サービスに Bluemix と同じ ID・パスワードでログインできることを確認します。

    IBM DevOps Services

  3. ブラウザで Marbles の GitHub ページを開きます。

    ページ内の「Deploy to Bluemix」ボタンをクリックします。

    GitHub - Marbles

    図 15. Marbles の GitHub ページ
    Marbles の GitHub ページの図
    Marbles の GitHub ページの図
  4. Bluemix へのログインを行います。「LOG IN」ボタンをクリックします。
    図 16. Bluemix へのログイン
    Bluemix へのログインの図
    Bluemix へのログインの図
  5. Marbles アプリケーションの名前を入力し、デプロイするスペースを選択します。

    入力内容を確認後、「DEPLOY」をクリックします。

    ※アプリケーションの名前は、デフォルトではランダムなものが入力されています。こちらは変更する事ができますが、アプリケーションの URL に使われるため、Bluemix 上で一意となるものを入力して下さい。

    図 17. デプロイ設定
    デプロイ設定の図
    デプロイ設定の図
  6. アプリケーションのデプロイが始まります。デプロイが終わるまでしばらくお待ち下さい。

    ※最初は DevOps サービスに Marbles 用プロジェクトが作成され、Marbles のソースコードがコピーされます。その後、Bluemix へのデプロイおよび Blockchain サービスのインスタンスの作成が実施されます。

    図 18. デプロイの概要
    デプロイの概要図
    デプロイの概要図
  7. デプロイ完了後、画面下部の「VIEW YOUR APP」ボタンをクリックすると Marbles の画面が表示されます。
    図 19. デプロイ完了後画面
    デプロイ完了後画面の図
    デプロイ完了後画面の図

    ※Marbles は起動時に Validating peer および Membership Services が起動していることが必要です。デプロイ時に一時的に Blockchain サービスが使えない状態になった場合、Marbles のデプロイは成功しても起動は失敗する場合があります。

    その場合は、後述の Blockchain サービスのモニター画面で Validating peer および Membership Services が起動済みであることを確認後、Bluemix のコンソール画面から Marbles を起動して下さい。(デプロイ失敗時に表示される「APP DASHBOARD」ボタンから Bluemix のコンソール画面を表示できます)

  8. Bluemix のアプリケーション管理画面を表示します。

    Marbles が起動し、Blockchain サービスのインスタンス (myblockchain) が作成されて接続 (バインド) されていることを確認します。

    ※アプリケーション管理画面は下記の手順で表示可能です。

    1. a. Bluemix の画面上部メニューで「コンソール」を選択し、コンソール画面を表示します。
    2. b. 「すべての項目」をクリックします。
    3. c. アプリケーションおよびサービスが表示されます。その中の Marbles アプリケーションをクリックします。アプリケーションが見つからない場合は、画面右上に表示されている組織やスペースをご確認ください。
    図 20. アプリケーション管理画面
    アプリケーション管理画面の図
    アプリケーション管理画面の図

3-2-2. Blockchain サービスとアプリケーションの連携の確認

Blockchain サービスと Marbles の連携に必要な「資格情報」を確認します。資格情報には、Blockchain サービスが用意している各サーバーのアドレスや、ブロックチェーンネットワークで利用できるユーザーの情報が書かれています。Marbles はこの資格情報を読み込み、Blockchain サービスとデータを送受信しています。

  1. Blockchain サービスのインスタンスがあるスペースのコンソール画面で、アプリケーションおよびサービスの一覧を表示します。

    https://new-console.ng.bluemix.net/#all-items でも表示可能です。

  2. アプリケーションおよび使用している Bluemix サービスの一覧が表示されます。

    Marbles にバインドされた Blockchain サービスのインスタンスをクリックします。

    図 21. Blockchain サービスのインスタンス
    Blockchain サービスのインスタンス図
    Blockchain サービスのインスタンス図
  3. Blockchain サービスインスタンスの詳細が表示されます。

    「サービス資格情報」をクリックします。

    図 22. Blockchain サービスインスタンスの詳細画面
    Blockchain サービスインスタンスの詳細画面
    Blockchain サービスインスタンスの詳細画面
  4. 「{"credentials":{... 」のような JSON で記述された資格情報が表示されることを確認します。

    表示されない場合、「新規資格情報の追加」をクリックし、資格情報を作成して下さい。

    図 23. Blockchain サービスインスタンスの資格情報
    Blockchain サービスインスタンスの資格情報の図
    Blockchain サービスインスタンスの資格情報の図

    ※資格情報を追加する際は、「Credentials-1」のような資格情報の名前を入力して下さい。

    (Blockchain サービスが用意するサーバーの情報等は自動で読み込まれます)

    図 24. 資格情報追加ダイアログ
    資格情報追加ダイアログの図
    資格情報追加ダイアログの図
  5. 資格情報を追加した場合は、Marbles を再始動します。

    Marbles のアプリケーション管理画面で「再始動」ボタンをクリックしして下さい。

    図 25. アプリケーションの再始動
    アプリケーションの再始動
    アプリケーションの再始動

3-2-3. Blockchain サービスのサーバー稼働状況を確認する

  1. Blockchain サービスインスタンスの詳細画面で、「管理」を表示します。「LAUNCH」ボタンをクリックします。
    図 26. Blockchain モニター画面の表示
    Blockchain モニター画面の表示
    Blockchain モニター画面の表示
  2. モニター画面が表示されます。

    「Getting Started」ダイアログが表示された場合は、ダイアログ右上の「X」をクリックして閉じて下さい。

    図 27. Blockchain モニター画面-Getting Started ダイアログ
    Blockchain モニター画面-Getting Started ダイアログの図
    Blockchain モニター画面-Getting Started ダイアログの図
  3. モニター画面の Network タブを開きます。ここでは、自分の Blockchain サービスのインスタンスで提供しているサーバーが表示されます。

    全てのサーバーが「Running」となっていることを確認し、「Stopped」となっている場合は「Actions」列の「Restart Peer」アイコンをクリックして再起動します。

    図 28. Blockchain モニター画面-Network タブ
    Blockchain モニター画面- Network タブの図
    Blockchain モニター画面- Network タブの図

    ※Firefox の場合、モニター画面を正常に表示するために「トラッキング保護」を無効にして下さい。アドレスバーのシールドアイコンをクリックすると、トラッキング保護を一時的に無効にできます。

    図 29. Blockchain モニター画面-トラッキング保護設定
    Blockchain モニター画面-トラッキング保護設定の図
    Blockchain モニター画面-トラッキング保護設定の図
  4. サーバーを再起動した場合は、起動が完了した後に Marbles のアプリケーション管理画面で「再始動」ボタンをクリックし、Marbles を再始動して下さい。
    図 30. アプリケーション再始動
    アプリケーション再始動の図
    アプリケーション再始動の図

3-3. サンプルアプリケーションの画面操作

Marbles の画面を操作し、Bob と Leroy でビー玉を交換します。

  1. Marbles のアプリケーション管理画面の「アプリの表示」をクリックします。
    図 31. 「アプリの表示」ボタン
    「アプリの表示」ボタンの図
    「アプリの表示」ボタンの図
  2. Marbles の Home 画面 (http://アプリケーション名.mybluemix.net/p1) が表示されます。この画面では存在しているビー玉が Bob のものと Leroy のものに分類されて表示されますが、まだビー玉を作製していないため何も表示されません。

    また、画面を表示してから約 1 分間は右上に「Warning」が表示され、操作できません。警告が消えるまでお待ち下さい。

    図 32. Marbles-Home 画面
    Marbles-Home 画面の図
    Marbles-Home 画面の図
  3. 「Create」をクリックし、ビー玉作製画面を表示します。ビー玉の色、大きさ、所有者 (Bob または Leroy) を選択し、「Create」をクリックします。(ビー玉の名前は自動的に記入されます)
    図 33. Marbles-Create 画面
    Marbles-Create 画面の図
    Marbles-Create 画面の図
  4. Home 画面に戻ります。先ほど作製したビー玉のデータが各 Validating peer に反映されると、ビー玉が表示されます。

    (ビー玉が表示されない場合は、しばらく待ってからブラウザ画面を更新して下さい)

    図 34. Marbles-Home 画面
    Marbles-Home 画面の図
    Marbles-Home 画面の図
  5. Home 画面下部の「View Transactions」をクリックすると、台帳のチェーン情報が表示されます。

    先ほどのビー玉作製操作で生成されたブロックが表示されます。

    ※Blockchain サービスのモニター画面内の Blockchain タブでも同様にブロックが確認できます。

    図 35. Marbles- View Transactions 画面
    Marbles- View Transactions 画面の図
    Marbles- View Transactions 画面の図
  6. 2-3 を繰り返し、Bob と Leroy の両方がビー玉を持っている状態にします。
    図 36. Marbles- Home 画面
    Marbles- Home 画面の図
    Marbles- Home 画面の図
  7. ビー玉をドラッグし、Bob と Leroy のビー玉を交換します。

    交換が各 Validating peer に反映されると、画面にも反映されます。(Validating peer に反映されるまでは一旦ビー玉が表示されなくなります)

    図 37. Marbles-ビー玉の交換
    Marbles- ビー玉の交換の図
    Marbles- ビー玉の交換の図
  8. 不要なビー玉があれば、画面下部のごみ箱アイコンにドラッグすると削除されます。

3-4. サンプルアプリケーションとブロックチェーンでの処理

先ほど Bluemix にデプロイした Marbles でビー玉の作製、持っているビー玉の表示、ビー玉の交換といった操作をしましたが、これらの操作により、1 章で説明した「トランザクション」が Marbles のアプリケーションで作成されています。ここでは、サンプルアプリケーションでの操作とブロックチェーンでの処理の対応を説明します。

Marbles と Blockchain サービスの関係は下図のようになっており、Marbles はユーザーの操作を受け付けてトランザクションを作成し、Blockchain サービスで用意したブロックチェーンネットワークがトランザクションを処理しています。

図 38. Marbles と Blockchain サービスの関係
Marbles と Blockchain サービスの関係
Marbles と Blockchain サービスの関係

Marbles ではブロックチェーンネットワークのうち Validating peer 0 にトランザクション実行のためのリクエストを送信しており、Validating peer 0 が他の Validating peer にトランザクションを配布しています。その後、各 Validating peer で Marbles 用の「チェーンコード」に基づいてトランザクションを実行します。

Marbles 用のチェーンコード

Blockchain サービスの基礎となっている Hyperledger では、トランザクションは下記の 3 種に分類されます。

  • Deploy

    チェーンコードを各 Validating peer にデプロイする

  • Invoke

    台帳にデータを書き込む

    ※Deploy でも台帳にデータが書き込まれますが、Invoke とは別に分類されます

  • Query

    台帳の内容を照会する

Invoke と Query の際に実施する処理は関数としてチェーンコードに書かれていますが、2 章で説明したように、実際に関数を処理するには Validating peer にチェーンコードをデプロイする必要があります。そのため、先に Deploy トランザクションを Validating peer に送信し、各 Validating peer にチェーンコードをデプロイします。一旦デプロイしたチェーンコードは ID が付与されて Validating peer に保持されるので、以降は付与されたチェーンコードの ID を指定して Invoke や Query のトランザクションを送信します。

Hyperledger では、ブロックチェーンネットワークにログイン (Registrar) したユーザーからの要求しか実行されないようになっています。そのため、ユーザーがブロックチェーンを利用する際は、最初にログインするリクエストを送信します。

これらのトランザクションおよびログインの関係を下図に示します。

図 39. トランザクションの種類
トランザクションの種類の図
トランザクションの種類の図

Marbles の場合、Marbles のアプリケーションでの操作と発生しているトランザクションの関係は次の表のようになっています。

表 1. Marbles の操作とトランザクションの関係
操作トランザクション
アプリケーションの起動Registrar、Deploy
存在しているビー玉のリストや個々のビー玉を表示するQuery (read 関数を呼出)
ビー玉を作製するInvoke (init_marble 関数を呼出)
ビー玉を交換する (所有者を変更する)Invoke (set_user 関数を呼出)
ビー玉を削除するInvoke (delete 関数を呼出)

最初のアプリケーションの起動では、まず Blockchain サービスで用意されているユーザーID およびパスワードで Blockchain サービスのネットワークにログインし、そのユーザーで Deploy や Invoke が実行できるようにしています。Marbles では、3-3 での操作で Bob や Leroy というユーザーを使いましたが、ブロックチェーンネットワークに対しては Blockchain サービスで用意されているユーザーID (user_type1_xxx など) を使ってログインし、データを送信しています。Bluemix の Marbles アプリケーションの管理画面でアプリケーションの起動時のログを見ると、「[ibc-js] Registering vp0-xxxx...:xxxx w/enrollID - user_type1_xxx」のように、Validating peer にログインを実施していることがわかります。

実際にログインの際は、下記のような形式のデータを Validating peer に送信しています。

{
  "enrollId": "user_type1_xxx",←ユーザーID
  "enrollSecret": "abcde"←パスワード
}

この場合、返信データとして、下記のようなものが返ってきます。(Marbles アプリケーションでは表示されませんが、後述する REST API 操作でリクエストを手動で行うことで確認可能です。)

{
  "OK": "Login successful for user ''user_type1_xxxx."
}

なお、Marbles アプリケーションから Blockchain サービスに送信しているデータの内容は、下記の Marbles およびデータ送受信に用いているライブラリ (ibm-blockchain-js) のソースコードで確認できます。また、Read および Query の返信データは下図のようにアプリケーションのログで "[ibc-js] 関数名 - success: { jsonrpc: '2.0',.." と表示されます。

Marbles - /utils/ws_part1.js

ibm-blockchain-js - index.js

図 40. Bluemix のログ画面
Bluemix のログ画面の図
Bluemix のログ画面の図

その後、Deploy を送信し、Marbles 用チェーンコードを各 Validating peer にデプロイして Marbles の画面側の操作を待つ状態となります。デプロイの際は下記のように「"method": "deploy"」とし、と、デプロイするチェーンコードの場所を含むデータを送信しています。

{
  "jsonrpc": "2.0",
  "method": "deploy",
  "params": {
    "type": 1,
    "chaincodeID": {
      "path": "https://github.com/ibm-blockchain/marbles-chaincode/hyperledger/part2"←チェーンコードの場所
    },
    "ctorMsg": {
      "function": "init",
      "args": [
        "99"
      ]
    },
    "secureContext": "user_type1_xxx"←ログインしたユーザーID
  },
  "id": xx
}

チェーンコードのデプロイに成功するとデプロイしたチェーンコードを示すチェーンコード ID が下記のような形式で Validating peer から返ってきます。Query と Invoke の際は、このチェーンコード ID を指定する必要があります。

{
  "jsonrpc": "2.0",
  "result": {
    "Status": "OK",
    "Message": "xxxxxxx"←チェーンコードID
  },
  id: xx
}

ビー玉の所有状態を表示する時は、Query トランザクションが Marbles から作成されます。2 章で、トランザクションにはチェーンコードの ID、使う関数、関数で処理する値を記述すると説明しましたが、Marbles では存在しているビー玉のリストを取得する場合、トランザクションを下記のような形式で Validating peer に送信しています。

{
  "jsonrpc": "2.0",
  "method": "query",←使う関数
  "params": {
      "type": 1,
      "chaincodeID": {
          "name": "xxxxxxxxxx"←チェーンコードID
      },
      "ctorMsg": {
          "function": "read",←関数で処理する値(さらに呼び出す関数)
          "args": [
              "_marbleindex"←関数で処理する値(呼び出した関数で処理する値)
          ]
      },
      "secureContext": "user_xx"←Marbles起動時にログインしたユーザーID
  },
  "id": xx
}

ここでは、「"method": "query"」とすることでチェーンコードの Query 関数を呼び出しています。その後、Query 関数で別の関数を呼び出して処理を行うのですが、その呼び出す関数や処理する値を「ctorMsg」に記入しています。

チェーンコードの「func (t *SimpleChaincode) Query」で始まる Query 関数を見ると、「function string, args []string」と書かれていますが、「function」「args」には「ctorMsg」に書かれたものが格納されるようになっています。処理内容をみると、「if function == "read"」のように「function」に応じて別の関数を呼び出していることがわかります。この場合、「function」には「read」が入っているので、「t.read」とあるように read 関数を呼ぶようになっています。read 関数では、stub.GetState(name) で「name」で照会対象を指定して台帳を照会していますが、ここで「args」に書かれている文字列を name として使っています。上記の場合は存在しているビー玉一覧を表示することを表す「_marbleindex」が name に格納されます。また、個々のビー玉の状態は、name にビー玉の名前を格納することで照会できます。

args に "_marbleindex" を指定した場合の返信データ
{
  "jsonrpc": "2.0",
  "result": {
    "status": "OK",
    "message": "[\"marble1\",\"marble2\"]"←存在しているビー玉の名前リスト
  },
  "id": 1
}
args に"ビー玉の名前"を指定した場合の返信データ
{
  "jsonrpc": "2.0",
  "result": {
    "status": "OK",
    "message": "{\"name\": \"marble1\", \"color\": \"white\", \"size\": 35, \"user\": \"bob\"}"
  },
  "id": 1
}
part2_chaincode.go
func (t *SimpleChaincode) Query(stub *shim.ChaincodeStub, function string, args []string) ([]byte, error) {
  fmt.Println("query is running " + function)

  // Handle different functions
  if function == "read" {                         //read a variable
    return t.read(stub, args)
  }
  fmt.Println("query did not find func: " + function)        //error

  return nil, errors.New("Received unknown function query")
}
func (t *SimpleChaincode) read(stub *shim.ChaincodeStub, args []string) ([]byte, error) {
  var name, jsonResp string
  var err error

  if len(args) != 1 {
    return nil, errors.New("Incorrect number of arguments. Expecting name of the var to query")
  }

  name = args[0]
  valAsbytes, err := stub.GetState(name)  //get the var from chaincode state
  if err != nil {
    jsonResp = "{\"Error\":\"Failed to get state for " + name + "\"}"
    return nil, errors.New(jsonResp)
  }

  return valAsbytes, nil                          //send it onward
}

ビー玉を作製する場合は、下記のように「"method": "invoke"」となっており、画面で作成したビー玉の情報を含むデータを Validating peer に送っています。成功した場合はトランザクションの ID が返ってきます。

送信データ
{
    "jsonrpc": "2.0",
    "method": "invoke",
    "params": {
        "type": 1,
        "chaincodeID": {
            "name": "xxxxxxx"
        },
        "ctorMsg": {
            "function": "init_marble",
            "args": [
                "xxxxxxxxxxxxx",←ビー玉の名前
                "blue",
                "35",
                "bob"
            ]
        },
        "secureContext": " user_xx "
    },
    "id": 1
}
返信データ
{
  "jsonrpc": "2.0",
  "result": {
    "status": "OK",
    "message": "xxxx-xxxx-xxxxxxxxx"←トランザクションのID
  },
  "id": 1
}

ビー玉作製時は、「"method": "invoke"」とあるように、チェーンコードの Invoke 関数を呼びだしています。Invoke 関数も Query 関数と同様に、「ctorMsg」に書かれた「function」「args」を受け取って「function」に応じた関数を呼び出して処理しています。ビー玉作製の場合、init_marble 関数に args に書かれているビー玉の情報 (「名前」、「色」、「大きさ」、「所有者」) を渡しています。その後 init_marble 関数では、stub.PutState(args[0], []byte(str)) で、ビー玉の名前と「{"name": "ID", "color": "色", "size": 大きさ, "user": "所有者"}」を台帳に書き込んでいます。

ビー玉を交換する (所有者を変更する)、ビー玉を削除する場合も、「ctorMsg」に書かれた「function」「args」は異なりますが、上記のような「"method": "invoke"」となっているデータを送り、Invoke 関数を呼び出して stub.PutState (ビー玉の名前, ビー玉の名前や所有者等の情報) で台帳を更新しています。例えば、ビー玉を交換する場合は、ctorMsg は下記のようになっています。

        "ctorMsg": {
            "function": "set_user",
            "args": [
                "xxxxxxxxx",←ビー玉の名前
                "leroy"←新所有者
            ]
        },

このように、Marbles では画面側アプリケーションでチェーンコードの ID、使う関数、関数で処理する値、を含むトランザクションを作成し、Validating peer はこのトランザクションを受け取り、チェーンコードにある関数に基づき台帳への照会や書き込みを行っています。

3-5. サンプルアプリケーションの REST API 操作

Marbles では画面側アプリケーションで Validating peer に対しトランザクションを作成して送信していましたが、手動でも同様の操作が可能です。Validating peer に対してトランザクションを送る方法は 2 通りあり、一つは http を利用した REST API を使う方法で、もう一つは gRPC(Google RPC) を使う方法です。Marbles では画面側アプリケーションと Validating peer は REST API で通信し、Validating peer 同士では gRPC を使って通信しています。

自分でブロックチェーンを利用したアプリケーションを作成する場合は、REST API または gRPC を利用して Validating peer にトランザクションを送信するようアプリケーションを作成します。

ここでは、Blockchain サービスのモニター画面を使って REST API による通信を手動で行う方法を説明します。

  1. Blockchain サービスのモニター画面を開き、「APIs」タブを開きます。
    図 41. モニター画面-APIs タブ
    モニター画面-APIs タブの図
    モニター画面-APIs タブの図
  2. タブ内画面上部にリクエストを送る Validating peer の URL が表示されます。

    右側の「VP0」等のボタンをクリックすると、宛先の Validating peer が変更されるので、適宜変更します。

    図 42. モニター画面-APIs タブの Validating peer 表示部
    モニター画面-APIs タブの Validating peer 表示部
    モニター画面-APIs タブの Validating peer 表示部
  3. 「Network's Enroll IDs」をクリックし、API にリクエストする際に使用可能なユーザーID とパスワードを確認します。
  4. 画面下部の API 分類一覧から使いたい API を探します。この画面では API は下記のように分類されています。分類の名前部分をクリックすると分類されている API が表示され、API をクリックすると API の詳細が表示されます。

    ここではログインに使う「/registrar」を探します。

    • Block: チェーンの中のブロックに関するもの
    • Blockchain: チェーン全体 (長さなど) に関するもの
    • Chaincode: Deploy、Query 等のチェーンコードに関するもの
    • Network: Validating peer 等ブロックチェーンネットワークに関するもの
    • Registrar: ログイン等ユーザー管理に関するもの
    • Transactions: トランザクションに関するもの
    図 43. モニター画面-APIs タブの API リスト
    モニター画面-APIs タブの API リスト
    モニター画面-APIs タブの API リスト
  5. 「POST /registrar」のように API のパスが書かれた部分をクリックし、API の詳細を開いた状態にします。API のパスの左に表示されている「POST」等はリクエスト時に指定するメソッドを表しています。「Parameters」セクションの Value 欄にリクエスト時に送信するデータ (パスパラメーターやリクエスト Body) を記入し、「Try it out!」をクリックすると、画面上部で選択した Validating peer のアドレスに API のパスを追加した URL にリクエストが送信されます。
    図 44. API 詳細表示
    API 詳細表示
    API 詳細表示
  6. リクエストの結果、Validating Peer からレスポンスがあれば「Try it out」ボタンの下の「Response Body」欄に表示されます。また、リクエストを Curl で送信する場合の記法や実際にリクエストした URL も表示されるので、Curl や POSTMAN 等の REST API にリクエストを送信できるツールで同様のリクエストを送信することができます。
    図 45. API 詳細表示の Response Body 表示部
    API 詳細表示の Response Body 表示部
    API 詳細表示の Response Body 表示部

この REST API を利用して、先ほどの画面操作を再現するには下記のように入力します。

  1. ログイン

    「Registrar」セクションの「POST /registrar」 を開き、Parameters の「Secret」行の Value 欄に下記を記入します。記入内容を確認後、「Try it out」ボタンをクリックしてデータを送信します。

    {
      "enrollId": "「user_type1_」から始まるユーザーID",
      "enrollSecret": "xxxx"
    }
    図 46. API 詳細表示 (/registrar) の Parameter 入力部
    API 詳細表示 (/registrar) の Parameter 入力部
    API 詳細表示 (/registrar) の Parameter 入力部

    Validating peer からの返信があれば、「Try it out」ボタンの下の「Response Body」欄に表示されます。ログインに成功した場合は、「"OK": "Login successful for user 'user_type1_xxxx.'"」または「"OK": "User user_type1_e652198cf7 is already logged in."」が表示されます。

    図 47. API 詳細表示 (/registrar) の Response Body 表示部
    API 詳細表示 (/registrar) の Response Body 表示部
    API 詳細表示 (/registrar) の Response Body 表示部

    ※ユーザーID、パスワードは Blockchain サービスで用意されたもののうち、「user_type1_」から始まるものをお使い下さい。(type の後の数字はユーザーの役割を表しており、「1」は利用者に相当する役割です。詳しくはこちらをご覧ください。) Blockchain サービスで用意されたユーザーは、この APIs タブ内の「+ Network's Enroll IDs」をクリックすると表示されます。

    なお、一度いずれかの Validating peer でログインしたユーザーは、別の Validating peer にログインできません (「"Error": "rpc error: code = 2 desc = 'Identity or token does not match.'"}」が表示されます)。その場合は別のユーザーでお試し下さい。

  2. Marbles チェーンコードのデプロイ

    「Chaincode」セクションの「POST /chaincode」 を開き、Parameters の「DeploySpec」行の Value 欄に下記を記入します。(下記では "path" の "https://~part2" 部分が途中で改行されて表示されていますが、入力時は 1 行で入力してください)

    {
      "jsonrpc": "2.0",
      "method": "deploy",
      "params": {
          "type": 1,
          "chaincodeID": {
              "path": "https://github.com/ibm-blockchain/marbles-chaincode/hyperledger/part2"
          },
          "ctorMsg": {
              "function": "init",
              "args": [
                  "99"
              ]
          },
          "secureContext": "ログインしたユーザーID(user_type1_xxx)"
      },
      "id": 1
    }
    図 48. API 詳細表示 (/chaincode) の Parameter 入力-デプロイ
    API 詳細表示 (/chaincode) の Parameter 入力-デプロイ
    API 詳細表示 (/chaincode) の Parameter 入力-デプロイ

    デプロイに成功した場合、"message" としてチェーンコードの ID が返ってきます。後の手順で使うので保存します。

    {
      "jsonrpc": "2.0",
      "result": {
        "status": "OK",
        "message": "8c5677016abb7b4885b8dc40bb5b28f1554888cd766e2c945bc61bca03b349
        092f19197d32785254c692c9210db34c31821efc89e8a9f4dcb3f5575bebb4584b"
      },
      "id": 1
    }
  3. ビー玉の作製

    「Chaincode」セクションの「POST /chaincode」 を開き、Parameters にある「InvokeSpec」行の Value 欄に下記を記入します。なお、ビー玉の色は Marbles のソースコード views/template/color_options.jade で「(color='white')」のように書かれている色名を入力して下さい。

    {
      "jsonrpc": "2.0",
      "method": "invoke",
      "params": {
          "type": 1,
          "chaincodeID": {
              "name": "デプロイしたチェーンコードのID"
          },
          "ctorMsg": {
              "function": "init_marble",
              "args": [
                  "ビー玉の名前(marble1)",
                  "ビー玉の色(white)",
                  "ビー玉の大きさ(35または16)",
                  "所有者(bobまたはleroy)"
              ]
          },
          "secureContext": "ログインしたユーザーID(user_type1_xxx)"
      },
      "id": 1
    }
    図 49. API 詳細表示 (/chaincode) の Parameter 入力-ビー玉作製
    API 詳細表示 (/chaincode) の Parameter 入力-ビー玉作製
    API 詳細表示 (/chaincode) の Parameter 入力-ビー玉作製

    成功すると、下記のようなデータが返ってきます。"message" にはトランザクションの ID が格納されます。

    {
      "jsonrpc": "2.0",
      "result": {
        "status": "OK",
        "message": "xxxxxxxxxxxxxx"
      },
      "id": 1
    }
  4. 存在するビー玉の一覧を取得する

    「Chaincode」セクションの「POST /chaincode」 を開き、Parameters にある「QuerySpec」行の Value 欄に下記を記入します。

    {
      "jsonrpc": "2.0",
      "method": "query",
      "params": {
        "type": 1,
        "chaincodeID": {
          "name": "デプロイしたチェーンコードのID "
        },
        "ctorMsg": {
          "function": "read",
            "args": [
              "_marbleindex"
            ]
        },
        "secureContext": "ログインしたユーザーID(user_type1_xxxx)"
      },
      "id": 1
    }
    図 50. API 詳細表示 (/chaincode) の Parameter 入力-ビー玉一覧取得
    API 詳細表示 (/chaincode) の Parameter 入力-ビー玉一覧取得
    API 詳細表示 (/chaincode) の Parameter 入力-ビー玉一覧取得

    成功すると、下記のようなデータが返ってきます。"message" に検索結果が "[\"ビー玉 1 の名前\",\"ビー玉 2 の名前"]" のような形式で格納されています。

    {
      "jsonrpc": "2.0",
      "result": {
        "status": "OK",
        "message": "[\"marble1\",\"marble2\"]"
      },
      "id": 1
    }

    ※「args」が「["_marbleindex"]」の場合、ビー玉の名前のリストを取得します。個々のビー玉の状態を取得する場合は、「args」を「["ビー玉の名前"]」に変更します。

  5. ビー玉を交換する

    「Chaincode」セクションの「POST /chaincode」 を開き、Parameters にある「InvokeSpec」行の Value 欄に下記を記入します。

    {
      "jsonrpc": "2.0",
      "method": "invoke",
      "params": {
          "type": 1,
          "chaincodeID": {
              "name": "デプロイしたチェーンコードのID"
          },
          "ctorMsg": {
              "function": "set_user",
              "args": [
                  "ビー玉の名前(marble1)",
                  "新しい所有者(bobまたはleroy)"
              ]
          },
          "secureContext": "ログインしたユーザーID(user_type1_xxxx)"
      },
      "id": 1
    }
    図 51. API 詳細表示 (/chaincode) の Parameter 入力-ビー玉交換
    API 詳細表示 (/chaincode) の Parameter 入力-ビー玉交換
    API 詳細表示 (/chaincode) の Parameter 入力-ビー玉交換

    成功すると、下記のようなデータが返ってきます。"message" にはトランザクションの ID が格納されます。

    {
      "jsonrpc": "2.0",
      "result": {
        "status": "OK",
        "message": "xxxxxxxx"
      },
      "id": 1
  6. ビー玉を削除する

    「Chaincode」セクションの「POST /chaincode」 を開き、Parameters にある「InvokeSpec」行の Value 欄に下記を記入します。

    {
      "jsonrpc": "2.0",
      "method": "invoke",
      "params": {
        "type": 1,
        "chaincodeID": {
          "name": "デプロイしたチェーンコードのID"
        },
        "ctorMsg": {
          "function": "delete",
          "args": [
            "ビー玉の名前(marble1)",
          ]
        },
        "secureContext": "ログインしたユーザーID(user_type1_xxxx)"
      },
      "id": 1
    }
    図 52. API 詳細表示 (/chaincode) の Parameter 入力-ビー玉削除
    API 詳細表示 (/chaincode) の Parameter 入力-ビー玉削除
    API 詳細表示 (/chaincode) の Parameter 入力-ビー玉削除

    成功すると、下記のようなデータが返ってきます。"message" にはトランザクションの ID が格納されます。

    {
      "jsonrpc": "2.0",
      "result": {
        "status": "OK",
        "message": "xxxxxxxx"
      },
      "id": 1
    }
4

おわりに

当記事では、Bluemix の Blockchain サービスを使って、ブロックチェーンの概要を説明しました。ここでは例としてサンプルアプリケーションの Marbles でビー玉の交換を行い、トランザクションを作成し、チェーンコードを実行し、ブロックチェーンの処理の流れを確認しました。サンプルアプリケーションは他にも提供されており、Marbles 同様に Bluemix 上で試すことができます。例えば Commercial Paper は広告を作って交換するアプリケーションで、Car Lease は車を貸し借りするアプリケーションです。

Commercial Paper

Car Lease

ブロックチェーンは金融や上記のようなモノのやりとり以外にも様々な利用法が検討されています。Bluemix の Blockchain サービスは手軽にブロックチェーンのネットワークを構築でき、さらに様々な業界で使えるような設計となっていますので、皆様のブロックチェーンのアイデアを試す場としてお使いいただければと思います。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Cloud computing
ArticleID=1037276
ArticleTitle=はじめての Blockchain
publish-date=09152016