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 |
Table of Contents
摘要
本 EIP 标准化了一个新的钱包作用域 RPC 方法 wallet_watchAsset
,以允许客户端建议用户的钱包跟踪某个 token。
动机
如今,以太坊钱包的主要用途之一是跟踪用户的资产。 如果没有这个 EIP,每个钱包要么需要预加载一个批准的资产列表,要么用户必须手动将资产添加到他们的钱包中。 在前一种情况下,钱包承担了管理此列表的安全风险,以及对其钱包上已知资产进行大规模轮询的带宽负担。 在后一种情况下,用户体验非常糟糕。
规范
本文档中,关键词“必须”、“禁止”、“需要”、“应该”、“不应该”、“推荐”、“不推荐”、“可以”和“可选”应按照 RFC 2119 和 RFC 8174 中的描述进行解释。
添加了一个新的 RPC 方法 wallet_watchAsset
。wallet_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 列表检查 name
和 symbol
字段以及合约 address
和 chainId
。 如果名称和/或符号与列表中的名称相似,但 chainId
/ address
不匹配,则应向用户显示警告。
钱包应该允许列入白名单和/或黑名单中的特定端口和方案,以避免 SSRF 攻击。
遗留 ERC20
类型
options 字段的格式为:
interface ERC20WatchAssetOptions {
{
address: string; // 令牌合约的十六进制地址
chainId?: number; // 资产的链 ID。 如果为空,则默认为当前链 ID。
};
}
address
是必需的,其他字段是可选的。 address
必须是 0x
前缀的 token 合约的校验和十六进制地址。 chainId
必须是资产所属的链 ID。
如果校验和失败,则必须认为该请求无效。
如果钱包无法识别 chainId
,或者 chainId
为空并且钱包没有“活动”链的概念,则调用必须失败。
wallet_watchAsset
应该根据知名 token 列表检查 name
和 symbol
字段以及合约 address
和 chainId
。 如果名称和/或符号与列表中的名称相似,但 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.