はじめに
株式会社日立製作所 研究開発グループ サービスコンピューティング研究部の池川です。
Blockchainに関する研究をしており、特にHyperledgerが管理するOSSを使っています。
第1回では、Intel SGXが搭載されていないVM上でFabric Private Chaincodeをシミュレーションモードで実行する手順をご紹介しました。
第2回では、Intel SGXが搭載されたVM上でFabric Private Chaincodeをハードウェアモードで実行する手順を紹介しました。
本記事では、Fabric Private Chaincodeを用いて書き込まれたトランザクションが実際にどのように台帳に書き込まれているかをHyperledger Explorerを用いて確認してみます。
Fabric Private Chaincodeとは(おさらい)
Hyperledger Fabric Private Chaincode(FPC)はLinux Foundationのブロックチェーン技術推進コミュニティであるHyperledgerが管理するOSSプロジェクトの1つです。
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本体に統合されるよう開発が進んでいます。
Hyperledger Explorerとは
Hyperledger Fabricなどのブロックチェーン基盤を用いているブロックチェーンネットワークで管理されている台帳の中身をGUIで可視化するWebアプリケーションです。
環境構築
この記事では、第2回で説明したハードウェアモードでの動かし方で用いた環境をそのまま使用します。
手順
第2回で説明したハードウェアモードでの動かし方で用いた環境をそのまま使用する。
今回はFabric Private Chaincodeの中のチュートリアルにあるhelloworld_cc.cpp
をインストールして動作確認を行います。
helloworld_cc.cppの一部関数を抜粋し、機能を説明します。
- storeAsset
- KeyとValueを引数として呼び出し、トランザクションをブロックチェーンに格納する。
- トランザクションが実行されその結果をState DBに書き込む。
- FPCの機能により、ブロックチェーンおよびState DBには暗号化された状態で書き込まれる。
- retrieveAsset
- Keyを指定しState DBからそのKeyに対応するを読み出し、Valueを返す。
- Valueは暗号化された状態であるためFPCの機能により復号化される。
// 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
があるディレクトリに移動し起動する
cd $FPC_PATH/samples/deployment/test-network/blockchain-explorer
docker-compose up -d
docker ps
で起動しているコンテナを確認してみます。
❯ 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番ポートにアクセスしてみます。
するとはじめにログイン画面が表示されます。
IDおよびパスワードは以下の初期設定がされています。
- ID: exploreradmin
- Password: exploreradminpw
上記IDおよびパスワードを用いてログインをすると次の画面になります。
下記のコマンドを実行してクライアントプログラムをビルドし、chaincodeに対してinvoke
を行います。
以下の操作では、先に説明したhelloworld_cc.cpp
内の関数であるstoreAsset
を呼び出し、引数としてKey: a
, Value: 10
としている。
# 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つのトランザクションがブロックチェーンに書き込まれます。
このトランザクションの中身を確認してみます。
書き込まれたデータに相当するvalue
の値が暗号化されて保存されていることを確認できます。
さいごに
今回はFPCを用いて書き込まれたトランザクションが実際にどのように台帳に書き込まれているかをHyperledger Explorerを用いて確認してみました。
Fabric Private Chaincodeは現在も開発が進んでいますので、引き続きその動向や使い方などを紹介していきたいと思います。