钱包调用准备 API

  • ethereum
  • 发布于 2024-12-30 22:43
  • 阅读 13

该提案定义了与 EIP-5792 的 wallet_sendCalls 互补的 JSON-RPC 方法。

摘要

本提案定义了对 EIP-5792wallet_sendCalls 方法的补充 JSON-RPC 方法。虽然 wallet_sendCalls 用于应用提交 calls,以便在钱包的界面中签名和提交,但本提案中的方法用于应用程序请求准备好的 calls(其中“准备好的”取决于钱包实现),以便由应用程序本身签名和提交。

动机

随着账户抽象和会话密钥的最新发展,应用程序越来越需要能够在不切换到钱包界面(例如,浏览器扩展程序)的情况下签名和提交操作。这可能很棘手,因为不同的账户实现可能具有不同的调用数据编码、签名格式等。为了解决这个问题,我们需要一种方法让应用程序知道如何为任何账户实现提交操作。

规范

定义了两个新的 JSON-RPC 方法。如果用户正在浏览器上与应用程序交互,则可以通过将请求发送到钱包的 EIP-1193 provider 来使用它们。但是,本提案还描述了应用程序如何与“钱包服务器”交互以进行后台进程。

wallet_prepareCalls

接受 EIP-5792 wallet_sendCalls 请求,并根据账户的实现返回准备好的 calls。

参数

type PrepareCallsParams = [{
  version: string
  from: `0x${string}`
  chainId: `0x${string}`
  calls: {
    to: `0x${string}`
    data: `0x${string}`
    value: `0x${string}`
  }[];
  capabilities: Record<string, any>
}]
参数示例
wallet_prepareCalls([{
  version: '1.0',
  from: '0x...',
  chainId: '0x...',
  calls: [{
    to: '0x...'
    data: '0x...'
    value: '0x...'
  }],
  capabilities: {
    paymasterService: {
      url: 'https://...'
    }
  }
}])

返回值

type PrepareCallsReturnValue = {
  type: string
  chainId: `0x${string}`
  signatureRequest: {
    hash: `0x${string}`
  }
  capabilities: Record<string, any>
}
##### 返回值示例

```typescript!
{
  type: 'user-operation-v06',
  userOp: {
    sender: '0x...',
    ...
  },
  chainId: '0x01',
  signatureRequest: {
    hash: '0x...'
  }
  capabilities: {
    paymasterService: {
      sponsor: 'My app'
    }
  }
}

调用 wallet_prepareCalls 后,应用程序开发人员应使用 signatureRequest 字段中提供的哈希进行签名,并将准备好并签名的 calls 通过第二个 RPC 方法 wallet_sendPreparedCalls 返回给钱包(通过其 EIP-1193 provider 或其服务器对应方)。

wallet_sendPreparedCalls

接受来自 wallet_prepareCalls 请求的响应中的准备好的 calls 以及签名,并返回 EIP-5792 call bundle ID。

参数

type SendPreparedCallsParams = [{
  version: string
  type: string
  data: any
  chainId: `0x${string}`
  signature: {
    type: string
    signature: `0x${string}`
  }
}]
参数示例
wallet_sendPreparedCalls([{
  version: '1.0',
  type: 'user-operation-v06',
  data: {
    sender: '0x...',
    ...
  },
  chainId: '0x01',
  signature: {
    type: 'secp256k1',
    data: '0x...'
  }
}])

返回值

type SendPreparedCallsReturnValue = {
  preparedCallIds: string[]
}
返回值示例
['0x...']

wallet_sendPreparedCalls RPC 使用 EIP-5792 call bundle 标识符进行响应,因此已经使用 wallet_sendCalls 向钱包提交 calls 的应用程序可以继续使用 wallet_getCallsStatus 来获取提交的 calls 的状态。

理由

许多会话密钥用例涉及代表用户提交操作。一个例子是自动执行用户 DEX 交易的应用程序。在这些情况下,钱包可以为应用程序提供一个“钱包服务器”URL,以便在浏览器上下文之外提交 JSON-RPC 请求。

定义一个声明公共钱包服务器 URL 的 walletServer EIP-5792 capability 不在本 EIP 的范围内。

{
  "0x2105": {
    "walletServer": {
      "supported": true,
      "url": "https://.../0x2105"
    }
  },
  "0x14A34": {
    "walletServer": {
      "supported": true,
      "url": "https://.../0x14A34"
    }
  }
}

如果钱包的 EIP-1193 provider 收到这些请求,它可能会选择将请求重新路由到自己的钱包服务器。或者,EIP-1193 provider 可以直接处理请求。

walletserver

向后兼容性

待定

安全考虑

需要讨论。

版权

CC0 下放弃版权和相关权利。

  • 原文链接: github.com/ethereum/ERCs...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
ethereum
ethereum
江湖只有他的大名,没有他的介绍。