Hyperledger Fabricにおける秘匿化パターンまとめ
前提
zabeth.icon LayerX公式の解釈ではないがとりあえずこの記事では匿名と秘匿化をこのような定義にする
匿名化: 誰が発行したTxかわからなくする
秘匿化: Txの中身をわからなくする
Hyperledger Fabricの秘匿化・匿名化の仕組み
Hyperledger Fabricでは公式に備わっている機能としては秘匿化しか存在せず、匿名化は自分で頑張って実装するしかない(できるのか??)
秘匿化もある個人間の秘匿化ではなく、ネットワークに参加する組織間での秘匿化に限られる
サマリ
zabeth.icon あ、書いてなかった....
Hyperledger Fabricの秘匿化機能
Channel
Hyperledger FabricではChannelごとにブロックチェーンが分かれている
Channelに属する組織及びPeerのみにそのChannelのブロックが配られる
Channel内の特定の組織のみにデータを共有することはできない
さらにその特定の組織のみで構成されるChannelを作成するか、その組織のPeerしか参加していないPrivate Dataを定義する
情報を共有していい組織のみで構成されるChannelを作成することで情報を秘匿化できる
Channelによる秘匿化は暗号化によるものではなく、「許可された組織にしかデータを配らない」ことによる秘匿化
Channelに組織を追加したり削除したりする手順はまぁまぁめんどくさい....
zabeth.icon 一度仕組みを作ればそうでもないが...
Private Data
指定したPeer間でのみstateを共有し、許可されていない(同一Channel上の)PeerにはTxのHashのみを配る仕組み
QuorumのPrivate Transactionに似ている
耐改ざん性はChannelに参加しているPeer全体で確保しつつ、中身は許可されたものだけで共有する
zabeth.icon Purge機能があるので、台帳上に永続的に持たせることは想定されていないという認識
各々がデータを外部に保存できる仕組みが必要になる
Private DataはChaincodeに紐付いているので、同一Channelの組織にしか使えない(Channelをまたげない)
zabeth.icon 別Channelでもいけるの....?(調べたことない)
Private Dataの定義の変更や共有するPeerの追加 or 削除をするにはChaincodeをupgradeする必要がある
Private Dataの定義をCollectionと呼ぶ
Collectionは共有する組み合わせごとに作成する
どうやって使うの?
ChannelとPrivate Dataのどちらを使うべきかというのはケースバイケースなので幾つかケースを並べてみる
①2つの組織間でのみデータを共有したい&その組み合わせがめちゃくちゃ多い
Channelで実現する場合
Channel数がかなり多くなるが、それに伴うデメリットとして管理コストの上昇がある
複数Channelで同じ内容のChaincodeを利用する場合でもChaincodeはChannelそしごとに管理されるので全Channelでupgradeが必要になる
また、各Channelで少しずつ権限設定が違う場合はすべてを正確に管理するのは難易度が高いと思われる
そのChannelに2組織しか参加しないのであれば耐改ざん性が乏しくなる可能性がある
複数のデータにアクセスしたいときにChannelをまたぐ必要性があり、atomicなTxを保証できない
Private Dataで実現する場合
全組織が同一のChannelに属し、各組織同士で必要なcollectionを定義する
もし同一のChaincodeを利用していてupgradeが必要になった場合、全員同じChannelに属しているので1回で済む
hashはChannelに属するPeerすべてが保持するので耐改ざん性は高くなる(※ただし改ざんの検知のみ)
同一のChannelに属しているのでatomicに他のprivate dataやchannel全体で共有されているstateにアクセスできる
②2つの組織間でのみデータを共有したい&組み合わせは数個程度
各組織間でChannelを作成して良いと思われる
管理コスト上昇が限定的と予想されるため
③ 期間限定で一部の組織間でのみ共有したいデータがある
Private Dataを利用すべき
期間限定なのでChannelを永続的に保持する必要性は薄い
わざわざ新しいChannelを作成せずに済む
Purge機能が使える
今まで使っていたstateにシームレスにアクセスできる(同一Channel内にcollectionを定義するのであれば)