Evm

帶有 web3j 的智能合約 - 返回的儲存的 SHA 雜湊與輸入不同

  • March 12, 2022

我有一個儲存文件的 sha-256 雜湊值的契約(儲存為 bytes32)。我還有一種方法來檢索映射到文件唯一 ID 的雜湊。但是,當我從契約中檢索和比較雜湊時,它與我發送的文件的雜湊不同。合約非常簡單——實際上只是一個 getter 和一個 setter——所以我不會在以任何方式儲存散列之前對其進行操作。這是 EVM 或 web3j 庫已知的事情嗎?我總是可以儲存雜湊的十六進製字元串表示而不是字節數組,但知道為什麼會發生這種情況仍然很好。

在使用 bytes32 和solidity sha 時,我注意到了同樣的問題。使用字元串類型時沒問題。您必須使用修改後的 sha lib,如下所示: https ://github.com/raineorshine/solidity-sha3每次都匹配solidity sha。

對此有歷史解釋。可以說,在世界範圍內,Solidity 編譯器的實現函式和客戶端庫中存在一系列算法版本。除非各方都使用相同的算法,否則它不會起作用。

您可以查看此內容以獲得更多資訊:為什麼 Solidity sha3 雜湊與其他 sha3 庫生成的不匹配?

這是我們未來可以預料到的問題,因為任何語言的所有客戶端總是需要匹配合約使用的算法——無論你今天決定使用什麼。

如何幫助確保任何客戶都可以匹配契約的內容,並且永遠如此

該問題的解決方案通常是公開一個pure函式來提供幫助。pure,因此客戶端可以在不將敏感資訊傳輸到區塊鏈的情況下使用它。(警告,如果使用 Infura,那麼它將被發送到他們的節點)。

function hashHelper(bytes memory data, args, etc) public pure returns(bytes32) {
 return keccak256(abi.encodePacked(data, args, etc));
}

在內部使用它並在外部公開,以便客戶可以方便地匹配契約的流程。

希望能幫助到你。

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