Я решил проблему.
1) Нужно использовать этот подход:
signPersonalMessageCall = Trust.signPersonalMessage()
.message("my message to be signed")
.call(this)
2) Для получения адреса пользователя необходимо использовать:
const val PERSONAL_MESSAGE_PREFIX = "\u0019Ethereum Signed Message:\n"
//...
fun recoverAddressFromSignature(message: String, signature: String): String? {
val prefix = PERSONAL_MESSAGE_PREFIX + message.length
val msgHash = Hash.sha3((prefix + message).toByteArray())
val signatureBytes = Numeric.hexStringToByteArray(signature)
var v = signatureBytes[64]
if (v < 27) {
v = (v + 27).toByte()
}
val sd = SignatureData(
v,
Arrays.copyOfRange(signatureBytes, 0, 32) as ByteArray,
Arrays.copyOfRange(signatureBytes, 32, 64) as ByteArray)
var addressRecovered: String? = null
// Iterate for each possible key to recover
for (i in 0..3) {
val publicKey = Sign.recoverFromSignature(
i,
ECDSASignature(BigInteger(1, sd.r), BigInteger(1, sd.s)),
msgHash)
if (publicKey != null) {
addressRecovered = "0x" + Keys.getAddress(publicKey)
Log.i(Core.APP_TAG, "*-*-* addressRecovered = $addressRecovered")
}
}
return addressRecovered
}
Метод (на Java) для восстановления был взят из здесь .