在 Java/Kotlin 中获取 hashMessage 与在 solidity 中一样

Get hashMessage in Java/Kotlin same like in solidity

我需要一个函数 (Java/Kotlin),returns hashMessage 对应于 Solidity 函数:

function getMessageHash(address _signer, uint _amount, uint _id) public pure returns (bytes32) {
        return keccak256(abi.encodePacked(_signer, _amount, _id));
} 

这个函数应该return格式的值:hash = "0xcf36ac4f97dc10d91fc2cbb20d718e94a8cbfe0f82eaedc6a4aa38946fb797cd"

我试过使用 Hash.sha3(String hexInput)。来自 org.web3j.crypto.Hash 包,但它只接受一个参数。 我不知道 abi.encodePacked() 在“引擎盖”下对参数做了什么。

我终于找到了解决方案,如果有人需要,我会 post 放在这里。 主要问题是,abi.encodePacked() 方法在“幕后”做什么。

HERE详细解释了一些参数是如何在这个方法中编码的。

对于带有下一个参数的特定问题和方法: encodedMessage = abi.encodePacked("0x1b77882d1e55ffff0bc1c4215b869a2a36f7054d", 1, 1) 此方法的结果是: encodedMessage = 1b77882d1e55ffff0bc1c4215b869a2a36f7054d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001

对于 _signer (string),前缀 (0x) 已删除,对于 _amount_id (uint) 我用的是TypeEncoder.encode(Uint256(1))。 每个参数的编码值附加到前一个参数,最后与方法一起散列:val hashedMessage = Hash.sha3(encodedMessage) 结果是:0xe06176482c2b2619110be196a3d999dedf922782c0fe85603b19044bf30b3856

稍后hashedMessage可用于签名或验证签名。但这超出了这个问题的范围。