Solidity

儲存 SHA-256 64 字節字元串

  • November 17, 2021

我想知道儲存 SHA-256 雜湊的最佳方式是什麼。當我將雜湊從我的網路應用程序傳遞到我的契約時,SHA-256 輸出是一個 64 字節的十六進製字元串。我遇到的問題是我開始收到錯誤,例如inaccessible dynamic type當我使用字元串時 - 因為字元串實際上只是動態大小的數組。有任何想法嗎?

我會將它分成兩個bytes32客戶端並在客戶端重新組裝。最簡單的形式可能是:

bytes32 part1;
bytes32 part2;

這是最經濟的,如果需要,可以在契約之間傳遞。

希望能幫助到你。

ps 如果您不需要召回它們而只需要驗證它們的存在(來自其他一些鏈下來源或聲明),將它們散列成單個bytes32將提供足夠的精度和 50% 的氣體減少。

正如 Edmund Edgar 提到的:SHA-256 是一個 32 字節的十六進製字元串,而不是像 SHA-512 那樣的 64 字節的十六進製字元串……

考慮到這一點,您可以將 SHA-256 值儲存在一個單獨的 bytes32 變數中**。**

要考慮的事情:(我假設您在您的網路應用程序中使用 web3.js)

  • 通常 SHA-256 生成現成的 32 字節十六進製字元串(64 個十六進製字元)
  • 這意味著您不應該再次將雜湊轉換為十六進制web3.fromascii(...),這會將您的十六進制雜湊視為 ascii 字元串並將其拉伸到 64 個字節(因為一個 ascii 字元由 2 個十六進製字元表示。如果您嘗試導入將 64 字節字元串轉換為solidity,它不適合 bytes32 變數,solidity 會將其裁剪為 32 字節。
  • 所以要真正讓你的 32 字節散列成為可靠的,你只需在你的 32 字節十六進制散列前面加上“0x”,這意味著,可靠將它辨識為十六進制;importHash(bytes32 someHash)然後,您可以定義一個將接受您的 32 字節雜湊的可靠函式 á la 。然後將其儲存在 bytes32 狀態變數中或將其用作映射鍵。
  • 當然,如果您實際使用 SHA-512,那麼 Rob Hitchens B9lab 的選項可能是您的最佳選擇。

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