Solidity
從solidity合約和web3js生成的Hashnot匹配
我想讓雜湊值與從 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
函式時,這與它們在本地執行雜湊計算相同,並且不會向網路透露任何機密資訊。希望能幫助到你。