Reference stateの可能性 ~ユースケース紹介編~

## 前書き
今回Reference state(以下Ref.state)に関する可能性を追求する調査を行いました。この調査により複数のユースケースで生じていた問題を解決することができます。本記事はCorda tech meetup 冬の陣(2023年2月22日開催)における発表の中で割愛した実際のテストコードを用いた結果の提示や詳しい説明の補足部分などを行う目的で作成されました。内容は、本記事の<font color="RED">**ユースケース紹介編**</font>と[**課題解決編**](https://qiita.com/ShotaIMO/items/847b3bfc824462834bbc)の２部編成でお届けしたいと思います。
Corda tech meetup 冬の陣のイベントレポートは[**こちら**](https://medium.com/corda-japan/corda-tech-meetup%E5%86%AC%E3%81%AE%E9%99%A3-%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88-2023%E5%B9%B42%E6%9C%88%E9%96%8B%E5%82%AC-93ef6b20ffc7)になります。

## 自己紹介
SBI R3 Japan株式会社にインターンでお邪魔している大学３年の井本翔太と申します。大学進学以来ブロックチェーンに興味を持ち始め、その仕組みや活用方法を学ぶ過程でCordaと出会いました。現在は、Cordaの機能調査やデモアプリケーション修正といったエンジニア業務やプレゼン資料作成といったビジネスサイドの仕事までありがたいことに様々な業務を経験させていただいております。

## １章：3つのユースケース紹介と共通課題の整理
はじめに3つのユースケースをご紹介し、それぞれに共通する課題について理解していただこうと思います。
### 1. Verifiable Credentials(VC)の失効確認
[Verifiable Credentials(VC)](https://www.w3.org/TR/vc-data-model/#what-is-a-verifiable-credential)とは分散型のIDである[DID](https://www.w3.org/TR/did-core/)に紐づく検証可能な資格情報になります。
前提として**ALice**、**VC発行会社**、**企業**という3つのエンティティが存在します。
はじめにAliceはVC発行会社の管理するVCをテストを受講することで下図のtxを発行しました(TOIECを受けてIIBCがスコア証明書を発行するイメージで大丈夫です。)。このVCのtxを企業での就職活動時にスコア証明として提出するケースを想定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2678414/244561df-f314-4de4-e10d-110ba4dc1a61.png)

ここで、Aliceがテスト受講の際に不正を働いていたことが発覚したため、VC発行会社は下図の失効txを発行しました。※チェーンで繋がっているのは先ほどのVC発行txの続きであることを意味します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2678414/7b220ead-5800-7dfd-f579-2f77f4236178.png)
しかしながら、Aliceは下図のように失効前のtx(<font color="RED">赤枠</font>に示すtx)を企業に渡すことが技術的に可能になります。**この時、企業はVCの発行や失効に関するtxの当事者ではないため、渡されたtxの有効性について一切把握することができません。** つまり、企業は渡されたtxを元に700点のVCが有効であると判断せざるを得ません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2678414/e2c5e1b6-a857-53d1-fd8f-f3e9a47e2671.png)
そこで、企業がAliceから渡されたtxのVC stateが有効なのか失効なのか確認する方法は存在しないのでしょうか？企業がVC stateをNotaryに投げ、検証した結果が**未消費**であれば、更新されていないため<font color="RED">**VC stateをInputStateとして消費した失効txは発行されていない=有効**</font>と判断できます。一方、**消費済み**であれば、更新されたため<font color="RED">**VC stateをInputStateとする失効txが発行された=無効**</font>と判断できます。したがって、VC stateの消費状況が判明すれば有効性を把握することができます。


### 2. トークン取引の第三者がその存在を確認する方法
続いてのユースケースはトークン取引の際に生じる問題に焦点を当てています。今回はトークンとして日本酒を指定しました。
前提として、**Party A**、**Party B**、**Party C**の３つのエンティティが存在します。
はじめに下図の左のtxようにParty Aが所持している日本酒を下図の右のtxでParty Bに移転します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2678414/f9d37f5e-8f0a-fdb4-e085-39e6d1006ee3.png)
その後、Party CはParty Aに対して日本酒を購入したい意向を示します。Party Cは取引前にParty Aにて日本酒所持の事実を確認したいため、事前確認としてParty Aの日本酒所持を示すtxの送信をParty Aに要求します。しなしながら、**現在Party Aに日本酒は存在せずParty Bに移転されています。**
ここでイレギュラーの発生として、移転したにも関わらずParty Aは誤って事前確認として日本酒の所持を示す<font color="RED">赤枠</font>のtxをParty Cに渡してしまいました。この時、**Party Cは日本酒移転に関するtxの当事者ではないため、渡されたtxを元にParty Aに日本酒があると判断せざるを得ません。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2678414/711b6b16-f606-e12f-1477-3a4ba6b91865.png)
Party CがParty Aから事前確認として渡された日本酒所持に関するtxを信じるのではなく検証する方法は存在しないのでしょうか？Party Cが日本酒stateをNotaryに投げ、検証した結果が、**未消費**であれば、更新されていないため<font color="RED">**日本酒stateをInputStateとする移転txは発行されていない=Party Aは日本酒を所持**</font>と判断できます。一方、**消費済み**であれば、更新されたため<font color="RED">**日本酒stateをInputStateとする移転xは発行された=Party Aは日本酒を所持していない**</font>と判断できます。したがって、日本酒stateの消費状況が判明すれば日本酒の所有状況を把握することができます。

