Konvertieren Sie die Hash-Funktion hex in bytes32

Die Ausgabe der Hash-Funktion SHA256 ist ein Hex-String der Länge 64. Beispiel:3ed54831f488a22b28398de0c567a3b064b937f54f81739ae9bd545967f3abab

Ich möchte die Funktion eines Smart Contracts mit folgender Struktur aufrufen:

function register(bytes32 hash)

und übergeben Sie das Hex als Argument.

Ich verwende die web3-JavaScript-Bibliothek.

Zuerst habe ich versucht, das Argument ohne Konvertierung zu übergeben. Das Ergebnis war ein Abschneiden der letzten 32 Bytes

Dann habe ich die Funktion von web3 fromAsciimit den gleichen Ergebnissen ausprobiert.

Habe ich auch ausprobiert hexToBytesund bytesToHexfunktioniert ab der 1.x Version. hexToBytesgibt ein Byte-Array der Größe 32 zurück. Wenn ich das Array an die Smart-Contract-Funktion übergebe, sind die Ergebnisse völlig anders als erwartet.

Wie konvertiere ich also ein Hex von 32 Bytes (64 Zeichen Hex) in ein Format, das für ein bytes32Funktionsargument geeignet ist?

Ich weiß, dass ich bytesoder stringanstelle von verwenden kann, bytes32aber ich würde es lieber vermeiden, da der Hexadezimalwert von SHA256 tatsächlich 32 Bytes beträgt.

BEARBEITEN

Ich erstelle einen Testvertrag und teste ihn im Remix. Ich rufe die setFunktion mit input auf 0x3fd54831f488a22b28398de0c567a3b064b937f54f81739ae9bd545967f3abab. Der Wert wird nicht abgeschnitten und ich erhalte die erwarteten Ergebnisse.

pragma solidity ^0.4.24;

contract Test {
    bytes32 public hash;

    function set(bytes32 h) public {
        hash = h;
    }
}

Das Problem sollte also in der web3-Bibliothek oder JS selbst liegen, oder?

AKTUALISIEREN

Ich verwende die truffle-contractBibliothek, um die Funktionen meines Smart Contracts aufzurufen

Totale Vermutung, aber haben Sie versucht, der 'Hex'-Zeichenfolge '0x' voranzustellen?
Ja, das habe ich für alle Fälle getan. Gleiche Ergebnisse.
Ich weiß, dass es keine Antwort auf Ihre Frage ist, aber wenn Sie am Anfang Ihres Projekts stehen, empfehle ich Ihnen, ethers.js zu verwenden - github.com/ethers-io/ethers.js Truffle Contract und Web3 hat wirklich oft seltsame und unerwartete Auswirkungen Verhaltensweisen.

Antworten (1)

Übergeben Sie es als Zeichenfolge "0x3fd54831f488a22b28398de0c567a3b064b937f54f81739ae9bd545967f3abab". Es wird nicht abgeschnitten.

Wenn dies nicht gelöst wird, lesen Sie Folgendes: Übergeben Sie ein String-Objekt mit dem Wert "0x.." als bytes32 an eine Solidity-Funktion

Vielen Dank. Sehr nützliche Links. Die Übergabe als Zeichenfolge mit dem Präfix „0x“ funktioniert nicht. Ich habe die anderen Methoden ausprobiert, aber ich bekomme eine Gasausnahme.
Überprüfen Sie alle Zwischenein- und -ausgaben im Konsolenprotokoll, der Fehler muss woanders liegen
Ich habe die Eingabe in Bytes konvertiert, bevor ich sie als übergeben habe: web3.fromAscii(value). Entfernen Sie die Konvertierung und übergeben Sie die Eingabe wie 0x...funktioniert.