Как восстановить адрес из подписанного сообщения? - PullRequest
0 голосов
/ 26 сентября 2018

Я использую Trust SDK для подписания сообщений и транзакций.

Я восстанавливаю транзакцию (Trust.signTransaction()) следующим образом:

val tx = Geth.newTransactionFromRLP(Numeric.hexStringToByteArray(response.result))

Где Geth - framework (org.ethereum.geth), версия 1.8.11.

Как восстановить данные (и адрес кошелька пользователя) из подписанного сообщения (Trust.signMessage())?

Разработчик Trust SDKсказал, чтобы посмотреть на «восстановление».Но что это?Framework?

Большое спасибо заранее.

1 Ответ

0 голосов
/ 10 октября 2018

Я решил проблему.

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) для восстановления был взят из здесь .

...