天天看点

web3j获得的sha3值和solidity为什么会不同?

我正在尝试使用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/

另外推荐一些之前的教程:

  • python以太坊 ,主要是针对python围绕web3.py进行区块链以太坊应用开发的讲解。
  • web3j ,主要是针对java和android程序员围绕web3j库进行区块链以太坊开发的讲解。
  • php以太坊 ,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和事件等内容。
  • 以太坊开发 ,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • 以太坊教程 ,主要介绍智能合约与dapp应用开发,适合入门。