在 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可用于签名或验证签名。但这超出了这个问题的范围。
我需要一个函数 (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可用于签名或验证签名。但这超出了这个问题的范围。