【问题标题】:Get hashMessage in Java/Kotlin same like in solidity在 Java/Kotlin 中获取 hashMessage,就像在solidity中一样
【发布时间】:2021-09-28 14:56:28
【问题描述】:

我需要一个函数(Java/Kotlin),它返回对应于 Solidity 函数的 hashMessage:

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

此函数应返回格式值:hash = "0xcf36ac4f97dc10d91fc2cbb20d718e94a8cbfe0f82eaedc6a4aa38946fb797cd"

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

【问题讨论】:

    标签: java kotlin solidity smartcontracts web3-java


    【解决方案1】:

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

    HERE详细解释了该方法中部分参数是如何编码的。

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 2011-06-09
      • 2021-06-20
      相关资源
      最近更新 更多