Hashen Sie eine Nachricht in ethereum-js und checken Sie Solidity ein

Ich versuche, eine gehashte Nachricht in meinem Solidity-Smart-Vertrag zu überprüfen. In JavaScript hash ich die Nachricht wie folgt:

util.sha3(Buffer.concat([
  new Buffer(address1),
  new Buffer(bytes32),
  new Buffer("0"),
  new Buffer(address2),
  new Buffer("0")
])).toString("hex");

Wenn ich Solidity einchecke, tue ich es

keccak256(id,ca,dataHash, false, address(0), false);

Ich habe beides mit keccak256und versucht sha3, aber beide ergeben einen anderen Hash als den in JavaScript erzeugten. Ich vermute ein Codierungsproblem (wahrscheinlich, weil ich Bufferetwas anderes als Solidity mache), aber ich kann nichts darüber finden.

Beachten Sie, dass ich nichts unterschreibe, daher sollte das in dieser Frage beschriebene Problem nicht zutreffen (zumindest nicht so, wie ich die Antwort und Dokumentation verstehe).

Antworten (1)

Ich hatte drei Probleme, hauptsächlich im Zusammenhang mit JavaScript und nicht, wie ich in der Frage annahm, mit Solidity. Für alle, die in Zukunft auf das gleiche Problem stoßen werden, liste ich sie hier auf:

Zunächst sha3nimmt auf der JS-Seite ein oder mehrere Buffers als Eingabe, die standardmäßig Zeichenfolgen als utf-8 dekodieren, während web3.js dieselben Zeichenfolgen als Hexes dekodiert, wenn sie an den Smart Contract gesendet werden. Der schnellste Weg, dies zu lösen, bestand darin, die Zeichenfolgen zu kürzen, um den 0xTeil zu entfernen und die Codierung von Buffer zu ändern:

Buffer.from(mystring.substring(2), "hex")

Aber danach schlugen meine Tests immer wieder fehl. Zwei meiner Werte waren boolesche Werte, was bedeutete, dass ich versuchte, einen Puffer mit einem einzelnen Bit zu haben. Dies scheint mit Buffer nicht möglich zu sein, da alles, was kürzer als ein Byte ist, ignoriert wird. Zum Glück, 0x00und 0x01funktioniert auch für falseund true, also musste ich die Codierung meines bool ändern in:

Buffer.from("00", "hex")

Welche Ausgabe wird auf die gleiche Weise wie falsein Solidity gehasht (dasselbe funktioniert mit "01"und true)

Trotzdem schlugen meine automatisierten Tests immer wieder fehl. Dies lag daran, dass util.sha3er einen Puffer liefert, dessen toStringMethode eine Zeichenfolge wie zurückgibt 0x1234567890abcdef, die Aufrufe von web3.js jedoch eine Zeichenfolge ohne die ersten beiden Zeichen zurückgeben (wie z. B. 1234567890abcdef).