Web3j-Signatur und Solidity Ecrecover

Ich versuche zu verstehen, wie man eine Nachricht in Java signiert und den öffentlichen Schlüssel in einem Smart Contract von Solidity wiederherstellt, aber meine öffentlichen Schlüssel scheinen nicht übereinzustimmen.

Hier ist mein Java-Code zum Generieren der Signatur:

    String testString = "testing signature method";
    Sign.SignatureData signatureData = Sign.signMessage(testString.getBytes(), credentials.getEcKeyPair());

    System.out.println(Numeric.toHexString(credentials.getAddress().getBytes()));
    System.out.println(Numeric.toHexString(testString.getBytes()));
    System.out.println("R: "+Numeric.toHexString(signatureData.getR()));
    System.out.println("S: "+Numeric.toHexString(signatureData.getS()));
    System.out.println("V: "+signatureData.getV());

Und hier ist meine intelligente Vertragsüberprüfungsfunktion:

function verify(bytes32 testStringBytes, uint8 v, bytes32 r, bytes32 s) constant returns (address) {

bytes memory prefix = "\x19Ethereum Signed Message:\n32";
bytes32 prefixedValue = keccak256(prefix, testStringBytes);
return ecrecover(prefixedValue , v, r, s);
}

Die Ausgabe, die ich für die Verifizierungsfunktion erhalte, ist

0x60009F80EA2D060fd804285d8a8a649351521582

Mein Java-Programm gibt die Adresse jedoch als aus

0x307838336530386135653737393031313236613136373231353930613865313337396662376231623662

Jeder sieht, wo ich falsch liege?

Die Werte, die ich in Ecrecover einfüge:

R: 0x524d3f28b7aad7418d9b9e30615e26104925b5fbaaf868a87bcf1b0b42172ec2
S: 0x07014e250540ce8e6dffb45e8c90e34ad5a31a3bbe5bb9a958ae7fdbee4f2048
V: 28
Was Sie vergleichen sollten, ist, ob die von Solidity angegebene Adresse mit der Adresse übereinstimmt, die zum Signieren der Nachricht verwendet wurde.
@Jaime Ich habe die Frage aktualisiert, die Ausgabe stimmt immer noch nicht überein
In Solidität übergeben Sie die hashNachricht, Sie sollten stattdessen die Nachricht verwenden.
Das war etwas, was ich in der Code-Entschuldigung nicht klargestellt habe, ich gebe eigentlich nur die ursprüngliche Nachricht weiter. Ich habe die Frage erneut aktualisiert.
Können Sie die Nachricht aufschreiben, um sie zu replizieren?

Antworten (1)

Es gab also zwei Probleme mit meinem Code. Erstens habe ich online über die Notwendigkeit gelesen, „\x19Ethereum Signed Message:\n32“ an den Hash in Solidity anzuhängen, dies ist jedoch nur erforderlich, wenn Web3js und nicht Web3j verwendet wird. Zweitens habe ich in meinem Smart Contract gehasht, als die Daten ursprünglich nicht gehasht waren.