Solidity

從solidity合約和web3js生成的Hashnot匹配

  • January 8, 2021

我想讓雜湊值與從 web3 或 ether 的 js 中通過solidity 合約生成的雜湊值相同。

通過以下方式生成solidity合約雜湊:sha256(abi.encodePacked(無參數))。

請幫助它。我如何使用 web3 或 ether 的 js 相同的雜湊生成。

在solidity中,雜湊是使用以下方法生成的:

function generateHash(param1, param2, ... paramN) public pure returns (bytes32) {
   return keccak256(abi.encodePacked(param1, param2, ... paramN));
}

在 web3.js v1.2.6 中,可以使用以下方法生成相同的雜湊:

web3.utils.soliditySha3(param1, param2, ... paramN);
Example:
 > const web3 = require('web3');
 > web3.utils.soliditySha3('balaji', 10000);
 > '0x6d4e07169abf3d9047d7d5283460790fe3f80395521c9a376768679fc27b4687'

在 ethers.js 中,可以使用以下方法生成相同的雜湊:

ethers.utils.soliditySha3(['paramTypes'], ['paramValues'])

Example:
 > const ethers = require('ethers');
 > > ethers.utils.solidityKeccak256(['string', 'uint256'], ['balaji', 10000]);
 > '0x6d4e07169abf3d9047d7d5283460790fe3f80395521c9a376768679fc27b4687'

在我看來,在這種情況下,合約值得提供一個“助手”功能,以確保客戶端可以輕鬆匹配合約的雜湊過程。我認為重要的是要確保他們無論使用何種語言都能做到這一點,並且將來始終能夠做到這一點

圖案很簡單。無論合約在做什麼,都將其編碼為public pure函式。在內部使用它。

這確保了外部客戶端始終能夠匹配合約的內部邏輯。

function hashHelper(address a, bytes32 b, uint c) public pure returns(bytes32) {
 return ... // keccak256(..., sha3( ..., whatever
}

function commit(bytes32 hash) public pure {
 // record committment
}

function reveal (address a, bytes32 b, uint c) public {
 require(hashHelper(a,b,c) == hash, "Invalid Hash inputs");
}

當客戶端呼叫該pure函式時,這與它們在本地執行雜湊計算相同,並且不會向網路透露任何機密資訊。

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/70069