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 和参数问题。