Hyperledger Fabric Private Chaincodeを動かしてみる #3 Hyperledger Explorerで確認

# はじめに

株式会社日立製作所 研究開発グループ サービスコンピューティング研究部の池川です。
Blockchainに関する研究をしており、特にHyperledgerが管理するOSSを使っています。

第1回では、Intel SGXが搭載されていないVM上でFabric Private Chaincodeをシミュレーションモードで実行する手順をご紹介しました。

https://qiita.com/ikegawa-koshi/items/39c98779ad8696b78816

第2回では、Intel SGXが搭載されたVM上でFabric Private Chaincodeをハードウェアモードで実行する手順を紹介しました。

https://qiita.com/ikegawa-koshi/items/8cf1fef1004fc16beb15

本記事では、Fabric Private Chaincodeを用いて書き込まれたトランザクションが実際にどのように台帳に書き込まれているかをHyperledger Explorerを用いて確認してみます。

## Fabric Private Chaincodeとは（おさらい）

Hyperledger Fabric Private Chaincode（FPC）はLinux Foundationのブロックチェーン技術推進コミュニティであるHyperledgerが管理するOSSプロジェクトの1つです。

https://github.com/hyperledger/fabric-private-chaincode

FPCを使用することによって、Hyperledger FabricにおけるChaincodeをTrusted Execution Environment (TEE)上で動作させることができるようになります。
TEEとはIntel Software Guard Extensions (SGX)やARM TrustZone、AMD Secure Encrypted Virtualization (SEV)などCPUベンダ各社が提供しているセキュリティ技術です。
メモリ上に暗号化領域を生成し、そこにプログラムやデータをロードすることでセンシティブなデータを保護しつつプログラムを実行することが可能となるCPUの機能です。

TEEを用いることにより、トランザクションおよびデータの内容を秘匿（暗号化）した状態でChaincodeを実行することが可能となり、プライバシー保護が必要なユースケースに適応可能となります。
2021年12月現在のFPCの実装ではIntel SGXを利用した実装が進められています。

また、FPCの実装はFabric本体のRFCプロセスを管理するhyperledger/fabric-rfcsにて承認されており、将来Fabric本体に統合されるよう開発が進んでいます。

https://github.com/hyperledger/fabric-rfcs

## Hyperledger Explorerとは

Hyperledger Fabricなどのブロックチェーン基盤を用いているブロックチェーンネットワークで管理されている台帳の中身をGUIで可視化するWebアプリケーションです。

https://github.com/hyperledger/blockchain-explorer

https://www.hyperledger.org/use/explorer

# 環境構築

この記事では、第2回で説明したハードウェアモードでの動かし方で用いた環境をそのまま使用します。

https://qiita.com/ikegawa-koshi/items/8cf1fef1004fc16beb15#%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89

# 手順

第2回で説明したハードウェアモードでの動かし方で用いた環境をそのまま使用する。

https://qiita.com/ikegawa-koshi/items/8cf1fef1004fc16beb15#%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89

今回はFabric Private Chaincodeの中のチュートリアルにある`helloworld_cc.cpp`をインストールして動作確認を行います。

https://github.com/hyperledger/fabric-private-chaincode/tree/main/samples/chaincode/helloworld

helloworld_cc.cppの一部関数を抜粋し、機能を説明します。

+ storeAsset
    + KeyとValueを引数として呼び出し、トランザクションをブロックチェーンに格納する。
    + トランザクションが実行されその結果をState DBに書き込む。
    + FPCの機能により、ブロックチェーンおよびState DBには暗号化された状態で書き込まれる。
+ retrieveAsset
    + Keyを指定しState DBからそのKeyに対応するを読み出し、Valueを返す。
    + Valueは暗号化された状態であるためFPCの機能により復号化される。

```cpp
//  Add asset_name, value to ledger
std::string storeAsset(std::string asset_name, int value, shim_ctx_ptr_t ctx)
{
    LOG_DEBUG("HelloworldCC: +++ storeAsset +++");

    put_state(asset_name.c_str(), (uint8_t*)&value, sizeof(int), ctx);

    return OK;
}

std::string retrieveAsset(std::string asset_name, shim_ctx_ptr_t ctx)
{
    std::string result;
    LOG_DEBUG("HelloworldCC: +++ retrieveAsset +++");

    uint32_t asset_bytes_len = 0;
    uint8_t asset_bytes[MAX_VALUE_SIZE];
    get_state(asset_name.c_str(), asset_bytes, sizeof(asset_bytes), &asset_bytes_len, ctx);

    //  check if asset_name exists
    if (asset_bytes_len > 0)
    {
        result = asset_name +   ":" +  std::to_string((int)(*asset_bytes));
     } else {
        //  asset does not exist
        result = NOT_FOUND;
    }
    return result;
}

```

