跳到主要内容

多链连接

DID Connect 的设计充分考虑了互操作性,其功能已超越 ArcBlock 生态系统。你可以配置它,使其与以太坊和 Solana 等其他主流区块链无缝交互。本示例将演示如何设置一个 DID Connect 会话,以请求在以太坊网络上执行操作。

实现多链功能的关键在于 chainInfo 对象,该对象用于告知用户的钱包在此次会话中应连接到哪个网络。

chainInfo 对象

要在特定区块链上发起请求,你必须提供一个 chainInfo 对象。该对象指定了目标网络的类型、ID 和连接端点。

chainInfo 对象的字段如下:

FieldTypeDescriptionRequired
typestring区块链的类型。支持的值为 'arcblock''ethereum''solona'
idstring网络的链 ID。例如,以太坊主网为 '1',Sepolia 测试网为 '11155111'对于 'ethereum''solona'
hoststring网络的 RPC 端点。虽然是可选的,但为了保证通信的可靠性,强烈建议提供。

示例:在以太坊上请求签名

接下来,我们将通过一个示例,演示如何请求用户使用其在 Sepolia 测试网上的以太坊账户签署一条消息。

首先,为目标网络定义 chainInfo。此对象将传递给 WalletHandlers 以配置 DID Connect 会话。

Ethereum Chain Configuration

javascript
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

javascript
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: '以太坊签名已验证!' };
  },
});

工作原理

  1. 当你的应用程序生成 DID Connect 二维码时,你提供的以太坊 chainInfo 信息将被编码其中。
  2. 用户使用像 ABT Wallet 这样的兼容钱包扫描该二维码。
  3. 钱包识别出 type: 'ethereum',并提示用户切换到 Sepolia 以太坊网络。
  4. 接着,用户被要求使用其选择的以太坊账户签署该消息。
  5. 批准后,钱包会将签名发送回你的应用程序,你可以在 onAuth 回调中处理该签名。

只需相应地更改 chainInfo 对象,就可以将此模式应用于 Solana 等其他链。这一强大功能使你能够构建去中心化应用,从而利用跨多个区块链生态系统的身份和资产。