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