sol合约中hash校验失败,在remix中可以成功
【问题分类】
- bug
- P2P网络相关(包含libp2p,liquid)
- 链账户身份与权限相关(证书问题、public、多签投票问题)
- 核心交易引擎相关(交易池、DAG)
- 共识相关
- 智能合约相关
- 存储相关
- SDK相关
- 长安链CMC工具
- 长安链管理台
- 长安链浏览器
- 长安链合约IDE
- 长安链web签名插件
- 跨链相关
- 轻节点相关
- 隐私计算相关
- 密码学相关
- 环境依赖:2.2.1版本 public模式
- 其他补充:
【问题描述】(请对问题进行描述,方便定位问题)
使用solidity编写简易的hash校验合约,相同合约在remix校验结果为true,在长安链中校验为false
具体的现象,操作步骤,前置条件等,尽可能描述清楚,有截图说明更佳 合约代码如下
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract hashtest {
function hashMatched(string memory hashLock, string memory secret) public pure returns (bool) {
bytes memory a = abi.encodePacked(sha256(bytes(secret)));
bytes memory b = hexStringToBytes(hashLock);
return sha256(a) == sha256(b);
}
function hexStringToBytes(string memory hexStr) internal pure returns (bytes memory) {
string memory hexStrWithoutPrefix = removePrefix(hexStr);
bytes memory bts = bytes(hexStrWithoutPrefix);
require(bts.length % 2 == 0);
bytes memory result = new bytes(bts.length / 2);
uint256 len = bts.length / 2;
for (uint256 i = 0; i < len; ++i) {
result[i] = bytes1(fromHexChar(uint8(bts[2 * i])) * 16 + fromHexChar(uint8(bts[2 * i + 1])));
}
return result;
}
function removePrefix(string memory hexStr) internal pure returns (string memory) {
// remove 0x frefix
bytes memory strBytes = bytes(hexStr);
if (strBytes.length > 2 && strBytes[1] == "x") {
return substring(hexStr, 2, strBytes.length);
} else {
return hexStr;
}
}
function substring(string memory str, uint256 startIndex, uint256 endIndex) internal pure returns (string memory) {
bytes memory strBytes = bytes(str);
bytes memory result = new bytes(endIndex - startIndex);
for (uint256 i = startIndex; i < endIndex; i++) {
result[i - startIndex] = strBytes[i];
}
return string(result);
}
function fromHexChar(uint8 c) internal pure returns (uint8) {
if (bytes1(c) >= bytes1("0") && bytes1(c) <= bytes1("9")) {
return c - uint8(bytes1("0"));
}
if (bytes1(c) >= bytes1("a") && bytes1(c) <= bytes1("f")) {
return 10 + c - uint8(bytes1("a"));
}
if (bytes1(c) >= bytes1("A") && bytes1(c) <= bytes1("F")) {
return 10 + c - uint8(bytes1("A"));
}
}
}
测试方法为hashMatched,
参数1:8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
参数2:123456
【相关日志文件】(如果有报错日志请贴图,或者上传附件)
chainmaker-go 的 log/system.log & bin/panic.log file *
SDK 的 sdk.log file
【系统信息】(请填写系统信息,方便定位问题)
- chainmaker-go version * : [v2.2.1]
- **OS & version * :ubuntu 20
- **docker镜像 version:2.2.1
-
管理台 version:
- 如果是管理台的相关问题,请附带管理台版本,如果不是可忽略。
-
区块浏览器 version:
- 如果是浏览器的相关问题,请附带浏览器版本,如果不是可忽略。
-
合约IDE version:
- 如果是合约IDE的相关问题,请附带合约IDE版本,如果不是可忽略。
-
web签名插件 version:
- 如果是web签名插件的相关问题,请附带web签名插件版本,如果不是可忽略。
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information