十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

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),仅供参考
返回列表