Android
如何從簽名的消息中恢復地址?
我使用 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 上)是從這裡獲取的。