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

