You need to enable JavaScript to run this app. Solidity合约部署后调用initTest()交易回退问题如何修复
优惠活动
大模型
产品
解决方案
定价
更多

Solidity合约部署后调用initTest()交易回退问题如何修复

Solidity合约initTest()执行VM revert问题修复方案

问题根因

触发报错的核心原因是CustID和ContractID都属于动态长度数组,合约部署后这两个数组的初始长度为0,你直接通过下标i=0赋值属于数组越界访问。Solidity 0.8+版本默认开启运行时边界检查,越界操作会直接触发交易回滚,因此会返回VM revert错误,两个数组的值自然也为空。

修复方案

可根据使用场景选择以下任意一种修复方式:

方式1:使用push()方法追加元素(推荐,适合动态新增场景)

直接修改initTest()函数,用数组自带的push方法将值追加到数组末尾,无需手动管理下标:

function initTest() public {
    CustID.push("04wT9Os3uv7p");
    ContractID.push("e7tk6peihfcc6ece1ffbe8f8cd433ae61c1081ae6b94");
}

方式2:先初始化数组长度再赋值

如果需要提前固定数组长度,可先指定数组长度后再按下标赋值:

function initTest() public {
    // 先将两个数组的长度设置为1
    CustID = new bytes[](1);
    ContractID = new bytes[](1);
    uint i = 0;
    CustID[i] = "04wT9Os3uv7p"; 
    ContractID[i++] = "e7tk6peihfcc6ece1ffbe8f8cd433ae61c1081ae6b94";
}

额外注意事项

当前代码还存在_UniCode状态变量未初始化的问题,后续调用runTest()时会再次触发回滚,需要补充构造函数传入你提前部署好的Code.sol中ContrIdCard合约的链上地址:

// 补充构造函数
constructor(address ContrIdCardAddress) {
    _UniCode = ContrIdCard(ContrIdCardAddress);
}

部署CodeTest合约时,先完成ContrIdCard合约的部署,将其链上地址作为参数传入CodeTest的构造函数即可。

内容的提问来源于stack exchange,提问作者ponga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 15:21:03