Speichern von SHA-256 64-Byte-String

Ich frage mich, wie man einen SHA-256-Hash am besten in Solidität speichert. Die SHA-256-Ausgabe ist eine 64-Byte-Hex-Zeichenfolge, wenn ich den Hash von meiner Web-App an meinen Vertrag übergebe. Das Problem, auf das ich stoße, ist, dass ich Fehler erhalte, z. B. inaccessible dynamic typewenn ich Zeichenfolgen verwende - da Zeichenfolgen eigentlich nur Arrays mit dynamischer Größe sind. Irgendwelche Ideen?

SHA 256 sollte normalerweise 32 Bytes Ausgabe liefern, dargestellt durch 64 Hexadezimalzeichen. Dies passt in einen einzelnen Standardsteckplatz bytes32. Sind Sie sicher, dass Sie einen 64-Byte-Hash erhalten?

Antworten (3)

Ich würde es clientseitig in zwei Teile zerlegen bytes32und clientseitig wieder zusammenbauen. Die einfachste Form könnte sein:

bytes32 part1;
bytes32 part2;

Dies ist so wirtschaftlich wie es nur geht und kann bei Bedarf zwischen den Verträgen weitergegeben werden.

Ich hoffe es hilft.

ps Wenn Sie sie nicht zurückrufen müssen und nur ihre Existenz validieren müssen (von einer anderen Off-Chain-Quelle oder Behauptung), würde das Hashing in eine einzige Menge bytes32genügend Präzision und 50% Gasreduzierung bieten.

Wie Edmund Edgar erwähnte: SHA-256 ist eine 32-Byte-Hex-Zeichenfolge und keine 64-Byte-Hex-Zeichenfolge wie SHA-512 ...

In Anbetracht dessen KÖNNEN Sie einen SHA-256-Wert in einer einzelnen Bytes32-Variablen in Solidity speichern.

Zu beachtende Dinge: (Ich nehme an, Sie verwenden web3.js in Ihrer Web-App)

  • normalerweise generiert SHA-256 vorgefertigte 32-Byte-Hex-Strings (64 Hex-Zeichen)

  • Das heißt, Sie sollten Ihren Hash nicht erneut mit in Hex umwandeln web3.fromascii(...), da dies Ihren Hex-Hash als ASCII-String behandeln und auf 64 Bytes dehnen würde (da ein ASCII-Zeichen durch 2 Hex-Zeichen dargestellt wird. Wenn Sie versuchen, zu importieren B. die 64-Byte-Zeichenfolge an Solidity, passt sie nicht in eine bytes32-Variable und Solidity wird sie auf 32 Bytes zuschneiden.

  • Um Ihren 32-Byte-Hash tatsächlich in Solidität zu bringen, stellen Sie Ihrem 32-Byte-Hex-Hash einfach "0x" voran, was bedeutet, dass Solidity ihn als Hex erkennt; Sie können dann eine Solidity-Funktion á la definieren, importHash(bytes32 someHash)die Ihren 32-Byte-Hash akzeptiert. Speichern Sie es dann in einer bytes32-Zustandsvariablen oder verwenden Sie es als Zuordnungsschlüssel.

  • Falls Sie tatsächlich SHA-512 verwenden, ist die Option von Rob Hitchens B9lab wahrscheinlich die beste Option.

Wenn Sie den Hash in Ihrer Webanwendung berechnen, ist die Zeichenfolge tatsächlich eine ASCII-Darstellung einer 256-Bit-Zahl, sodass die kostengünstige Möglichkeit, diese im Vertrag zu speichern, ein uint256 ist. Führen Sie die Konvertierung in der App durch und übergeben Sie den Hash als uint256 an den Vertrag.