题目
一个组件里散落着 window.ethereum.request 调用:读余额、订阅、签名都走同一个全局对象,在多钱包环境下出现链与账户不一致。请说明直接调用 provider 的适用边界,以及数据读取、签名与发送分别应该交给谁。
考察目标
- 划分直接
request与封装层能力的职责边界。 - 掌握多钱包环境下获取当前 Provider 的方式。
- 设计能力探测与 4200 降级路径。
划分直接 request 与数据层、连接层封装的职责边界,给出多钱包环境下 Provider 获取与降级的工程方案。
一个组件里散落着 window.ethereum.request 调用:读余额、订阅、签名都走同一个全局对象,在多钱包环境下出现链与账户不一致。请说明直接调用 provider 的适用边界,以及数据读取、签名与发送分别应该交给谁。
request 与封装层能力的职责边界。request 是钱包接口的通用入口,method 与参数由对应 RPC 规范定义;对不支持的已最终确定 EIP 方法,规范建议返回 4200,也允许按具体方法的规范返回其他错误。调用方应处理不支持与其他失败分支。实现差异与工程取舍见深入回答。
【协议保证】request 以 { method, params } 结构提交调用,具体方法的语义由对应 RPC 规范定义(依据:EIP-1193 §request)。
【协议保证】对不支持的已最终确定 EIP 方法,规范建议以 4200 拒绝,或按该方法的规范返回适当错误;调用方需要处理这一分支(依据:EIP-1193 §Supported RPC Methods)。
【工程经验】读取链上数据走公开客户端:在 viem 中由 public client 承担读取与模拟,避免把读操作与钱包弹窗耦合(依据:viem Custom Transport 文档对 client 与 transport 分工的说明)。
【工程经验】签名与发送使用当前连接对应的 Provider:在 wagmi 中可以通过当前 connector 获取,而不是直接读取全局 window.ethereum(依据:wagmi Connectors 文档)。
【工程经验】多钱包环境下始终使用当前连接对象的 Provider,可以让链与账户信息与界面显示保持一致(依据:wagmi Connectors 文档;工程经验)。
【工程经验】钱包特有能力(例如资产添加、权限查询一类方法)适合直接 request 调用;调用前做能力探测,并在收到 4200 时进入降级路径(依据:EIP-1193 §Provider Errors;工程经验)。
【工程经验】把 Provider 获取封装为 Hook 或服务,避免组件内散落全局对象访问(依据:工程经验,无规范依据)。
【工程经验】连接切换时清理旧的订阅与监听,避免新旧连接的回调同时写入状态(依据:工程经验,无规范依据)。
【工程经验】混用不同来源的 Provider 会造成链与账户错配;出现不一致时优先收敛到单一来源再排查(依据:工程经验,无规范依据)。
window.ethereum,多钱包环境拿到的是非当前连接的 Provider。request,绕过了参数校验与类型检查。request,哪些交给数据层或连接层更合适?request 调用,你会怎么规划?request 是通用入口,读链上数据与钱包交互是两类路径。发现这道题有问题? 反馈此题