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
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.
Jaime
Hughes_J
Jaime
hash
Nachricht, Sie sollten stattdessen die Nachricht verwenden.Hughes_J
Jaime