Vergleichen Sie byte32 Keccak256 mit demselben Keccak256, das in einem byte32-Array gespeichert ist

Ich möchte, dass meine Funktion ein Array von Hash-Geheimnissen als Parameter akzeptieren kann, und da die Solidität keine Zeichenfolgen zulässt, musste ich ein byte32 [] verwenden.

Der String-Parameter ist eine Aufnahme für das Geheimnis des Benutzers, das ich mit Keccak256 hash, das es in einen Byte32-Wert konvertieren sollte.

Da (oder so denke ich) die gehashte geheime Zeichenfolge ein byte32 ist und das gehashte Geheimnis auch im ersten Element des byte32-Arrays gespeichert ist, sollte die Assertion beim Vergleich als wahr ausgewertet werden

Prüfen:

it("Checking secrets", function() {
    return myContract.deployed().then(function(instance){
      contract = instance;
      return contract.test.call("hello", ["1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8"])
      .then(function(testVals){
        assert.equal(testVals[0].valueOf(), testVals[1][0].valueOf())
      })
  });
});

Funktion:

function test(string val1, bytes32[] val2) public returns(bytes32, bytes32[]){
        return(keccak256(val1), val2);
    }

Ergebnis:

AssertionError: expected '0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8' to equal '0x3163386166663935303638356332656434626333313734663334373232383762'
Versuchen Sie es mit einem führenden 0x, dh0x1c8aff95...
Wow, so ein dummer Fehler, lol ... vielen Dank, dass Sie sich seit dem Vormittag wieder bei mir gemeldet haben.

Antworten (1)

@smart war richtig. Ich musste den Hashes, die ich an das byte32-Array übergab, ein führendes "0x" hinzufügen:

it("Checking secrets", function() {
    return myContract.deployed().then(function(instance){
      contract = instance;
      return contract.test.call("hello", ["0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8"])
      .then(function(testVals){
        assert.equal(testVals[0].valueOf(), testVals[1][0].valueOf())
      })
  });
});