將雜湊函式十六進制轉換為 bytes32
雜湊函式 SHA256 的輸出是一個大小為 64 的十六進製字元串。例如:
3ed54831f488a22b28398de0c567a3b064b937f54f81739ae9bd545967f3abab
我想呼叫具有以下結構的智能合約的功能:
function register(bytes32 hash)
並將十六進製作為參數傳遞。
我使用 web3 JavaScript 庫。
首先,我嘗試在不進行任何轉換的情況下傳遞參數。結果是最後 32 個字節的截斷
然後我嘗試了 web3 的
fromAscii
功能,結果相同。我還嘗試了 1.x 版本
hexToBytes
的bytesToHex
功能。hexToBytes
返回一個大小為 32 的字節數組。當我將數組傳遞給智能合約函式時,結果與預期的完全不同。那麼如何以適合
bytes32
函式參數的格式轉換 32 字節的十六進制(64 字元十六進制)?我知道我可以使用
bytes
orstring
代替,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函式