Хранение строки SHA-256 64 байта

Мне интересно, как лучше всего хранить хэш SHA-256 в твердости. Выход SHA-256 представляет собой 64-байтовую шестнадцатеричную строку, когда я передаю хэш из своего веб-приложения в свой контракт. Проблема, с которой я сталкиваюсь, заключается в том, что я начинаю получать ошибки, например, inaccessible dynamic typeпри использовании строк, поскольку строки на самом деле являются просто массивами динамического размера. Есть идеи?

SHA 256 обычно должен давать вам 32 байта вывода, представленные 64 шестнадцатеричными символами. Это поместится в один стандартный bytes32слот. Вы уверены, что получаете хеш размером 64 байта?

Ответы (3)

Я бы разделил его на две bytes32части на стороне клиента и снова собрал бы на стороне клиента. Простейшая форма может быть:

bytes32 part1;
bytes32 part2;

Это настолько экономично, насколько это возможно, и при необходимости может передаваться между контрактами.

Надеюсь, поможет.

ps Если вам не нужно их отзывать, а нужно только подтвердить их существование (из какого-то другого источника или заявления вне сети), объединение их в один bytes32обеспечит достаточную точность и 50%-ное сокращение газа.

Как упомянул Эдмунд Эдгар: SHA-256 - это 32-байтовая шестнадцатеричная строка, а не 64-байтовая шестнадцатеричная строка, такая как SHA-512...

Имея это в виду, вы МОЖЕТЕ хранить значение SHA-256 в одной переменной bytes32 в Solidity.

Что следует учитывать: (я предполагаю, что вы используете web3.js в своем веб-приложении)

  • обычно SHA-256 генерирует готовые 32-байтовые шестнадцатеричные строки (64 шестнадцатеричных символа)

  • это означает, что вы не должны снова преобразовывать свой хэш в шестнадцатеричный с помощью web3.fromascii(...), который будет обрабатывать ваш шестнадцатеричный хэш как строку ascii и растягивать его до 64 байтов (поскольку один ascii-символ представлен двумя шестнадцатеричными символами. Если вы попытаетесь импортировать 64-байтовую строку в Solidity, она не поместится в переменную bytes32, и Solidity обрежет ее до 32 байт.

  • поэтому, чтобы на самом деле преобразовать ваш 32-байтовый хеш в Solidity, вы просто добавляете «0x» к вашему 32-байтовому шестнадцатеричному хешу, что означает, что Solidity распознает его как шестнадцатеричный; затем вы можете определить функцию солидности, importHash(bytes32 someHash)которая примет ваш 32-байтовый хэш. затем сохраните его в переменной состояния bytes32 или используйте в качестве ключа сопоставления.

  • конечно, если вы действительно используете SHA-512, то вариант Rob Hitchens B9lab, вероятно, будет вашим лучшим вариантом.

На самом деле, если вы вычисляете хеш в своем веб-приложении, строка представляет собой ASCII-представление 256-битного числа, поэтому экономичный способ сохранить это в контракте — это uint256. Выполните преобразование в приложении и передайте хеш как uint256 в контракт.