【Hyperledger Indy/Aries】ACA-PyでVerifiable Credentialを失効させる

SSI

こんにちは。GMOグローバルサイン・ホールディングスCTO室で分散型IDの研究開発をしている神沼@t_kanumaです。

この記事ではHyperledger Ariesの実装の1種であるACA-Py(Aries Cloud Agent – Python)が持つ、Verifiable Credentialに対するRevocation機能を試します。まず記事の前半でIndyにおけるRevocationについて述べ、後半で動作確認について述べます。

前提

Hyperledger Indy、AriesおよびACA-Pyについての詳細は省きますが、端的にいうとACA-PyはDockerコンテナ上のPythonプロセスです。詳細は拙著ではありますが、以下の記事をご参照ください。

また当記事ではローカルに環境を構築します。
以下の拙著の内容を前提にしていますので軽く目を通した上でお進みください。

リファレンス

  1. GitHub – hyperledger/indy-nodeTransactionに関するドキュメント
  2. GitHub – Indy RFC 0011: Credential Revocation
  3. GitHub – Aries RFC 0441: Prover and Verifier Best Practices for Proof Presentation
  4. Linux Foundationによるオンライン講座

1. Revocationについて

(1) 全体像

(2) 概要

Verifiable Credential(VC)の失効は、例えば期限切れなどでVCの有効性を抹消したい目的だけでなく、VCの更新を目的とするケースでも執り行われます。具体的な例としては、メールアドレスや住所、電話番号などClaimの内容に変更がある場合です。

誰がVCの失効を管理するかというと、それはIssuerです。IssuerはVCを失効させる権限を持ち、それを実行に移します。その際にIssuerはIndy Ledger内にCredential DefinitionごとにRevocation Registryなるモノを作る必要があります。そこで自身が過去に発行したVCに対する失効状態を管理をします。失効機能をつけるか否かはCredential Definitionごとのオプションであり、Issuer次第です。

ここでIssuer側ではなく、HolderおよびVerifierの視点に立ってみます。詳しくは後述しますが、HolderはVC発行時にIssuerから渡された情報を元に、Verifierに対し提示するProofに含まれる各Claimが失効していないことを証明します。VerifierはHolderから提示される情報と、IssuerがLedger上に作成した(誰でも情報を参照でき、かつ改竄されていないと信頼できる)Revocation Registryの内容を照合して検証します。

VerifierはProof提示の際に、発行元の検証だけでなく失効の検証においても、Issuerに直接問い合わせるのではなく、信頼できるDistributed Ledgerに問い合わせるわけです。

(3) Revocation RegistryとLedger上のTransaction

ではここから、まずはIssuerが管理するRevocation Registryについて見ていきます。

Revocation Registryは、Indy Ledger上の2種のTransactionとして表現されます。Revocation Registry DefinitionRevocation Registry Entryです。

Transaction同士の関係図

Trasaction Type: REVOC_REG_DEF

Revocation Registry Definitionはその名の通り、Revocation Registryの定義です。Credential Definitionを親レコードとして、1:多で紐付きます。

このTransactionが持つ全属性のリスト、およびサンプルデータについては、前述リファレンスNo.1のドキュメントをご確認ください。

以下、代表的なものをあげてみます。

  • credDefId: いわば外部キー的なもので、このCredential DefinitionにRegistryが紐づきます。
  • maxCredNum: このRegistryで管理できる発行済みCredentialの上限数です。
  • tag: 同じCredential Definitonに紐づく複数のRegistryを識別するためのタグです。
  • tailsLocaltion: Tail ServerのURLです。後述の「(5) Proof提示における”失効していないこと”の検証」にて説明します。

Transaction Type: REVOC_REG_ENTRY

Revocation Registry Entryは、上記のRevocation Registry Definitionを親として1:多で紐づきます。このTransactionはIssuerがVCを失効させる度に作成されます。

このTransactionが持つ全属性のリスト、およびサンプルデータについては、前述リファレンスNo.1のドキュメントをご確認ください。

以下、代表的なものについて上げてみます

  • revocRegDefId: 親となる言わば外部キー的なRevocation Registry DefinitionのIDです。
  • accum: 後述の「(5) Proof提示における”失効していないこと”の検証」にて説明します。
  • revoked: 前回のTransactionの時点から新たに失効されたVCの配列のインデックスです。前回のTransactionからの差分のみを持ちます。

(4) 失効状態の管理方式

まずIndyの世界では、PKIにおけるCRL(Certificate Revocation List)のような、どのVCが失効されているかいないかを判断できる失効リストを公開していません。それはなぜかというと、そうすると複数のVerifierが結託することで情報の相関付け、名寄せが成されてしまい、Holderのプライバシーが保護されなくなってしまう危険性があるためです。

失効リスト方式にするということは、Verifierが失効リストを眺めて、”このVCは失効されている、これはされていない”と判断できるということで、全てのVCを一意に識別するための何かしらのIDがVCに含まれているということです。

VerifierがVCの一意性を認識できてしまうと、裏で他のVerifier達と結託して、あるVCが、どのサービスでいつどのように使われているかが丸わかりになってしまう恐れが出てきたり、
Holderがどこの誰だか特定されてしまうリスクも高まります。Holderのインターネット上の生活におけるプライバシーが守られない結果になるわけです。

これではProof提示検証の際に、HolderがPairwise DIDでVerifierごとにIDを変えて相関付けのリスクを下げたり、ゼロ知識証明を使い明かす情報を最小限に留めるなど、プライバシーを保護するために行っている工夫の効果が全体として薄れてしまいます。

ではどうやってVerifierは失効の状態を検証するかというと、Cryptographic Accumlatorというハッシュ関数と、Accumlatorを円滑に機能させるためにTail Fileというファイルが登場します。

ここからはそれらを中心に、Proof提示における”失効していないこと”の検証の仕組みを見ていきます。

(5) Proof提示における”失効していないこと”の検証の仕組み

まずHolderがProofを作成してそれをVerifierに提示した際、Verifierが何を検証するかについて述べます。Verifierは以下の5つのことを検証します。

  1. 想定しているIssuerがClaimを発行していること。
  2. Claimの値がVerifierの要求する条件に合致すること。
  3. Proofを提示したHolderが、Proofの素であるClaimのオーナーであること。
  4. Claimが改竄されていないこと。
  5. Claimが失効していないこと。

当記事で重要なのはNo.5です。

次に前述したRevocation Registry Entryが持つ属性”accum(Accumlator Value)”についてです。
Wikipediaによると暗号学におけるAccumlatorとは、以下の通りです。

暗号化では、アキュムレータは一方向のメンバーシップハッシュ関数です。これにより、ユーザーはセットの個々のメンバーを明らかにすることなく、潜在的な候補者が特定のセットのメンバーであることを証明できます。

属性”accum”も、これと同じモノ(accumの値はAccumulatorにより、複数の値が合算されたモノ)だと考えます。これを頭に入れつつ、”失効していないことの検証”の仕組みを述べていきます。

Holderは、VC発行時にIssuerから、各VC固有のランダム値を受け取ります(以降これをXとします)。このXはAccumulator Valueの因子です。言い換えれば各VC固有のXが合算されるとAccumulator Valueになるということです。HolderはVerifierに対するProof提示の際に、このXがAccumulator Valueの因子の1つであることを、Xを明かさずに証明します。つまりは前述の相関付け、名寄せを防ぐためにゼロ知識証明するということです。

実際にはIssuerからHolderへ値Xを直接は渡すことはしていません。IssuerがHolderへ渡すのは、各Xを要素に持つ配列におけるインデックスです。この配列はTail Fileと呼ばれます。Tail FileはIssuerによりRevocation Registryと一緒に作成され、それ以降変更されないバイナリファイルで、Revocation Registryに1:1で紐付きます。また、誰でも取得可能である必要があり、Issuerがそれを公開するサーバを管理します。HolderはProof提示の際にTail Fileを参照し、自身に与えられたインデックスに対応するXを元にゼロ知識証明するわけです。(Tail Fileの内容は変わらないたいため、Holderは初回の参照時にダウンロードしてそれ以降はローカルを参照していると考えます。)

繰り返しますが、ポイントとしてTail Fileに変更は入りません。上記でRevocation Registry作成時に、maxCredNum属性でこのRevocation Registryで管理できるVCの上限数を指定していました。例えばこれに1000を指定した場合、Tail Fileには初期時点で長さ1000の配列が作られ、それぞれのインデックスに対してランダム値Xが割り振られると考えます。

VC失効の際には、Issuerは失効したVCのXが寄与しなくなるようAccumlator Valueを再計算します。そして再計算したAccumulator Valueを含む新たなRevocation Registry EntryをLedgerに作成します。

最後に、Revocation Registry Entryの”revoked”属性にて失効したVCのTail File上のインデックスを記録している理由について述べます。Proof提示の際のゼロ知識証明のために、IssuerはVC発行時、X以外にもう1つ別の値もHolderに与えます。それはそのVC以外のAccumulator Valueに寄与する因子群を合算した値です(以降Yとします)。HolderはXが寄与することの証明にYも使います。ここで問題なのは、自身のVC発行以降に異なるVCの失効でAccumulator Valueが更新されると、Yが最新の値ではなく古くなってしまう点です。ここでHolderは、そのVCの発行以降のRevocation Registry EntryのTransaction群を参照することで、 差分のX群を特定することができ、自身でYの更新をするわけです。

(これは推測ですが、HolderがTail File上の値群を素に、Proof検証が通るようXとYを偽造することを防止するために、IssuerがHolderに渡すYには、Issuerのみが知るシークレットな値が含まれているのではと考えます。)

(6) W3CのVC失効に関する仕様との比較

W3Cが抱えるVCs Data Modelに準拠VC失効に関する仕様には、Revocation List 2020Status List 2021の2つがあります。(後者は前者の後継版で、仕組みは変わらないがデータモデルが若干変更されている理解でいます。)

Indyと比較すると、Indyの方がHolderのプライバシー保護に優れるが、その分仕組みが複雑になっているという結論に至りました。以下、その個人的な見解の詳細です。

共通部分

両者ともIssuerによるProof提示のトレースは起きません。

Status List 2021は失効リストをビット配列として用意します。処理方式として、VerifierがIssuerにHolder VCに記載された配列のindexを渡すことはしません。VerifierはIssuerからビット配列を取得し、Verifier側の環境でindexのビット状態、つまりは失効状態を確認します。

もしVerifierがIssuerにindexを渡し、Issuerから失効状態を返してもらうとなると、IssuerはあるVCがどのVerifierに提示されているのか、そのトレースができてしまうことになります。

異なる部分

Holderの名寄せ(correlation)に対する対応が異なります。

Status List 2021では、VC内に失効状態を管理するビット配列のindexを埋め込んでいるため、そのindexがVCの識別子になってしまってしまいます。これにより、悪意のVerifier同士が結託することで、Holderへの名寄せが起こる可能性が高まります。

Indyでは、前述した通り、このindexをVerifierに明かさずに、配列に寄与することをZKPします。

2.動作確認

では、ここからはACA-Pyを使った実際の動作確認に入っていきます。

(1) 確認事項

以下を確認します。

  • 発行したVerifiable Credentialを失効できること。
  • 失効されたVerifiable Credentialを素にしたProofの検証に失敗すること。(無効なProofであることの確認)

(2) 環境

上図の通り、ローカル環境にて以下を準備します。(数字は各OSSのバージョンです。)

四角で表現された要素は全てDockerコンテナ、カッコ内は利用するフレームワーク/ソフトウェアです。

(3) ACA-PyにおけるRevocation

検証に入る前に、ACA-PyのRevocation周りの起動パラメーターとAdmin API Endpointについて簡単に述べておきます。

起動パラメーター

Revocationに関する起動パラメーターには以下のものが用意されています。

  • tails-server-base-url
    • Tail ServerのURLです。
  • tails-server-upload-url
    • IssuerがTail FileをアップロードするURLです。
    • デフォルトではtail-server-base-urlの値です。
  • notify-revocation
    • Issuer向けのパラメーターです。
    • IssuerがVCを失効したときに、そのVCのオーナーであるHolderに(DIDCommで)通知を飛ばすか否かと設定します。
    • Aries RFC 0721: Revocation Notification
  • monitor-revocation-notification
    • Holder向けのパラメーターです。
    • IssuerからVC失効の通知が来た際に、Holder自身のWebhookをコールするか否かを設定します。

Admin API Endpoint

次にAdmin APIが構えるRevocationに関するEndpointは以下の通りです。

