
深入解析 EIP-2256wallet_getOwnedAssetsJSON-RPC 方法与钱包资产查询规范【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPsEIP-2256wallet_getOwnedAssetsJSON-RPC Method提出了一种标准化的钱包到 dApp 的 JSON-RPC 方法允许 dApp 在获得用户许可的前提下从钱包直接获取某个以太坊地址所拥有的资产列表从而替代传统dApp 各自维护热门资产清单并逐一代币查询链上余额的做法。读完本文你将掌握wallet_getOwnedAssets的完整调用约定参数、返回值、数据字段能够写出可直接运行的 JSON-RPC 请求示例并理解它与 EIP-747、EIP-155、EIP-1474 等标准之间的配套关系以及钱包端 UI 交互与安全设计要点。背景为什么需要查询用户资产的统一标准在 EIP-2256 提出之前以太坊生态中不存在一个标准化的方式让 dApp 向用户请求其拥有的资产列表。现实中的做法是每个 dApp 自行维护一份热门/已知资产清单包括合约地址、ABI 等然后针对清单里的每一项资产通过 RPC 向区块链查询该地址的余额。这种模式带来两个突出问题dApp 之间重复劳动每个财务类 dApp如税务计算、定制化支付选项选择等都要重复维护资产清单、重复实现查询逻辑用户体验不佳用户看到的资产选项要么多于其真实持有来自各种不想要的空投代币要么少于其真实持有dApp 维护的清单不完整。EIP-2256 的动机正在于此用户真正关心的资产列表其实就保存在用户所使用的钱包里。钱包允许用户只管理自己感兴趣的资产因此让钱包直接回答这个地址拥有哪些资产是最自然、最准确的途径。该 EIP 提出的wallet_getOwnedAssets方法与 EIP-747wallet_watchAsset形成互补后者解决网站如何向钱包建议添加新资产前者解决dApp 如何从钱包取回已关注资产的列表。规范wallet_getOwnedAssets方法定义EIP-2256 定义了一个新增到 web3 浏览器钱包中的 JSON-RPC 方法wallet_getOwnedAssets用于 dApp 与钱包之间的通信且仅针对钱包已为用户账户白名单化的资产——也就是说钱包有权决定哪些资产可以被查询空投等用户不关注资产默认不会出现在结果中。请求参数Arguments参数类型必填说明第 1 个参数address是拥有这些资产的以太坊地址第 2 个参数options 对象object否查询选项详见下表options 对象内的可选字段字段类型说明chainIduint链 ID遵循 EIP-155可选limituintdApp 期望返回的资产数量上限可选typesstring[]资产接口标识符数组如[ERC20, ERC721]可选justificationstringdApp 提供的、向用户解释本次请求目的的人类可读文本可选但推荐提供其中chainId与 EIP-155 定义的链 ID 保持一致该标准中列举的常见取值包括1以太坊主网、3Ropsten、4Rinkeby、5Goerli、42Kovan、1337Geth 私有链默认等。limit的语义是给用户的可选项数量上限而非硬性截断——这由钱包 UI 的交互决定见下文UI 最佳实践。types用于限定资产接口类型让钱包只呈现与 dApp 功能相关的资产类别。返回结果Result返回一个资产记录asset records数组每条记录包含以下字段字段类型说明addressaddress以太坊校验和checksummed地址chainIduint资产部署所在链的标识符typestring资产接口的 ERC 标识符如ERC20可选——EIP 提到可用 EIP-1820 来辅助确定该 ERC 现已在仓库中标记为 Moved其接口注册思想仍可参考optionsobject资产特有字段对象以ERC20代币为例options内可包含字段类型说明namestring代币名称若代币未实现该接口则可选symbolstring代币符号若代币未实现该接口则可选iconbase64代币图标可选balanceuint用户持有的代币数量以最小代币单位最小面额计decimalsuint代币实现的小数位数可选address、type字段为 dApp 提供足够的资产标识信息使其可以进一步实现资产特有的功能balance字段则是一个优化点——通常余额信息本身是公开的钱包直接返回可以避免 dApp 再向链上查询一遍。完整请求/响应示例示例 1请求返回用户拥有的全部资产请求{ id:1, jsonrpc: 2.0, method: wallet_getOwnedAssets, params: [ 0x3333333333333333333333333333333333333333, { justification: The dApp needs to know about all your assets in order to calculate your taxes properly. } ] }响应{ id:1, jsonrpc: 2.0, result: [ { address: 0x0000000000000000000000000000000000000001, chainId: 1, type: ERC20, options: { name: TokenA, symbol: TKA, icon: data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw, balance: 1000000000000, decimals: 18 } }, { address: 0x0000000000000000000000000000000000000002, chainId: 3, type: ERC20, options: { name: TokenB, symbol: TKB, icon: data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw, balance: 2000000000000, decimals: 18 } }, { address: 0x0000000000000000000000000000000000000003, chainId: 42, type: ERC721, options: { name: TokenC, symbol: TKC, icon: data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw, balance: 10 } } ] }注意该示例的要点三个资产分别部署在chainId为1、3、42的不同链上证明一次调用可以跨链返回资产ERC721NFT资产同样通过options.balance表达持有数量此处为 10decimals字段在ERC721记录中省略icon字段使用data:URI 形式的 base64 编码图片。示例 2带过滤条件的请求仅返回 chainId 1 上的一个 ERC20 资产请求{ id:1, jsonrpc: 2.0, method: wallet_getOwnedAssets, params: [ 0x3333333333333333333333333333333333333333, { chainId: 1, limit: 1, types: [ERC20], justification: Select your token of choice, in order to pay for our services. } ] }响应{ id:1, jsonrpc: 2.0, result: [ { address: 0x0000000000000000000000000000000000000001, chainId: 1, type: ERC20, options: { name: TokenA, symbol: TKA, icon: data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw, balance: 1000000000000, decimals: 18 } } ] }本例展示了chainId、limit、types三个过滤参数同时生效的效果钱包只返回满足chainId1 且 typeERC20条件的资产并且按limit: 1的语义只交回 1 条记录。钱包端 UI 最佳实践EIP-2256 明确规定钱包必须向用户展示请求 UI用户拥有三种选择接受请求——此时 dApp 收到全部被请求的资产拒绝请求——不返回任何数据修改amend请求——通过降低返回给 dApp 的资产数量来收窄授权范围。具体交互规则当请求全部资产时钱包 UI 应向用户展示资产总数用户也可以自行勾选将返回给 dApp 的资产子集即修改请求当请求的是特定选择如示例 2 的过滤条件时用户从持有资产列表中做选择作为优化手段钱包可以维护一份用户常用资产列表在 UI 中优先展示这部分资产并允许用户展开查看使用频率较低的持有资产。这套 UI 设计把数据最小化原则落到交互层面即使 dApp 请求了全部资产用户也有权只交出其中的一部分体现了以用户为中心的权限控制思路。设计理由Rationale解读EIP-2256 的设计决策背后有清晰考量避免重复劳动chainId与types可选参数让 dApp 能主动收窄展示给用户的候选列表贴合 dApp 自身功能需要limit参数让 dApp 告知用户最多可以选择多少个账户/资产。关于是否还应提供一个下界最少返回数量EIP 认为有待实践验证当前可视为下界为1。更好的 UX 一致性options响应字段携带资产特有信息名称、符号、图标等dApp 可以复用钱包使用的同一套视觉与文本标识让用户在 dApp 界面中更容易识别资产。足够的资产标识信息address与type字段让 dApp 能在此基础上实现额外的资产特有功能。减少链上查询balance字段本身就是一种优化——该信息通常已经公开由钱包直接附带返回可省去 dApp 一次链上读取。与相关 EIP 标准的配套关系EIP-2256 位于钱包-站点wallet-site通信标准族的中间位置与之配套的标准包括EIP-55校验和地址结果中的address字段要求使用校验和checksummed地址这正是 EIP-55 定义的地址编码规则该 ERC 文件在仓库中已标记为 Moved其校验和规则仍被广泛引用EIP-155简单重放攻击保护chainId参数遵循 EIP-155 的链 ID 语义该文件同时给出了常见链 ID 清单主网 1、Ropsten 3、Rinkeby 4、Goerli 5、Kovan 42、Geth 私有链 1337EIP-1474远程过程调用规范EIP-2256 依赖其确立的 JSON-RPC 请求/响应对象约定。EIP-1474 规定了请求对象必须包含id、jsonrpc、method、params响应对象必须包含result或error后者含code与message例如-32601 Method not found、-32602 Invalid params、-32000 Invalid input等错误码体系EIP-2256 的请求与响应示例完全符合这一规范EIP-747wallet_watchAsset RPC 方法两者是一对写入/读取组合——EIP-747 让网站建议钱包关注某个资产该标准已 Final且对type/options的扩展提出了明确要求新增资产类型必须通过独立 EIP 规范EIP-2256 则让 dApp 从钱包读取已关注的资产EIP-1820Pseudo-introspection RegistryEIP-2256 提到可用其来确定资产的接口类型该 ERC 在仓库中已标记为 Moved。兼容性、测试与实现状态向后兼容性Backwards CompatibilityEIP-2256 声明不适用——因为这是一个全新方法不影响任何既有 RPC 行为。测试用例Test Cases规范中标注 To be done待完成目前尚未提供标准化的测试向量。实现Implementation规范中同样标注 To be done待完成即截至该 EIP 文档的当前状态尚无公开的标准实现。需要注意该 EIP 在仓库中的状态为Stagnant停滞意味着它自 2019-08-29 创建作者 Loredana Cirstea后并未持续推进到 Draft/Final 阶段。因此本文所描述的全部内容均为该 EIP 文档本身的规范定义而非已落地生态标准任何钱包或 dApp 若要采用此方法应将其视为一种参考性的提案约定并结合 EIP-1474 的错误码体系自行实现参数校验与错误处理。总结EIP-2256 通过一个简洁的wallet_getOwnedAssetsJSON-RPC 方法把用户拥有哪些资产这一信息的权威来源从dApp 自建清单 链上逐个查询转移到了用户自己的钱包既消除了 dApp 的重复劳动又通过钱包白名单、UI 授权与可修改请求的交互设计让用户对资产数据的暴露范围拥有最终控制权。它与 EIP-747关注资产、EIP-1474RPC 规范、EIP-155链 ID等标准共同构成了 dApp 与钱包之间资产交互的完整协议面。对于正在设计钱包资产面板或财务类 dApp 的开发者而言本文的参数表、完整请求/响应示例与 UI 交互规则可以直接作为接口设计与产品设计的参考基线。如需进一步阅读可在本仓库中查看 EIP-2256 原文、EIP-747 wallet_watchAsset、EIP-1474 RPC 规范 与 EIP-155 链 ID 清单。【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考