Hyperledger Indy/Aries まとめ



# Hyperledger Indy/Aries まとめ

本まとめはIndyのブロックチェーンについてではなく、Indy上でのDID/VCの操作に焦点を当てている。
そのため、主にHyperledger Ariesのまとめになった。

## ソース

リンクの一覧は以下にまとめている。
https://github.com/rg-bcali/did-study/issues/4


## (参考文献) アイデンティティはだれのもの？　Hyperledger Indy & Ariesで実現する分散アイデンティティ
![](https://i.imgur.com/JkhoqRc.jpg)
Ariesコミュニティが公開しているデモに解説やイラストを付け加えたもの。
https://github.com/hyperledger/aries-cloudagent-python/blob/main/demo/AriesOpenAPIDemo.md

Indy/Ariesを使った開発をする上では一読の価値はある。

## 関連のHyperledgerプロジェクト
![](https://i.imgur.com/6ObpwLT.png)

### Hyperledger Indy
![](https://i.imgur.com/IFkzSQX.png)


分散アイデンティティのために実装されたブロックチェーンとそのインターフェース。

indy-sdk: https://github.com/hyperledger/indy-sdk
indy-node: https://github.com/hyperledger/indy-node


### Hyperledger Aries
![](https://i.imgur.com/XA53aGg.png)


credentialの作成・送信・保存用のツールキット。

Hyperledger Ursaにより安全に鍵やCredentialの管理をする。
Hyperledger Indyのことを理解していなくても操作可能なように抽象化している。
リンク: https://github.com/hyperledger/aries

現状Go, .NET, pythonでエージェントが実装されているが、python性のACA-Pyが活発。
https://github.com/hyperledger/aries-cloudagent-python

![](https://i.imgur.com/W7Ss5qf.png)

### Hyperledger Ursa
![](https://i.imgur.com/fw8rYvR.png)

Hyperledgerの暗号ライブラリ。
Hyperledgerプロジェクトがそれぞれ独自の暗号処理を実装してしまうと相互運用性がなくなってしまう。暗号処理部分をモジュールとして切り出した。
Indy, Ariesでは以下の処理を担っている。
- 鍵生成
- データの暗号化と複合
- データの署名と検証
- データハッシュの生成と検証
- ゼロ知識署名(ZKP)

リンク: https://github.com/hyperledger/ursa

## 台帳
indyには複数のブロックチェーンがある。
* プール元帳：プール／ネットワーク構成に関連するトランザクション（すべてのノード、そのキーとアドレスのリスト）
* コンフィグ元帳：プールの構成に関するトランザクションとプールのアップグレードに関するトランザクション
* ドメイン元帳：すべてのメインドメインおよびアプリケーション固有のトランザクション（DIDのNYMトランザクションを含む）


### コンセンサス
コンセンサスアルゴリズはRBFT
コンセンサスなどLedgerの重要な部分ははindy-plenumに実装
https://github.com/hyperledger/indy-plenum#plenum-byzantine-fault-tolerant-protocol



## DIDエージェント(IONとの違い)
一部のSSIインフラではWalletを操作するソフトウェアとしてエージェントという概念を重視している。
エージェントはwalletの管理だけでなく安全なVC交換のためのプライベートなP2P通信を行うことを目指している。
=> DIDComm

![](https://i.imgur.com/0JClMQ6.png)
Sovrin Glossary V3, p.56, https://sovrin.org/wp-content/uploads/Sovrin-Glossary-V3.pdf

#### おまけ
Aries上でのDIDCommはDIFが公開している仕様書に準拠している。
https://identity.foundation/didcomm-messaging/spec/


## Aries Cloud Agent Internals: Agent and Controller

Ariesエージェントのインスタンスは、エージェント本体とコントローラの2つの部分で構成.

![](https://i.imgur.com/98LQnPa.png)

### エージェント
Ariesのコア機能全ての処理
- 他のエージェントとのやりとり
- 安全なストレージの管理
- コントローラへのイベント通知の送信
- コントローラからの指示の受信

### コントローラー
Web等のインターフォース。
https://github.com/hyperledger/aries-cloudagent-python/blob/main/docs/GettingStartedAriesDev/AriesAgentArchitecture.md


## Aries RFCs
Ariesで行う、V発行・検証、鍵管理、メッセージングなど、全ての操作におけるプロトコルを管理している。

https://github.com/hyperledger/aries-rfcs/blob/main/index.md

## AriesでのVC発行・検証
AriesでのVC発行・検証環境構築には以下のことを行う。

1. indyネットワークを構築する
2. エンティティごとのDIDエージェントを立てる
3. エージェント同士でDIDCommのコネクションを接続
4. VCの発行・検証を行う

**(ポイント)DIDCommのコネクションを接続していないとVCの発行ができない**
indy-sdkを使う場合はDIDCommが必要ないのかもしれない(未確認)

## Swagger UIでの操作
![](https://i.imgur.com/OEpU6IG.png)

Swaager UIによりGUIで操作が可能。
ネット上に公開されているSwagger UIはAPIのバージョンが古い
https://ula-aca.github.io/aries-cloudagent-interface-javascript/

## DIDCommコネクションの確立
お互いのエージェントのAPIを数回叩くことでコネクションを確立。

これらのAPIを叩いて上記を行う
![](https://i.imgur.com/JfsCNd1.png)


## VCの発行
プロトコルは２種類あるが、最新の2.0を使うのが良い。
* [0036: Issue Credential Protocol 1.0](https://github.com/hyperledger/aries-rfcs/blob/main/features/0036-issue-credential/README.md)
* [0453: Issue Credential Protocol 2.0](https://github.com/hyperledger/aries-rfcs/blob/main/features/0453-issue-credential-v2/README.md)

![](https://i.imgur.com/Y8btmMn.png)

#### propose-credentianl & offer-credential
省略可能。
VCの発行に先立ってHolderがCredentialデータの調整を行う場合Issuerに送信する。

#### Request Credential
issuerがHolderに提供する予定のCredentialを送る。

#### Issue Credential
Requetへの応答としてVCを送信する。

## VCの検証

![](https://i.imgur.com/i2AimAP.png)

プロトコルは２種類あるが、最新の2.0を使うのが良い。
- [Aries RFC 0037: Present Proof Protocol 1.0](https://github.com/hyperledger/aries-rfcs/blob/main/features/0037-present-proof/README.md)
- [Aries RFC 0454: Present Proof Protocol 2.0 ](https://github.com/hyperledger/aries-rfcs/blob/main/features/0454-present-proof-v2/README.md)


#### Request Presentation
VerifierからIssuerに送信するVC要求メッセージ
```
{
    "@type": "https://didcomm.org/present-proof/%VER/request-presentation",
    "@id": "<uuid-request>",
    "goal_code": "<goal-code>",
    "comment": "some comment",
    "will_confirm": true,
    "present_multiple": false,
    "formats" : [
        {
            "attach_id" : "<attach@id value>",
            "format" : "<format-and-version>",
        }
    ],
    "request_presentations~attach": [
        {
            "@id": "<attachment identifier>",
            "mime-type": "application/json",
            "data":  {
                "base64": "<base64 data>"
            }
        }
    ]
}
```

#### Presentation
署名されたプレゼンテーションを送信する。
```
{
    "@type": "https://didcomm.org/present-proof/%VER/presentation",
    "@id": "<uuid-presentation>",
    "goal_code": "<goal-code>",
    "comment": "some comment",
    "last_presentation": true,
    "formats" : [
        {
            "attach_id" : "<attach@id value>",
            "format" : "<format-and-version>",
        }
    ],
    "presentations~attach": [
        {
            "@id": "<attachment identifier>",
            "mime-type": "application/json",
            "data": {
                "sha256": "f8dca1d901d18c802e6a8ce1956d4b0d17f03d9dc5e4e1f618b6a022153ef373",
                "links": ["https://ibb.co/TtgKkZY"]
            }
        }
    ]
}
```

## HTTPの操作
デモではDIDComm接続・VC発行・検証までを以下のように行っている。(パラメーターは省略)
- Issuer: localhost:8021
- Holder: localhost:8031
- Verifier: localhost:8041

```
// コネクション確立
(Issuer) POST /connections/create-invitation
(Holder) POST /connections/receive-invitation
(Holder) POST /connections/{conn_id}/accept-invitation
(Issuer) POST /connections/{conn_id}/accept-request

// VCの発行
(Issuer) POST /issue-credential-v2.0/send
(Holder) POST /issuecredential-v2.0/records/{id}/store

// VCの検証
(Verifier) POST /present-proof-2.0/send-request
(Holder) GET /present-proof-2.0/records/{pres_ex_id}/credentials
(Holder) POST /present-proof-2.0/records/{pres_ex_id}/send-presentation
(Verifier) POST /present-proof-2.0/records/{pres_ex_id}/verify-presentation
```

## 実装にあたって
### von-network
Verifiable Organizations Networkの略。
dockerを使用して、indy-nodeが4つ起動し、簡単にネットワークを構築できる。

プロジェクトリンク: https://vonx.io
Githubリンク: https://github.com/bcgov/von-network

また、Ledger Browserによりノードのステータスやトランザクションの情報などをGUIで確認できる。
http://greenlight.bcovrin.vonx.io/