Я пытаюсь понять, как подписать сообщение на Java и восстановить открытый ключ в смарт-контракте Solidity, однако мои открытые ключи не совпадают.
Вот мой код Java для создания подписи:
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());
И вот моя функция проверки смарт-контракта:
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);
}
Вывод, который я получаю для функции проверки,
0x60009F80EA2D060fd804285d8a8a649351521582
Однако моя java-программа выводит адрес как
0x307838336530386135653737393031313236613136373231353930613865313337396662376231623662
Кто-нибудь видит, где я ошибаюсь?
Значения, которые я подставляю в Ecrecover:
R: 0x524d3f28b7aad7418d9b9e30615e26104925b5fbaaf868a87bcf1b0b42172ec2
S: 0x07014e250540ce8e6dffb45e8c90e34ad5a31a3bbe5bb9a958ae7fdbee4f2048
V: 28
Итак, в моем коде было две проблемы. Во-первых, я читал в Интернете о необходимости добавлять «\x19Ethereum Signed Message:\n32» к хешу в Solidity, однако это требуется только при использовании Web3js, а не Web3j. Во-вторых, я хэшировал в своем смарт-контракте, когда данные не были хэшированы изначально.
Хайме
Хьюз_Дж
Хайме
hash
сообщение, вместо этого вы должны использовать сообщение.Хьюз_Дж
Хайме