Aries建立连接过程介绍
1. Aries通信机制介绍
Aries Agent 之间的消息通信是 peer-to-peer 的。Agents 之间通过互相发送消息实现互动,这种互动可以是简单地交换一个纯文本的信息,也可能是一个相对复杂的询问凭证、提供凭证和验证凭证的过程。
Aries 具有两个级别的消息协议,因为所有的消息都是关于 DIDs 交换的,所以从高等级来说,这个消息机制被称为 DIDComm(DID Communication)。
在低级别来说,DIDComm 分为:
- DIDComm 信封协议 envelope protocol:这个协议只负责消息传递给目的地,而不需要知道消息的具体内容。
- DIDComm 内容协议 content protocols:内容协议有很多,有的可能很简单,以此交互就行结束,有的可能会负责,需要两到三次的来回交互才能完成。
2. Aries通信案例
这里描述的是Faber和Alice代理建立连接的过程
连接是通过调用自身Agent的API完成的,Aries封装了一系列Indy相关的方法,包括issue-credential
、wallet
、revocation
等。无需基于Indy-sdk进行开发。
我个人觉得Aries用于普通用户和机构,创建Indy网络及创建Steward角色还是需要Indy-sdk完成的。
演示环境搭建(完全一致,无需修改):https://github.com/hyperledger/aries-cloudagent-python/blob/master/demo/AriesOpenAPIDemo.md
-
Faber Agent创建连接邀请
执行
POST /connections/create-invitation
,无需任何参数Response body:
{ "connection_id": "6296344c-107a-47f4-9c78-2f5628e6d2d8", "invitation": { "@type": "did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/connections/1.0/invitation", "@id": "d63eb958-da64-4522-b6d7-b1464bc3da44", "recipientKeys": [ "HzuztUt2mMJWdGNcQXtPg9MmrMcD517aFGxzmvFzXCse" ], "serviceEndpoint": "http://10.4.68.245:8020", "label": "Faber.Agent" }, "invitation_url": "http://10.4.68.245:8020?c_i=eyJAdHlwZSI6ICJkaWQ6c292OkJ6Q2JzTlloTXJqSGlxWkRUVUFTSGc7c3BlYy9jb25uZWN0aW9ucy8xLjAvaW52aXRhdGlvbiIsICJAaWQiOiAiZDYzZWI5NTgtZGE2NC00NTIyLWI2ZDctYjE0NjRiYzNkYTQ0IiwgInJlY2lwaWVudEtleXMiOiBbIkh6dXp0VXQybU1KV2RHTmNRWHRQZzlNbXJNY0Q1MTdhRkd4em12RnpYQ3NlIl0sICJzZXJ2aWNlRW5kcG9pbnQiOiAiaHR0cDovLzEwLjQuNjguMjQ1OjgwMjAiLCAibGFiZWwiOiAiRmFiZXIuQWdlbnQifQ==" }
-
Alice Agent执行
POST /connections/receive-invitation
来接收请求(注意:不是接受),将上述invitation
部分作为body参数(在现实中,
invitation
应该通过QR码的方式获得,无需加密)它会为这个连接新创建一个新的 DID 和 DID 文档,然后将邀请的唯一标识以及新创建的 DID 文档放到一个 连接请求内容协议消息中。这也会创建一个连接的记录,然后这个记录会被记录到自己的 DID 和 DID 文档中。DIDComm 的信封协议(envelop protocol)就是用来封装这个内容协议消息的,使用邀请中的公钥对消息进行加密,然后将消息发送给邀请中指定的服务的 endpoint。
Response body:
{ "initiator": "external", "routing_state": "none", "updated_at": "2020-04-30 01:46:20.042140Z", "invitation_key": "HzuztUt2mMJWdGNcQXtPg9MmrMcD517aFGxzmvFzXCse", "invitation_mode": "once", "alias": "aaalice", "state": "invitation", "created_at": "2020-04-30 01:46:20.042140Z", "accept": "manual", "connection_id": "df98bef2-f67f-410c-8a96-f63405bba8ef", "their_label": "Faber.Agent" }
-
Alice Agent 执行
POST /connections/{id}/accept-invitation
接受Faber Agent的连接请求,将上面的connection_id
作为参数Response body
{ "initiator": "external", "routing_state": "none", "updated_at": "2020-04-30 02:38:16.919735Z", "invitation_key": "HzuztUt2mMJWdGNcQXtPg9MmrMcD517aFGxzmvFzXCse", "invitation_mode": "once", "alias": "aaalice", "state": "request", "created_at": "2020-04-30 01:46:20.042140Z", "request_id": "011c4e75-48a4-4976-a7f4-7de8f4dac2b5", "accept": "manual", "connection_id": "df98bef2-f67f-410c-8a96-f63405bba8ef", "my_did": "VNk6eT19CyU4PYzDxfaTp1", "their_label": "Faber.Agent" }
-
Faber Agent完成连接
Faber Agent执行
GET /connections
可以获取当前连接(在真是场景中连接是自动完成的)Response body:
{ "results": [ { "state": "request", "invitation_key": "HzuztUt2mMJWdGNcQXtPg9MmrMcD517aFGxzmvFzXCse", "routing_state": "none", "accept": "manual", "created_at": "2020-04-30 01:28:13.874808Z", "invitation_mode": "once", "connection_id": "6296344c-107a-47f4-9c78-2f5628e6d2d8", "updated_at": "2020-04-30 02:38:17.219477Z", "their_label": "Alice.Agent", "initiator": "self", "their_did": "VNk6eT19CyU4PYzDxfaTp1" }, {"state": "invitation", "invitation_key": "FqWE3ezBs7Nvxhr19iiTee2Y4emFwLerU3AREGJWQqpd", "routing_state": "none", "accept": "manual", "created_at": "2020-04-30 01:01:43.867887Z", "invitation_mode": "once", "connection_id": "1ab72b8c-6ede-4fad-a6d0-67f6a2ba02ce", "updated_at": "2020-04-30 01:01:43.867887Z", "initiator": "self" } ] }
Faber Agent执行
POST /connections/{id}/accept-request
来完成连接Response body:
{ "state": "response", "invitation_key": "HzuztUt2mMJWdGNcQXtPg9MmrMcD517aFGxzmvFzXCse", "routing_state": "none", "accept": "manual", "created_at": "2020-04-30 01:28:13.874808Z", "invitation_mode": "once", "connection_id": "6296344c-107a-47f4-9c78-2f5628e6d2d8", "my_did": "7GFFH3kvQTnsknu1BT1APi", "updated_at": "2020-04-30 02:58:49.381156Z", "their_label": "Alice.Agent", "initiator": "self", "their_did": "VNk6eT19CyU4PYzDxfaTp1" }
更多流程请阅读:https://github.com/hyperledger/aries-cloudagent-python/blob/master/demo/AriesOpenAPIDemo.md
网友评论