
wagmi SolidJS custom Transport 详解用任意 EIP-1193 Provider 接入自定义 JSON-RPC 端点【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi在 SolidJS 项目中构建以太坊应用时wagmi/solid提供的customTransport 是一个高度灵活的 JSON-RPC 接入层它不绑定任何特定的 RPC 端点实现而是接收一个符合 EIP-1193 规范的request函数把所有 JSON-RPC 调用委托给你提供的实现。读完本篇你将掌握如何在createConfig中配置customtransport、五个参数provider、key、name、retryCount、retryDelay的完整取值与默认值以及它在 wagmi 源码中的真实来源——对 viemcustomtransport 的再导出——和仓库内部的典型用法。custom Transport 的定位customtransport 的作用是把 wagmi 的 transport 协议wagmi 内部统一的 JSON-RPC 传输层对接到任何自定义的 JSON-RPC API。它本质上是对 viem 内置customtransport 的封装wagmi 并没有在 SolidJS 或 core 包中重新实现它而是直接再导出。从源码结构看这条导出链在仓库中有据可查wagmi/core的入口文件 packages/core/src/exports/index.ts 中有一行export { custom, http, webSocket } from viem——即custom、http、webSocket三个 transport 均直接来自 viemwagmi/solid的入口文件 packages/solid/src/exports/index.ts 在 Transports 区块中把custom从wagmi/core再导出。因此当你从wagmi/solid导入custom时实际拿到的就是 viem 的实现。这也意味着它支持 viemcustomtransport 的全部选项wagmi 只是保证它与createConfig的transports映射无缝集成。仓库中的文档侧也印证了这一点本篇对应的文档 site/solid/api/transports/custom.md 通过 include 指令引用了共享文档 site/shared/transports/custom.md说明 core/react/vue/solid 等各框架包共用同一份customtransport 说明仅包名不同。导入import { custom } from wagmi/solid由于custom经wagmi/core再导出从wagmi/solid顶层导入即可获得如果你需要精确了解其类型来源可以追溯到 viem。在 createConfig 中使用将custom放入transports映射以链 ID 为键把每条链的 JSON-RPC 调用路由到你的request函数import { createConfig, custom, } from wagmi/solid import { mainnet } from wagmi/solid/chains import { customRpc } from ./rpc export const config createConfig({ chains: [mainnet], connectors: [injected()], transports: { [mainnet.id]: custom({ async request({ method, params }) { const response await customRpc.request(method, params) return response }, }), }, })其中customRpc代表你自己实现的 JSON-RPC 客户端例如内部 RPC 网关、带鉴权的代理、Mock 服务等只要它暴露了request(method, params)方法即可。对照仓库中 playgrounds/solid-start/src/wagmi.ts 的createConfig写法transports的映射结构[chainId]: transport完全一致——playground 里各链使用的是http()而本篇将其替换为custom()即可接入任意自研 RPC 通道。参数详解provider{ request({ method: string, params: unknown[] }): Promiseunknown }一个 EIP-1193 的request函数。这是custom唯一的必填参数wagmi/viem 会把每条 JSON-RPC 调用eth_chainId、eth_blockNumber、eth_call等转换成{ method, params }传入你的实现并期望它返回结果或抛出 JSON-RPC 错误对象。import { customRpc } from ./rpc const transport custom({ async request({ method, params }) { const response await customRpc.request(method, params) return response } })key可选stringTransport 的键。默认值custom。const transport custom( provider, { key: windowProvider, } )key用于在 viem 客户端内部标识该 transport 实例在 fallback 等多 transport 场景中可用于区分来源。name可选stringTransport 的名称。默认值Ethereum Provider。const transport custom( provider, { name: Window Ethereum Provider, } )name主要用于调试与日志场景下识别 transport对运行行为无影响。retryCount可选number请求失败时的最大重试次数。默认值3。const transport custom(provider, { retryCount: 5, })值得注意的一个仓库内部用例wagmi/core的 getConnectorClient 在基于 connector 的 EIP-1193 provider 构造默认 transport 时显式写入了retryCount: 0。可以推断当底层 provider 自身如钱包注入的 provider已经管理了重试或连接生命周期时把 wagmi 层的重试关掉可以避免重复重试——这是retryCount参数最典型的调参场景。Mock connector 的实现 packages/core/src/connectors/mock.ts 中也用custom({ request })({ retryCount: 0 })以同样的方式禁用重试。retryDelay可选number两次重试之间的基础延迟毫秒。默认情况下transport 使用指数退避exponential backoff~~(1 count) * retryDelay因此重试间隔不是恒定的而是逐次翻倍。const transport custom(provider, { retryDelay: 100, })仓库内的实战参照除了上述文档示例仓库里还有两处custom的直接使用可供参考测试中的最小用法packages/core/src/actions/getProof.test.ts 以[chain.mainnet.id]: custom({ ... })的形式把某条链绑定到自定义 transport演示了按链 ID 选择性替换传输层的做法内部组件的默认行为packages/core/src/actions/getConnectorClient.ts 中当 connector 没有自定义getClient实现时wagmi 会走默认使用customtransport的分支——也就是说wagmi 把 connector 暴露出的 EIP-1193 provider 包成一个customtransport 来驱动钱包客户端。这一实现细节说明custom不只是接入自研 RPC的工具它也是 wagmi 内部把 EIP-1193 provider 统一接入 viem 客户端的通用机制。小结customtransport 的价值在于把传输层怎么发 JSON-RPC 请求这一决策完全交给用户provider.request决定了请求通道retryCount/retryDelay控制失败重试策略key/name负责实例标识与调试。由于wagmi/solid中的custom即 viem 实现的直接再导出见 packages/core/src/exports/index.ts其参数语义与 viem 官方文档保持一致可放心在生产环境中用于私有的、带鉴权或需要拦截逻辑的 JSON-RPC 端点。【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考