> For the complete documentation index, see [llms.txt](https://ceramic-zhong-wen-wen-dang.gitbook.io/ceramic-zhong-wen-wen-dang/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ceramic-zhong-wen-wen-dang.gitbook.io/ceramic-zhong-wen-wen-dang/ceramic-xie-yi/zhang-hu/dui-xiang-neng-li-cacao.md).

# 对象能力CACAO

## 对象能力CACAO

Cearmic流支持[CACAO](https://chainagnostic.org/CAIPs/caip-74)，使得基本但强大的基于能力的授权系统得以存在。CACAO或“链不可知对象能力”是用于授权的可组合、可转移和可验证容器，并编码在IPLD中。有关完整的CACAO规范和更多示例，请参考[CAIP-74：CACAO - 面向链不可知的能力对象](https://chainagnostic.org/CAIPs/caip-74)。

## **方法**

基于对象能力的授权系统，CACAO是其中一种实现方式，它是在开放和分布式系统中表示授权的自然方法。对象能力需要很少的协调工作，只有关心特定能力的各方才会存储，并且可以进行自我验证。\
相比之下，像访问控制列表（ACL）这样流行的授权模型通常依赖于维护准确、达成共识并及时更新权限列表的能力。当你可以依靠单个权威来源来维护列表时，ACL简单而足够；但在分布式环境中很快就变得困难。在许多未知参与者之间维护一个列表成为了一个艰难的共识问题，在大规模情况下通常非常昂贵，并需要大量前期和持续协调。

## **用法**

CACAO 使一个账户能够授权另一个账户代表其在有限的数据上构建签名，或者在这种情况下写入 Ceramic 流。

### **使用区块链账号**

当与“[使用X登录](https://chainagnostic.org/CAIPs/caip-122)”结合使用时，CACAO解锁了区块链账户授权Ceramic账户（DID）代表他们签署数据的能力。这种在Ceramic中经常使用的模式，大大增加了用户拥有的数据和公钥密码学的可用性。由于采用了基于区块链的系统，许多用户现在可以使用其钱包和区块链账户轻松地在基于Web的环境中签署数据。

### **授权会话**

像 Ceramic 这样的数据中心系统通常比区块链系统具有更频繁的写入操作，因此在区块链钱包中签署每个 Ceramic 流事件可能是不切实际的。相反，通过使用 CACAO 和“使用 X 登录”功能，可以通过临时密钥和经过 CACAO 授权的 DID 来进行许多写入操作。允许用户使用基于区块链的账户和钱包仅签署一次，然后在授权时间（会话）内继续签署多个有效payloads。

> 在未来，我们预计能够模拟更复杂的环境和结构的授权，包括整个组织。

## **规范**

核心ceramic协议中支持对象能力。流中的事件是使用DAGJWS（DAG-JOSE）格式化的签名有效载荷，[如此处所述](https://developers.ceramic.network/protocol/streams/event-log/)。这描述了如何通过首先构建具有CACAO的JWS来扩展它以构造有效的CACAO签名payload。然后可以将具有CACAO的JWS直接编码为DAG-JOSE。

### **使用CACAO的JWS**

JWS CACAO支持包括向JWS受保护头添加cap参数并指定正确的kid参数字符串。以下是带有CACAO的示例受保护的JWS头：

```JSON
{ 
  "alg": "EdDSA",
  "cap": "ipfs://bafyreidoaclgf2ptbvflwalfrr6d4iqehkzyidwbzaouprdbjjfb4yim6q"
  "kid": "did:key:z6MkrBdNdwUPnXDVD1DCxedzVVBpaGi8aSmoXFAeKNgtAer8#z6MkrBdNdwUPnXDVD1DCxedzVVBpaGi8aSmoXFAeKNgtAer8"
 }
 
```

其中alg - 标识用于保护JWS的加密算法**cap - 映射到URI字符串，预期可解析为CACAO对象的IPLD CID**kid - 引用用于保护JWS的密钥。在此范围内，这应该是一个带有对DID验证方法中任何键的引用的DID。参数必须与CACAO对象的aud目标匹配，以使CACAO和相应签名一起有效。

> 由于cap目前不是IANA“JSON Web签名和加密头参数”注册表中的注册头参数名称，因此我们暂时将其视为“私有头参数名称”，并且CACAO为选择使用本规范的实现提供了附加含义。\
> 这意味着在验证过程中忽略cap标头仍将通过kid定义的密钥生成有效的JWS负载。它只是没有按照CACAO中定义的任何其他含义。 cap标头参数也可以通过在JWS中使用crit（关键）标头参数作为扩展来添加支持，但几乎没有理由基于消费者不理解cap标头而使JWS无效，因为它仍然有效。

### **DagJWS with CACAO**

**构造**根据前面部分描述的具有CACAO的JWS，按照DAG-JOSE规范和实现步骤，将给定的具有CACAO头部和有效负载的JWS构建成DagJWS。DagJWS与任何JWS非常相似，唯一的区别在于有效负载是一个base64url编码的IPLD CID，该CID引用了JSON对象有效负载。

```JSON
{ 
  cid: "bagcqcera2mews3mbbzs...quxj4bes7fujkms4kxhvqem2a",
  value: {
    jws: { 
      link: CID("bafyreidkjgg6bi4juwx...lb2usana7jvnmtyjb4xbgwl6e"),
      payload: "AXESIGpJjeCjiaWv...LKw6pIDQfTVrJ4SHlwmsvx", 
      signatures: [
        {
          protected: "eyJhbGciOiJFZERTQSIsImNh...GU2djZEpLTmhYSDl4Rm9rdEFKaXlIQiJ9"
          signature: "6usTYvu5KN0LFTQsWE9U-tqx...h60EgfvjL_rlAW7_tnQUl84sQyogpkLAQ"
        }
      ]
    }
  }
}
```

**验证**以下算法描述了确定给定的具有CACAO的DagJWS是否有效所需的步骤：

1. 按照[DAG-JOSE规范](https://ipld.io/specs/codecs/dag-jose/spec/)将给定的DagJWS转换为JWS。
2. 根据JWS规范，判断给定的JWS是否有效。验证给定签名与保护头中的 `alg` 和 `kid` 配对的有效性，以及给定负载的有效性。如果无效，则必须引发错误。
3. 将投影的 JWS 标头中 cap 参数中给定的 URI 解析为 CACAO JSON 对象。遵循[CAIP-74 CACAO](https://chainagnostic.org/CAIPs/caip-74)规范来确定给定的CACAO是否有效。如果无效，则必须引发错误。

**示例:**&#x4EE5;IPLD dag-jose编码块为例，字符串被缩写。

```JSON
{ 
  cid: "bagcqcera2mews3mbbzs...quxj4bes7fujkms4kxhvqem2a",
  value: {
    jws: { 
      link: CID("bafyreidkjgg6bi4juwx...lb2usana7jvnmtyjb4xbgwl6e"),
      payload: "AXESIGpJjeCjiaWv...LKw6pIDQfTVrJ4SHlwmsvx", 
      signatures: [
        {
          protected: "eyJhbGciOiJFZERTQSIsImNh...GU2djZEpLTmhYSDl4Rm9rdEFKaXlIQiJ9"
          signature: "6usTYvu5KN0LFTQsWE9U-tqx...h60EgfvjL_rlAW7_tnQUl84sQyogpkLAQ"
        }
      ]
    }
  }
}
```

如果解码 `block.value.jws.signatures[0].protected` ，你会看到以下对象，即上述所描述的JWS受保护的头部：

```JSON
{
  "alg": "EdDSA",
  "cap": "ipfs://bafyreidoaclgf...yidwbzaouprdbjjfb4yim6q",
  "kid": "did:key:z6Mkq2ZyjGV54ev...hXH9xFoktAJiyHB#z6Mkq2ZyjGV54ev...hXH9xFoktAJiyHB"
}
```
