¿Por qué los hashes sha3 de Solidity no coinciden con lo que producen otras bibliotecas sha3?

Solidity tiene una función nombrada sha3y la probé con una entrada de cadena vacía. No coincide con lo que producen otras bibliotecas sha3. Veo contratos escritos por otros usando la misma sha3función en Solidity, y sus valores hash tampoco coinciden. web3.sha3Lo mismo ocurre con los hashes de Javascript . ¿Por qué?

Ya que usted mismo responde esto; ¿podría dar algunos ejemplos de código que muestren la diferencia en la salida y en la respuesta cómo configurar una biblioteca sha3 de este tipo para la compatibilidad con Keccak-256?
muestras añadidas para responder
Las personas que provienen de un motor de búsqueda van a utilizar diferentes términos. Es probable que este sea el tipo de problema/pregunta que la gente va a hacer.
@eth Como alguien que visita desde un motor de búsqueda, puedo verificar que su suposición era correcta, me alegro de que esto no se haya fusionado para un duplicado con un SEO menos óptimo.

Respuestas (2)

Ethereum usa Keccak-256 , en lugar del estándar SHA-3 FIPS 202. En las bibliotecas sha3 que está utilizando, intente buscar la opción para especificar usando Keccak-256.

Para Python, consulte Obtener ID de método "Keccak hash" en Python

Para Javascript, esta biblioteca js-sha3 implicaría usar la keccak_256función en lugar de sha3_256.

keccak_256('');
// c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470

sha3_256('');
// a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a

Otros:

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
Como se ve enjs-sha3 la única diferencia es el relleno, 0x06para FIPS202, 0x01para Keccak-256.
No estoy seguro de que este comentario sea exacto: (1) keccak-256 no es una cosa (2) vea el comentario de @axic a continuación para obtener una respuesta más correcta.
keccak()puede permitir múltiples entradas dentro del contrato inteligente como: keccak256(97, 98, 99). ¿Cómo podríamos lograr esto usando keccak_256() que representaste? @eth♦
@Alper Si ha visto las preguntas vinculadas y relacionadas, creo que sería mejor publicar una pregunta nueva y bien escrita. (La respuesta para su ejemplo es usar "abc", pero una respuesta general es mejor).

Ampliando esta respuesta :

Ethereum utiliza hash Keccak, que se presentó a la competencia NIST para SHA3. Posteriormente, fue seleccionado como ganador en 2012, pero el estándar final solo se publicó en agosto de 2015.

Ethereum usa Keccak en su forma, ya que fue seleccionado en 2012. Lástima que algunos parámetros del algoritmo se ajustaron para la especificación final en 2015, lo que lo hizo incompatible con el original.

La mayoría de las herramientas en línea implementan la versión final de 2015 de SHA3.

Estoy votando a favor, pero para tu información , me vinculé a ethereum.stackexchange.com/questions/550/… en lugar de "repasar" las cosas del NIST :)
Me he perdido totalmente que es un enlace. Creo que, según estas tres o cuatro respuestas, tendría sentido convertirlas en una sola página wiki.