Revocation Registryを作り前述のTransactionをLedgerに作成したり、VCを失効してそれをLedgerに同期することなどができることがわかります。

(4) フロー

以下のフローに従い進めていきます。

  1. von-networkおよびVerifier役のACA-Py起動
  2. Tail Serverの起動
  3. IssuerおよびHolder役のACA-Py起動
  4. IssuerによるTransaction(Schema、Credential Definition)の作成
  5. Revocation Registryの確認
  6. IssuerによるVCの発行
  7. IssuerによるVCの失効
  8. Revocation Registry Entryの確認
  9. Proof検証が失敗することの確認

それではこのフローに従って進めていきます。

1. von-networkおよびVerifier役のACA-Pyの起動

前述の拙著(c)をご参照ください。

2. Tail Serverの起動

開発用のIndy Ledgerであるvon-networkを開発するカナダブリティッシュ・コロンビア州がGitHubでTail Serverを提供しています。

GitHubからリポジトリをクローンします。

git clone https://github.com/bcgov/indy-tails-server.git -b v1.0.0 --depth 1

私の場合、docker-compose.ymlを少々修正しました。具体的には、IssuerとHolderがTail Serverにアクセス可能になるよう、Docker内のIssuerとHolderのACA-Pyが所属するネットワークに、このTail Serverも含めるように修正しました。

起動コマンドが用意されています。

./manage start

# 停止は以下のコマンドでした。
./manage stop

3. HolderおよびIssuer役のACA-Pyの起動

前述の拙著(c)のdocker-compose.ymlの内容に以下のパラメーターを追加します。

--tails-server-base-url <url>

4. IssuerによるTransaction(Schema、Credential Definition)の作成

VCの中身は何でも良いのですが、今回は”社員証”にして以下のClaimを持つようにします。

  • 社員番号
  • 名前
  • 部署

まずはSchemaを作成します。

# request
curl -X 'POST' \
  'http://localhost:8031/schemas' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "attributes": [
    "employee_id","name","department"
  ],
  "schema_name": "employee",
  "schema_version": "2.0"
}'

#response
{
  "schema_id": "Vtw2qgmuMVy3rk2ipw7Vxt:2:employee:2.0",
  "schema": {
    "ver": "1.0",
    "id": "Vtw2qgmuMVy3rk2ipw7Vxt:2:employee:2.0",
    "name": "employee",
    "version": "2.0",
    "attrNames": [
      "department",
      "name",
      "employee_id"
    ],
    "seqNo": 32
  }
}

Ledger上でも確認します。

次にCredential Definitionを作成します。
上記で作成したSchemaのID、Revocation Registryで扱うVCの上限値(revocation_registry_size)、このCredential Definition作成時に自動でRevocation Registryを作るかどうか(support_revocation)を指定します。

# request
curl -X 'POST' \
  'http://localhost:8031/credential-definitions' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "schema_id": "Vtw2qgmuMVy3rk2ipw7Vxt:2:employee:2.0",
  "revocation_registry_size": 1000,
  "support_revocation": true,
  "tag": "1"
}'

# response
{
  "credential_definition_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1"
}

Ledger上でも確認します。

5. Revocation Registryの確認

上記4でCredential Definitionを作成するときに、”support_revocation:true”に設定していたため、Credential Definitionと同時にRevocation Registry Definitionも作成されます。

# request
curl -X 'GET' \ 'http://localhost:8031/revocation/registry/Vtw2qgmuMVy3rk2ipw7Vxt%3A4%3AVtw2qgmuMVy3rk2ipw7Vxt%3A3%3ACL%3A32%3A1%3ACL_ACCUM%3Ac9a32814-a024-4ce3-a29c-30723ecc6aac' \
  -H 'accept: application/json'

# response
{
  "result": {
    "max_cred_num": 1000,
    "revoc_reg_entry": {
      "ver": "1.0",
      "value": {
        "accum": "21 11EAF11256BBAD50054553FF9B5C8A00A2EE5BAD48A408C78CCD40BED15DA71CC 21 1205A36610385D6A4077A159648E8A4AC5E63D1AEC80140787ECE6BCAA3611DAB 6 74C9FF9EF2A222626DC8BB1A6CBDD27B260758BCB4D3A280E82A576E1C90A9C5 4 1AD1902435D1ACD78B78334FF65CDF2B54364E8C48A3BBDBB71B3526882071F0 6 7AA9A633C5D191C6155BF26DD5C795FC53B47D8A2B6025A01B4253A5EB7516CC 4 07DF6CCFD61646BD7DAECC4292DC38C609C3FB1FC3788EC0BFB86956966BA768"
      }
    },
    "pending_pub": [],
    "updated_at": "2022-06-09T04:29:33.577769Z",
    "revoc_def_type": "CL_ACCUM",
    "tails_public_uri": "http://172.19.0.6:6543/Vtw2qgmuMVy3rk2ipw7Vxt:4:Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1:CL_ACCUM:c9a32814-a024-4ce3-a29c-30723ecc6aac",
    "created_at": "2022-06-09T04:29:27.700095Z",
    "revoc_reg_id": "Vtw2qgmuMVy3rk2ipw7Vxt:4:Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1:CL_ACCUM:c9a32814-a024-4ce3-a29c-30723ecc6aac",
    "record_id": "c9a32814-a024-4ce3-a29c-30723ecc6aac",
    "tag": "c9a32814-a024-4ce3-a29c-30723ecc6aac",
    "tails_hash": "CrF3Vuca7tzykrtnxiXrfsWu36ZjVMzLRPy1ZkikbVK3",
    "issuer_did": "Vtw2qgmuMVy3rk2ipw7Vxt",
    "revoc_reg_def": {
      "ver": "1.0",
      "id": "Vtw2qgmuMVy3rk2ipw7Vxt:4:Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1:CL_ACCUM:c9a32814-a024-4ce3-a29c-30723ecc6aac",
      "revocDefType": "CL_ACCUM",
      "tag": "c9a32814-a024-4ce3-a29c-30723ecc6aac",
      "credDefId": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1",
      "value": {
        "issuanceType": "ISSUANCE_BY_DEFAULT",
        "maxCredNum": 1000,
        "publicKeys": {
          "accumKey": {
            "z": "1 1D72FA3E85937C59D0DD8D5DEEDBDCABE14D89AE773B8DE9575333386278F7E9 1 0DA1B6506417D5CE11F74AC6E85456E8DA37DCABDF7E9D1927529B964ADFC63F 1 16B1261B92860EA9ACF498EFF1E643B5A71D4082A438093A7E894AB22C27BD16 1 1D2C46844FEBDB275B8E2CEFABC1EDF878B6F29C7FEB3279956C97A1B46E787D 1 15C440E26334E75048D5E2619D15FACFECCED5A1FEFF67C9F7C822EFF6E3A374 1 23BBEF3B305D306CC4EABEA417F0335B8D1522FCF484168BE2A94AFBAB62EE78 1 214E86800ABC1D2F23AC2D230CD7FBA1582B38EC98893551A50D26D70F5CE880 1 0201A1F3B55A93839C92A38DFF09E842FB83CAC583F9F088FE7ECA7D21E1E3C6 1 030E97D155C468D0FE637F4E452873F11B9C1E4D7B1793BFCAA9F28BB9FE7ADD 1 17B06895822481D0427998E5A5209F4269F9D1A87D611C7FE6442E90450C2D15 1 0F2D7E9A163DFF71802518D3B014823CB389E78F0C070B4532F3151CCAC5B297 1 09874FB834FF726845C8181E19F368E100A8C702D258651B94ABE17AF692438A"
          }
        },
        "tailsHash": "CrF3Vuca7tzykrtnxiXrfsWu36ZjVMzLRPy1ZkikbVK3",
        "tailsLocation": "http://172.19.0.6:6543/Vtw2qgmuMVy3rk2ipw7Vxt:4:Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1:CL_ACCUM:c9a32814-a024-4ce3-a29c-30723ecc6aac"
      }
    },
    "state": "active",
    "tails_local_path": "/home/indy/.indy_client/tails/Vtw2qgmuMVy3rk2ipw7Vxt:4:Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1:CL_ACCUM:c9a32814-a024-4ce3-a29c-30723ecc6aac/CrF3Vuca7tzykrtnxiXrfsWu36ZjVMzLRPy1ZkikbVK3",
    "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1"
  }
}

Ledger上でも確認します。

続いて、Revocation Registry Entryの初期Trasanctionの確認です。
このAccumulator Valueの値は、Tail File上の全ての因子が寄与した結果のモノだと考えます。

最後にTail Serverのログを確認すると、IssuerがTail Fileをアップロードしている様子が見て取れます。

6. IssuerによるVCの発行

まずIssuerとHolderの間にコネクションを張ります。詳細は割愛します。

IssuerからVC発行オファーを出します。

# request
curl -X 'POST' \
  'http://localhost:8031/issue-credential/send-offer' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "auto_remove": false,
  "comment": "vc offer",
  "connection_id": "5e66ac87-2352-42d8-9323-24606ce908ae",
  "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1",
  "credential_preview": {
    "@type": "did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/issue-credential/1.0/credential-preview",
    "attributes": [
      {
        "name": "name",
        "value": "Alice"
      },
      {
        "name": "department",
        "value": "R&D"
      },
      {
        "name":"employee_id",
        "value": "12345"
      }
    ]
  },
  "trace": true
}'

