Go-Ethereum

web3.eth.sign 沒有返回一個有效的簽名 - 或者它是如何工作的?

  • May 9, 2017

編輯:問題已解決;下面登錄的工作範例

我使用我想用 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
}

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