web3.eth.sign 沒有返回一個有效的簽名 - 或者它是如何工作的?
編輯:問題已解決;下面登錄的工作範例
我使用我想用 eth.sign 簽名的消息的 sha3
m = web3.sha3("Please work.")
然後我跑
eth.sign(eth.coinbase, m)
它返回給我:
0x1c28d6720234343026c24718728cf0c251b0d09c87c32a6e380396a3360065290d0e7ec99a48e547e36645cecc11fd8d09742955c3d16c32eb75d9b24dd158d754
從理論上講,我將能夠從中得出簽名的有效性。
r = 0x1c28d6720234343026c24718728cf0c251b0d09c87c32a6e380396a336006529
s = 0x0d0e7ec99a48e547e36645cecc11fd8d09742955c3d16c32eb75d9b24dd158d7
v = 54
?!(我的印像是這將是 0 或 1。對於 ecrecover 我嘗試了 27 和 28 )現在我將這些插入到 ecrecover(m, v, r, s) 中,我得到……
27:
0x8c6c953abf2957f7fec4c689f8fe2ff09b81b245
有 28 個:
0xb8feaa9b9bfd7f10caefdc6d7baa1f74c37cedef
世界上到底發生了什麼?我正在嘗試使用 web3 為我的應用程序實現登錄,這是一個主要障礙。希望各位高手能指正我的錯誤。
謝謝。
我自己找到了答案,請參閱下面的工作程式碼。我正在遵循我不推薦的本指南!
我還在 geth 模式下使用奇偶校驗來簽署數據,我也不推薦。切換到普通的舊 geth RPC 給了我更理智的結果。
話雖如此,當心v!. geth 的實現之間存在一個錯誤,它將為 v 返回00/01 或 1b/1c。我通過使用 ethereumjs-util 的fromRpcSig方法解決了我的問題,該方法解釋了該錯誤。如果以下方法不起作用,請嘗試導入 web3 並將其 sha3 方法與 ethUtils toBuffer 一起使用。
這是實現登錄的客戶端和伺服器端的完整程式碼片段:
客戶
function login() { let data = web3.sha3('hello world'); web3.eth.sign(web3.eth.defaultAccount, data, (err, result) => { if (!err) { axios.post(url + '/login', { addr: web3.eth.defaultAccount, sig: result }).then((res) => { console.log(res); }); } }); }
伺服器
var ethUtils = require('ethereumjs-util'); let addr = req.body.addr; let sig = req.body.sig; let signature = ethUtils.fromRpcSig(sig); let data = 'hello world'; let pubKey = ethUtils.ecrecover( ethUtils.sha3(data), signature.v, signature.r, signature.s); let foundAddr = '0x' + ethUtils.pubToAddress(pubKey).toString('hex'); if (foundAddr === addr) { // Hooray! The user's signature proves they are who they say they are! } else { // Not authenticated successfully }