# reponse
{
  "role": "issuer",
  "schema_id": "Vtw2qgmuMVy3rk2ipw7Vxt:2:employee:2.0",
  "credential_offer_dict": {
    "@type": "did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/issue-credential/1.0/offer-credential",
    "@id": "3f8d2e23-660c-4a91-b484-f1333a3018db",
    "~thread": {},
    "~trace": {
      "target": "log",
      "full_thread": true,
      "trace_reports": []
    },
    "comment": "vc offer",
    "offers~attach": [
      {
        "@id": "libindy-cred-offer-0",
        "mime-type": "application/json",
        "data": {
          "base64": "eyJzY2hlbWFfaWQiOiAiVnR3MnFnbXVNVnkzcmsyaXB3N1Z4dDoyOmVtcGxveWVlOjIuMCIsICJjcmVkX2RlZl9pZCI6ICJWdHcycWdtdU1WeTNyazJpcHc3Vnh0OjM6Q0w6MzI6MSIsICJrZXlfY29ycmVjdG5lc3NfcHJvb2YiOiB7ImMiOiAiNDM1MjgzODg4MTcyNzE4MzkzNjE3MTY5MTcwMDQ4NjAxNjIwMDMwOTc1NDc4Mzg3MzAxMTA3NzgzMDM0MTUyODA5NTA5OTU0NDI4NjQiLCAieHpfY2FwIjogIjEwMzY5Mjg4NDQ5NzE0MTcxODUyNTcyNDUzNzU5MDkyMTIwOTYxOTI0MDg5OTAwNzc1MzU1NDQ2OTY5OTc2MjUxNzMyMzkxNjc1OTAxMTYyODIyNzA1MDg5NjMxMzIxMTY2NjE2ODYxMTMxMTAzMzg0OTE1MjI2MzYxOTc2ODIzMTgxNjQ2MTUyNjAwODI0NjMyMTMzMzE4NDQ0NDA0MDA3NjQzODkzNDI2MDgzMjgwMjUyODg1NTExODYzMTU0MjAzNzk0NTQ0MTM1NjQyMTk4NTM1NDk3NzM4NjU3Nzk4NjkxMjQ3ODAxMzA5MDkyNjIzNzc5NDY1MTU4NTc2ODE4ODQyNTE0MzY0OTU2OTU0NjEyMzUzMTUxMTk5Mzk1MDQxMzgzODE5NDQ4NjEwMzQ4ODIyOTQxOTk0MjEzNzQ4MjQ1NjcwOTc0NDQ3MjIxNTM5MzY3Mjg4MTYyMDI3ODYyMzQwODI3NTYwNTkyNzc0MjUwMjczODI1MTIyNDkzNjEzOTAzNTIxNDI5OTAyNzk1MzIxNzkyNDAwMjQ2NTM2MDIxMTUzMjQ2Mzg5MTQ3OTAxNTc4MTM3ODAzNDYxMDI0MTQyMjU3NjEzOTE5MDcyNzQ1NDM2NzI3OTUwMjEyNTYwOTMzNjAwMDM1NzM1MzkwNDQ1Nzc1MTA2MjAxMTU2OTk5NTgxMjk2NzA3NTAwMDgyNzM0MjY4NjkzNTQxNzI4NTY3MzA5MzM4NDUzMTY1MDk1MzU3NTE1OTEwMTM3MTkzMDkwODk4NjIzNTAzMjM1NTE2MTM0NDk2NzM2NDUxNDM3MzExODk4Njg2NDM2NTg2NjM3NzQxMjg0MzU5Njc5NjUzNzQ2ODA4MTMzNjUyMTEwMTQ4NTE2ODAxMTU3MDY2NTMzOTg1MDQ0MTcwNjgyNDY1NzAiLCAieHJfY2FwIjogW1sibmFtZSIsICIxMDI5NTIyMDkzMzMyMjg3MzEyNTU0NjIwODk4NDg3NTY1MTkyNzA5ODc0MjQ3NjQ1NzUyNTA4NTQ1MTA0MzIwMDg0MTQ1OTY5MzEzMTAzMzA1ODcxNDcwNTYwOTQ3OTMwNjY1MzA1NDE1NTU3MDQwMDA4MTU4OTAxNzkyMzcxODU0NTYxNzEyODg5NjM3NTQwNTQwMDUwNzMxODA0NTEzNDk1NTgzNjcwNjYyMDU5ODU5MjEwMjUzMzc2Mjk4MzM2NjY1NzgzNTk5MDIzMTc2NjYxNTU2MTg2NTMwNDM2ODkwMTM3ODk2MjU4NzQ3ODY0NjY0ODc0MzQ0ODA2ODkxMjkzOTg2NTkwNTgzNDMzOTc3NDAzODE1NDI5NTM0MjY3NjE0MDk3NDUxNjY0MjExOTc1ODU3MzUxNDQ1MjA3MjExMTI0NTU5ODcwNzUzNDMyMjQ5NTM5MDMzODYyMDc2MTMyMTA4NDI3OTkyMDkwNzQwNjM2NzE1NjM4NTg0NzQ1NTY4NzMxODk2MjM2NzkxMzM0NzcwNzg3NzQ3OTMxNzIxMzE0ODI0NTYwNzQ2MDM5ODg1NDU3NDkxNjgxOTc0NjYzMzk4NjIyODgyMDM3NTg1NTM0MzI3MzEyOTU4NTYzNDk4MzAxMjUxMjE2NjkxMDM5Mzg1NzIxMjI5NjE3MDAzNDQwMDAxNjE4Nzg4NDY2MzI0NzAwNTI4MzQ2ODgxNTQ1ODc5NDE4ODY5NzY4ODI5MDE3NDQxNzcyMTkwNDkwNDM2OTcwMDE0ODU0Njc1NDk4NjE1MzYyMTA5NzgzOTM2MzU0OTE4MTU3NDc3MjczMTA3OTQ4MTI2MTYwNDIzMDk5Nzk2ODU0MTY5NzEyMjA3NTIxNTU2MTI4OTcwMDE3OTcwOTY3NzYyNTM3ODk4Njc1MjMzIl0sIFsibWFzdGVyX3NlY3JldCIsICI0NTcwNDI1MDM0MTU2OTczMjA5MDQ3MTU1MjgzNDE3Mjk5ODI1OTM3MzM3ODUwMzA5OTQ1NzY5NTYyMDkxMTU2MDg3MDkwMTcyMzkyMzUzNDYxNjAxMjkyMDA5NTU3NDYyMzkxNDUxMzkxOTg1MzgwNzcwOTYxNTk1MTYwNzI5NjYxODkyNzIxNDgxNzg0MDY1NzU4NTUxNTk3MzI3Njk5NjUwMzk1NDc4MDA1OTMwOTIxMzQ2NzE5MTU5MTg1NTEyMjAxMzA0Nzc3MzU4NzQwNzkxODYwMjY5OTE0NTQ3OTk3OTkzMzc0NDIwMTk0MTA4Mjg0MTg1MDU2MDA4MDY3NjczMDU4MzYzMTE3NjUxOTUyMDE5NjExMDkxMTQyOTQxMTQxODIyMDAyMTQ1MzcwOTc1NTIxOTE2NzYyMjQ0NDIzNjc5NTY0MTU0NDc0NzI3NjQ0OTczMjIzMDEwNjIxOTAwODA3MzA5NzQ2Nzk1MjAyNzUyMTYzNTYyMDI2MzU5MTY4NDczNzU3MDUzNTQ4Njc4NzM3MDMwNjY1NDg5NzIxMjA0NTAzNTQxMzk1OTM1MjM0OTg2NjcxMzg0Njc1NTUwNzgyOTAzMDgzMDk0MDExMjM5NDUwMTY5Njg1NTE1NDA1MzkyMTc4MjE3NTc2Nzk2NzUzOTA3Nzk0MjcxNzQ4ODMxODgzNDY5NzUyODcxMDM0ODA3MzY5Mjc0NzMxNTI2NzU4MDQzNTg3NDk3MTAyODc5NTg4MTkxNzgyODAwNTU4MzExMzYxNzU1MTk3ODM0NjY0MTk4MjQ4NzQ3NjkwNDE5NjY5OTYwODU2Nzk2Mjc1MjQ4Mzk2NjExMDExNTkxODQyNDgxNzQ1NjU4NjU0NDkzODYxNjg0NTI4Nzc4MDg0MjM4MzQzMzY3MjMzOTE4NzAiXSwgWyJkZXBhcnRtZW50IiwgIjU1OTYyMTc5NzIyOTg1OTYyOTYwODcyODA5MjE3NzM1ODA4MjEwNDQ2MDQ3MzQ2NjAzMzgzMDAwMzA0NzY1MDQ4OTEzNDY3ODk5MDg2NzEyOTk4NDA5OTcxMjQwMDYyMTY0Mjg2NTUyMTE3NDQ5OTQzNDk5NTk0NDA5ODUyMzYxMTYyMjc1OTAwODQ0NzY1NzI5ODg4NzY2MzgyNTQyNDI2NzQ4Nzk2MTkxMzA1Mzc1NjUyNDUxNjkyNDM5NjI5NjQxNTkzOTI3MTI4MDI4MDg1MTU0NTY4OTU0NjY3MDMzNTUwMTU2NzQ0ODM5MjcxMzk0NDA3NjE4NzE4OTY5MTQ5NzM4OTAxMzkwMzU4MTU0Mjg0NjA5NDY0Njc1MzEzMTUxOTgyMDE2NDg5OTM0NjA5MDE3MTczODc1Mzc0MTM5MDYwNzY5MzY5MjYzNzgzMDQ1Nzk4NzcwNDYxOTM4Nzc5NjM5NzA2MDUzNTA5NDk1NTkwODY3MDEzMjI1NDg3NjAzMjY4MDI3NTI3MzQzNTYyMzgzOTYyNjEyMzk5NjM3NTg2NTcwMjU0NTQwNzMyNzY0MTE1NzAxNTEzOTQ1ODE3MDE5NTAxNDU1OTAwMDgwMzAyMTA3NDE3NTQ3NTU4MjM1NzY3NjA2Mzk1NDI0OTE4ODMwODU2NTAxNDU3MzQ4OTkyMDM1MzE2MTY4MDM5NjcxNzU1MTU0NTE1MTQ0NDcwMDQ1MTA1ODQ5Mjc0MjAwMDE5OTQzNjc4MTc4MjM1ODI2OTI2NTQ1NzczNTU0NzgxMDE3MTU3MDk4OTA0OTc0Nzk0OTU1MTI3MTMwNzQwMTE4MzQzNjY1Mjk0NTk1MjU3MjYxNzIzNTE1NDgwNTgzMDY5MjE4NDM2NjYzMDkyMTg5MzY3NDEyNjIxNTg3MTU0MjA5OSJdLCBbImVtcGxveWVlX2lkIiwgIjQ3MTE5NTk0ODgzMzM4MDI2NzM3MDIyOTk0NTM1NTkxODY4MTMyNTQ5OTgxNDM1NTU2MjQ4MDE0NTk1OTUxNjUyNTYyNTc2NzU2NTQ0NDQ5MDgxMzIxNTkyODk0NjExNjgwODc2NjM0NDYxMjM3Mzk1MzAxNTc3Nzk5NTA3MjYwODM2Mjk4Mzg0MzU4NzQwMDY4NzczOTUyNzc1MDM1OTcyNDQ2NjE1OTgyNzI2OTcyNTc1NDg5NTExMjgzNDA4MjMwNDEzMzA2MDg0Nzk2OTU5NzE2NzE3NzA0NzcwMTMxNDQ0MzMwOTQwMDE1MTc1OTk4MjQ0ODg3OTU5MTc3NzI4MTA3MTM1NzE0MTM5MDY5Mjg4OTExOTg4MzgyMzg1NzYzMTgxMTk5MTkxOTI3NjUzNTc0NzY0ODExNjM3MzY2ODYyNzkyMTQ0OTkxOTM4NjU0MzM4Mzg4NDc4NDg0MDQzNTc0MzU4OTE2MDMyMzc4NjE3MjA3MDA1NjQxOTUyOTMyMDE0MTI0OTY4ODA0Nzc5Nzc5MTAxNzk5OTUzMzI1NTQ2MjgyMzg5NzEwNDMxNTkwOTE5OTQ1NDIzMzQ0MTQ3MDg0MTU5OTg5MzM5NTcwMDg1Nzk0OTA0MjEyNzM2NTYwNTMxOTQyMzYzODExMjg4MDEzMzMxMDQzMDkyNjMzNTg2OTc0NzQ3MTI4NjYwNTg1MjU1ODY3Mjc5NDU0MDIyNzU4MTI5OTI0NTk1MjgxNDI1NjI3OTg1NzAwOTUyMDY5NTkxMDA2MDYwNDI0Mjc3OTk5MDM2MTI3NDIyNDE1MDI3NTQxNDExMzY4NzYxNTc4MDExNzE1NTIxNTU4ODY2NDE2MTYxMDIwNDYyMTk4OTU4Njc3OTc3OTE5MzUxMzA0OTcyMjk5MDM5NDA3NjI3NjQ2OCJdXX0sICJub25jZSI6ICI1OTI5ODAyODgyNjE0NjcxMTA0ODU3NyJ9"
        }
      }
    ],
    "credential_preview": {
      "@type": "did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/issue-credential/1.0/credential-preview",
      "attributes": [
        {
          "name": "name",
          "value": "Alice"
        },
        {
          "name": "department",
          "value": "R&D"
        },
        {
          "name": "employee_id",
          "value": "12345"
        }
      ]
    }
  },
  "credential_exchange_id": "ee6aee58-0628-4fd3-abd9-7b681c9ebb39",
  "initiator": "self",
  "state": "offer_sent",
  "auto_remove": false,
  "updated_at": "2022-06-10T04:10:51.597006Z",
  "credential_offer": {
    "schema_id": "Vtw2qgmuMVy3rk2ipw7Vxt:2:employee:2.0",
    "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1",
    "nonce": "59298028826146711048577",
    "key_correctness_proof": {
      "c": "43528388817271839361716917004860162003097547838730110778303415280950995442864",
      "xz_cap": "1036928844971417185257245375909212096192408990077535544696997625173239167590116282270508963132116661686113110338491522636197682318164615260082463213331844440400764389342608328025288551186315420379454413564219853549773865779869124780130909262377946515857681884251436495695461235315119939504138381944861034882294199421374824567097444722153936728816202786234082756059277425027382512249361390352142990279532179240024653602115324638914790157813780346102414225761391907274543672795021256093360003573539044577510620115699958129670750008273426869354172856730933845316509535751591013719309089862350323551613449673645143731189868643658663774128435967965374680813365211014851680115706653398504417068246570",
      "xr_cap": [
        [
          "name",
          "1029522093332287312554620898487565192709874247645752508545104320084145969313103305871470560947930665305415557040008158901792371854561712889637540540050731804513495583670662059859210253376298336665783599023176661556186530436890137896258747864664874344806891293986590583433977403815429534267614097451664211975857351445207211124559870753432249539033862076132108427992090740636715638584745568731896236791334770787747931721314824560746039885457491681974663398622882037585534327312958563498301251216691039385721229617003440001618788466324700528346881545879418869768829017441772190490436970014854675498615362109783936354918157477273107948126160423099796854169712207521556128970017970967762537898675233"
        ],
        [
          "master_secret",
          "457042503415697320904715528341729982593733785030994576956209115608709017239235346160129200955746239145139198538077096159516072966189272148178406575855159732769965039547800593092134671915918551220130477735874079186026991454799799337442019410828418505600806767305836311765195201961109114294114182200214537097552191676224442367956415447472764497322301062190080730974679520275216356202635916847375705354867873703066548972120450354139593523498667138467555078290308309401123945016968551540539217821757679675390779427174883188346975287103480736927473152675804358749710287958819178280055831136175519783466419824874769041966996085679627524839661101159184248174565865449386168452877808423834336723391870"
        ],
        [
          "department",
          "559621797229859629608728092177358082104460473466033830003047650489134678990867129984099712400621642865521174499434995944098523611622759008447657298887663825424267487961913053756524516924396296415939271280280851545689546670335501567448392713944076187189691497389013903581542846094646753131519820164899346090171738753741390607693692637830457987704619387796397060535094955908670132254876032680275273435623839626123996375865702545407327641157015139458170195014559000803021074175475582357676063954249188308565014573489920353161680396717551545151444700451058492742000199436781782358269265457735547810171570989049747949551271307401183436652945952572617235154805830692184366630921893674126215871542099"
        ],
        [
          "employee_id",
          "471195948833380267370229945355918681325499814355562480145959516525625767565444490813215928946116808766344612373953015777995072608362983843587400687739527750359724466159827269725754895112834082304133060847969597167177047701314443309400151759982448879591777281071357141390692889119883823857631811991919276535747648116373668627921449919386543383884784840435743589160323786172070056419529320141249688047797791017999533255462823897104315909199454233441470841599893395700857949042127365605319423638112880133310430926335869747471286605852558672794540227581299245952814256279857009520695910060604242779990361274224150275414113687615780117155215588664161610204621989586779779193513049722990394076276468"
        ]
      ]
    }
  },
  "thread_id": "3f8d2e23-660c-4a91-b484-f1333a3018db",
  "credential_proposal_dict": {
    "@type": "did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/issue-credential/1.0/propose-credential",
    "@id": "864bda0c-7015-4cad-8829-b796f000ea1f",
    "~trace": {
      "target": "log",
      "full_thread": true,
      "trace_reports": []
    },
    "comment": "vc offer",
    "credential_proposal": {
      "@type": "did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/issue-credential/1.0/credential-preview",
      "attributes": [
        {
          "name": "name",
          "value": "Alice"
        },
        {
          "name": "department",
          "value": "R&D"
        },
        {
          "name": "employee_id",
          "value": "12345"
        }
      ]
    },
    "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1"
  },
  "auto_offer": false,
  "trace": true,
  "connection_id": "5e66ac87-2352-42d8-9323-24606ce908ae",
  "created_at": "2022-06-10T04:10:51.597006Z",
  "credential_definition_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1"
}

