You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Truffle开发Solidity测试合约时遇字面量转string存储指针错误求助

解决Solidity 0.4.17中字面量字符串转string storage指针的错误

你遇到的这个报错,核心原因是Solidity 0.4.x版本对string类型的存储和内存区分有严格限制:字面量字符串属于memory临时类型,而如果你的setStudentEnrollInfo函数参数定义的是string storage(存储指针类型),Solidity不允许直接把临时的memory字面量转换成storage指针——因为storage指针必须指向合约存储中已存在的固定位置,字面量并没有存在那里。

最直接的解决方案(推荐)

修改你的SkillDevelopment.sol中setStudentEnrollInfo函数的参数类型,把string storage改成string memory:

// SkillDevelopment.sol中的函数定义
function setStudentEnrollInfo(string memory _info) public {
    // 你的原有业务逻辑,比如将传入的信息存储到合约状态变量
    // 例如:studentEnrollInfo = _info;
}

修改后,你的测试合约里的调用代码不需要做任何改动,直接传入字面量字符串就能正常运行了。memory类型专门用于处理临时的、函数调用期间存在的字符串,完全适配字面量的传入场景。

特殊场景的备选方案(不推荐用于你的测试场景)

如果因为业务需求必须使用string storage参数(比如你要直接修改合约中已存在的存储字符串),那你需要先把字面量存入一个memory变量,再通过storage指针操作,但这种情况对你的测试调用来说完全没必要。示例代码如下(仅作参考):

// 测试合约中的修改
function testSetStudentEnrollInfo() public {
    // 先把字面量存入memory变量
    string memory tempInfo = "{\"Info\":[{\"id\":\"06bb05b8b3152b0323f4a9c07ae84f0c513b2494...";
    // 假设你的合约中有一个状态变量studentInfo是string类型
    skillDevelopmentContract.setStudentEnrollInfo(skillDevelopmentContract.studentInfo);
    // 然后再将tempInfo的值赋值给这个storage变量(需要在合约函数内部处理)
}

本质上,这个问题是Solidity早期版本对内存和存储类型的严格隔离导致的,换成memory参数是最符合你测试场景的解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:45:31