〜WorldStateとPrivateDataの利用方法〜はじめにAdFraud情報共有プラットフォームは、データマーケットの商品選択として、実データを抽象化したデータジャケットの考えを利用しています。Blockchainを利用するため、このデータジャケット自体もChaincodeで実装しています。本記事では、このデータジャケットのChaincodeを実装する際に試したWorldStateとPrivateDataの利用方法をサンプルを含めて紹介したいと思います。WorldStateは、1つのテーブルしか持てないので、複数の情報をキーで分けて管理する際に便利な複合キー(CompositeKey)の使い方についても紹介します。Fabricにおけるデータベースのアクセスは下記の図のような経路になっています。それぞれのコンポーネントの役割は下記のようになっています。各参加者、もしくは一部の参加者でのみ同じ状態で保持するテーブルAPIインターフェイスChaincodeからCouchDB/LevelDBへアクセスするためのAPIインターフェイスは、下記が用意されています。このインターフェイスについては、SDKが用意されている全ての言語で共通になっています。Query(DBがCouchDBの時だけ使用可能)ChaincodeStub.getPrivateDataByRange()ChaincodeStub.getPrivateDataQueryResult()削除系ChaincodeStub.deletePrivateData()また、引数等の具体的なインターフェイス仕様については下記で参照できます。(バージョンによる違いがあるので、指定バージョンを確認したい場合は、この記事で紹介した環境を起動する必要があります。FabricでPrivateDataを利用するには、Chaincodeをデプロイ時に下記の手順を追加で行う必要があります。Dataを利用することができないように設定されています。このため、configtxgenコマンドを用いてchannelを作成するトランザクションファイルを生成する際に、下記の設定を追加する必要があります。Fabricでは、Chaincodeをデプロイする際に、PrivateDataのテーブル設定、およびアクセス権限を予め設定する必要があります。このため、下記のようなPrivateDataのアクセス権限の設定ファイルを用意し、InstantiateやUpdate時に追加選択して実行する必要があります。"OR('Org1MSP.member')"サンプルコードAdFraud情報共有プラットフォームでは、登録時点では公開しないデータジャケットを一時的に保存できるようにしています。このため、参加している各組織ごとにPrivateDataを用意しています。今回は、3つの組織ごとにPrivateDataを用意し、共通のインターフェイスで、それぞれの公開しないデータジャケットを取得するようなChaincodeのサンプルコードを載せています。Fabricでは、WorldStateが、デプロイされたChaincode1つに対して1つのWorldStateしか存在しないので、複数のデータを管理するために複合キーを利用することができます。この複合キーを利用した場合、データベースへの保存時は、複合キーに指定したそれぞれの値が連結して鍵になっている仕様のため、注意が必要です。今回は、この複合キーの生成、および、データジャケットを一括で取得するサンプルコードを下記に載せておきます。Fabric上でPrivateDataやWorldStateを利用する方法、および複合キーを利用したデータベース操作について紹介しました。Fabricについては、少し離れたことをしようとすると、公式ドキュメントからサンプルコードが少なくなる傾向があるので、こういうTipsが増えて欲しいと思います。今後も、開発時にハマったような知見があればブログに公開する予定のため、今後もよろしくお願いします。