Подпись Web3j и Solidity Ecrecover

Я пытаюсь понять, как подписать сообщение на 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
Что вы должны сравнить, так это то, соответствует ли адрес, указанный Solidity, адресу, использованному для подписи сообщения.
@Jaime Джейми, я обновил вопрос, результат все еще не совпадает
В солидности вы передаете hashсообщение, вместо этого вы должны использовать сообщение.
Это было то, что я не ясно дал понять в извинениях за код, я на самом деле только передаю исходное сообщение. Я снова обновил вопрос.
Вы можете записать сообщение, чтобы попытаться воспроизвести его?

Ответы (1)

Итак, в моем коде было две проблемы. Во-первых, я читал в Интернете о необходимости добавлять «\x19Ethereum Signed Message:\n32» к хешу в Solidity, однако это требуется только при использовании Web3js, а не Web3j. Во-вторых, я хэшировал в своем смарт-контракте, когда данные не были хэшированы изначально.