Warum stimmen Solidity sha3-Hashes nicht mit dem überein, was andere sha3-Bibliotheken produzieren?

Solidity hat eine Funktion namens sha3und ich habe sie mit einer leeren Zeichenfolgeneingabe getestet. Es stimmt nicht mit dem überein, was andere sha3-Bibliotheken produzieren. Ich sehe Verträge, die von anderen mit der gleichen sha3Funktion in Solidity geschrieben wurden, und ihre Hashes stimmen ebenfalls nicht überein. Dasselbe gilt für Javascript- web3.sha3Hashes. Wieso den?

Da Sie dies selbst beantworten; Können Sie einige Codebeispiele geben, die den Unterschied in der Ausgabe und in der Antwort zeigen, wie eine solche sha3-Bibliothek für die Keccak-256-Kompatibilität konfiguriert wird?
Beispiele hinzugefügt, um zu antworten
Leute, die von einer Suchmaschine kommen, werden unterschiedliche Begriffe verwenden. Dies ist wahrscheinlich die Art von Problem/Frage, die die Leute stellen werden.
@eth Als jemand, der von einer Suchmaschine aus zu Besuch kommt, kann ich überprüfen, ob Ihre Annahme richtig war. Ich bin froh, dass dies nicht für ein Duplikat mit weniger optimaler SEO zusammengeführt wurde.

Antworten (2)

Ethereum verwendet Keccak-256 anstelle des SHA-3 FIPS 202-Standards. Versuchen Sie in den von Ihnen verwendeten sha3-Bibliotheken nach der Option zum Angeben mit Keccak-256 zu suchen.

Für Python siehe Abrufen der Methoden-ID "Keccak Hash" in Python

Für Javascript würde diese Bibliothek js-sha3 die Verwendung der keccak_256Funktion anstelle von beinhalten sha3_256.

keccak_256('');
// c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470

sha3_256('');
// a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a

Andere:

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
Wie man sieht,js-sha3 besteht der einzige Unterschied in der Polsterung 0x06für FIPS202 0x01für Keccak-256.
Ich bin mir nicht sicher, ob dieser Kommentar korrekt ist: (1) keccak-256 ist kein Ding (2) siehe @axic-Kommentar unten für eine korrektere Antwort.
keccak()kann mehrere Eingaben innerhalb des Smart Contracts zulassen als: keccak256(97, 98, 99). Wie könnten wir dies mit keccak_256() erreichen, das Sie dargestellt haben? @eth♦
@Alper Wenn Sie die verknüpften und verwandten Fragen gesehen haben, wäre es meiner Meinung nach besser, eine neue und gut geschriebene Frage zu posten. (Die Antwort für Ihr Beispiel lautet "abc", aber eine allgemeine Antwort ist besser.)

Erweiterung dieser Antwort :

Ethereum verwendet Keccak-Hashing, das beim NIST-Wettbewerb für SHA3 eingereicht wurde. Anschließend wurde es 2012 als Gewinner ausgewählt, aber der endgültige Standard wurde erst im August 2015 veröffentlicht.

Ethereum verwendet Keccak in seiner Form, wie es 2012 ausgewählt wurde. Schade, dass einige Parameter des Algorithmus für die endgültige Spezifikation im Jahr 2015 optimiert wurden, wodurch es mit dem Original inkompatibel wurde.

Die meisten Online-Tools implementieren die endgültige Version 2015 von SHA3.

Ich stimme hoch, aber zu Ihrer Information, ich habe auf ethereum.stackexchange.com/questions/550/… verlinkt, anstatt das NIST-Zeug "aufzuwärmen" :)
Das habe ich total übersehen, das ist ein Link. Ich denke, basierend auf diesen drei bis vier Antworten wäre es sinnvoll, sie zu einer einzigen Wiki-Seite zu machen.