Solidity

將雜湊函式十六進制轉換為 bytes32

  • July 7, 2018

雜湊函式 SHA256 的輸出是一個大小為 64 的十六進製字元串。例如:3ed54831f488a22b28398de0c567a3b064b937f54f81739ae9bd545967f3abab

我想呼叫具有以下結構的智能合約的功能:

function register(bytes32 hash)

並將十六進製作為參數傳遞。

我使用 web3 JavaScript 庫。

首先,我嘗試在不進行任何轉換的情況下傳遞參數。結果是最後 32 個字節的截斷

然後我嘗試了 web3 的fromAscii功能,結果相同。

我還嘗試了 1.x 版本hexToBytesbytesToHex功能。hexToBytes返回一個大小為 32 的字節數組。當我將數組傳遞給智能合約函式時,結果與預期的完全不同。

那麼如何以適合bytes32函式參數的格式轉換 32 字節的十六進制(64 字元十六進制)?

我知道我可以使用bytesorstring代替,bytes32但我寧願避免使用它,因為 SHA256 的十六進制確實是 32 個字節。

編輯

我創建了一個測試契約並在混音中對其進行測試。我set用 input 呼叫函式0x3fd54831f488a22b28398de0c567a3b064b937f54f81739ae9bd545967f3abab。該值沒有被截斷,我得到了預期的結果。

pragma solidity ^0.4.24;

contract Test {
   bytes32 public hash;

   function set(bytes32 h) public {
       hash = h;
   }
}

那麼,問題應該出在 web3 庫或 JS 本身對嗎?

更新

我使用truffle-contract庫來呼叫我的智能合約的函式

將其作為字元串傳遞“0x3fd54831f488a22b28398de0c567a3b064b937f54f81739ae9bd545967f3abab”它不會被截斷。

如果這不能解決,請閱讀:將帶有“0x..”值的字元串對像作為字節32傳遞給solidity函式

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