Alert Source Discuss
Standards Track: Interface

EIP-747: wallet_watchAsset RPC 方法

添加一个新的 RPC 方法,允许网站提示用户关注资产

Authors Dan Finlay (@danfinlay), Esteban Mino (@estebanmino), Gavin John (@Pandapip1)
Created 2018-08-13
Requires EIP-20, EIP-1046, EIP-1193

摘要

本 EIP 标准化了一个新的钱包作用域 RPC 方法 wallet_watchAsset,以允许客户端建议用户的钱包跟踪某个 token。

动机

如今,以太坊钱包的主要用途之一是跟踪用户的资产。 如果没有这个 EIP,每个钱包要么需要预加载一个批准的资产列表,要么用户必须手动将资产添加到他们的钱包中。 在前一种情况下,钱包承担了管理此列表的安全风险,以及对其钱包上已知资产进行大规模轮询的带宽负担。 在后一种情况下,用户体验非常糟糕。

规范

本文档中,关键词“必须”、“禁止”、“需要”、“应该”、“不应该”、“推荐”、“不推荐”、“可以”和“可选”应按照 RFC 2119 和 RFC 8174 中的描述进行解释。

添加了一个新的 RPC 方法 wallet_watchAssetwallet_watchAsset 请求将指定的资产列入用户的钱包。如果请求有效,它必须立即(即在提示用户之前)返回 true,否则如果无效则返回错误。 “列入用户的钱包” 的含义取决于钱包的实现。 成功调用 wallet_watchAsset 必须表明钱包识别了该请求并且其中不包含任何问题,但不表示是否提示了用户或是否实际将资产添加到了钱包。

wallet_watchAsset 参数

wallet_watchAsset 方法接受一个参数,即 WatchAssetParameters 对象,其定义如下:

interface WatchAssetParameters {
  type: string; // 资产的接口,例如 'ERC1046'
  options: any;
}

type 字符串应该是资产合约实现的接口的常用名称,例如 ERC1046。 为不同的资产类型定义全局标识符超出了本 EIP 的范围。

应该根据资产 type 扩展或修改此接口。 这些更改必须在单独的 EIP 中指定。

wallet_watchAsset 返回值

wallet_watchAsset 立即(即无需等待用户交互)返回布尔值 true,以表明请求已被识别(无论是否提示用户),如果请求无效则返回错误。 在以下情况下可能会发生错误(不详尽):

  • 资产类型无法识别/不受支持
  • 由于允许列表或拒绝列表,资产被阻止(由于根本原因需要开发人员采取行动,因此该请求“无效”)
  • 下载图像失败
    • 钱包没有加载显示资产所需的一些元数据,以防止潜在的 SSRF 攻击

ERC1046 类型

options 字段的格式为:

interface ERC1046WatchAssetOptions {
{
    address: string; // 令牌合约的十六进制地址
    chainId?: number; // 资产的链 ID。 如果为空,则默认为当前链 ID。
  };
}

address 是必需的,其他字段是可选的。 address 必须是 0x 前缀的 token 合约的校验和十六进制地址。 chainId 必须是资产所属的链 ID。

如果校验和失败,则必须认为该请求无效。

如果钱包无法识别 chainId,或者 chainId 为空并且钱包没有“活动”链的概念,则调用必须失败。

wallet_watchAsset 必须获取 ERC-1046 tokenURI 并检查 interop 字段以确定 token 的类型。 如果解析失败或类型未知,则 RPC 调用必须出错。

wallet_watchAsset 应该根据知名 token 列表检查 namesymbol 字段以及合约 addresschainId。 如果名称和/或符号与列表中的名称相似,但 chainId / address 不匹配,则应向用户显示警告。

钱包应该允许列入白名单和/或黑名单中的特定端口和方案,以避免 SSRF 攻击。

遗留 ERC20 类型

options 字段的格式为:

interface ERC20WatchAssetOptions {
{
    address: string; // 令牌合约的十六进制地址
    chainId?: number; // 资产的链 ID。 如果为空,则默认为当前链 ID。
  };
}

address 是必需的,其他字段是可选的。 address 必须是 0x 前缀的 token 合约的校验和十六进制地址。 chainId 必须是资产所属的链 ID。

如果校验和失败,则必须认为该请求无效。

如果钱包无法识别 chainId,或者 chainId 为空并且钱包没有“活动”链的概念,则调用必须失败。

wallet_watchAsset 应该根据知名 token 列表检查 namesymbol 字段以及合约 addresschainId。 如果名称和/或符号与列表中的名称相似,但 chainId / address 不匹配,则应向用户显示警告。

如果可能,建议改用 ERC1046 类型,它支持图像和自定义元数据。

理由

显示用户的资产是每个现代 DApp 用户期望的基本功能。 目前,大多数钱包要么管理他们自己的资产列表(他们将其存储在客户端),要么查询中心化的 API 以获取余额,这降低了去中心化程度并允许将帐户持有人与 IP 地址相关联。 此外,从网络刷新/轮询资产列表的成本可能很高,尤其是在带宽受限的设备上。 此外,维护资产列表会变成一种政治行为,引发骚扰并引发列出晦涩难懂资产的压力。

自动列出资产会将资产变成一种垃圾邮件:用户突然看到他们不关心的新资产出现在他们的钱包中。 这可以用于发送未经请求的信息,甚至进行网络钓鱼诈骗。 这种现象在空投 token 中已经很常见,这是造成网络拥塞的主要原因,因为到目前为止,向人们发送新 token 的垃圾邮件已经获得了更多用户的关注。

当用户手动添加资产时,他们可能之前从网站上了解过它。 那一刻,双方的利益自然保持一致,双方都希望用户跟踪该 token。 这是一个引入 API 以轻松允许双方协作的自然点。

安全考虑

服务器端请求伪造

钱包应谨慎对待向 URL 发出任意请求。 因此,建议钱包通过将特定方案和端口列入白名单来清理 URI。 例如,一个易受攻击的钱包可能会被诱骗修改本地托管的 redis 数据库中的数据。

验证

如果符号或名称与另一个 token 匹配或相似,钱包应警告用户,以避免网络钓鱼诈骗。

指纹识别

为避免基于钱包行为和/或列出的资产进行指纹识别,RPC 调用必须在提示用户或发生错误时立即返回,而无需等待用户接受或拒绝提示。

版权

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

Citation

Please cite this document as:

Dan Finlay (@danfinlay), Esteban Mino (@estebanmino), Gavin John (@Pandapip1), "EIP-747: wallet_watchAsset RPC 方法," Ethereum Improvement Proposals, no. 747, August 2018. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-747.