#delegation #capability #capabilities #message #human #read #wallet-signable

capgrok

使用能力委派构建人类和机器可读的钱包签名消息

6 个版本

0.3.1 2022 年 10 月 10 日
0.3.0 2022 年 10 月 7 日
0.2.2 2022 年 8 月 18 日
0.2.0 2022 年 7 月 29 日
0.1.0 2022 年 7 月 21 日

#15 in #delegation

Download history 14/week @ 2024-03-29 6/week @ 2024-04-05

每月 121 次下载

Apache-2.0

29KB
587

Capgrok - 人类可读的能力。

使用此 crate 构建钱包签名消息,其中包含能力委派。生成的消息包含能力的两种表示:一种无歧义的机器可读表示,以及一种人类可读的描述。在这两种表示中,后者是从前者确定性地生成的。

消息格式

我们目前支持以下消息格式

  • EIP-4361: 使用以太坊进行登录 (SIWE)

SIWE 示例

以下是一个示例,具有

  • 展示任何凭证的能力
  • 展示类型 type1 的凭证的能力(技术上冗余)
  • 从 kepler 位置 kepler:ens:example.eth://default/kv 列表、获取和检索 metadata
  • 从 kepler 位置 kepler:ens:example.eth://default/kv/publickepler:ens:example.eth://default/kv/dapp-space 列表、获取、检索 metadataputdelete
let credential: Namespace = "credential".parse().unwrap();
let kepler: Namespace = "kepler".parse().unwrap();

let msg = Builder::new()
    .with_default_actions(&credential, ["present"])
    .with_actions(&credential, "type:type1", ["present"])
    .with_actions(
        &kepler,
        "kepler:ens:example.eth://default/kv",
        ["list", "get", "metadata"],
    )
    .with_actions(
        &kepler,
        "kepler:ens:example.eth://default/kv/public",
        ["list", "get", "metadata", "put", "delete"],
    )
    .with_actions(
        &kepler,
        "kepler:ens:example.eth://default/kv/dapp-space",
        ["list", "get", "metadata", "put", "delete"],
    )
    .build(Message {
        domain: "example.com".parse().unwrap(),
        address: Default::default(),
        statement: None,
        uri: "did:key:example".parse().unwrap(),
        version: siwe::Version::V1,
        chain_id: 1,
        nonce: "mynonce1".into(),
        issued_at: "2022-06-21T12:00:00.000Z".parse().unwrap(),
        expiration_time: None,
        not_before: None,
        request_id: None,
        resources: vec![],
    })?;

这会产生以下 SIWE 消息

example.com wants you to sign in with your Ethereum account:
0x0000000000000000000000000000000000000000

I further authorize did:key:example to perform the following actions on my behalf: (1) credential: present for any. (2) credential: present for type:type1. (3) kepler: list, get, metadata for kepler:ens:example.eth://default/kv. (4) kepler: list, get, metadata, put, delete for kepler:ens:example.eth://default/kv/dapp-space, kepler:ens:example.eth://default/kv/public.

URI: did:key:example
Version: 1
Chain ID: 1
Nonce: mynonce1
Issued At: 2022-06-21T12:00:00.000Z
Resources:
- urn:capability:credential:eyJkZWZhdWx0QWN0aW9ucyI6WyJwcmVzZW50Il0sInRhcmdldGVkQWN0aW9ucyI6eyJ0eXBlOnR5cGUxIjpbInByZXNlbnQiXX19
- urn:capability:kepler:eyJ0YXJnZXRlZEFjdGlvbnMiOnsia2VwbGVyOmVuczpleGFtcGxlLmV0aDovL2RlZmF1bHQva3YiOlsibGlzdCIsImdldCIsIm1ldGFkYXRhIl0sImtlcGxlcjplbnM6ZXhhbXBsZS5ldGg6Ly9kZWZhdWx0L2t2L2RhcHAtc3BhY2UiOlsibGlzdCIsImdldCIsIm1ldGFkYXRhIiwicHV0IiwiZGVsZXRlIl0sImtlcGxlcjplbnM6ZXhhbXBsZS5ldGg6Ly9kZWZhdWx0L2t2L3B1YmxpYyI6WyJsaXN0IiwiZ2V0IiwibWV0YWRhdGEiLCJwdXQiLCJkZWxldGUiXX1

仅登录

可以构建不带任何能力的信息,在这种情况下,将只生成包含“登录”消息的声明

let msg: Message = DelegationBuilder::new()
    .build(Message {
        domain: "example.com".parse().unwrap(),
        address: Default::default(),
        statement: None,
        uri: "did:key:example".parse().unwrap(),
        version: siwe::Version::V1,
        chain_id: 1,
        nonce: "mynonce1".into(),
        issued_at: "2022-06-21T12:00:00.000Z".parse().unwrap(),
        expiration_time: None,
        not_before: None,
        request_id: None,
        resources: vec![],
    }))?;

这会产生以下 SIWE 消息

'example.com wants you to sign in with your Ethereum account:
0x0000000000000000000000000000000000000000


URI: did:key:example
Version: 1
Chain ID: 1
Nonce: mynonce1
Issued At: 2022-06-21T12:00:00.000Z

依赖关系

~8.5MB
~151K SLoC