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 keccak256
und versucht sha3
, aber beide ergeben einen anderen Hash als den in JavaScript erzeugten. Ich vermute ein Codierungsproblem (wahrscheinlich, weil ich Buffer
etwas 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).
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 sha3
nimmt auf der JS-Seite ein oder mehrere Buffer
s 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 0x
Teil 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, 0x00
und 0x01
funktioniert auch für false
und true
, also musste ich die Codierung meines bool ändern in:
Buffer.from("00", "hex")
Welche Ausgabe wird auf die gleiche Weise wie false
in Solidity gehasht (dasselbe funktioniert mit "01"
und true
)
Trotzdem schlugen meine automatisierten Tests immer wieder fehl. Dies lag daran, dass util.sha3
er einen Puffer liefert, dessen toString
Methode 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
).