Как abi.encodePacked (...) и sha256 (..) работают в Солидности? - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь внедрить подпись в контракте Solidity, и у меня возникают проблемы при сравнении хэшей.Я вычисляю хеш со следующим кодом в коде:

sha256(abi.encodePacked(param1, ...., paramN);

Где:

abi.encodePacked(param1, ..., paramN) = [bytes: 0x0102030405060701]

и

sha255(abi.encodePacked(param1, ..., paramN)) = [bytes32: 0x245138c905599c8579ab186fbdbd6e62396aac35a98a6568f8803eed049d1251]

Основная проблема, с которой я сталкиваюсь, заключается в том, что при использовании python sha256 на 0102030405060701 я получаю результат 5bc31e3decf480124c79c114744d111ec82b62e466a097c3ced6fe76cbace9a5 101 * 101 * *

1020 *

1 Ответ

0 голосов
/ 13 июня 2019

Проблема в том, что вы хэшируете строку "0102030405060701", но вы должны хэшировать байты, которые представляет шестнадцатеричное значение:

>>> import hashlib
>>> import binascii
>>> hashlib.sha256(b'0102030405060701').hexdigest()
'5bc31e3decf480124c79c114744d111ec82b62e466a097c3ced6fe76cbace9a5'
>>> hashlib.sha256(binascii.unhexlify('0102030405060701')).hexdigest()
'245138c905599c8579ab186fbdbd6e62396aac35a98a6568f8803eed049d1251'

Обратите внимание, что хеширование строки приводит к тому же (неправильному) значениюВы упомянули в своем вопросе, но сначала преобразование в двоичный файл с помощью unhexlify дает правильный результат, соответствующий тому, что вы получили в Solidity.

...