DID Connect 的设计充分考虑了互操作性,其功能已超越 ArcBlock 生态系统。你可以配置它,使其与以太坊和 Solana 等其他主流区块链无缝交互。本示例将演示如何设置一个 DID Connect 会话,以请求在以太坊网络上执行操作。
实现多链功能的关键在于 chainInfo 对象,该对象用于告知用户的钱包在此次会话中应连接到哪个网络。
chainInfo 对象
要在特定区块链上发起请求,你必须提供一个 chainInfo 对象。该对象指定了目标网络的类型、ID 和连接端点。
chainInfo 对象的字段如下:
| Field | Type | Description | Required |
|---|---|---|---|
type | string | 区块链的类型。支持的值为 'arcblock'、'ethereum' 和 'solona'。 | 是 |
id | string | 网络的链 ID。例如,以太坊主网为 '1',Sepolia 测试网为 '11155111'。 | 对于 'ethereum'、'solona' |
host | string | 网络的 RPC 端点。虽然是可选的,但为了保证通信的可靠性,强烈建议提供。 | 否 |
示例:在以太坊上请求签名
接下来,我们将通过一个示例,演示如何请求用户使用其在 Sepolia 测试网上的以太坊账户签署一条消息。
首先,为目标网络定义 chainInfo。此对象将传递给 WalletHandlers 以配置 DID Connect 会话。
Ethereum Chain Configuration
const ethereumChainInfo = {
type: 'ethereum',
id: '11155111', // Sepolia 链 ID
host: 'https://sepolia.infura.io/v3/YOUR_INFURA_PROJECT_ID', // 示例 RPC 端点
};接下来,在 handlers.attach 方法中使用此配置。你可以在 authPrincipal 声明中设置 chainInfo,为整个会话定义上下文。如果需要在多个链上协调工作流,也可以为单个声明指定 chainInfo。
Attaching Wallet Handlers
const { WalletHandlers } = require('@arcblock/did-connect');
// 假设 'authenticator' 和 'tokenStorage' 已配置好
const handlers = new WalletHandlers({ authenticator, tokenStorage });
handlers.attach({
app: server, // 你的 Express.js 应用实例
action: 'eth-signature',
// 为整个认证请求设置链上下文
authPrincipal: {
chainInfo: ethereumChainInfo,
},
// 定义要在指定链上请求的声明
claims: {
signature: () => ({
typeUrl: 'eth:personal-data', // 请求个人签名
display: '签署一条消息以验证你的以太坊账户',
origin: 'https://yourapp.com',
// 如果设置了 authPrincipal.chainInfo,此项为可选
chainInfo: ethereumChainInfo,
}),
},
// 处理钱包的响应
onAuth: ({ claims, userDid }) => {
const signatureClaim = claims.find(c => c.type === 'signature');
console.log(`User ${userDid} provided a signature: ${signatureClaim.signature}`);
// 现在你可以在以太坊网络上验证签名
return { successMessage: '以太坊签名已验证!' };
},
});工作原理
- 当你的应用程序生成 DID Connect 二维码时,你提供的以太坊
chainInfo信息将被编码其中。 - 用户使用像 ABT Wallet 这样的兼容钱包扫描该二维码。
- 钱包识别出
type: 'ethereum',并提示用户切换到 Sepolia 以太坊网络。 - 接着,用户被要求使用其选择的以太坊账户签署该消息。
- 批准后,钱包会将签名发送回你的应用程序,你可以在
onAuth回调中处理该签名。
只需相应地更改 chainInfo 对象,就可以将此模式应用于 Solana 等其他链。这一强大功能使你能够构建去中心化应用,从而利用跨多个区块链生态系统的身份和资产。