我正在试图获得签署的Metamask消息确认与以太在后端-util,但没有成功。
Metamask出现在用户面前,他们可以对消息进行签名--但是当消息在后端被验证时,我会得到一个错误。
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的节点
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")"ethereumjs-util": "^7.0.10",
"web3": "^1.3.6"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 }});
}
)"axios": "^0.21.1",
"vue": "^3.0.0",
"web3": "^1.3.6"我已经学习了我能在网上找到的所有例子,包括使用Metamask签署消息,并使用ethereumjs使用进行验证。,但是在这方面工作了几个小时之后,我什么也没有得到。
发布于 2022-02-10 18:29:34
最近,我在节点js (实际上是在n8n自定义函数中)中实现了这一点。
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没有承诺的功能!
发布于 2021-06-15 20:02:31
最后排序
前端应该是这样的:
var message = 'data';
const messageBuffer = Buffer.from(message);
const messageHash = ethUtil.hashPersonalMessage(messageBuffer);
const sigDecoded = ethUtil.fromRpcSig(sig);https://ethereum.stackexchange.com/questions/101966
复制相似问题