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

Mist中字符串比较失败求助:Solidity合约Remix正常Mist报错

解决Mist中执行compareString仅显示"NO"的问题

我帮你排查了下问题,核心原因出在Solidity 0.4.18版本的字符串比较逻辑上——这个版本里直接用==比较string类型,实际上对比的是字符串在合约存储中的引用地址,而不是字符串的实际内容。哪怕两个哈希字符串内容完全一致,只要它们是通过不同的函数调用存入合约的,fhash == comphash都会返回false,也就是你在Mist里看到的"NO"。而Remix可能因为测试场景的特殊性(比如你刚好复用了同一个字符串变量赋值,导致引用地址相同),才让你觉得运行正常。

修正方案

我们需要修改字符串比较的逻辑:通过计算两个字符串的Keccak256哈希值,再对比哈希值是否相等(内容相同的字符串,哈希值一定一致)。

以下是修正后的完整合约代码:

pragma solidity ^0.4.18; 

contract Hash { 
    string fhash; 
    string comphash; 
    event Instructor(string _fhash); 
    event Instructors(string _comphash); 

    function setinstructor(string _fhash) public { 
        fhash = _fhash;
        Instructor(_fhash);
    }

    function setcomphash(string _comphash) public {
        comphash = _comphash;
        Instructors(_comphash);
    }

    function compareString() public view returns (bool) {
        // 转换为bytes后计算哈希,再对比哈希值
        return keccak256(abi.encodePacked(fhash)) == keccak256(abi.encodePacked(comphash));
    }
}

关键点说明

  • abi.encodePacked(fhash):将字符串转换为紧凑编码的字节数组,确保不同格式的字符串(比如带有特殊字符)都能被正确处理。
  • keccak256(...):计算字节数组的Keccak256哈希,通过对比哈希值来判断原字符串内容是否一致。

这样修改后,无论在Remix还是Mist中,只要两个哈希字符串内容相同,compareString都会返回true(Mist中会显示"YES"),内容不同则返回false(显示"NO"),符合你的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:45:14