Python keccak256 хэш массива uint8 не соответствует хешированию целостности?

У меня есть функция в интеллектуальном контракте:

  function getNumberHash(uint8[] _numbers) constant public returns (bytes32) {
    return keccak256(_numbers);
}

Когда я передаю [1,2,3,4,5] в качестве аргумента, он возвращает:

"0": "bytes32: 0x5917e5a395fb9b454434de59651d36822a9e29c5ec57474df3e67937b969460c"

У меня есть этот скрипт Python, но он возвращает другой хеш:

import sha3
import numpy as np

a = np.array([1, 2, 3, 4, 5], dtype=np.uint8)

k = sha3.keccak_256()
k.update(a)
print(k.hexdigest())

Возвращает следующий хэш:

0x7d87c5ea75f7378bb701e404c50639161af3eff66293e9f375b5f17eb50476f4

Почему две функции не возвращают одно и то же значение, так как они оба являются uint8 [] и используют один и тот же алгоритм keccak256? Как я могу решить эту проблему?

3 голоса | спросил user2692560 8 +03002017-10-08T08:38:50+03:00312017bEurope/MoscowSun, 08 Oct 2017 08:38:50 +0300 2017, 08:38:50

1 ответ


3

Web3.soliditySha3() даст правильный хэш.

Основная причина заключается в том, что значения массива 0-pads в массивах, которые вы не получите по умолчанию в большинстве реализаций. Для этой цели web3.py имеет удобный метод.

В этом примере вы должны использовать:

from web3 import Web3
hash = Web3.soliditySha3(['uint8[]'], [[1, 2, 3, 4, 5]])
assert hash.hex() == '0x5917e5a395fb9b454434de59651d36822a9e29c5ec57474df3e67937b969460c'
ответил carver 8 +03002017-10-08T18:34:41+03:00312017bEurope/MoscowSun, 08 Oct 2017 18:34:41 +0300 2017, 18:34:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132