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
相关产品推荐
相关产品推荐

