Alert Source Discuss
🚧 Stagnant Standards Track: Interface

EIP-5345: JSON-RPC 的静默签名扩展

无需用户交互的临时交易签名

Authors Stanley Wu (@fruit37), Mücahit Büyükyılmaz (@anndro), Muhammed Emin Aydın (@muhammedea)
Created 2022-07-26
Discussion Link https://ethereum-magicians.org/t/walletconnect-silent-signing-extension/10137

摘要

支持大量交易的移动应用程序可能会由于钱包和应用程序 UI 之间不受控制的切换而成为不良用户体验的来源。通过本提案,我们希望引入在不需要用户参与的情况下签名和发送钱包交易的方法。可以通过提供用户在特定时间段内的同意来实现此功能。我们称该功能为静默签名 (Silent Signing)。

动机

某些区块链应用程序与区块链的交互频率远高于其他应用程序。对于拥有自己侧链的游戏应用程序尤其如此。中断游戏过程并切换到钱包以执行交易会严重影响用户体验。

规范

为了解决这种情况,我们想为 ethereum JSON-RPC 引入新的 RPC 方法。这些方法有助于钱包实现静默签名功能。

静默签名用户流程

静默签名过程具有以下结构:

  1. 首先,应用程序通过 RPC 的 wallet_requestSilentSign 方法请求钱包使用静默签名。
  2. 其次,钱包提示用户确认在特定时间段内启用静默签名功能。
  3. 如果用户未确认静默签名或不允许 RPC 方法,则应用程序将继续使用常规方法。
  4. 如果用户确认静默签名,则在指定的时间段内,每个后续交易都将使用 wallet_silentSendTransaction 方法发送。

实现

该实现引入了应用程序和钱包端的新 RPC 方法和流程。

新的 RPC 方法

wallet_requestSilentSign

此 RPC 方法打开钱包,并提示用户启用在特定时间段内的自动签名。此函数授予应用程序调用以下方法的权限,直到时间戳过期。诸如 eth_signTrancaction 之类的标准方法保持不变。

Parameters
  Object: request object
    until: NUMBER - unix timesptamp, 权限有效的结束时间
    chainId: NUMBER - 合约所在的链 ID
    contractAddress: ADDRESS - 允许的合约地址
    allowedFunctions: STRING ARRAY - 允许的函数签名
          Ex: ["equip(address,uint256)", "unequip(address,uint256)"]
    description: STRING - 钱包可以向用户显示的额外描述

Returns
  DATA, 20 Bytes: permissionSecret - 用于静默签名请求的密钥(随机生成)

wallet_silentSignTransaction

此 RPC 方法创建一个交易,并将其数据发送到钱包进行签名。钱包在后台对数据进行签名,不会干扰用户参与的任何过程。之后,应用程序使用 Nethereum 或其他库的 sendRawTransaction 方法将签名的交易发送到区块链。

Parameters
  DATA, 20 Bytes: permissionSecret - 从 `wallet_requestSilentSign` 方法获得的密钥
  Object - 交易对象
    from: DATA, 20 Bytes - 发送交易的地址。
    to: DATA, 20 Bytes - (创建新合约时可选) 交易定向到的地址。
    gas: QUANTITY - (可选,默认值:90000) 为交易执行提供的 gas 的整数。它将返回未使用的 gas。
    gasPrice: QUANTITY - (可选,默认值:待定) 用于每个已付 gas 的 gasPrice 的整数,以 Wei 为单位。
    value: QUANTITY - (可选) 与此交易一起发送的值的整数,以 Wei 为单位。
    data: DATA - 合约的已编译代码或调用的方法签名和编码参数的哈希值。
    nonce: QUANTITY - (可选) nonce 的整数。这允许覆盖您自己的使用相同 nonce 的待处理交易。
  
Returns
  DATA, 签名的交易对象。

wallet_silentSendTransaction

此 RPC 方法创建一个交易,并将其发送到区块链,而不会干扰用户参与的过程。

Parameters
  DATA, 20 Bytes: permissionSecret - 从 `wallet_requestSilentSign` 方法获得的密钥
  Object - 交易对象
    from: DATA, 20 Bytes - 发送交易的地址。
    to: DATA, 20 Bytes - (创建新合约时可选) 交易定向到的地址。
    gas: QUANTITY - (可选,默认值:90000) 为交易执行提供的 gas 的整数。它将返回未使用的 gas。
    gasPrice: QUANTITY - (可选,默认值:待定) 用于每个已付 gas 的 gasPrice 的整数。
    value: QUANTITY - (可选) 与此交易一起发送的值的整数。
    data: DATA - 合约的已编译代码或调用的方法签名和编码参数的哈希值。
    nonce: QUANTITY - (可选) nonce 的整数。这允许覆盖您自己的使用相同 nonce 的待处理交易。

Returns
  DATA, 32 Bytes - 交易哈希,如果交易尚不可用,则为零哈希。

应用程序和钱包通信

应用程序和钱包之间发送 RPC 请求可以像往常一样。例如,浏览器扩展钱包可以轻松使用这些新方法。甚至硬件钱包也可以实现此功能。但是对于移动钱包,应考虑额外的通信技术。因为移动钱包在不使用时可能处于非活动状态。

移动钱包主要使用 Walletconnect 协议。应用程序关闭或在后台活动时无法通过 WebSocket 连接到 Bridge 服务器。因此,我们必须触发钱包连接到 Bridge 并开始等待请求。为此,将使用推送通知。这意味着只有支持推送通知的钱包才能实现该功能。

每当钱包收到推送通知时,它都会连接到 Bridge 服务器并获得对挂起请求的访问权限。如果存在 wallet_silenSignTransactionwallet_silentSendTransaction 静默签名请求挂起,并且已为此特定持续时间确认与请求客户端的交互,则钱包将执行请求而不会干扰正在进行的用户活动。

理由

游戏和 Metaverse 应用程序意味着很多用户与钱包交互、切换到钱包并批准交易的情况。这种切换方面可能会干扰游戏本身并产生较差的用户体验。这就是为什么如果钱包可以支持静默签名功能,允许在没有用户交互的情况下对交易进行签名,那么此类应用程序可能会受益。

向后兼容性

这些新的 RPC 方法不会干扰当前的 RPC 方法,并且对于移动钱包,推送通知 API 当前是 WalletConnect 规范的一部分。实现提案的功能不会改变其他应用程序和钱包的任何内容。

安全考虑

拟议的功能旨在改善用户体验,并且只能在获得用户同意后才能启用。用户可以自由选择像往常一样使用该应用程序。

静默签名权限具有使其更安全的限制。

  • 仅在指定的时间段内授予权限
  • 仅针对特定链中的特定合约授予权限,并限制为指定的功能。

版权

版权和相关权利已通过 CC0 放弃。

Citation

Please cite this document as:

Stanley Wu (@fruit37), Mücahit Büyükyılmaz (@anndro), Muhammed Emin Aydın (@muhammedea), "EIP-5345: JSON-RPC 的静默签名扩展 [DRAFT]," Ethereum Improvement Proposals, no. 5345, July 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-5345.