Explorerを起動するための`docker-compose.yml`があるディレクトリに移動し起動する

```shell
cd $FPC_PATH/samples/deployment/test-network/blockchain-explorer
docker-compose up -d
```

`docker ps`で起動しているコンテナを確認してみます。

```shell
❯ docker ps
CONTAINER ID   IMAGE                               COMMAND                  CREATED        STATUS                  PORTS                                                                                                                             NAMES
dc531103dcbd   hyperledger/explorer:latest         "docker-entrypoint.s…"   46 hours ago   Up 46 hours             0.0.0.0:8080->8080/tcp, :::8080->8080/tcp                                                                                         explorer.mynetwork.com
1e92af5ae1dc   hyperledger/explorer-db:latest      "docker-entrypoint.s…"   46 hours ago   Up 46 hours (healthy)   5432/tcp                                                                                                                          explorerdb.mynetwork.com
eb5c77bf33bb   hyperledger/fabric-tools:latest     "/bin/bash"              5 days ago     Up 5 days                                                                                                                                                 cli
57e4fed0becb   hyperledger/fabric-orderer:latest   "orderer"                5 days ago     Up 5 days               0.0.0.0:7050->7050/tcp, :::7050->7050/tcp, 0.0.0.0:7053->7053/tcp, :::7053->7053/tcp, 0.0.0.0:9443->9443/tcp, :::9443->9443/tcp   orderer.example.com
9c7d769689f0   hyperledger/fabric-peer:latest      "peer node start"        5 days ago     Up 5 days               0.0.0.0:7051->7051/tcp, :::7051->7051/tcp, 0.0.0.0:9444->9444/tcp, :::9444->9444/tcp                                              peer0.org1.example.com
2080502088e4   hyperledger/fabric-peer:latest      "peer node start"        5 days ago     Up 5 days               0.0.0.0:9051->9051/tcp, :::9051->9051/tcp, 7051/tcp, 0.0.0.0:9445->9445/tcp, :::9445->9445/tcp                                    peer0.org2.example.com
```

`hyperledger/explorer`は8080番ポートで動作しているようです。
Webブラウザを用いてExplorerが動作しているサーバの8080番ポートにアクセスしてみます。
するとはじめにログイン画面が表示されます。

![スクリーンショット 2021-12-10 19.05.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190447/ebf2d146-48c1-87a8-8567-165c250ce3ad.png)

IDおよびパスワードは以下の初期設定がされています。

+ ID: exploreradmin
+ Password: exploreradminpw

上記IDおよびパスワードを用いてログインをすると次の画面になります。

![スクリーンショット 2021-12-13 15.35.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190447/e95230b1-a310-5298-db47-e1af5f96a02c.png)

下記のコマンドを実行してクライアントプログラムをビルドし、chaincodeに対して`invoke`を行います。
以下の操作では、先に説明した`helloworld_cc.cpp`内の関数である`storeAsset`を呼び出し、引数として`Key: a`, `Value: 10`としている。

```shell
# make fpcclient
cd $FPC_PATH/samples/application/simple-cli-go
make

# init our enclave
./fpcclient init $CORE_PEER_ID

# interact with the FPC Chaincode
./fpcclient invoke storeAsset a 10
```

上記の操作を行うと、`init`と`invoke`の2つのトランザクションがブロックチェーンに書き込まれます。

![スクリーンショット 2021-12-13 15.36.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190447/0b539cd3-e0be-43ab-5eb4-49495d59e7c7.png)

このトランザクションの中身を確認してみます。

![スクリーンショット 2021-12-13 15.36.41 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190447/5bbf60c8-ca87-4c4c-94b6-e3a061b669d2.png)

書き込まれたデータに相当する`value`の値が暗号化されて保存されていることを確認できます。


# さいごに
今回はFPCを用いて書き込まれたトランザクションが実際にどのように台帳に書き込まれているかをHyperledger Explorerを用いて確認してみました。
Fabric Private Chaincodeは現在も開発が進んでいますので、引き続きその動向や使い方などを紹介していきたいと思います。