Вывод хеш-функции SHA256 представляет собой шестнадцатеричную строку размером 64. Например:3ed54831f488a22b28398de0c567a3b064b937f54f81739ae9bd545967f3abab
Я хочу вызвать функцию смарт-контракта со следующей структурой:
function register(bytes32 hash)
и передать шестнадцатеричный в качестве аргумента.
Я использую библиотеку JavaScript web3.
Сначала я попытался передать аргумент без преобразования. Результатом стало усечение последних 32 байтов.
Затем я попробовал функцию web3 fromAscii
с теми же результатами.
Я также пробовал hexToBytes
и bytesToHex
функции от версии 1.x. hexToBytes
возвращает массив байтов размером 32. Когда я передаю массив функции смарт-контракта, результаты полностью отличаются от ожидаемых.
Итак, как мне преобразовать шестнадцатеричный код из 32 байтов (64-символьный шестнадцатеричный) в формат, подходящий для bytes32
аргумента функции?
Я знаю, что могу использовать bytes
или string
вместо, bytes32
но я бы предпочел избегать этого, поскольку шестнадцатеричный код SHA256 действительно составляет 32 байта.
РЕДАКТИРОВАТЬ
Я создаю тестовый контракт и тестирую его в ремиксе. Я вызываю set
функцию с вводом 0x3fd54831f488a22b28398de0c567a3b064b937f54f81739ae9bd545967f3abab
. Значение не усекается, и я получаю ожидаемые результаты.
pragma solidity ^0.4.24;
contract Test {
bytes32 public hash;
function set(bytes32 h) public {
hash = h;
}
}
Итак, проблема должна быть в библиотеке web3 или в самом JS, верно?
ОБНОВИТЬ
Я использую truffle-contract
библиотеку для вызова функций моего смарт-контракта
Передайте его как строку «0x3fd54831f488a22b28398de0c567a3b064b937f54f81739ae9bd545967f3abab». Она не будет усечена.
Если это не решает, прочитайте это: передача объекта String со значением «0x..» в виде байтов32 в функцию твердости
web3.fromAscii(value)
. Удаление преобразования и передача ввода как 0x...
сработало.
Томас Джей Раш
Лакшмана
Кристиан