跳到正文
← 使用教程

Scaffold-ETH 2 读合约一直空:核对 chainId、部署记录和参数

链小知 · 进阶 · 核验 · 依官方文档整理

从 useScaffoldReadContract 的默认网络、具名合约和 watch 机制定位 data 为空的原因。

开始前准备

  • 准备已有本地部署的 Scaffold-ETH 2 工程、读取组件和对应的合约 ABI/地址记录。
  • 本教程读取已经存在的状态;本地链需保持运行。全新的部署是独立操作,不能拿其他链的地址代替本地记录。

1. 确认本地环境与部署属于同一条链

检查 yarn chain 的本地节点仍运行、yarn start 的前端连接到该工程。官方流程中 yarn deploy 将合约部署到这条本地链;若重启后状态被清空,旧记录可能仍留在前端。先核对已部署合约地址和链身份,再诊断 Hook。

检查结果:本地节点、前端配置、部署地址属于同一实例。

2. 显式核对 Hook 的读取网络

useScaffoldReadContract 没填 chainId 时采用 targetNetworks[0].id。钱包显示的网络不能替代这个配置检查;比较组件 chainId、targetNetworks 的第一项与部署记录链 ID。多网络工程可以显式选择读值网络,但地址/ABI也要有该网络对应记录。

检查结果:Hook 的实际读取 chainId 与合约部署链一致。

3. 按 ABI 核对 contractName 和 args

官方例子使用 contractName: "YourContract"、functionName: "userGreetingCounter"、args: ["<ADDRESS>"]。这些字段必须对应项目实际合约和函数;缺少地址参数、参数顺序错误或读到另一个 ABI,都应先修输入,而不是关闭类型检查。

检查结果:合约名、函数名、完整参数及返回类型均与 ABI 对上。

4. 区分尚未读到与合法零值

检查 Hook 的返回状态与错误信息,data 未返回时展示加载或失败,不能用无条件兜底 0 掩盖错误。返回 bigint 的零才是已读到的零;按项目返回类型格式化,保存原始值。若地址上没有预期代码,回到网络和部署记录检查。

检查结果:界面能区分 undefined、错误和真实零值,原始返回值可复核。

5. 核对刷新行为再判断卡住

watch 默认 true,会随新区块刷新;若组件关闭 watch,状态未自动变化并不证明读取失败。用返回的 refetch 检查主动刷新结果,并记录触发时刻和网络。仍失败时依次检查节点可达、合约记录、ABI和参数,避免把重新部署当第一种排查办法。

检查结果:watch 配置、刷新时间、最后成功值或错误明确。

怎样确认完成

  • 已记录 chainId、合约地址/ABI、输入参数、读取状态和刷新设置。
  • 文档核对只证明排查流程,未实际启动或部署本地工程。

常见错误与边界

  • 钱包网络与 Hook 默认 targetNetworks[0] 可能不同。
  • 新启动的本地链不保证保留旧部署;同样的地址字符串也不证明同一状态。
  • 关闭类型检查或把所有空值改成 0 会隐藏错链、ABI 和参数问题。

本教程根据官方资料整理,尚未完成逐步操作验收。界面、支持范围及费用变化时,先核对官方说明。 纯文本版 · 提交纠错依据