次にHolderからVC発行リクエストを出します。

# request
curl -X 'POST' \
  'http://localhost:8041/issue-credential/records/c68375ad-7b2c-4344-9ed6-2d43e20f4c49/send-request' \
  -H 'accept: application/json' \
  -d ''

# response
{
  "schema_id": "Vtw2qgmuMVy3rk2ipw7Vxt:2:employee:2.0",
  "initiator": "external",
  "auto_remove": false,
  "thread_id": "3f8d2e23-660c-4a91-b484-f1333a3018db",
  "updated_at": "2022-06-10T04:13:52.104243Z",
  "credential_proposal_dict": {
    "@type": "did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/issue-credential/1.0/propose-credential",
    "@id": "ada6740d-94a2-401d-8410-b3df803638ed",
    "schema_id": "Vtw2qgmuMVy3rk2ipw7Vxt:2:employee:2.0",
    "credential_proposal": {
      "@type": "did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/issue-credential/1.0/credential-preview",
      "attributes": [
        {
          "name": "name",
          "value": "Alice"
        },
        {
          "name": "department",
          "value": "R&D"
        },
        {
          "name": "employee_id",
          "value": "12345"
        }
      ]
    },
    "comment": "vc offer",
    "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1"
  },
  "credential_exchange_id": "c68375ad-7b2c-4344-9ed6-2d43e20f4c49",
  "connection_id": "1e922492-940e-43e2-9268-c06ae4c7ed23",
  "state": "request_sent",
  "auto_offer": false,
  "trace": true,
  "credential_request_metadata": {
    "master_secret_blinding_data": {
      "v_prime": "15305770205102240170784567817271372644710343371550022872503365691240093150851486644479909441336454648663031708081945286685865419168446576349024216469151967788816908286631420999888728146500379488669296953584602569396470623040606012146710888643807486487255208029581331531369571740999892024887803426815535123193850219272552582597556069122477611601966400417149011918639751860613805391316757328704593003131511803642809531442890398462687111512153987994572543145816196045847498993313224099137373128897941491790216909630559430000730613569565452013265908654090082509229727943002157285556735894086824734493408740118776682266366390649024561084940816027",
      "vr_prime": "1D6EA6A4BAF8DA3E915949D04B38D5BAAE5B8D5A5812B5FE9A2FFB1E89C987CC"
    },
    "nonce": "780368230261730679676771",
    "master_secret_name": "revoke-holder-wallet"
  },
  "credential_request": {
    "prover_did": "uknCtyaYnbfLCZzcYoq1g",
    "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1",
    "blinded_ms": {
      "u": "2654108041051076614837622051611587821609951914498798550575012043701953791412930792689028318462499045786188754121662199638909003471381204474947529555521333239775768659303330017096200685950998690797765723344800286288045793767121779555062463860464068687755336279215680250991710261630692657823848057999308702806829941901509625010907419507899797332876626073371240059731984796759233324195010078037398462400609219525940878511646394577379172505151690663555138840556333228570947037606809126232296052790553036585123102079808218407810278923121246030153501029804013114053176153478770502728710936401632030085552000433371083184084",
      "ur": "1 0830F0405F498D62484DAA777262399E26B91EE2DADA7E72166F603F4ECAA388 1 10AC8AB2B0AEF50EEF6C33F46760E00B521D8057BB3B7896CBA38DE6D4C8D4BA 2 095E45DDF417D05FB10933FFC63D474548B7FFFF7888802F07FFFFFF7D07A8A8",
      "hidden_attributes": [
        "master_secret"
      ],
      "committed_attributes": {}
    },
    "blinded_ms_correctness_proof": {
      "c": "108193927554951790886134619125769453934803554080485768282334857152800064468720",
      "v_dash_cap": "1655991392743571386787461230060033656214701866685866949540831428557531093199711363202952463158214912207661470888255637191791825700672715202092290300643758722204214564829983679401668419629188696682098188446599633425499330079009374633341190956917049943101012446219532426277910025915068686866947161911235586111867637598321963662302919498215827069848727479020637185154856447153443588174637336686309333520270710602331445204801305414221475264648808296569492906189313609425741147069608287797899097592669442664070727823028645911163250407098865643662897576773332840844368299075422510482775204456208353691581749248825985034258562101911144757356276519745041914635382044695308112791921571703879971435727209471149340306442205210920",
      "m_caps": {
        "master_secret": "31949768915287456863415968710100752650736836791516609491699021329439323902960800188720980942855501134110607979678197722174969136188646545853248408079532404676896901226752798703858"
      },
      "r_caps": {}
    },
    "nonce": "780368230261730679676771"
  },
  "auto_issue": false,
  "credential_definition_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1",
  "created_at": "2022-06-10T04:10:51.748329Z",
  "credential_offer": {
    "schema_id": "Vtw2qgmuMVy3rk2ipw7Vxt:2:employee:2.0",
    "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1",
    "nonce": "59298028826146711048577",
    "key_correctness_proof": {
      "c": "43528388817271839361716917004860162003097547838730110778303415280950995442864",
      "xz_cap": "1036928844971417185257245375909212096192408990077535544696997625173239167590116282270508963132116661686113110338491522636197682318164615260082463213331844440400764389342608328025288551186315420379454413564219853549773865779869124780130909262377946515857681884251436495695461235315119939504138381944861034882294199421374824567097444722153936728816202786234082756059277425027382512249361390352142990279532179240024653602115324638914790157813780346102414225761391907274543672795021256093360003573539044577510620115699958129670750008273426869354172856730933845316509535751591013719309089862350323551613449673645143731189868643658663774128435967965374680813365211014851680115706653398504417068246570",
      "xr_cap": [
        [
          "name",
          "1029522093332287312554620898487565192709874247645752508545104320084145969313103305871470560947930665305415557040008158901792371854561712889637540540050731804513495583670662059859210253376298336665783599023176661556186530436890137896258747864664874344806891293986590583433977403815429534267614097451664211975857351445207211124559870753432249539033862076132108427992090740636715638584745568731896236791334770787747931721314824560746039885457491681974663398622882037585534327312958563498301251216691039385721229617003440001618788466324700528346881545879418869768829017441772190490436970014854675498615362109783936354918157477273107948126160423099796854169712207521556128970017970967762537898675233"
        ],
        [
          "master_secret",
          "457042503415697320904715528341729982593733785030994576956209115608709017239235346160129200955746239145139198538077096159516072966189272148178406575855159732769965039547800593092134671915918551220130477735874079186026991454799799337442019410828418505600806767305836311765195201961109114294114182200214537097552191676224442367956415447472764497322301062190080730974679520275216356202635916847375705354867873703066548972120450354139593523498667138467555078290308309401123945016968551540539217821757679675390779427174883188346975287103480736927473152675804358749710287958819178280055831136175519783466419824874769041966996085679627524839661101159184248174565865449386168452877808423834336723391870"
        ],
        [
          "department",
          "559621797229859629608728092177358082104460473466033830003047650489134678990867129984099712400621642865521174499434995944098523611622759008447657298887663825424267487961913053756524516924396296415939271280280851545689546670335501567448392713944076187189691497389013903581542846094646753131519820164899346090171738753741390607693692637830457987704619387796397060535094955908670132254876032680275273435623839626123996375865702545407327641157015139458170195014559000803021074175475582357676063954249188308565014573489920353161680396717551545151444700451058492742000199436781782358269265457735547810171570989049747949551271307401183436652945952572617235154805830692184366630921893674126215871542099"
        ],
        [
          "employee_id",
          "471195948833380267370229945355918681325499814355562480145959516525625767565444490813215928946116808766344612373953015777995072608362983843587400687739527750359724466159827269725754895112834082304133060847969597167177047701314443309400151759982448879591777281071357141390692889119883823857631811991919276535747648116373668627921449919386543383884784840435743589160323786172070056419529320141249688047797791017999533255462823897104315909199454233441470841599893395700857949042127365605319423638112880133310430926335869747471286605852558672794540227581299245952814256279857009520695910060604242779990361274224150275414113687615780117155215588664161610204621989586779779193513049722990394076276468"
        ]
      ]
    }
  },
  "role": "holder"
}

次にIssuerからVCを発行します。

# request
curl -X 'POST' \
  'http://localhost:8031/issue-credential/records/ee6aee58-0628-4fd3-abd9-7b681c9ebb39/issue' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "comment": "issue Alices employee card."
}'

