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

发布时间:2026/11/5 23:57:22

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/10/28 15:34:42

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

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

2026/11/4 22:12:54

Android 煤矿调度客户端:弱网可靠送达与断网续传

简介:这是一份面向煤炭行业信息化建设者与Android应用开发学习者的技术参考文献,围绕如何借助移动平台提升煤矿调度与安全生产管理效率展开论述。文章以Android客户端为主线,结合ASP.NET MVC4框架下的Web API与Java后端技术,构建起…

2026/11/5 16:51:33

EasyU优启通PE维护盘实战指南:制作、启动与核心操作全解析

1. 为什么一个PE维护盘值得单独拿出来聊装系统、修引导、救数据、清病毒,这些活儿但凡干过几次的人都知道,真正决定效率的往往不是你手速多快,而是手边那套PE环境靠不靠谱。EasyU(圈内习惯叫优启通)就是在这个场景下被…

2026/11/5 16:26:13

Rust原来很简单二:所有权系统

Part 2 核心篇 —— 所有权系统 本篇覆盖 第 6 ~ 10 章:所有权、借用与引用、生命周期、字符串与切片、内存模型。 ⚠️ 这是全书最重要的一篇。 把它吃透,Rust 从此“很简单”;跳过它,你会处处碰壁。请慢下来,动手敲每一段代码。 第 6 章 所有权:Rust 的第一性原理 6…

2026/11/5 15:00:49

基于Hadoop+Spark的民宿智能推荐系统设计与实现

1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享…

2026/11/5 14:10:30

ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计

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

2026/11/5 14:10:30

UART接口24位ADC搭配RS485,解决远距离温度监控难题

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

2026/11/5 14:10:30

UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践

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

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

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

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

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