我正在尝试使用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))
原文《以太坊常见问题和错误》中的:
http://cw.hubwiz.com/card/c/ethereum-FAQ/1/2/5/
另外推荐一些之前的教程: