Почему хэши Solidity sha3 не соответствуют тому, что производят другие библиотеки sha3?

У Solidity есть функция с именем, sha3и я протестировал ее с пустой строкой ввода. Это не соответствует тому, что производят другие библиотеки sha3. Я вижу контракты, написанные другими, использующими ту же sha3функцию в Solidity, и их хэши тоже не совпадают. То же самое касается web3.sha3хэшей Javascript. Почему?

Поскольку вы сами отвечаете на это; не могли бы вы привести несколько примеров кода, показывающих разницу в выводе и в ответе, как настроить такую ​​библиотеку sha3 для совместимости с Keccak-256?
добавлены образцы для ответа
Люди, приходящие из поисковой системы, будут использовать разные термины. Это, вероятно, будет тип проблемы/вопроса, который люди собираются задать.
@eth Как человек, зашедший из поисковой системы, я могу убедиться, что ваше предположение было правильным, я рад, что это не было объединено для дубликата с менее оптимальным SEO.

Ответы (2)

Ethereum использует Keccak-256 вместо стандарта SHA-3 FIPS 202. В библиотеках sha3, которые вы используете, попробуйте поискать возможность указать с помощью Keccak-256.

Для Python см. Получение идентификатора метода «Keccak hash» в Python .

Для Javascript эта библиотека js-sha3 будет включать использование keccak_256функции вместо sha3_256.

keccak_256('');
// c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470

sha3_256('');
// a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a

Другие:

keccak_256('The quick brown fox jumps over the lazy dog');
// 4d741b6f1eb29cb2a9b9911c82f56fa8d73b04959d3d9d222895df6c0b28aa15

keccak_256('The quick brown fox jumps over the lazy dog.');
// 578951e24efd62a3d63a86f7cd19aaa53c898fe287d2552133220370240b572d

sha3_256('The quick brown fox jumps over the lazy dog');
// 69070dda01975c8c120c3aada1b282394e7f032fa9cf32f4cb2259a0897dfc04

sha3_256('The quick brown fox jumps over the lazy dog.');
// a80f839cd4f83f6c3dafc87feae470045e4eb0d366397d5c6ce34ba1739f734d
Как видноjs-sha3 , единственная разница заключается в прокладке, 0x06для FIPS202, 0x01для Keccak-256.
Я не уверен, что этот комментарий точен: (1) keccak-256 — это не вещь (2) более правильный ответ см. ниже в комментарии @axic.
keccak()может разрешить несколько входов внутри смарт-контракта, например keccak256(97, 98, 99): Как мы могли бы добиться этого, используя keccak_256(), который вы представляли? @эт♦
@Alper Если вы видели связанные и связанные вопросы, я думаю, было бы лучше опубликовать новый и хорошо написанный вопрос. (Ответ для вашего примера - использовать «abc», но общий ответ лучше.)

Расширение этого ответа :

Ethereum использует хеширование Keccak, которое было представлено на конкурс NIST для SHA3. Впоследствии он был выбран победителем в 2012 году, но окончательный стандарт был выпущен только в августе 2015 года.

Ethereum использует Keccak в том виде, в каком он был выбран в 2012 году. Жаль, что некоторые параметры алгоритма были изменены для окончательной спецификации в 2015 году, что сделало его несовместимым с оригиналом.

Большинство онлайн-инструментов реализуют окончательную версию SHA3 2015 года.

Я голосую за, но, к вашему сведению, я связался с ethereum.stackexchange.com/questions/550/… вместо того, чтобы «перефразировать» материалы NIST :)
Я совершенно пропустил, что это ссылка. Я думаю, что на основе этих трех-четырех ответов имело бы смысл объединить их в одну вики-страницу.