Android

如何從簽名的消息中恢復地址?

  • October 10, 2018

我使用 Trust SDK 簽署消息和交易。

我恢復這樣的事務(Trust.signTransaction()):

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

其中Geth- 框架 (org.ethereum.geth),版本 1.8.11。

如何從簽名消息 ( ) 中恢復數據(以及使用者錢包的地址Trust.signMessage())?

Trust SDK 的開發者說要看看“恢復”。但它是什麼?框架?

非常感謝您提前。

我已經解決了這個問題。

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 上)是從這裡獲取的。

引用自:https://ethereum.stackexchange.com/questions/59476