StarkNet合约声明报错:必填字段缺失等ValidationError问题求助
问题详情
- 操作:参照Cairo官方Hello Starknet示例编写合约,执行合约声明命令
- 执行命令:
或带网络与账户参数的命令:starknet declare --contract contract_compiled.jsonstarknet declare --contract contract_compiled.json --network alpha-goerli --account __default__ - 报错信息:
{'contract_class_version': ['Missing data for required field.'], 'entry_points_by_type': defaultdict(<class 'dict'>, {'EXTERNAL': {'value': {0: {'function_idx': ['Missing data for required field.'], 'offset': ['Unknown field.']}, 1: {'function_idx': ['Missing data for required field.'], 'offset': ['Unknown field.']}}}}), 'program': ['Unknown field.']}
- 账户状态:持有0.00381910303249468 ETH,测试网地址可正常查询
问题原因
该错误是合约编译版本与starknet-cli版本不兼容导致的:
- 旧版Cairo编译器(如0.10.x及更早)输出v0格式合约文件,缺少
contract_class_version字段,且entry_points_by_type结构、program字段均不符合新版starknet-cli要求。 - 新版starknet-cli要求合约遵循Starknet合约类v1格式,该格式新增
contract_class_version字段,用sierra_program和casm_program替代旧的program字段,同时entry_points_by_type结构也有调整。
解决方案
1. 升级Cairo与starknet-cli版本
先检查当前工具版本:
cairo-compile --version starknet --version
通过pip升级到最新稳定版(若使用虚拟环境,需先激活对应环境):
pip install --upgrade cairo-lang starknet-devnet
2. 重新编译合约
使用新版编译器重新编译合约源码(假设源码文件为hello_starknet.cairo):
starknet-compile hello_starknet.cairo --output contract_compiled.json
编译后的新文件会自动包含contract_class_version字段,结构完全符合新版cli要求。
3. 重新执行声明命令
再次运行合约声明命令,注意新版cli的网络参数已更新为goerli(替代旧的alpha-goerli):
starknet declare --contract contract_compiled.json --network goerli --account __default__
若__default__账户未正确配置,可替换为具体账户名称。
额外注意
如果合约代码基于旧版Cairo(0.10.x及更早)编写,需要适配新版Cairo(1.0+)的语法规范,否则编译会失败,可参照官方文档最新示例调整代码。
内容的提问来源于stack exchange,提问作者guhao

