wagmi getProof 动作详解:获取账户与存储槽的 Merkle 证明

发布时间:2026/9/17 16:45:14

wagmi getProof 动作详解:获取账户与存储槽的 Merkle 证明 wagmi getProof 动作详解获取账户与存储槽的 Merkle 证明【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi本文围绕 wagmi 核心包wagmi/core中的getProof动作展开讲解如何通过 RPC 返回指定账户的账户状态与存储槽位值及其 Merkle 证明覆盖参数语义、返回结构与查询场景TanStack Query的完整用法。读完本文你将掌握在 wagmi 应用中获取链上数据证明的实战方式并能结合源码理解其底层实现与测试行为。getProof 是什么getProof是wagmi/core提供的一个核心动作Action用于返回指定账户的账户值与存储值并附带 Merkle 证明Return the account and storage values of the specified account including the Merkle-proof。它是对 Viem 同名 public action 的一层封装底层走的是以太坊 JSON-RPC 的eth_getProof方法。该功能典型应用在跨链桥、乐观验证、状态证明等需要对账户余额、nonce、代码哈希或某个存储槽位取值做链下可验证证明的场景。在 wagmi 中它作为Config驱动的动作被导出使用方式与仓库内其他动作如getBalance、getBlockNumber保持一致。Import从wagmi/core中导入动作函数、参数类型与返回类型import { getProof } from wagmi/core import { type GetProofParameters } from wagmi/core import { type GetProofReturnType } from wagmi/core import { type GetProofErrorType } from wagmi/core基本用法getProof是异步函数需要传入config与参数对象。以下示例获取指定地址及其存储键在最新区块上的证明import { getProof } from wagmi/core import { config } from ./config await getProof(config, { address: 0x4200000000000000000000000000000000000016, storageKeys: [ 0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99, ], })其中config通过createConfig创建典型的配置如下site/snippets/core/config.tsimport { createConfig, http } from wagmi/core import { mainnet, sepolia } from wagmi/core/chains export const config createConfig({ chains: [mainnet, sepolia], transports: { [mainnet.id]: http(), [sepolia.id]: http(), }, })从源码看packages/core/src/actions/getProof.ts动作内部会解构出chainId通过config.getClient({ chainId })获取对应链的客户端再用getAction(client, viem_getProof, getProof)拿到 Viem 动作后执行剩余的参数address、storageKeys、blockNumber、blockTag等原样透传给 Viemexport async function getProofconfig extends Config( config: config, parameters: GetProofParametersconfig, ): PromiseGetProofReturnType { const { chainId, ...rest } parameters const client config.getClient({ chainId }) const action getAction(client, viem_getProof, getProof) return action(rest) }GetProofParameters是 Viem 参数与ChainIdParameterconfig的交集Compute展平export type GetProofParametersconfig extends Config Config Compute viem_GetProofParameters ChainIdParameterconfig 参数详解address类型Address说明要获取证明的账户地址。await getProof(config, { address: 0x4200000000000000000000000000000000000016, // [!code focus] storageKeys: [ 0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99, ], })storageKeys类型0x${string}[]说明需要出具证明并包含在返回结果中的存储槽位键storage keys数组。每个元素是以0x开头的 32 字节存储槽位哈希。await getProof(config, { address: 0x4200000000000000000000000000000000000016, storageKeys: [ // [!code focus:3] 0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99, ], })blockNumber类型bigint | undefined说明在指定区块高度处获取证明可选。使用 bigint 字面量如42069n。await getProof(config, { address: 0x4200000000000000000000000000000000000016, blockNumber: 42069n, // [!code focus] storageKeys: [ 0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99, ], })blockTag类型latest | earliest | pending | safe | finalized | undefined说明在指定区块标签处获取证明可选。latest为默认标签safe/finalized适用于支持 PoS 最终性语义的网络。await getProof(config, { address: 0x4200000000000000000000000000000000000016, blockTag: latest, // [!code focus] storageKeys: [ 0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99, ], })chainId类型config[chains][number][id] | undefined说明要获取证明的目标链 ID可选。省略时使用当前激活链。可从wagmi/core/chains导入链对象获取其id。import { getProof } from wagmi/core import { config } from ./config import { optimism } from wagmi/core/chains await getProof(config, { chainId: optimism.id, // [!code focus] address: 0x4200000000000000000000000000000000000016, storageKeys: [ 0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99, ], })返回类型getProof返回Proof即GetProofReturnType直接复用 Viem 的返回类型import { type GetProofReturnType } from wagmi/core返回的证明数据包含账户证明与存储证明。以仓库测试中的模拟响应为例packages/core/src/actions/getProof.test.ts结构如下const proofResponse { address: 0x4200000000000000000000000000000000000016, accountProof: [0x1], balance: 0x0, codeHash: 0x${0.repeat(64)}, nonce: 0x0, storageHash: 0x${0.repeat(64)}, storageProof: [ { key: 0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99, proof: [0x1], value: 0x0, }, ], } as const字段含义address被证明的账户地址accountProof账户状态Account Trie的 Merkle 证明节点数组balance、nonce账户余额与交易计数十六进制字符串codeHash账户代码的哈希storageHash存储 Trie 根哈希storageProof每个请求的存储键对应的证明数组包含key、proof与value。测试通过自定义 transport 拦截eth_getProof并返回上述结构验证getProof能正确透传并解析结果见 packages/core/src/actions/getProof.test.ts 中test(default, ...)。错误类型import { type GetProofErrorType } from wagmi/coreGetProofErrorType直接映射 Viem 的GetProofErrorType见 packages/core/src/actions/getProof.ts 第 19 行涵盖底层 RPC 调用失败时可能抛出的错误类型。在 TypeScript 项目中可用它做精细化错误处理。与 TanStack Query 集成getProof同样提供了 TanStack Query 集成从wagmi/core/query导出便于在 UI 中声明式地获取并缓存证明数据import { type GetProofData, type GetProofOptions, type GetProofQueryFnData, type GetProofQueryKey, getProofQueryKey, getProofQueryOptions, } from wagmi/core/query核心实现见 packages/core/src/query/getProof.tsgetProofQueryOptions会根据参数生成 query key[getProof, { address, storageKeys, blockNumber?, blockTag?, chainId? }]并设置enabled条件——只有address与storageKeys都提供时才启用查询enabled: Boolean( options.address options.storageKeys (options.query?.enabled ?? true), ), queryFn: async (context) { const [, { scopeKey: _, ...parameters }] context.queryKey if (!parameters.address || !parameters.storageKeys) throw new Error(address and storageKeys are required) return getProof(config, { ...(parameters as GetProofParameters) }) },在 packages/core/src/query/getProof.test.ts 中可以看到blockNumber、blockTag、chainId参数都会作为 query key 的组成部分参与缓存即不同区块/链的证明请求互不污染缓存。React Hook 用法React 侧对应 Hook 为useProofpackages/react/src/hooks/useProof.ts导入自wagmiimport { useProof } from wagmi实现上先通过useConfig拿到配置、useChainId拿到当前链再调用getProofQueryOptions并交给useQuery参数里的chainId会优先于当前链 IDconst config useConfig(parameters) const chainId useChainId({ config }) const options getProofQueryOptions(config, { ...parameters, chainId: parameters.chainId ?? chainId, }) return useQuery(options)典型的组件用法import { useProof } from wagmi function Proof() { const result useProof({ address: 0x4200000000000000000000000000000000000016, storageKeys: [ 0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99, ], }) if (result.isPending) return divLoading.../div if (result.isError) return divError: {result.error.message}/div return pre{JSON.stringify(result.data, null, 2)}/pre }小结getProof是 wagmi 中面向链上状态证明的核心动作它把 Viem 的eth_getProof能力接入 wagmi 的Config体系支持按chainId选择目标链、按blockNumber/blockTag指定取证区块并返回账户证明与存储证明的完整 Merkle 证明数据。对于跨链桥、状态验证等需要链下可验证数据的场景可以直接使用wagmi/core的动作函数或通过wagmi/core/query与 React 的useProof获得缓存与声明式状态管理能力。【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/17 16:45:14

MCP协议:让大模型主动提问的交互范式革命

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/17 16:40:14

MATLAB/Simulink基带传输系统闭环仿真实战

简介:本资源是一份面向通信工程专业本科生的《通信原理》课程设计文档,聚焦数字基带传输系统建模与仿真,帮助学习者掌握MATLAB/Simulink在通信系统设计中的核心应用。文档完整呈现了从基带信号生成(含AMI、HDB3等码型说明&#xf…

2026/9/17 17:45:20

PostgreSQL报错分层排查:FATAL与ERROR实战

1. 报错先分层:PostgreSQL的错误信息其实是有规律的用了这么多年 PostgreSQL,我发现一个挺有意思的现象:新手看到ERROR就慌,老手看到ERROR先看它是哪一层报出来的。PostgreSQL 的报错看着吓人,动不动一整段英文往上刷&…

2026/9/17 17:45:20

swarms 框架 OneToOne 指南:双智能体一对一对话模式详解

swarms 框架 OneToOne 指南:双智能体一对一对话模式详解 【免费下载链接】swarms The Enterprise-Grade Multi-Agent Orchestration Framework. Website: https://swarms.ai 项目地址: https://gitcode.com/GitHub_Trending/swar/swarms 本文围绕 swarms 多智…

2026/9/17 17:45:20

树、森林与二叉树转换详解:从孩子兄弟表示法到遍历规律

在计算机专业里,“树、森林与二叉树转换”这一小节往往只占教材几页纸,可真正用到的时候——写语法解析器、做文件目录索引、复习数据结构期末考、准备面试手撕算法——你会发现它是连接多叉树世界和二叉树世界的唯一桥梁。我第一次彻底弄懂这个转换&…

2026/9/17 17:45:20

PLC培训实操标准:真实硬件+故障注入+闭环调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/17 17:40:20

Excel VBA一键批量生成进度条:条件格式数据条自动化指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/16 12:52:37

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/17 0:03:13

WiFi密码安全测试:从原理到实战的字典暴力破解指南

1. 写在前面:我为什么要研究WiFi密码这件事先交代一下背景。我身边有不少朋友,家里的WiFi密码常年是"12345678"或者"88888888",问就是"好记"。直到有一次,隔壁邻居蹭网蹭到我家路由器后台都进不去&…

2026/9/17 0:03:13

redis-py服务控制与监控函数实战:从ping到slowlog的巡检指南

我用 redis-py 写了快五年的业务代码,坦白说,真正让我觉得这个客户端“像一个成熟工具箱”的,不是 get/set 那套基本操作,而是它那批专门做服务控制与状态监控的辅助函数。日常开发里,大家把redis.Redis(host..., deco…

2026/9/17 0:03:13

SpringBoot+Vue3实现中小企业设备管理系统开发实践

1. 项目概述与核心价值中小企业设备管理系统是制造业、服务业等领域的基础信息化工具。传统设备管理往往依赖Excel表格或纸质记录,存在数据孤岛、流程混乱、维护成本高等痛点。这套基于Java SpringBootVue3MyBatis的技术方案,通过前后端分离架构实现了设…

2026/9/16 22:55:57

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/16 22:56:09

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/16 22:56:16

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码