Web3js
在 Python Web3 中恢復 JavaScript 簽名消息
從 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
不會產生正確的乙太坊地址。我已經使用這兩個資源來嘗試幫助我調試問題,但沒有成功:
這就是最終的工作:
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
,請回複評論!