Solidity

在 JS 中獲得與 solidity SHA256 相同的輸出

  • September 26, 2021

是否有一個js函式/庫可以提供與sha256相同的輸出?我在映射中保存了一個雜湊,並且可以通過 cli(松露控制台)訪問它並查看雜湊是什麼,但我想將這個相同的雜湊作為電子郵件發送。所以在前端,我需要獲取相同的雜湊並通過 POST 請求將其發送到後端,然後由後端處理電子郵件。

編輯

正如評論中指出的那樣,soliditySHA3模仿 Solidity 的sha3/keccak256函式,這些函式與 SHA256 無關*。*


web3.utils.soliditySHA3做你想做的事:https ://web3js.readthedocs.io/en/1.0/web3-utils.html#soliditysha3

我在嘗試這樣做時遇到了一個巨大的問題。我已經嘗試了所有方法,但還沒有找到合適的解決方案來在 nodejs 中生成與solidity sha256 函式中生成的雜湊相同的雜湊。但是,我遇到了這個“可能的”(我將在後面用引號解釋原因)解決方案:

   function HashUtility(bytes32 val) public pure returns (bytes32) {
       bytes32 h = sha256(abi.encodePacked(val));
       return h;
   }

除了嘗試生成相同的散列之外,您還可以使用上面的這個函式從 nodeJs 中的值生成相等的散列。然後,在您的前端或鬆露中,您將執行以下操作:

const secret = web3.utils.asciiToHex('A');
const result = await instance.HashUtility.call(secret);

在上面的程式碼中,我'A'首先將字元串轉換為十六進制,0x41然後呼叫該方法HashUtility對其進行雜湊處理。生成的雜湊是:

0x037371bf62c8a2c23f8134fc2c7049fbe698860b888c98b955644c4b8f8f3155.

我找不到任何其他產生相同雜湊的 sha256 函式。使用 nodejs cryptosha256 散列不會以我嘗試的任何方式給出相同的散列。也許是因為雜湊以十六進制值返回,我必須將生成的字元串轉換為十六進制?試過了,但沒有用。

我還不得不說,我不太確定使用HashUtility我上面製作的solidity 函式是一個很好的解決方案。我不確定,但礦工可以看到你發送給函式的參數,這可能是個問題,因為你會透露一個你不想透露的值。這意味著最好的解決方案是在將其發送到合約之前對其進行雜湊處理。我不知道為什麼在 nodeJS 中這樣做會如此痛苦。在帶有巧克力蛋糕的 python 中,它非常容易工作。不過,我仍在尋找解決方案,可能很快就會找到。

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