题目
账户概览面板需要展示余额、交易计数与地址类型,开发用三个依次等待的请求实现,切换账户后旧数据还会短暂出现;另一个页面为了显示「活跃度」把地址的历史交易拉了一遍。请说明批量读取与缓存键的设计。
考察目标
- 账户概览所需的最小数据集合。
- JSON-RPC 批量请求与合约批量读取的差别。
- 缓存键与切换账户、切换链后的失效。
说明账户概览所需的最小数据集合、批量请求按 id 关联与逐项失败处理,以及缓存键的隔离维度。
账户概览面板需要展示余额、交易计数与地址类型,开发用三个依次等待的请求实现,切换账户后旧数据还会短暂出现;另一个页面为了显示「活跃度」把地址的历史交易拉了一遍。请说明批量读取与缓存键的设计。
账户概览可以批量读取余额、nonce 与代码,但代码非空不等于传统合约账户:EIP-7702 委托的 EOA 也会返回委托指示码。JSON-RPC 批量响应可能乱序,应按 id 关联并逐项处理失败;代币余额与授权额度则需做合约读取。缓存键至少区分链和账户。实现差异与工程取舍见深入回答。
以下片段只演示批量合约读取与逐项判断,省略了 chain、address 与 ABI 的来源说明。
import { useReadContracts } from "wagmi";
const { data } = useReadContracts({
contracts: [
{ address, abi: erc20Abi, functionName: "balanceOf", args: [account] },
{
address,
abi: erc20Abi,
functionName: "allowance",
args: [account, spender],
},
],
});
const balance = data?.[0]?.status === "success" ? data[0].result : undefined;
发现这道题有问题? 反馈此题