题目
一个行情页面在账户变化后没有刷新数据,另一个页面在挂载时读取一次状态之后就不再更新。请说明 EIP-1193 的五个事件分别在什么条件下触发、载荷是什么,以及事件与状态读取之间是什么关系。
考察目标
- 说清五个事件的触发条件与载荷形态。
- 区分「变化通知」与「当前状态读取」两类能力。
- 理解事件订阅的接口形态(
on与removeListener)。
逐个说明 EIP-1193 五个事件的触发条件与载荷形态,并解释事件与状态读取的分工。
一个行情页面在账户变化后没有刷新数据,另一个页面在挂载时读取一次状态之后就不再更新。请说明 EIP-1193 的五个事件分别在什么条件下触发、载荷是什么,以及事件与状态读取之间是什么关系。
on 与 removeListener)。EIP-1193 定义五个事件:connect 在首次连上链或从断开状态恢复时触发,载荷是 { chainId: 十六进制字符串 };disconnect 在与各链的连接均已断开时触发,载荷是 ProviderRpcError,其 code 遵循 CloseEvent 状态码;chainChanged 的载荷是十六进制字符串形式的 chainId;accountsChanged 在 eth_accounts 的返回值发生变化时触发,载荷是地址数组;message 是兜底通知通道,订阅类推送以 { type: 'eth_subscription', data } 的形式出现。实现差异与工程取舍见深入回答。
【协议保证】connect 在两类条件下触发:钱包首次连上某条链,或从断开状态恢复为可提交请求;载荷为 { chainId },其中 chainId 是十六进制字符串(依据:EIP-1193 §connect)。
【协议保证】disconnect 在钱包无法继续向所连各链提交请求时触发;载荷是 ProviderRpcError,其 code 遵循 CloseEvent 的状态码约定(依据:EIP-1193 §disconnect)。
【协议保证】chainChanged 在钱包所连链发生变化时触发;载荷是十六进制字符串形式的 chainId(依据:EIP-1193 §chainChanged)。
【协议保证】accountsChanged 在 eth_accounts 的返回值发生变化时触发;载荷是账户地址数组(依据:EIP-1193 §accountsChanged)。
【协议保证】message 是钱包向页面传递通知的兜底通道,可承载各类消息;eth_subscribe 相关推送以 { type: 'eth_subscription', data } 的形状出现(依据:EIP-1193 §message)。
【协议保证】事件描述的是「发生了变化」,当前账户、链与连接的完整状态通过 request 调用读取;两条通道分工互补(依据:EIP-1193 §Events、§request)。
【协议保证】订阅接口由 on 与 removeListener 成对提供,事件的载荷形态在规范中逐项定义(依据:EIP-1193 §Events)。
【协议保证】accountsChanged 的载荷可以为空数组,属于合法形态(依据:EIP-1193 §accountsChanged)。
【协议保证】message 的载荷结构由 type 字段区分,消费者按 type 判读其中内容(依据:EIP-1193 §message)。
【实现行为】wagmi 的 useConnectionEffect 提供 onConnect、onDisconnect、onAccountsChanged、onChainChanged 回调,把这几类事件封装为组件内可用的订阅形式(依据:wagmi useConnectionEffect 页面 §Parameters)。
accountsChanged 的数组参数当作全部账户状态,忽略主动查询。removeListener,监听器没有按预期移除。chainChanged 的十六进制字符串参数与十进制数字直接比较。disconnect 的载荷为什么是错误对象而不是空载荷?这对错误处理有什么影响?message 承载自定义通知,你会如何设计载荷判读逻辑?accountsChanged 的载荷是地址数组,chainChanged 的载荷是十六进制字符串。connect 与 disconnect 的触发条件及其载荷形态。request,并给出先订阅再读一次的时序设计。disconnect 载荷中 code 遵循 CloseEvent 状态码的含义,并设计对应的重连策略。发现这道题有问题? 反馈此题