FISCO BCOS既可以部署国密版的区块链,又可以部署非国密版的区块链,同时两者都支持solidity语言编写的智能合约。但让我好奇的是,在国密版的链上有没有实现对应的国密版哈希函数,验签函数?
例如,在非国密版的区块链上,可以用solidity写keccak256函数来对一段内容做哈希运算。那在国密版中是不是有对应的sm3函数来做这样的哈希运算?还是国密版的keccak256函数底层使用了sm3函数?为了弄清楚这一点,我写了一些测试代码进行测试
智能合约代码如下:
pragma solidity >=0.4.0 <0.7.0;
contract HelloWorld2 {
string hello = "hello, world";
function sayHello() public view returns (string memory) {
return hello;
}
function hashTest(bytes memory _input) public pure returns(bytes32) {
bytes32 result = sha256(_input);
return result;
}
function kehashTest(bytes memory _input) public pure returns(bytes32) {
bytes32 result = keccak256(_input);
return result;
}
}
在webase平台上部署运行kehashTest函数,如下图所示:
运行结果如下图所示:
然后,在线下我写了测试代码,发现是用国密的SM3算法算出来的。部分代码如下:
try {
bytes = Hex.decodeHex("deadbeef");
} catch (DecoderException e) {
e.printStackTrace();
}
System.out.println(SM3.byteArrayToHexString(SM3.hash(bytes)));
从而证明了在国密版的链上,keccak256函数底层实际上使用的是SM3算法。