协议声明 (Agreement Claim) 是一个强大的工具,用于获取用户对服务条款、隐私政策或任何其他正式协议的明确同意。此声明并非简单的复选框,而是要求用户对文档的哈希(摘要)进行加密签名,从而创建一个可验证且不可否认的同意记录。
此过程可确保用户同意你所提供的确切文档版本,因为 DID 钱包在请求用户签名之前会独立验证文档的完整性。
工作原理
协议声明的工作流程旨在确保安全性和透明度:
应用端
你的应用程序向钱包提供一个托管文档的 URL (
uri) 和一个预先计算好的该文档内容的加密哈希(digest)。钱包端
用户的 DID 钱包接收请求。
验证
钱包从提供的
uri获取文档,使用相同的method(例如 SHA256)计算其哈希值,并将其与你的应用程序发送的digest进行比较。用户同意
如果哈希值匹配,钱包会向用户显示文档和确认提示。如果不匹配,钱包会警告用户可能存在差异,保护他们免受“偷梁换柱”式攻击。
签名
用户批准后,钱包会使用用户的私钥对已验证的摘要进行签名。
响应
生成的签名作为同意证明被发送回你的应用程序。

参数
agreement 声明对象接受以下参数:
| Parameter | Type | Description |
|---|---|---|
uri | string | 必需。用户需要查看并同意的文档(例如,服务条款)的 URL。必须是 http 或 https URL。 |
digest | string | 必需。文档内容的加密哈希(摘要)。在请求签名之前,钱包将根据 uri 处的文档验证此摘要。 |
method | string | 可选。用于创建摘要的哈希算法。默认为 sha2。支持的方法包括 sha2、sha3 和 keccak。 |
description | string | 可选。在钱包中向用户显示的自定义消息,解释他们同意的内容。默认为“请确认您的协议以继续。”。 |
示例:请求同意服务条款
以下是如何配置 WalletHandlers 以请求用户同意服务条款文档。你首先需要为你的 terms.txt 文件生成一个 SHA256 哈希值。
请求用户同意
const { WalletHandlers } = require('@arcblock/did-connect');
// 你可以使用如下命令生成此摘要:
// shasum -a 256 path/to/your/terms.txt
const termsDigest = 'f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2';
const handlers = new WalletHandlers({
chainInfo: { host: 'https://beta.abtnetwork.io/api' },
appInfo: {
name: 'My App',
description: 'My App Description',
icon: 'https://arcblock.oss-cn-beijing.aliyuncs.com/images/wallet-round.png',
link: 'https://my-app.com',
},
claims: {
agreement: {
description: 'Please read and agree to our new Terms of Service to proceed.',
uri: 'https://my-app.com/terms.txt',
method: 'sha2',
digest: termsDigest,
},
},
onAuth: async ({ claims, userDid }) => {
// claims 数组将包含协议声明的响应
const agreementClaim = claims.find(c => c.type === 'agreement');
console.log(`${userDid} agreed and signed with digest:`, agreementClaim.sig);
// 现在你可以根据用户的 DID 和原始摘要验证签名
},
});在 onAuth 回调中,你会收到 sig 字段,这是用户对文档摘要的签名。你可以将此签名与用户的 DID 一起存储,作为其同意的持久且可验证的记录。
后续步骤
在获得用户同意后,你可能需要验证他们拥有的特定属性或资格。了解如何通过请求可验证凭证来实现这一点。