Web3js

在 Python Web3 中恢復 JavaScript 簽名消息

  • July 27, 2018

從 Web3.js 獲取簽名消息並在 Web3.py 中恢復簽名地址時遇到問題。

這是我在 JavaScript 中創建簽名消息的程式碼:

async function sign_message() {
   var message = "hi"
   var message_hash = web3.eth.accounts.hashMessage(message)
   //message_hash == 0x0d52783c4cbad7ebaf7eb943fc648f5282a52070442fc18d8dd16ddb2fcbaf66

   var accounts = await web3.eth.getAccounts()
   var signature = await web3.eth.personal.sign(message, accounts[0])
   //accounts[0] ~ 0x6d31165d5d932d571f3b44695653b46dcc327e84
   console.log(signature)
   //signature == 0x29887fe718fcc6e64b97d681f80e6fd485883a45ec0dbc0e35a3752acf1065655d73c9034cac3df0dc82da015abe42367f5e90fd499d872b19610a3ea9c176921b
}

然後這裡嘗試在 Python 中恢復地址:

>>> message = "hi"
>>> message_hash = defunct_hash_message(text=message)
>>> message_hash
HexBytes('0x0d52783c4cbad7ebaf7eb943fc648f5282a52070442fc18d8dd16ddb2fcbaf66')
>>> signature = '0x29887fe718fcc6e64b97d681f80e6fd485883a45ec0dbc0e35a3752acf1065655d73c9034cac3df0dc82da015abe42367f5e90fd499d872b19610a3ea9c176921b'
>>> w3.eth.account.recoverHash(message_hash, signature=signature)
'0x6F4630e882c48151D9e4E386F95009b6312717f4'

請注意,message_hash兩個範例中的 相同,但recoverHash不會產生正確的乙太坊地址。

我已經使用這兩個資源來嘗試幫助我調試問題,但沒有成功:

如何正確簽署 ecrecover 使用的交易?

使用 pyethereum 驗證personal.sign 簽名

這就是最終的工作:

async function create_signature(message, accounts) {
   var hex = ''
   for(var i=0;i<message.length;i++) {
       hex += ''+message.charCodeAt(i).toString(16)
   }
   var hexMessage = "0x" + hex
   var signature = web3.eth.personal.sign(hexMessage, accounts[0])
   return signature
}

在 Python 端,我們恢復了這樣的地址:

def recover_address(message, signature):
   message_hash = defunct_hash_message(text=message)
   address = w3.eth.account.recoverHash(message_hash, signature=signature)
   return address

如果有人知道在 JavaScript 程式碼中計算的更好方法hexMessage,請回複評論!

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