# response
{
  "role": "issuer",
  "schema_id": "Vtw2qgmuMVy3rk2ipw7Vxt:2:employee:2.0",
  "credential_offer_dict": {
    "@type": "did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/issue-credential/1.0/offer-credential",
    "@id": "3f8d2e23-660c-4a91-b484-f1333a3018db",
    "~thread": {},
    "~trace": {
      "target": "log",
      "full_thread": true,
      "trace_reports": []
    },
    "comment": "vc offer",
    "offers~attach": [
      {
        "@id": "libindy-cred-offer-0",
        "mime-type": "application/json",
        "data": {
          "base64": "eyJzY2hlbWFfaWQiOiAiVnR3MnFnbXVNVnkzcmsyaXB3N1Z4dDoyOmVtcGxveWVlOjIuMCIsICJjcmVkX2RlZl9pZCI6ICJWdHcycWdtdU1WeTNyazJpcHc3Vnh0OjM6Q0w6MzI6MSIsICJrZXlfY29ycmVjdG5lc3NfcHJvb2YiOiB7ImMiOiAiNDM1MjgzODg4MTcyNzE4MzkzNjE3MTY5MTcwMDQ4NjAxNjIwMDMwOTc1NDc4Mzg3MzAxMTA3NzgzMDM0MTUyODA5NTA5OTU0NDI4NjQiLCAieHpfY2FwIjogIjEwMzY5Mjg4NDQ5NzE0MTcxODUyNTcyNDUzNzU5MDkyMTIwOTYxOTI0MDg5OTAwNzc1MzU1NDQ2OTY5OTc2MjUxNzMyMzkxNjc1OTAxMTYyODIyNzA1MDg5NjMxMzIxMTY2NjE2ODYxMTMxMTAzMzg0OTE1MjI2MzYxOTc2ODIzMTgxNjQ2MTUyNjAwODI0NjMyMTMzMzE4NDQ0NDA0MDA3NjQzODkzNDI2MDgzMjgwMjUyODg1NTExODYzMTU0MjAzNzk0NTQ0MTM1NjQyMTk4NTM1NDk3NzM4NjU3Nzk4NjkxMjQ3ODAxMzA5MDkyNjIzNzc5NDY1MTU4NTc2ODE4ODQyNTE0MzY0OTU2OTU0NjEyMzUzMTUxMTk5Mzk1MDQxMzgzODE5NDQ4NjEwMzQ4ODIyOTQxOTk0MjEzNzQ4MjQ1NjcwOTc0NDQ3MjIxNTM5MzY3Mjg4MTYyMDI3ODYyMzQwODI3NTYwNTkyNzc0MjUwMjczODI1MTIyNDkzNjEzOTAzNTIxNDI5OTAyNzk1MzIxNzkyNDAwMjQ2NTM2MDIxMTUzMjQ2Mzg5MTQ3OTAxNTc4MTM3ODAzNDYxMDI0MTQyMjU3NjEzOTE5MDcyNzQ1NDM2NzI3OTUwMjEyNTYwOTMzNjAwMDM1NzM1MzkwNDQ1Nzc1MTA2MjAxMTU2OTk5NTgxMjk2NzA3NTAwMDgyNzM0MjY4NjkzNTQxNzI4NTY3MzA5MzM4NDUzMTY1MDk1MzU3NTE1OTEwMTM3MTkzMDkwODk4NjIzNTAzMjM1NTE2MTM0NDk2NzM2NDUxNDM3MzExODk4Njg2NDM2NTg2NjM3NzQxMjg0MzU5Njc5NjUzNzQ2ODA4MTMzNjUyMTEwMTQ4NTE2ODAxMTU3MDY2NTMzOTg1MDQ0MTcwNjgyNDY1NzAiLCAieHJfY2FwIjogW1sibmFtZSIsICIxMDI5NTIyMDkzMzMyMjg3MzEyNTU0NjIwODk4NDg3NTY1MTkyNzA5ODc0MjQ3NjQ1NzUyNTA4NTQ1MTA0MzIwMDg0MTQ1OTY5MzEzMTAzMzA1ODcxNDcwNTYwOTQ3OTMwNjY1MzA1NDE1NTU3MDQwMDA4MTU4OTAxNzkyMzcxODU0NTYxNzEyODg5NjM3NTQwNTQwMDUwNzMxODA0NTEzNDk1NTgzNjcwNjYyMDU5ODU5MjEwMjUzMzc2Mjk4MzM2NjY1NzgzNTk5MDIzMTc2NjYxNTU2MTg2NTMwNDM2ODkwMTM3ODk2MjU4NzQ3ODY0NjY0ODc0MzQ0ODA2ODkxMjkzOTg2NTkwNTgzNDMzOTc3NDAzODE1NDI5NTM0MjY3NjE0MDk3NDUxNjY0MjExOTc1ODU3MzUxNDQ1MjA3MjExMTI0NTU5ODcwNzUzNDMyMjQ5NTM5MDMzODYyMDc2MTMyMTA4NDI3OTkyMDkwNzQwNjM2NzE1NjM4NTg0NzQ1NTY4NzMxODk2MjM2NzkxMzM0NzcwNzg3NzQ3OTMxNzIxMzE0ODI0NTYwNzQ2MDM5ODg1NDU3NDkxNjgxOTc0NjYzMzk4NjIyODgyMDM3NTg1NTM0MzI3MzEyOTU4NTYzNDk4MzAxMjUxMjE2NjkxMDM5Mzg1NzIxMjI5NjE3MDAzNDQwMDAxNjE4Nzg4NDY2MzI0NzAwNTI4MzQ2ODgxNTQ1ODc5NDE4ODY5NzY4ODI5MDE3NDQxNzcyMTkwNDkwNDM2OTcwMDE0ODU0Njc1NDk4NjE1MzYyMTA5NzgzOTM2MzU0OTE4MTU3NDc3MjczMTA3OTQ4MTI2MTYwNDIzMDk5Nzk2ODU0MTY5NzEyMjA3NTIxNTU2MTI4OTcwMDE3OTcwOTY3NzYyNTM3ODk4Njc1MjMzIl0sIFsibWFzdGVyX3NlY3JldCIsICI0NTcwNDI1MDM0MTU2OTczMjA5MDQ3MTU1MjgzNDE3Mjk5ODI1OTM3MzM3ODUwMzA5OTQ1NzY5NTYyMDkxMTU2MDg3MDkwMTcyMzkyMzUzNDYxNjAxMjkyMDA5NTU3NDYyMzkxNDUxMzkxOTg1MzgwNzcwOTYxNTk1MTYwNzI5NjYxODkyNzIxNDgxNzg0MDY1NzU4NTUxNTk3MzI3Njk5NjUwMzk1NDc4MDA1OTMwOTIxMzQ2NzE5MTU5MTg1NTEyMjAxMzA0Nzc3MzU4NzQwNzkxODYwMjY5OTE0NTQ3OTk3OTkzMzc0NDIwMTk0MTA4Mjg0MTg1MDU2MDA4MDY3NjczMDU4MzYzMTE3NjUxOTUyMDE5NjExMDkxMTQyOTQxMTQxODIyMDAyMTQ1MzcwOTc1NTIxOTE2NzYyMjQ0NDIzNjc5NTY0MTU0NDc0NzI3NjQ0OTczMjIzMDEwNjIxOTAwODA3MzA5NzQ2Nzk1MjAyNzUyMTYzNTYyMDI2MzU5MTY4NDczNzU3MDUzNTQ4Njc4NzM3MDMwNjY1NDg5NzIxMjA0NTAzNTQxMzk1OTM1MjM0OTg2NjcxMzg0Njc1NTUwNzgyOTAzMDgzMDk0MDExMjM5NDUwMTY5Njg1NTE1NDA1MzkyMTc4MjE3NTc2Nzk2NzUzOTA3Nzk0MjcxNzQ4ODMxODgzNDY5NzUyODcxMDM0ODA3MzY5Mjc0NzMxNTI2NzU4MDQzNTg3NDk3MTAyODc5NTg4MTkxNzgyODAwNTU4MzExMzYxNzU1MTk3ODM0NjY0MTk4MjQ4NzQ3NjkwNDE5NjY5OTYwODU2Nzk2Mjc1MjQ4Mzk2NjExMDExNTkxODQyNDgxNzQ1NjU4NjU0NDkzODYxNjg0NTI4Nzc4MDg0MjM4MzQzMzY3MjMzOTE4NzAiXSwgWyJkZXBhcnRtZW50IiwgIjU1OTYyMTc5NzIyOTg1OTYyOTYwODcyODA5MjE3NzM1ODA4MjEwNDQ2MDQ3MzQ2NjAzMzgzMDAwMzA0NzY1MDQ4OTEzNDY3ODk5MDg2NzEyOTk4NDA5OTcxMjQwMDYyMTY0Mjg2NTUyMTE3NDQ5OTQzNDk5NTk0NDA5ODUyMzYxMTYyMjc1OTAwODQ0NzY1NzI5ODg4NzY2MzgyNTQyNDI2NzQ4Nzk2MTkxMzA1Mzc1NjUyNDUxNjkyNDM5NjI5NjQxNTkzOTI3MTI4MDI4MDg1MTU0NTY4OTU0NjY3MDMzNTUwMTU2NzQ0ODM5MjcxMzk0NDA3NjE4NzE4OTY5MTQ5NzM4OTAxMzkwMzU4MTU0Mjg0NjA5NDY0Njc1MzEzMTUxOTgyMDE2NDg5OTM0NjA5MDE3MTczODc1Mzc0MTM5MDYwNzY5MzY5MjYzNzgzMDQ1Nzk4NzcwNDYxOTM4Nzc5NjM5NzA2MDUzNTA5NDk1NTkwODY3MDEzMjI1NDg3NjAzMjY4MDI3NTI3MzQzNTYyMzgzOTYyNjEyMzk5NjM3NTg2NTcwMjU0NTQwNzMyNzY0MTE1NzAxNTEzOTQ1ODE3MDE5NTAxNDU1OTAwMDgwMzAyMTA3NDE3NTQ3NTU4MjM1NzY3NjA2Mzk1NDI0OTE4ODMwODU2NTAxNDU3MzQ4OTkyMDM1MzE2MTY4MDM5NjcxNzU1MTU0NTE1MTQ0NDcwMDQ1MTA1ODQ5Mjc0MjAwMDE5OTQzNjc4MTc4MjM1ODI2OTI2NTQ1NzczNTU0NzgxMDE3MTU3MDk4OTA0OTc0Nzk0OTU1MTI3MTMwNzQwMTE4MzQzNjY1Mjk0NTk1MjU3MjYxNzIzNTE1NDgwNTgzMDY5MjE4NDM2NjYzMDkyMTg5MzY3NDEyNjIxNTg3MTU0MjA5OSJdLCBbImVtcGxveWVlX2lkIiwgIjQ3MTE5NTk0ODgzMzM4MDI2NzM3MDIyOTk0NTM1NTkxODY4MTMyNTQ5OTgxNDM1NTU2MjQ4MDE0NTk1OTUxNjUyNTYyNTc2NzU2NTQ0NDQ5MDgxMzIxNTkyODk0NjExNjgwODc2NjM0NDYxMjM3Mzk1MzAxNTc3Nzk5NTA3MjYwODM2Mjk4Mzg0MzU4NzQwMDY4NzczOTUyNzc1MDM1OTcyNDQ2NjE1OTgyNzI2OTcyNTc1NDg5NTExMjgzNDA4MjMwNDEzMzA2MDg0Nzk2OTU5NzE2NzE3NzA0NzcwMTMxNDQ0MzMwOTQwMDE1MTc1OTk4MjQ0ODg3OTU5MTc3NzI4MTA3MTM1NzE0MTM5MDY5Mjg4OTExOTg4MzgyMzg1NzYzMTgxMTk5MTkxOTI3NjUzNTc0NzY0ODExNjM3MzY2ODYyNzkyMTQ0OTkxOTM4NjU0MzM4Mzg4NDc4NDg0MDQzNTc0MzU4OTE2MDMyMzc4NjE3MjA3MDA1NjQxOTUyOTMyMDE0MTI0OTY4ODA0Nzc5Nzc5MTAxNzk5OTUzMzI1NTQ2MjgyMzg5NzEwNDMxNTkwOTE5OTQ1NDIzMzQ0MTQ3MDg0MTU5OTg5MzM5NTcwMDg1Nzk0OTA0MjEyNzM2NTYwNTMxOTQyMzYzODExMjg4MDEzMzMxMDQzMDkyNjMzNTg2OTc0NzQ3MTI4NjYwNTg1MjU1ODY3Mjc5NDU0MDIyNzU4MTI5OTI0NTk1MjgxNDI1NjI3OTg1NzAwOTUyMDY5NTkxMDA2MDYwNDI0Mjc3OTk5MDM2MTI3NDIyNDE1MDI3NTQxNDExMzY4NzYxNTc4MDExNzE1NTIxNTU4ODY2NDE2MTYxMDIwNDYyMTk4OTU4Njc3OTc3OTE5MzUxMzA0OTcyMjk5MDM5NDA3NjI3NjQ2OCJdXX0sICJub25jZSI6ICI1OTI5ODAyODgyNjE0NjcxMTA0ODU3NyJ9"
        }
      }
    ],
    "credential_preview": {
      "@type": "did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/issue-credential/1.0/credential-preview",
      "attributes": [
        {
          "name": "name",
          "value": "Alice"
        },
        {
          "name": "department",
          "value": "R&D"
        },
        {
          "name": "employee_id",
          "value": "12345"
        }
      ]
    }
  },
  "credential_exchange_id": "ee6aee58-0628-4fd3-abd9-7b681c9ebb39",
  "initiator": "self",
  "state": "credential_issued",
  "auto_remove": false,
  "updated_at": "2022-06-10T04:17:42.209362Z",
  "credential_offer": {
    "schema_id": "Vtw2qgmuMVy3rk2ipw7Vxt:2:employee:2.0",
    "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1",
    "nonce": "59298028826146711048577",
    "key_correctness_proof": {
      "c": "43528388817271839361716917004860162003097547838730110778303415280950995442864",
      "xz_cap": "1036928844971417185257245375909212096192408990077535544696997625173239167590116282270508963132116661686113110338491522636197682318164615260082463213331844440400764389342608328025288551186315420379454413564219853549773865779869124780130909262377946515857681884251436495695461235315119939504138381944861034882294199421374824567097444722153936728816202786234082756059277425027382512249361390352142990279532179240024653602115324638914790157813780346102414225761391907274543672795021256093360003573539044577510620115699958129670750008273426869354172856730933845316509535751591013719309089862350323551613449673645143731189868643658663774128435967965374680813365211014851680115706653398504417068246570",
      "xr_cap": [
        [
          "name",
          "1029522093332287312554620898487565192709874247645752508545104320084145969313103305871470560947930665305415557040008158901792371854561712889637540540050731804513495583670662059859210253376298336665783599023176661556186530436890137896258747864664874344806891293986590583433977403815429534267614097451664211975857351445207211124559870753432249539033862076132108427992090740636715638584745568731896236791334770787747931721314824560746039885457491681974663398622882037585534327312958563498301251216691039385721229617003440001618788466324700528346881545879418869768829017441772190490436970014854675498615362109783936354918157477273107948126160423099796854169712207521556128970017970967762537898675233"
        ],
        [
          "master_secret",
          "457042503415697320904715528341729982593733785030994576956209115608709017239235346160129200955746239145139198538077096159516072966189272148178406575855159732769965039547800593092134671915918551220130477735874079186026991454799799337442019410828418505600806767305836311765195201961109114294114182200214537097552191676224442367956415447472764497322301062190080730974679520275216356202635916847375705354867873703066548972120450354139593523498667138467555078290308309401123945016968551540539217821757679675390779427174883188346975287103480736927473152675804358749710287958819178280055831136175519783466419824874769041966996085679627524839661101159184248174565865449386168452877808423834336723391870"
        ],
        [
          "department",
          "559621797229859629608728092177358082104460473466033830003047650489134678990867129984099712400621642865521174499434995944098523611622759008447657298887663825424267487961913053756524516924396296415939271280280851545689546670335501567448392713944076187189691497389013903581542846094646753131519820164899346090171738753741390607693692637830457987704619387796397060535094955908670132254876032680275273435623839626123996375865702545407327641157015139458170195014559000803021074175475582357676063954249188308565014573489920353161680396717551545151444700451058492742000199436781782358269265457735547810171570989049747949551271307401183436652945952572617235154805830692184366630921893674126215871542099"
        ],
        [
          "employee_id",
          "471195948833380267370229945355918681325499814355562480145959516525625767565444490813215928946116808766344612373953015777995072608362983843587400687739527750359724466159827269725754895112834082304133060847969597167177047701314443309400151759982448879591777281071357141390692889119883823857631811991919276535747648116373668627921449919386543383884784840435743589160323786172070056419529320141249688047797791017999533255462823897104315909199454233441470841599893395700857949042127365605319423638112880133310430926335869747471286605852558672794540227581299245952814256279857009520695910060604242779990361274224150275414113687615780117155215588664161610204621989586779779193513049722990394076276468"
        ]
      ]
    }
  },
  "revoc_reg_id": "Vtw2qgmuMVy3rk2ipw7Vxt:4:Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1:CL_ACCUM:c9a32814-a024-4ce3-a29c-30723ecc6aac",
  "thread_id": "3f8d2e23-660c-4a91-b484-f1333a3018db",
  "credential": {
    "schema_id": "Vtw2qgmuMVy3rk2ipw7Vxt:2:employee:2.0",
    "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1",
    "rev_reg_id": "Vtw2qgmuMVy3rk2ipw7Vxt:4:Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1:CL_ACCUM:c9a32814-a024-4ce3-a29c-30723ecc6aac"
  },
  "credential_proposal_dict": {
    "@type": "did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/issue-credential/1.0/propose-credential",
    "@id": "864bda0c-7015-4cad-8829-b796f000ea1f",
    "~trace": {
      "target": "log",
      "full_thread": true,
      "trace_reports": []
    },
    "comment": "vc offer",
    "credential_proposal": {
      "@type": "did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/issue-credential/1.0/credential-preview",
      "attributes": [
        {
          "name": "name",
          "value": "Alice"
        },
        {
          "name": "department",
          "value": "R&D"
        },
        {
          "name": "employee_id",
          "value": "12345"
        }
      ]
    },
    "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1"
  },
  "auto_offer": false,
  "revocation_id": "1",
  "trace": true,
  "connection_id": "5e66ac87-2352-42d8-9323-24606ce908ae",
  "created_at": "2022-06-10T04:10:51.597006Z",
  "credential_request": {
    "prover_did": "uknCtyaYnbfLCZzcYoq1g",
    "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1",
    "blinded_ms": {
      "u": "2654108041051076614837622051611587821609951914498798550575012043701953791412930792689028318462499045786188754121662199638909003471381204474947529555521333239775768659303330017096200685950998690797765723344800286288045793767121779555062463860464068687755336279215680250991710261630692657823848057999308702806829941901509625010907419507899797332876626073371240059731984796759233324195010078037398462400609219525940878511646394577379172505151690663555138840556333228570947037606809126232296052790553036585123102079808218407810278923121246030153501029804013114053176153478770502728710936401632030085552000433371083184084",
      "ur": "1 0830F0405F498D62484DAA777262399E26B91EE2DADA7E72166F603F4ECAA388 1 10AC8AB2B0AEF50EEF6C33F46760E00B521D8057BB3B7896CBA38DE6D4C8D4BA 2 095E45DDF417D05FB10933FFC63D474548B7FFFF7888802F07FFFFFF7D07A8A8",
      "hidden_attributes": [
        "master_secret"
      ],
      "committed_attributes": {}
    },
    "blinded_ms_correctness_proof": {
      "c": "108193927554951790886134619125769453934803554080485768282334857152800064468720",
      "v_dash_cap": "1655991392743571386787461230060033656214701866685866949540831428557531093199711363202952463158214912207661470888255637191791825700672715202092290300643758722204214564829983679401668419629188696682098188446599633425499330079009374633341190956917049943101012446219532426277910025915068686866947161911235586111867637598321963662302919498215827069848727479020637185154856447153443588174637336686309333520270710602331445204801305414221475264648808296569492906189313609425741147069608287797899097592669442664070727823028645911163250407098865643662897576773332840844368299075422510482775204456208353691581749248825985034258562101911144757356276519745041914635382044695308112791921571703879971435727209471149340306442205210920",
      "m_caps": {
        "master_secret": "31949768915287456863415968710100752650736836791516609491699021329439323902960800188720980942855501134110607979678197722174969136188646545853248408079532404676896901226752798703858"
      },
      "r_caps": {}
    },
    "nonce": "780368230261730679676771"
  },
  "credential_definition_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1"
}

