使用最新polkadot-js与substrate contracts node查询合约信息报错如何解决
报错根因说明
该错误为版本不兼容导致:ink! 3.0.0-rc6调整了ContractInfo枚举的结构,新增了特殊标记位,和旧版本的pallet-contracts模块、polkadot-js类型定义不匹配,导致解析时无法识别索引为128的枚举值。
可稳定运行的兼容环境配置方案
经过验证的版本组合
- Rust 版本:
stable 1.56.1(当前环境版本符合要求,无需调整) - cargo-contract 版本:
0.15.0 - ink! 全量依赖版本:
3.0.0-rc5 - substrate-contracts-node 版本:
v0.1.0 - polkadot-js 相关依赖版本:
7.9.1
具体操作步骤
- 清理本地合约项目的历史构建缓存:执行
cargo clean,手动删除项目根目录下的Cargo.lock文件,避免旧版本依赖残留 - 固定合约
Cargo.toml中所有ink!相关依赖的版本为3.0.0-rc5,不要使用模糊版本标识符,示例配置如下:
[dependencies] ink_primitives = { version = "3.0.0-rc5", default-features = false } ink_metadata = { version = "3.0.0-rc5", default-features = false, features = ["derive"], optional = true } ink_env = { version = "3.0.0-rc5", default-features = false } ink_storage = { version = "3.0.0-rc5", default-features = false } ink_lang = { version = "3.0.0-rc5", default-features = false } [dev-dependencies] ink_lang_macro = { version = "3.0.0-rc5" }
- 安装指定版本的cargo-contract:执行
cargo install cargo-contract --version 0.15.0 --force,强制覆盖本地已安装的其他版本 - 重新编译合约:执行
cargo +stable contract build,编译完成后检查生成的metadata.json文件,确认source.language字段显示为ink! 3.0.0-rc5 - 运行
v0.1.0版本的substrate-contracts-node,不要使用master分支的最新提交 - 前端项目锁定polkadot-js相关依赖版本,执行
npm install @polkadot/api@7.9.1 @polkadot/api-contract@7.9.1
功能验证
按照原有流程重新部署合约后,调用const contractInfo = await api.query.contracts.contractInfoOf(deployedAddress);即可正常获取合约信息,不会再出现枚举解析报错。
内容的提问来源于stack exchange,提问作者forgetso
相关产品推荐
相关产品推荐

