Преобразование хэш-функции в шестнадцатеричном формате в байты32

Вывод хеш-функции 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библиотеку для вызова функций моего смарт-контракта

Полное предположение, но пробовали ли вы добавить префикс «0x» к строке «hex»?
Да, делал на все случаи. Те же результаты.
Я знаю, что это не ответ на ваш вопрос, но если вы находитесь в начале своего проекта, я предлагаю вам использовать ethers.js - github.com/ethers-io/ethers.js Контракт Truffle и web3 действительно часто имеют странные и неожиданные поведение.

Ответы (1)

Передайте его как строку «0x3fd54831f488a22b28398de0c567a3b064b937f54f81739ae9bd545967f3abab». Она не будет усечена.

Если это не решает, прочитайте это: передача объекта String со значением «0x..» в виде байтов32 в функцию твердости

Спасибо. Очень полезные ссылки. Передача в виде строки с префиксом «0x» не работает. Я пробовал другие методы, но я получаю исключение из газа.
Проверьте все промежуточные входы и выходы в журнале консоли, ошибка должна быть где-то еще
Я преобразовывал ввод в байты, прежде чем передавать его как: web3.fromAscii(value). Удаление преобразования и передача ввода как 0x...сработало.