次にHolderで発行されたCredentialをWalletに保管します。

# request
curl -X 'POST' \
  'http://localhost:8041/issue-credential/records/c68375ad-7b2c-4344-9ed6-2d43e20f4c49/store' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "credential_id": "employee12345"
}'

# response
{
  "role": "issuer",
  "schema_id": "Vtw2qgmuMVy3rk2ipw7Vxt:2:employee:2.0",
  "credential_offer_dict": {
    "@type": "did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/issue-credential/1.0/offer-credential",
    "@id": "3f8d2e23-660c-4a91-b484-f1333a3018db",
    "~thread": {},
    "~trace": {
      "target": "log",
      "full_thread": true,
      "trace_reports": []
    },
    "comment": "vc offer",
    "offers~attach": [
      {
        "@id": "libindy-cred-offer-0",
        "mime-type": "application/json",
        "data": {
          "base64": "eyJzY2hlbWFfaWQiOiAiVnR3MnFnbXVNVnkzcmsyaXB3N1Z4dDoyOmVtcGxveWVlOjIuMCIsICJjcmVkX2RlZl9pZCI6ICJWdHcycWdtdU1WeTNyazJpcHc3Vnh0OjM6Q0w6MzI6MSIsICJrZXlfY29ycmVjdG5lc3NfcHJvb2YiOiB7ImMiOiAiNDM1MjgzODg4MTcyNzE4MzkzNjE3MTY5MTcwMDQ4NjAxNjIwMDMwOTc1NDc4Mzg3MzAxMTA3NzgzMDM0MTUyODA5NTA5OTU0NDI4NjQiLCAieHpfY2FwIjogIjEwMzY5Mjg4NDQ5NzE0MTcxODUyNTcyNDUzNzU5MDkyMTIwOTYxOTI0MDg5OTAwNzc1MzU1NDQ2OTY5OTc2MjUxNzMyMzkxNjc1OTAxMTYyODIyNzA1MDg5NjMxMzIxMTY2NjE2ODYxMTMxMTAzMzg0OTE1MjI2MzYxOTc2ODIzMTgxNjQ2MTUyNjAwODI0NjMyMTMzMzE4NDQ0NDA0MDA3NjQzODkzNDI2MDgzMjgwMjUyODg1NTExODYzMTU0MjAzNzk0NTQ0MTM1NjQyMTk4NTM1NDk3NzM4NjU3Nzk4NjkxMjQ3ODAxMzA5MDkyNjIzNzc5NDY1MTU4NTc2ODE4ODQyNTE0MzY0OTU2OTU0NjEyMzUzMTUxMTk5Mzk1MDQxMzgzODE5NDQ4NjEwMzQ4ODIyOTQxOTk0MjEzNzQ4MjQ1NjcwOTc0NDQ3MjIxNTM5MzY3Mjg4MTYyMDI3ODYyMzQwODI3NTYwNTkyNzc0MjUwMjczODI1MTIyNDkzNjEzOTAzNTIxNDI5OTAyNzk1MzIxNzkyNDAwMjQ2NTM2MDIxMTUzMjQ2Mzg5MTQ3OTAxNTc4MTM3ODAzNDYxMDI0MTQyMjU3NjEzOTE5MDcyNzQ1NDM2NzI3OTUwMjEyNTYwOTMzNjAwMDM1NzM1MzkwNDQ1Nzc1MTA2MjAxMTU2OTk5NTgxMjk2NzA3NTAwMDgyNzM0MjY4NjkzNTQxNzI4NTY3MzA5MzM4NDUzMTY1MDk1MzU3NTE1OTEwMTM3MTkzMDkwODk4NjIzNTAzMjM1NTE2MTM0NDk2NzM2NDUxNDM3MzExODk4Njg2NDM2NTg2NjM3NzQxMjg0MzU5Njc5NjUzNzQ2ODA4MTMzNjUyMTEwMTQ4NTE2ODAxMTU3MDY2NTMzOTg1MDQ0MTcwNjgyNDY1NzAiLCAieHJfY2FwIjogW1sibmFtZSIsICIxMDI5NTIyMDkzMzMyMjg3MzEyNTU0NjIwODk4NDg3NTY1MTkyNzA5ODc0MjQ3NjQ1NzUyNTA4NTQ1MTA0MzIwMDg0MTQ1OTY5MzEzMTAzMzA1ODcxNDcwNTYwOTQ3OTMwNjY1MzA1NDE1NTU3MDQwMDA4MTU4OTAxNzkyMzcxODU0NTYxNzEyODg5NjM3NTQwNTQwMDUwNzMxODA0NTEzNDk1NTgzNjcwNjYyMDU5ODU5MjEwMjUzMzc2Mjk4MzM2NjY1NzgzNTk5MDIzMTc2NjYxNTU2MTg2NTMwNDM2ODkwMTM3ODk2MjU4NzQ3ODY0NjY0ODc0MzQ0ODA2ODkxMjkzOTg2NTkwNTgzNDMzOTc3NDAzODE1NDI5NTM0MjY3NjE0MDk3NDUxNjY0MjExOTc1ODU3MzUxNDQ1MjA3MjExMTI0NTU5ODcwNzUzNDMyMjQ5NTM5MDMzODYyMDc2MTMyMTA4NDI3OTkyMDkwNzQwNjM2NzE1NjM4NTg0NzQ1NTY4NzMxODk2MjM2NzkxMzM0NzcwNzg3NzQ3OTMxNzIxMzE0ODI0NTYwNzQ2MDM5ODg1NDU3NDkxNjgxOTc0NjYzMzk4NjIyODgyMDM3NTg1NTM0MzI3MzEyOTU4NTYzNDk4MzAxMjUxMjE2NjkxMDM5Mzg1NzIxMjI5NjE3MDAzNDQwMDAxNjE4Nzg4NDY2MzI0NzAwNTI4MzQ2ODgxNTQ1ODc5NDE4ODY5NzY4ODI5MDE3NDQxNzcyMTkwNDkwNDM2OTcwMDE0ODU0Njc1NDk4NjE1MzYyMTA5NzgzOTM2MzU0OTE4MTU3NDc3MjczMTA3OTQ4MTI2MTYwNDIzMDk5Nzk2ODU0MTY5NzEyMjA3NTIxNTU2MTI4OTcwMDE3OTcwOTY3NzYyNTM3ODk4Njc1MjMzIl0sIFsibWFzdGVyX3NlY3JldCIsICI0NTcwNDI1MDM0MTU2OTczMjA5MDQ3MTU1MjgzNDE3Mjk5ODI1OTM3MzM3ODUwMzA5OTQ1NzY5NTYyMDkxMTU2MDg3MDkwMTcyMzkyMzUzNDYxNjAxMjkyMDA5NTU3NDYyMzkxNDUxMzkxOTg1MzgwNzcwOTYxNTk1MTYwNzI5NjYxODkyNzIxNDgxNzg0MDY1NzU4NTUxNTk3MzI3Njk5NjUwMzk1NDc4MDA1OTMwOTIxMzQ2NzE5MTU5MTg1NTEyMjAxMzA0Nzc3MzU4NzQwNzkxODYwMjY5OTE0NTQ3OTk3OTkzMzc0NDIwMTk0MTA4Mjg0MTg1MDU2MDA4MDY3NjczMDU4MzYzMTE3NjUxOTUyMDE5NjExMDkxMTQyOTQxMTQxODIyMDAyMTQ1MzcwOTc1NTIxOTE2NzYyMjQ0NDIzNjc5NTY0MTU0NDc0NzI3NjQ0OTczMjIzMDEwNjIxOTAwODA3MzA5NzQ2Nzk1MjAyNzUyMTYzNTYyMDI2MzU5MTY4NDczNzU3MDUzNTQ4Njc4NzM3MDMwNjY1NDg5NzIxMjA0NTAzNTQxMzk1OTM1MjM0OTg2NjcxMzg0Njc1NTUwNzgyOTAzMDgzMDk0MDExMjM5NDUwMTY5Njg1NTE1NDA1MzkyMTc4MjE3NTc2Nzk2NzUzOTA3Nzk0MjcxNzQ4ODMxODgzNDY5NzUyODcxMDM0ODA3MzY5Mjc0NzMxNTI2NzU4MDQzNTg3NDk3MTAyODc5NTg4MTkxNzgyODAwNTU4MzExMzYxNzU1MTk3ODM0NjY0MTk4MjQ4NzQ3NjkwNDE5NjY5OTYwODU2Nzk2Mjc1MjQ4Mzk2NjExMDExNTkxODQyNDgxNzQ1NjU4NjU0NDkzODYxNjg0NTI4Nzc4MDg0MjM4MzQzMzY3MjMzOTE4NzAiXSwgWyJkZXBhcnRtZW50IiwgIjU1OTYyMTc5NzIyOTg1OTYyOTYwODcyODA5MjE3NzM1ODA4MjEwNDQ2MDQ3MzQ2NjAzMzgzMDAwMzA0NzY1MDQ4OTEzNDY3ODk5MDg2NzEyOTk4NDA5OTcxMjQwMDYyMTY0Mjg2NTUyMTE3NDQ5OTQzNDk5NTk0NDA5ODUyMzYxMTYyMjc1OTAwODQ0NzY1NzI5ODg4NzY2MzgyNTQyNDI2NzQ4Nzk2MTkxMzA1Mzc1NjUyNDUxNjkyNDM5NjI5NjQxNTkzOTI3MTI4MDI4MDg1MTU0NTY4OTU0NjY3MDMzNTUwMTU2NzQ0ODM5MjcxMzk0NDA3NjE4NzE4OTY5MTQ5NzM4OTAxMzkwMzU4MTU0Mjg0NjA5NDY0Njc1MzEzMTUxOTgyMDE2NDg5OTM0NjA5MDE3MTczODc1Mzc0MTM5MDYwNzY5MzY5MjYzNzgzMDQ1Nzk4NzcwNDYxOTM4Nzc5NjM5NzA2MDUzNTA5NDk1NTkwODY3MDEzMjI1NDg3NjAzMjY4MDI3NTI3MzQzNTYyMzgzOTYyNjEyMzk5NjM3NTg2NTcwMjU0NTQwNzMyNzY0MTE1NzAxNTEzOTQ1ODE3MDE5NTAxNDU1OTAwMDgwMzAyMTA3NDE3NTQ3NTU4MjM1NzY3NjA2Mzk1NDI0OTE4ODMwODU2NTAxNDU3MzQ4OTkyMDM1MzE2MTY4MDM5NjcxNzU1MTU0NTE1MTQ0NDcwMDQ1MTA1ODQ5Mjc0MjAwMDE5OTQzNjc4MTc4MjM1ODI2OTI2NTQ1NzczNTU0NzgxMDE3MTU3MDk4OTA0OTc0Nzk0OTU1MTI3MTMwNzQwMTE4MzQzNjY1Mjk0NTk1MjU3MjYxNzIzNTE1NDgwNTgzMDY5MjE4NDM2NjYzMDkyMTg5MzY3NDEyNjIxNTg3MTU0MjA5OSJdLCBbImVtcGxveWVlX2lkIiwgIjQ3MTE5NTk0ODgzMzM4MDI2NzM3MDIyOTk0NTM1NTkxODY4MTMyNTQ5OTgxNDM1NTU2MjQ4MDE0NTk1OTUxNjUyNTYyNTc2NzU2NTQ0NDQ5MDgxMzIxNTkyODk0NjExNjgwODc2NjM0NDYxMjM3Mzk1MzAxNTc3Nzk5NTA3MjYwODM2Mjk4Mzg0MzU4NzQwMDY4NzczOTUyNzc1MDM1OTcyNDQ2NjE1OTgyNzI2OTcyNTc1NDg5NTExMjgzNDA4MjMwNDEzMzA2MDg0Nzk2OTU5NzE2NzE3NzA0NzcwMTMxNDQ0MzMwOTQwMDE1MTc1OTk4MjQ0ODg3OTU5MTc3NzI4MTA3MTM1NzE0MTM5MDY5Mjg4OTExOTg4MzgyMzg1NzYzMTgxMTk5MTkxOTI3NjUzNTc0NzY0ODExNjM3MzY2ODYyNzkyMTQ0OTkxOTM4NjU0MzM4Mzg4NDc4NDg0MDQzNTc0MzU4OTE2MDMyMzc4NjE3MjA3MDA1NjQxOTUyOTMyMDE0MTI0OTY4ODA0Nzc5Nzc5MTAxNzk5OTUzMzI1NTQ2MjgyMzg5NzEwNDMxNTkwOTE5OTQ1NDIzMzQ0MTQ3MDg0MTU5OTg5MzM5NTcwMDg1Nzk0OTA0MjEyNzM2NTYwNTMxOTQyMzYzODExMjg4MDEzMzMxMDQzMDkyNjMzNTg2OTc0NzQ3MTI4NjYwNTg1MjU1ODY3Mjc5NDU0MDIyNzU4MTI5OTI0NTk1MjgxNDI1NjI3OTg1NzAwOTUyMDY5NTkxMDA2MDYwNDI0Mjc3OTk5MDM2MTI3NDIyNDE1MDI3NTQxNDExMzY4NzYxNTc4MDExNzE1NTIxNTU4ODY2NDE2MTYxMDIwNDYyMTk4OTU4Njc3OTc3OTE5MzUxMzA0OTcyMjk5MDM5NDA3NjI3NjQ2OCJdXX0sICJub25jZSI6ICI1OTI5ODAyODgyNjE0NjcxMTA0ODU3NyJ9"
        }
      }
    ],
    "credential_preview": {
      "@type": "did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/issue-credential/1.0/credential-preview",
      "attributes": [
        {
          "name": "name",
          "value": "Alice"
        },
        {
          "name": "department",
          "value": "R&D"
        },
        {
          "name": "employee_id",
          "value": "12345"
        }
      ]
    }
  },
  "credential_exchange_id": "ee6aee58-0628-4fd3-abd9-7b681c9ebb39",
  "initiator": "self",
  "state": "credential_issued",
  "auto_remove": false,
  "updated_at": "2022-06-10T04:17:42.209362Z",
  "credential_offer": {
    "schema_id": "Vtw2qgmuMVy3rk2ipw7Vxt:2:employee:2.0",
    "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1",
    "nonce": "59298028826146711048577",
    "key_correctness_proof": {
      "c": "43528388817271839361716917004860162003097547838730110778303415280950995442864",
      "xz_cap": "1036928844971417185257245375909212096192408990077535544696997625173239167590116282270508963132116661686113110338491522636197682318164615260082463213331844440400764389342608328025288551186315420379454413564219853549773865779869124780130909262377946515857681884251436495695461235315119939504138381944861034882294199421374824567097444722153936728816202786234082756059277425027382512249361390352142990279532179240024653602115324638914790157813780346102414225761391907274543672795021256093360003573539044577510620115699958129670750008273426869354172856730933845316509535751591013719309089862350323551613449673645143731189868643658663774128435967965374680813365211014851680115706653398504417068246570",
      "xr_cap": [
        [
          "name",
          "1029522093332287312554620898487565192709874247645752508545104320084145969313103305871470560947930665305415557040008158901792371854561712889637540540050731804513495583670662059859210253376298336665783599023176661556186530436890137896258747864664874344806891293986590583433977403815429534267614097451664211975857351445207211124559870753432249539033862076132108427992090740636715638584745568731896236791334770787747931721314824560746039885457491681974663398622882037585534327312958563498301251216691039385721229617003440001618788466324700528346881545879418869768829017441772190490436970014854675498615362109783936354918157477273107948126160423099796854169712207521556128970017970967762537898675233"
        ],
        [
          "master_secret",
          "457042503415697320904715528341729982593733785030994576956209115608709017239235346160129200955746239145139198538077096159516072966189272148178406575855159732769965039547800593092134671915918551220130477735874079186026991454799799337442019410828418505600806767305836311765195201961109114294114182200214537097552191676224442367956415447472764497322301062190080730974679520275216356202635916847375705354867873703066548972120450354139593523498667138467555078290308309401123945016968551540539217821757679675390779427174883188346975287103480736927473152675804358749710287958819178280055831136175519783466419824874769041966996085679627524839661101159184248174565865449386168452877808423834336723391870"
        ],
        [
          "department",
          "559621797229859629608728092177358082104460473466033830003047650489134678990867129984099712400621642865521174499434995944098523611622759008447657298887663825424267487961913053756524516924396296415939271280280851545689546670335501567448392713944076187189691497389013903581542846094646753131519820164899346090171738753741390607693692637830457987704619387796397060535094955908670132254876032680275273435623839626123996375865702545407327641157015139458170195014559000803021074175475582357676063954249188308565014573489920353161680396717551545151444700451058492742000199436781782358269265457735547810171570989049747949551271307401183436652945952572617235154805830692184366630921893674126215871542099"
        ],
        [
          "employee_id",
          "471195948833380267370229945355918681325499814355562480145959516525625767565444490813215928946116808766344612373953015777995072608362983843587400687739527750359724466159827269725754895112834082304133060847969597167177047701314443309400151759982448879591777281071357141390692889119883823857631811991919276535747648116373668627921449919386543383884784840435743589160323786172070056419529320141249688047797791017999533255462823897104315909199454233441470841599893395700857949042127365605319423638112880133310430926335869747471286605852558672794540227581299245952814256279857009520695910060604242779990361274224150275414113687615780117155215588664161610204621989586779779193513049722990394076276468"
        ]
      ]
    }
  },
  "revoc_reg_id": "Vtw2qgmuMVy3rk2ipw7Vxt:4:Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1:CL_ACCUM:c9a32814-a024-4ce3-a29c-30723ecc6aac",
  "thread_id": "3f8d2e23-660c-4a91-b484-f1333a3018db",
  "credential": {
    "schema_id": "Vtw2qgmuMVy3rk2ipw7Vxt:2:employee:2.0",
    "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1",
    "rev_reg_id": "Vtw2qgmuMVy3rk2ipw7Vxt:4:Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1:CL_ACCUM:c9a32814-a024-4ce3-a29c-30723ecc6aac"
  },
  "credential_proposal_dict": {
    "@type": "did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/issue-credential/1.0/propose-credential",
    "@id": "864bda0c-7015-4cad-8829-b796f000ea1f",
    "~trace": {
      "target": "log",
      "full_thread": true,
      "trace_reports": []
    },
    "comment": "vc offer",
    "credential_proposal": {
      "@type": "did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/issue-credential/1.0/credential-preview",
      "attributes": [
        {
          "name": "name",
          "value": "Alice"
        },
        {
          "name": "department",
          "value": "R&D"
        },
        {
          "name": "employee_id",
          "value": "12345"
        }
      ]
    },
    "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1"
  },
  "auto_offer": false,
  "revocation_id": "1",
  "trace": true,
  "connection_id": "5e66ac87-2352-42d8-9323-24606ce908ae",
  "created_at": "2022-06-10T04:10:51.597006Z",
  "credential_request": {
    "prover_did": "uknCtyaYnbfLCZzcYoq1g",
    "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1",
    "blinded_ms": {
      "u": "2654108041051076614837622051611587821609951914498798550575012043701953791412930792689028318462499045786188754121662199638909003471381204474947529555521333239775768659303330017096200685950998690797765723344800286288045793767121779555062463860464068687755336279215680250991710261630692657823848057999308702806829941901509625010907419507899797332876626073371240059731984796759233324195010078037398462400609219525940878511646394577379172505151690663555138840556333228570947037606809126232296052790553036585123102079808218407810278923121246030153501029804013114053176153478770502728710936401632030085552000433371083184084",
      "ur": "1 0830F0405F498D62484DAA777262399E26B91EE2DADA7E72166F603F4ECAA388 1 10AC8AB2B0AEF50EEF6C33F46760E00B521D8057BB3B7896CBA38DE6D4C8D4BA 2 095E45DDF417D05FB10933FFC63D474548B7FFFF7888802F07FFFFFF7D07A8A8",
      "hidden_attributes": [
        "master_secret"
      ],
      "committed_attributes": {}
    },
    "blinded_ms_correctness_proof": {
      "c": "108193927554951790886134619125769453934803554080485768282334857152800064468720",
      "v_dash_cap": "1655991392743571386787461230060033656214701866685866949540831428557531093199711363202952463158214912207661470888255637191791825700672715202092290300643758722204214564829983679401668419629188696682098188446599633425499330079009374633341190956917049943101012446219532426277910025915068686866947161911235586111867637598321963662302919498215827069848727479020637185154856447153443588174637336686309333520270710602331445204801305414221475264648808296569492906189313609425741147069608287797899097592669442664070727823028645911163250407098865643662897576773332840844368299075422510482775204456208353691581749248825985034258562101911144757356276519745041914635382044695308112791921571703879971435727209471149340306442205210920",
      "m_caps": {
        "master_secret": "31949768915287456863415968710100752650736836791516609491699021329439323902960800188720980942855501134110607979678197722174969136188646545853248408079532404676896901226752798703858"
      },
      "r_caps": {}
    },
    "nonce": "780368230261730679676771"
  },
  "credential_definition_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1"
}

