题目
一个页面用 net_version 判断当前是否主网,另一个页面把 eth_chainId 的十六进制字符串与配置中的数字直接比较,判断条件一直没有成立。请说明这两个方法的返回格式、命名空间差异,以及判断网络时的推荐做法。
考察目标
- 掌握
net_version与eth_chainId的返回类型与所属命名空间。 - 识别字符串、进制与类型比较带来的问题。
- 设计链信息读取与缓存的时机。
对照两个方法的返回形态与命名空间差异,给出判断当前网络的工程做法与比较时的常见错误。
一个页面用 net_version 判断当前是否主网,另一个页面把 eth_chainId 的十六进制字符串与配置中的数字直接比较,判断条件一直没有成立。请说明这两个方法的返回格式、命名空间差异,以及判断网络时的推荐做法。
net_version 与 eth_chainId 的返回类型与所属命名空间。net_version 返回十进制字符串形式的网络 ID,属于 net 命名空间;eth_chainId 返回十六进制字符串形式的 chainId。两者位于不同的方法集合,返回格式也不同;页面在处理链信息时需要按各自格式解析,并在链变化后重新读取。实现差异与工程取舍见深入回答。
【协议保证】net_version 返回十进制字符串形式的网络 ID(依据:EIP-1474 §net_version)。
【协议保证】eth_chainId 的返回值是十六进制字符串(依据:EIP-1193 §request 的调用示例)。
【协议保证】两个方法分属不同命名空间:net_version 位于 net 方法集合,eth_chainId 位于 eth 方法集合(依据:EIP-1474 §net_version;EIP-1193 §request)。
【工程经验】判断当前网络以 eth_chainId 为准,把它的返回值解析为数字后与配置比较(依据:工程经验,无规范依据)。
【工程经验】比较前统一进制与类型:十六进制字符串先解析,十进制字符串按十进制解析,避免字符串与数字混比(依据:工程经验,无规范依据)。
【工程经验】页面初始化、刷新、重连与链事件到达后重新读取 chainId,缓存中的链信息随之失效(依据:工程经验,无规范依据)。
【工程经验】把 chainId 写死绕过配置会让新增网络时的维护成本上升,建议从配置或钱包读取(依据:工程经验,无规范依据)。
【工程经验】界面上的网络名称与 chainId 分开维护:名称属于展示层,判断逻辑围绕 chainId 展开(依据:工程经验,无规范依据)。
net_version 的返回值判断主网或测试网。eth_chainId 的十六进制字符串与配置中的十进制数字直接比较。eth_chainId 而不是 net_version?net_version 返回十进制字符串、eth_chainId 返回十六进制字符串。发现这道题有问题? 反馈此题