【和訳】Hyperledger Composer ソリューションを構築するための開発者向けチュートリアル

# はじめに

和訳第二弾。

[Developer tutorial for creating a Hyperledger Composer solution](https://hyperledger.github.io/composer/latest/tutorials/developer-tutorial) の和訳です。
ガバガバ和訳でも英語読むよりマシという方は御覧ください。
関連チュートリアルに関しても（たぶん）上げます。
当方 Hyperledger Composer について学び始めたばかりであるため、指摘等大歓迎です。

---

本チュートリアルでは、Hyperledger Composer におけるブロックチェーンソリューションの構築を一から行います。数時間のうちに、実際の Hyperledger Fabric ブロックチェーンネットワークに対してのトランザクションの実行、ブロックチェーンネットワークとやり取りを行う Angular 2 [^1] アプロケーションの生成・実行までを行うことができます。

また、本チュートリアルでは自身のユースケースに適用できるテクニックとリソースの概要を説明します。

**NOTE:** 本チュートリアルは、下記に参照されている Ubuntu 上に構築された Hyperledger Fabric v1.2 を利用する最新版 Hyperledger Composer 向けに書かれています。Mac 上でもテストを行っています。

[^1]: おそらく Angular 4 の誤植

# 必要事項

チュートリアル実行前に以下の項目を行ってください。

- [開発環境の構築](https://hyperledger.github.io/composer/latest/installing/development-tools.html)
- エディタのインストール（例：VSCode、Atom）

# Step 1. ビジネスネットワーク構造の作成

Hyperledger Composer のキーコンセプトは、**business network definition (BND)** です。これは、ブロックチェーンソリューションに対するデータモデル、トランザクションロジック、アクセス制御ルールを定義するものです。BND を作成するために、適切なプロジェクト構造を作成する必要があります。

最も簡単な方法は、Yeoman ジェネレータを利用し、ビジネスネットワークの骨組みを作成することです。Yeoman によってビジネスネットワークのすべてのコンポーネントが含まれたディレクトリが作成されます。

1. Yeoman を用いてビジネスネットワークの骨組みを作成します。このコマンドには以下の項目が必要です。

    ```
    yo hyperledger-composer:businessnetwork
    ```

    1. ビジネスネットワーク名
    2. ネットワークの説明
    3. 作者名
    4. 作者のEmailアドレス
    5. ライセンス
    6. ネームスペース

2. ネットワーク名として **tutorial-network** を入力します。また、説明、名前、Email を適切に入力します。
3. ライセンスは **Apache-2.0** を入力します（デフォルトが Apache-2.0）。
4. ネームスペースとして **org.example.mynetwork** を入力します。
5. 空のネットワークを作成するかどうか訊かれた場合 **No** を選択します。

# Step 2. ビジネスネットワークの定義

ビジネスネットワークは、資産、参加者、トランザクション、アクセス制御ルール、オプションであるイベントとクエリで構成されます。Step 1. で作成したネットワークの骨組みには、ネットワークにおけるすべての資産、参加者、トランザクションのクラス定義を含んだ model（**.cto**）ファイルが存在しています。骨組みには、基本的なアクセス制御ルールが記述されたアクセス制御（**permissions.acl**）ファイル、トランザクション処理機能が記述されたスクリプト（**logic.js**）ファイル、ネットワークのメタデータが記述された **package.json** ファイルも含まれています。

## 資産、参加者、トランザクションのモデリング

最初に更新するファイルは model ファイル（**.cto**）です。このファイルは [Hyperledger Composer モデリング言語](https://hyperledger.github.io/composer/latest/reference/cto_language.html) によって記述されています。モデルファイルには資産、参加者、トランザクション、イベントのクラスが含まれています。これは、モデリング言語のドキュメントに記載されている Hyperledger Composer のシステムモデルを暗黙的に拡張しています。

1. **org.example.mynetwork.cto** model ファイルを開きます。
2. 下記の内容に書き換えます。

    ```org.example.mynetwork.cto
    /**
     * My commodity trading network
     */
    namespace org.example.mynetwork
    asset Commodity identified by tradingSymbol {
        o String tradingSymbol
        o String description
        o String mainExchange
        o Double quantity
        --> Trader owner
    }
    participant Trader identified by tradeId {
        o String tradeId
        o String firstName
        o String lastName
    }
    transaction Trade {
        --> Commodity commodity
        --> Trader newOwner
    }
    ```

3. **org.example.mynetwork.cto** に変更を保存します。

## JavaScript によるトランザクションロジックの実装

model ファイルで **Trade** トランザクションが定義され、資産と参加者の関係が特定されています。トランザクション処理関数ファイルには、model ファイルで定義されたトランザクションを実行するための JavaScript が記述されています。

**Trade** トランザクションは、取引されている **Commodity** と新しいオーナーとして設定する **Trader** を単に受け入れることを目的としています。

1. **lib/logic.js** スクリプトファイルを開きます。
2. 下記の内容に書き換えます。

    ```logic.js
    /**
     * Track the trade of a commodity from one trader to another
     * @param {org.example.mynetwork.Trade} trade - the trade to be processed
     * @transaction
     */
    async function tradeCommodity(trade) {
        trade.commodity.owner = trade.newOwner;
        let assetRegistry = await getAssetRegistry('org.example.mynetwork.Commodity');
        await assetRegistry.update(trade.commodity);
    }
    ```

3. **lib/logic.js** に変更を保存します。

## アクセス制御の追加

1. **permissions.acl** ファイルを開きます。
2. 下記の内容に書き換えます。

    ```permission.acl
    /**
     * Access control rules for tutorial-network
     */
    rule Default {
        description: "Allow all participants access to all resources"
        participant: "ANY"
        operation: ALL
        resource: "org.example.mynetwork.*"
        action: ALLOW
    }
     
    rule SystemACL {
      description:  "System ACL to permit all access"
      participant: "ANY"
      operation: ALL
      resource: "org.hyperledger.composer.system.**"
      action: ALLOW
    }
    ```

3. **permission.acl** に変更を保存します。

# Step 3. ビジネスネットワークアーカイブの作成

ビジネスネットワークの定義が完了したので、デプロイ可能なビジネスネットワークアーカイブ（**.bna**）ファイルとしてパッケージングします。

1. コマンドラインを使用し、**tutorial-network** へ移動します。
2. 下記のコマンドを実行します。

    ```
    composer archive create -t dir -n .
    ```

コマンド実行完了後、**tutorial-network** ディレクトリに **<span>tutorial-network@</span>0.0.1.bna** ファイルが作成されます。

# Step 4. ビジネスネットワークのデプロイ

**.bna** ファイルを作成したので、ビジネスネットワークを Hyperledger Fabric のインスタンス上にデプロイ可能となりました。通常、チェーンコードをピアにインストールする権限と、チェーンコードを **composerchannel** チャネル上で開始する権限を持つ **PeerAdmin** ID の作成には、Fabric 管理者からの情報が必要となります。今回は開発環境インストールの一環として、既に **PeerAdmin** ID が作成されています。

ビジネスネットワークのインストール後、ネットワークが起動可能となります。ベストプラクティスとしては、デプロイ後にビジネスネットワークを管理するための新しい ID を作成するべきです。この ID はネットワーク管理者と呼ばれます。

## 正しい資格情報を取得する

正しい資格情報の **PeerAdmin** ネットワークカードが開発環境インストールの一環として作成されています。

## ビジネスネットワークのデプロイ

Hyperledger Fabric へのビジネスネットワークのデプロイには、Hyperledger Composer ビジネスネットワークをピアにインストールしてからビジネスネットワークを起動し、新規参加者、ID、関連カードを作成してネットワーク管理者にする必要があります。最後に、ネットワーク管理者カードを利用するためにはインストールが必要です。その後、ネットワークに ping を実行して応答することを確認できます。

1. ビジネスネットワークをインストールするために、**tutorial-network** ディレクトリで下記のコマンドを実行します。**composer network install** コマンドには以下のオプションが必要です。

    ```
    composer network install --card PeerAdmin@hlfv1 --archiveFile tutorial-network@0.0.1.bna
    ```  

    1. --card：PeerAdmin カード（今回は事前に作成及びインポートされています）
    2. --archiveFile：ビジネスネットワークを定義する **.bna** のファイルパス

2. ビジネスネットワークを起動するために、下記のコマンドを実行します。**composer network start** コマンドには以下のオプションが必要です。

    ```
    composer network start --networkName tutorial-network --networkVersion 0.0.1 --networkAdmin admin --networkAdminEnrollSecret adminpw --card PeerAdmin@hlfv1 --file networkadmin.card
    ```

    1. --networkName：ビジネスネットワークの名前
    2. --networkVersion：ビジネスネットワークのバージョン
    3. --networkAdmin：ビジネスネットワークの管理者の名前
    4. --networkAdminEnrollSecre：ビジネスネットワークの管理者のシークレット
    5. --card：PeerAdmin カード
    6. --file：ビジネスネットワークカードとしてインポートされるために作成されるファイルの名前

3. ネットワーク管理者 ID を使用可能なビジネスネットワークカードとしてインストールするために、下記のコマンドを実行します。**composer card import** コマンドには以下のオプションが必要です。

    ```
    composer card import --file networkadmin.card
    ```

    1. --file：**composer network start** コマンドでカード作成のために指定されたファイル名

4. ビジネスネットワークのデプロイが完了したかを確認するために、下記のコマンドを実行し、pingを飛ばします。**composer network ping** コマンドには以下のオプションが必要です。

    ```
    composer network ping --card admin@tutorial-network
    ```

    1. --card：ping を飛ばすネットワークを特定するためのビジネスネットワークカード

# Step 5. RESTサーバの生成

Hyperledger Composer は、ビジネスネットワークをもとにオーダーメイドの REST API を生成できます。ウェブアプリケーションを開発するために、REST API は言語に依存しない有用な抽象化レイヤを提供します。

1. **tutorial-network** ディレクトリに移動し、REST API 作成のために下記のコマンドを実行します[^2]。

    ```
    composer-rest-server
    ```

2. カードネームとして **admin@tutorial-network** を入力します。
3. API でネームスペースを使用するかどうかは、 **never use namespace** を選択します。
4. API を保護するかどうかは、 **No** を選択します。
5. パスポートを使用して認証を行うかどうかは、 **No** を選択します。
6. explorer テストインターフェイスを使用するかどうかは、 **Yes** を選択します。
7. ダイナミックロギングは設定しません。
8. イベントの発行を有効にするかどうかは、 **Yes** を選択します。
9. TLS を有効にするかどうかは、 **No** を選択します。

生成された API はデプロイされたブロックチェーンとビジネスネットワークに接続されています。

[^2]: カード名、ネームスペース指定後はEnter連打でOK

# Step 6. アプリケーションの生成

Hyperledger Composer は、REST API に対して実行される Angular 4 アプリケーションも生成可能です。

1. Angular 4 アプリケーションを作成するために、**tutorial-network** ディレクトリで下記のコマンドを実行します。

    ```
    yo hyperledger-composer:angular
    ```

2. 実行されているビジネスネットワークに接続するかどうかを尋ねられたら、**Yes** を選択します。
3. 標準の **package.json** の質問に回答してください[^3]。
4. ネットワークカードとして **admin@tutorial-network** を入力します
5. **Connect to an existing REST API** を選択します。
6. REST サーバのアドレスとして **http\://localhost** を入力します。
7. REST サーバのポートとして **3000** を入力します。
8. **Namespaces are not used** を選択します。

Angular ジェネレータはプロジェクトの足場を作成し、すべての依存関係をインストールします。アプリケーションの実行には、Angular プロジェクトのディレクトリへ移動し **npm start**[^4] を実行します。これにより、REST API に対して http://localhost:4200 で実行される Angular 4 アプリケーションが起動されます。

**NOTE：** Yo Angular アプリケーションジェネレータは、シンプルで基本的なビジネスネットワークの定義（ここでは、取引ネットワークモデル）に基づいて、スケルトン web アプリケーションを生成することを目的としています。[Writing Web Applications](https://hyperledger.github.io/composer/latest/applications/web.html) で Angular ジェネレータの詳細を参照してください。

[^3]: Project name、Description、License はデフォルトで問題なし、Author name、Author email は自分のものを入力
[^4]: 自分の環境ではエラーが発生。app.module.js を開き、30行目付近のカンマ、空行等を削除で直った