最後にHolderにて発行されたVCを確認します。

# request
curl -X 'GET' \
  'http://localhost:8041/credentials' \
  -H 'accept: application/json'

# response
{
  "results": [
    {
      "referent": "employee12345",
      "attrs": {
        "department": "R&D",
        "employee_id": "12345",
        "name": "Alice"
      },
      "schema_id": "Vtw2qgmuMVy3rk2ipw7Vxt:2:employee:2.0",
      "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1",
      "rev_reg_id": "Vtw2qgmuMVy3rk2ipw7Vxt:4:Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1:CL_ACCUM:c9a32814-a024-4ce3-a29c-30723ecc6aac",
      "cred_rev_id": "1"
    }
  ]
}

7. IssuerによるVCの失効

Issuerから失効させます。

# request
curl -X 'POST' \
  'http://localhost:8031/revocation/revoke' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "connection_id": "5e66ac87-2352-42d8-9323-24606ce908ae",
  "cred_ex_id": "ee6aee58-0628-4fd3-abd9-7b681c9ebb39",
  "publish": true
}'

#response
{}

次にHolderからVCが失効したかを確認します。
Admin API EndpointのパスパラメータにCredential IDを指定します。

# request
curl -X 'GET' \
  'http://localhost:8041/credential/revoked/employee12345' \
  -H 'accept: application/json'