### 3. Nodeに関する障害発生によって失われたstate情報の確認
最後のユースケースはNodeに関する障害が発生した際に生じる問題に焦点を当てています。
前提としてNode-Notary間で通信中に障害が発生し、Nodeは時点スナップショットを用いたロールバックで自身の情報の復元を試みます。下図にて通常のNode-Notary間での通信中にNodeで障害が発生する具合を示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2678414/9e17908d-4b68-2bb4-86c7-67053bd84d55.png)

その後、時点スナップショットを用いたロールバックにてNodeは自身の情報を復元しますが、下図に示すように時点スナップショット以降の情報は失われてしまいます。したがって、復旧したNodeは障害発生時に処理していたtxを再度流そうとしても**障害によって失われた期間にtxのInputStateをNotaryが消費済みとしたのか未消費のままなのか把握できない**といった問題が生じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2678414/d3bbd8bc-34f0-f60e-7a6b-1d026d34f81d.png)
そこでNodeがInputStateの消費状況を検証する方法は存在するのでしょうか？NodeがInputStateをNotaryに投げ、検証結果が**未消費**であれば、<font color="RED">**NotaryはInputStateを処理していない**</font>と判断できます。一方、**消費済み**であれば、<font color="RED">**NotaryはInputStateを処理した**</font>と判断できます。したがって、InputStateの消費状況が判明すれば再びtxにて使用できるか把握することができます。

### 共通する課題の整理
先ほどの3つのユースケースに共通する課題として、<font color="RED">**あるtxの中のstateの消費状況を知りたい**</font>という問題が存在していました。
- VCのケース：企業がParty Aから渡されたtxのVC stateの消費状況を検証したい
- 日本酒トークン：Party CがParty Aから渡されたtxの日本酒 stateの消費状況を検証したい
- Node障害のケース：Nodeが障害によって失われた期間にtxのInputStateが消費されたかどうかを検証したい

消費状況を確認したいのであれば下図のように目的のstateをInputStateとしてtxに含めてNotaryに問い合わせてはどうでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2678414/8c841003-2294-7623-cc21-59e207ce7ca5.png)
しかしながら、この手法では**消費状況を確認したいstateが未消費だった場合も消費済みになってしまいます。** つまり、消費状況を確認するためにNotaryに問い合わせを行った結果、強制的に消費済みになってしまう大きな問題点が存在します。またCordaは二重消費をNotaryが検知するため、そのstateは二度とtxで使うことができません。

以上から、<font color="RED">**消費状況を確認したいstateを問い合わせの際に消費することなく検証する必要があります。**</font>


## 2章：検証により実現可能な要件
この検証を実現することで、従来手法では難しいと考えられていた要件を達成することができます。それは、<font color="RED">**目的のstateをInputStateとして消費したtxの存在を検知できる**</font>という点です。目的のInputStateしたtxとは、VCのユースケースでは失効tx、日本酒トークンのユースケースでは移転txになります。
従来手法では達成不可能な理由としては、Cordaのプライバシー性の高さにあります。Cordaではプライバシー性の高さによりtxの当事者以外(第三者)がその概要を確認することはできません。そのため、txの存在確認のため関連するtx(AliceのVC発行tx、Party Aが日本酒所持を示すtx)を受け取った第三者が、その中に含まれるstate(700点のVC state、日本酒state)をNotaryに問い合わせても強制的に消費済みとなります。したがって、目的のstateが使用されたtxの存在を検知できませんでした。しかしながら、消費状況が変わることなく問い合わせが可能になれば、関連するtxとチェーンで繋がるtxの存在を検知できます。ここで強調したいのは、<font color="RED">**データは完全に閲覧不可能であるため、Cordaが提供するプライバシー性は崩壊する事がない**</font>という点です。




## 終わりに
以上が**ユースケース紹介編**になります。さて、消費状況を変えることなく問い合わせを実現する手法はどのようにして実現するのでしょうか？お察しの良い皆様なら、タイトルのキーワードである **「Reference state」** が出てきていないことにお気付きだと思います。閑話はここまでにしまして、解決方法に興味を持たれた方はぜひ[**課題解決編**](https://qiita.com/ShotaIMO/items/847b3bfc824462834bbc)をご覧ください。
Cordaにご興味のある方は[**SBI R3 Japan株式会社**](https://sbir3japan.co.jp/)へ直接ご連絡いただければ幸いです。ご一読ありがとうございました。