首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Metamask消息上签名,并使用ethereumjs utils 7.0.10进行验证

在Metamask消息上签名,并使用ethereumjs utils 7.0.10进行验证
EN

Ethereum用户
提问于 2021-06-15 19:40:43
回答 2查看 1.1K关注 0票数 1

我正在试图获得签署的Metamask消息确认与以太在后端-util,但没有成功。

Metamask出现在用户面前,他们可以对消息进行签名--但是当消息在后端被验证时,我会得到一个错误。

代码语言:javascript
复制
Number can only safely store up to 53 bits
at assert (project\node_modules\ethereumjs-util\node_modules\bn.js\lib\bn.js:6:21)
    at BN.toNumber (project\node_modules\ethereumjs-util\node_modules\bn.js\lib\bn.js:547:7)
    at Object.exports.bufferToInt (project\node_modules\ethereumjs-util\dist\bytes.js:148:55)
    at Object.exports.fromRpcSig (project\node_modules\ethereumjs-util\dist\signature.js:76:21)
    at project\Routes\dashboard.js:21:32 ## will mark this in backend

签名是132个字符的十六进制,从0x开始。

后端代码-带有Express的节点

代码语言:javascript
复制
var ethUtil = require('ethereumjs-util');

var sig = req.query.sig;
console.log(sig + " length: " + sig.length);

var message = 'data';
const messageBuffer = Buffer.from(message);
const messageHash = ethUtil.hashPersonalMessage(messageBuffer);
const signatureBuffer = Buffer.from(sig);
const sigDecoded = ethUtil.fromRpcSig(signatureBuffer); ### this line is where it throws the Number can only safely store up to 53 bits error

// Recover Address
var recoveredPub = ethUtil.ecrecover(messageHash, sigDecoded.v, sigDecoded.r, sigDecoded.s)
var recoveredAddress = ethUtil.pubToAddress(recoveredPub).toString("hex")

后端package.json

代码语言:javascript
复制
"ethereumjs-util": "^7.0.10",
"web3": "^1.3.6"

前端代码

代码语言:javascript
复制
import('eth-sig-util');
import('axios');
import(web3);
      
window.ethereum.sendAsync({ id: 1, method: 'personal_sign', params: [ web3.utils.fromUtf8("data"), window.ethereum.selectedAddress] },
    function(err, result) {
        console.log(result);
        let sig = result.result;
        axios.get("http://myhost:8000/authenticate/" , { params: { sig }});
    }
)

前端packages.json

代码语言:javascript
复制
"axios": "^0.21.1",
"vue": "^3.0.0",
"web3": "^1.3.6"

我已经学习了我能在网上找到的所有例子,包括使用Metamask签署消息,并使用ethereumjs使用进行验证。,但是在这方面工作了几个小时之后,我什么也没有得到。

EN

回答 2

Ethereum用户

发布于 2022-02-10 18:29:34

最近,我在节点js (实际上是在n8n自定义函数中)中实现了这一点。

代码语言:javascript
复制
const { verifyMessage } = require('@ethersproject/wallet') // https://docs.ethers.io/v5/single-page/#/v5/api/utils/signing-key/-%23-utils-verifyMessage

const recoveredAddress = verifyMessage(signedMessage, signature).toLowerCase()
const isSignerMatching = !!(recoveredAddress === expectedAddress.toLowerCase())

实际上,找出如何正确导入它是最复杂的!

因为ethers.utils没有承诺的功能!

票数 1
EN

Ethereum用户

发布于 2021-06-15 20:02:31

最后排序

前端应该是这样的:

代码语言:javascript
复制
var message = 'data';
const messageBuffer = Buffer.from(message);
const messageHash = ethUtil.hashPersonalMessage(messageBuffer);
const sigDecoded = ethUtil.fromRpcSig(sig);
票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/101966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档