# response
{
  "revoked": true
}

失効を確認できました。

8. Revocation Registry Entryの確認

上記のVC失効と同時に新たなRevocation Registry EntryのTransactionが作成されます。またそのAccumlated Valueは更新されていることがわかります。

また以下の通り、Raw Dataを開くとRevocation Registry作成時の初回Trasanctionにはなかった”revoked”配列が作成されています。この値がTail Fileのインデックスを指していると考えます。

9. Proof検証が失敗することの確認

まずHolderとVerifierの間にコネクションを張ります。詳細は割愛します。
次にVerifierからHolderにProof提示のリクエストを出します。

ポイントはリクエストボディ内のfromとto属性を持つnon_revokedオブジェクトです。これを含めないとVerifierは”失効していないこと”の検証をスルーします。Verifierはここで指定した任意の”瞬間”において各Claimが失効していないことの証明をHolderに求めるわけです。

前述の参考資料No.3によると(私の理解が正しければ)、from/toと範囲を指定できますが、ベストプラクティスとしては同じ数値(エポック秒)を指定するようです。つまりはある瞬間を指定するわけです。(範囲指定に関して、前述の参考資料No.1に、その複雑さの説明があります。その期間中にVC発行と失効が起きると検証結果の意味が曖昧になることが理由のように感じましたが(実際はtoのみが効く?)、明瞭に理解するまでに至りませんでした。)

以下では、Proof検証が失敗するようにfrom/toにVC失効後の時間を指定しています。

# request
curl -X 'POST' \
  'http://localhost:8021/present-proof/send-request' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "comment": "Proof of Employee",
  "trace": true,
  "connection_id": "7c705513-8c00-450d-9325-d479def7b9e8",
  "proof_request": {
    "name": "Employee Proof Request",
    "non_revoked": {
      "from": 1656379110,
      "to": 1656379110
    },
    "version": "1.0",
    "requested_attributes": {
      "0_name_uuid": {
        "name": "name",
        "restrictions": [
          {
            "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1"
          }
        ]
      },
      "0_department_uuid": {
        "name": "department",
        "restrictions": [
          {
            "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1"
          }
        ]
      },
      "0_employee_id_uuid": {
        "name": "employee_id",
        "restrictions": [
          {
            "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1"
          }
        ]
      }
    },
    "requested_predicates": {}
  }
}
'

# response
{
  "trace": true,
  "auto_present": false,
  "presentation_exchange_id": "f3a9c72b-8dfa-4f04-a790-199d9559eb91",
  "updated_at": "2022-06-28T02:17:45.751141Z",
  "created_at": "2022-06-28T02:17:45.751141Z",
  "connection_id": "7c705513-8c00-450d-9325-d479def7b9e8",
  "initiator": "self",
  "presentation_request_dict": {
    "@type": "did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/present-proof/1.0/request-presentation",
    "@id": "cfa2e059-3dce-4fe6-8240-7d47c0071891",
    "~trace": {
      "target": "log",
      "full_thread": true,
      "trace_reports": []
    },
    "request_presentations~attach": [
      {
        "@id": "libindy-request-presentation-0",
        "mime-type": "application/json",
        "data": {
          "base64": "eyJuYW1lIjogIkVtcGxveWVlIFByb29mIFJlcXVlc3QiLCAibm9uX3Jldm9rZWQiOiB7ImZyb20iOiAxNjU2Mzc5MTEwLCAidG8iOiAxNjU2Mzc5MTEwfSwgInZlcnNpb24iOiAiMS4wIiwgInJlcXVlc3RlZF9hdHRyaWJ1dGVzIjogeyIwX25hbWVfdXVpZCI6IHsibmFtZSI6ICJuYW1lIiwgInJlc3RyaWN0aW9ucyI6IFt7ImNyZWRfZGVmX2lkIjogIlZ0dzJxZ211TVZ5M3JrMmlwdzdWeHQ6MzpDTDozMjoxIn1dfSwgIjBfZGVwYXJ0bWVudF91dWlkIjogeyJuYW1lIjogImRlcGFydG1lbnQiLCAicmVzdHJpY3Rpb25zIjogW3siY3JlZF9kZWZfaWQiOiAiVnR3MnFnbXVNVnkzcmsyaXB3N1Z4dDozOkNMOjMyOjEifV19LCAiMF9lbXBsb3llZV9pZF91dWlkIjogeyJuYW1lIjogImVtcGxveWVlX2lkIiwgInJlc3RyaWN0aW9ucyI6IFt7ImNyZWRfZGVmX2lkIjogIlZ0dzJxZ211TVZ5M3JrMmlwdzdWeHQ6MzpDTDozMjoxIn1dfX0sICJyZXF1ZXN0ZWRfcHJlZGljYXRlcyI6IHt9LCAibm9uY2UiOiAiODAxNTg3ODkzMDU4NTEyMTk5MDgzOTM2In0="
        }
      }
    ],
    "comment": "Proof of Employee"
  },
  "role": "verifier",
  "thread_id": "cfa2e059-3dce-4fe6-8240-7d47c0071891",
  "state": "request_sent",
  "presentation_request": {
    "nonce": "801587893058512199083936",
    "name": "Employee Proof Request",
    "version": "1.0",
    "requested_attributes": {
      "0_name_uuid": {
        "restrictions": [
          {
            "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1"
          }
        ],
        "name": "name"
      },
      "0_department_uuid": {
        "restrictions": [
          {
            "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1"
          }
        ],
        "name": "department"
      },
      "0_employee_id_uuid": {
        "restrictions": [
          {
            "cred_def_id": "Vtw2qgmuMVy3rk2ipw7Vxt:3:CL:32:1"
          }
        ],
        "name": "employee_id"
      }
    },
    "requested_predicates": {},
    "non_revoked": {
      "to": 1656379110,
      "from": 1656379110
    }
  }
}

次にHolderからVerifierにProofを送信します。

# request
curl -X 'POST' \
  'http://localhost:8041/present-proof/records/1eb83fe1-00b7-463d-97a7-96c21545a78e/send-presentation' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "requested_attributes": {
    "0_name_uuid": {
      "cred_id": "employee12345",
      "revealed": true
    },
    "0_department_uuid": {
      "cred_id": "employee12345",
      "revealed": true
    },
    "0_employee_id_uuid": {
      "cred_id": "employee12345",
      "revealed": true
    }
  },
  "requested_predicates": {
  },
  "self_attested_attributes": {
  },
  "trace": true
}'

# response
(長いため割愛します。)

最後にVerifierでProofを検証します。

# request
curl -X 'POST' \
  'http://localhost:8021/present-proof/records/f3a9c72b-8dfa-4f04-a790-199d9559eb91/verify-presentation' \
  -H 'accept: application/json' \
  -d ''

# response
{
  "verified": "false",
  "trace": true,
  "auto_present": false,
  "presentation_exchange_id": "f3a9c72b-8dfa-4f04-a790-199d9559eb91",
  "updated_at": "2022-06-28T02:20:11.614952Z",
  "created_at": "2022-06-28T02:17:45.751141Z",
  "connection_id": "7c705513-8c00-450d-9325-d479def7b9e8",
  "initiator": "self",
    (長いため省略します。)

“verified:false”となり、Proofの検証に失敗したこと(Proofが無効であること)を確認できました。

また詳細は省きますが、non_revokedに対し以下のバリエーションでProof検証を確認しました。

  • Proofリクエストにnon_revokedを含めない場合、失効済みだとしてもProofの検証に成功すること。
  • 失効済みVCに対して、発行後かつ失効前の時間を指定した場合、Proofの検証に成功すること。
  • 未失効VCに対して、発行後の時間を指定した場合、Proofの検証に成功すること。
  • Revocation Registry作成前の時間を指定した場合、またはRevocation Registry作成後だがVC発行前の時間を指定した場合、HolderからのProof送信時点で失敗すること。Admin APIのエラーメッセージは以下の通り。
    • 400: Exception parsing rev reg delta response (interval ends before rev reg creation?): Error: Item not found on ledger.

終わりに

ACA-PyでVerifiable Credentialの失効が機能することを確認できました。
どなたかのお役に立てたならば幸いです。