通过CLI传递合约代码与数据部署后调用报exit code -5的问题
问题根因
- 核心错误是你对
TvmCell做了多余的嵌套包装:tvm.code()、tvm.getData()返回的本身就是符合要求的TvmCell类型的合约代码、数据对象,你通过TvmBuilder.store()方法将其存入新的Builder再转成Cell,等于给原始的合约代码/数据外面多套了一层Cell引用。tvm.buildStateInit接收的是原生的合约代码Cell和数据Cell,你传入嵌套后的Cell会导致生成的StateInit中的代码不是合法的TVM可执行字节码,VM解析代码时失败就会抛出整数溢出的-5错误。 - 你贴的代码存在拼写错误:
teamplteData变量名拼写错误,若实际代码也是该写法会导致传入的合约数据为空,也会触发执行错误。 - 额外校验点:确认Fabric合约的
deployWithCodeAndData方法接收的code、data参数类型为TvmCell,若定义为bytes等其他类型会导致自动序列化时多嵌套一层结构。
修复方案
- 删除多余的
TvmBuilder包装逻辑,直接使用原始获取到的TvmCell构建StateInit:
// 直接传入原始code、data,无需额外处理 TvmCell stateInit = tvm.buildStateInit(code, data);
- 修正拼写错误的变量名。
- 验证生成的StateInit合法性:可在本地计算你生成的StateInit哈希,与直接部署模板合约得到的StateInit哈希对比,二者一致则说明结构正确。
内容的提问来源于stack exchange,提问作者nivedano
相关产品推荐
相关产品推荐

