以太坊常见问题和错误

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

我正在尝试使用web3j来监控我的智能合约事件。我发现主题的第一个参数是事件名称的哈希值。因此,我想用web3j将事件名称哈希然后就可以映射得到我想要的事件。但是,我发现它的价值是不同的。不知道是什么情况。

代码如下:

// my smart contract event
EVWithdraw(address user ,uint256 amount ,bytes32 ticketID);

我在智能合约中调用EVWithdraw(address,uint256,bytes32)

function getsha3(string func) public constant returns(bytes32) {
    return sha3("EVWithdraw(address,uint256,bytes32)"); 
}
// returns 0x953d0c27f84a9649b0e121099ffa9aeb7ed83e65eaed41d3627f895790c72d41

我的java代码:

String hashed = Hash.sha3("EVWithdraw(address,uint256,bytes32)");
// returns 0x5e148119b535e6da59d359ccb21e1987190bf984ea6998cc09de3b3d056603bf

为什么值是不同?我跟踪了Sha3类,好像也使用了keccak256。这是编码问题吗?

问题的答案

web3j Sha3函数需要一个十六进制编码的字符串值。如果你先把字符串string转换成字节bytes,就ok了。如下:

Hash.sha3("EVWithdraw(address,uint256,bytes32)".getBytes(StandardCharsets.UTF_8))