Ethereum 使用wallet connect在以太坊上签名并验证消息不起作用
我正在尝试为我的DAPP使用wallet connect对邮件进行签名和验证。到目前为止,我已经尝试使用ethers和web3包装WalletConnect,并且在我的移动设备上使用metamask和trust wallet应用程序。到目前为止,这些方法都不起作用Ethereum 使用wallet connect在以太坊上签名并验证消息不起作用,ethereum,web3,Ethereum,Web3,我正在尝试为我的DAPP使用wallet connect对邮件进行签名和验证。到目前为止,我已经尝试使用ethers和web3包装WalletConnect,并且在我的移动设备上使用metamask和trust wallet应用程序。到目前为止,这些方法都不起作用 <template> <div id="app"> <div>Steps: <br>Connect wallet (i used metama
<template>
<div id="app">
<div>Steps:
<br>Connect wallet (i used metamask mobile and trust wallet)
<br>Once connected Sign the message
<br>
<br>Issues:
<br>On metamask mobile wallet you receive a message to sign but nothing is sent back once signed
<br>On Trust wallet the the signature is returned to the DAPP but it does not verifiy to the current account? Verification fails
<br>
<br>
</div>
<button @click="connectWallet">Connect wallet</button>
<template v-if="coinbase">
<div>Account: {{ coinbase }}</div>
<button @click="sign">Sign</button>
<div>Signature: {{ signature }}</div>
<div>verified message: {{ verified }}</div>
<div>verified2 message: {{ verified }}</div>
<div>verificationMatch: {{ verificationMatch }}</div>
</template>
</div>
</template>
<script>
import { ethers } from "ethers";
import Web3 from "web3";
import WalletConnectProvider from "@walletconnect/web3-provider";
export default {
name: "App",
data: () => ({
coinbase: "",
web3: {},
signer: {},
verified: "",
verified2: "",
signature: ""
}),
computed: {
verificationMatch() {
// these should match
return this.coinbase === this.verified;
}
},
methods: {
async connectWallet() {
const walletConnectProvider = new WalletConnectProvider({
infuraId: "3cd774e14cf34ff78167908f8377051c" // Required
// qrcode: true
});
await walletConnectProvider.enable();
this.web3 = new Web3(walletConnectProvider);
this.coinbase = walletConnectProvider.wc.accounts[0];
console.log(this.web3.eth.accounts[0]);
// this.coinbase = await this.web3.eth.getAccounts()[0];
},
async sign() {
var message = "Hello World";
this.signature = await this.web3.eth.sign(message, this.coinbase);
this.verified = ethers.utils.verifyMessage(message, this.signature);
this.verified2 = this.web3.eth.accounts.recover(message, this.signature);
}
}
};
</script>
<style>
#app {
font-family: "Avenir", Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
步骤:
Connect wallet(我使用metamask mobile和trust wallet)
一旦连接,请在邮件上签名
问题:
在metamask mobile wallet上,您会收到一条要签名的消息,但签名后不会返回任何内容
在信托钱包上,签名返回给DAPP,但不验证当前帐户?验证失败
连接钱包
帐户:{{coinbase}
签名
签名:{{签名}
已验证消息:{{verified}}
已验证的2消息:{{verified}
验证匹配:{{verificationMatch}
从“ethers”导入{ethers};
从“Web3”导入Web3;
从“@walletconnect/web3 provider”导入WalletConnectProvider;
导出默认值{
名称:“应用程序”,
数据:()=>({
硬币库:“,
web3:{},
签署人:{},
核实:“,
已验证2:“,
签名:“”
}),
计算:{
验证匹配(){
//这些应该匹配
返回this.coinbase==this.verified;
}
},
方法:{
异步连接钱包(){
const walletConnectProvider=新的walletConnectProvider({
infuraId:“3cd774e14cf34ff78167908f8377051c”//Required
//qrcode:正确
});
等待walletConnectProvider.enable();
this.web3=新的web3(walletConnectProvider);
this.coinbase=walletConnectProvider.wc.accounts[0];
console.log(this.web3.eth.accounts[0]);
//this.coinbase=等待this.web3.eth.getAccounts()[0];
},
异步符号(){
var message=“你好,世界”;
this.signature=等待this.web3.eth.sign(消息,this.coinbase);
this.verified=ethers.utils.verifyMessage(消息,this.signature);
this.verified2=this.web3.eth.accounts.recover(消息,this.signature);
}
}
};
#应用程序{
字体系列:“Avenir”,Helvetica,Arial,无衬线;
-webkit字体平滑:抗锯齿;
-moz osx字体平滑:灰度;
文本对齐:居中;
颜色:#2c3e50;
边缘顶部:60像素;
}
您可以在这里找到一些代码沙盒
此链接适用于ethersjs
此链接适用于web3
任何帮助都将不胜感激 对于
WalletConnectProvider
,我也有同样的问题,但它适用于低级连接器调用:
var rawMessage = "Hello World";
var rawMessageLength = new Blob([rawMessage]).size
var message = ethers.utils.toUtf8Bytes("\x19Ethereum Signed Message:\n" + rawMessageLength + rawMessage)
message = ethers.utils.keccak256(message)
var params = [
await this.signer.getAddress(),
message
]
this.signature = await this.wc.connector.signMessage(params);
this.verified = ethers.utils.verifyMessage(rawMessage, this.signature);
this.wc
是对walletConnectProvider
的引用,我对walletConnectProvider
有同样的问题,但它适用于低级连接器调用:
var rawMessage = "Hello World";
var rawMessageLength = new Blob([rawMessage]).size
var message = ethers.utils.toUtf8Bytes("\x19Ethereum Signed Message:\n" + rawMessageLength + rawMessage)
message = ethers.utils.keccak256(message)
var params = [
await this.signer.getAddress(),
message
]
this.signature = await this.wc.connector.signMessage(params);
this.verified = ethers.utils.verifyMessage(rawMessage, this.signature);
this.wc
是指walletConnectProvider
而不是像@Vyacheslav所描述的那样调用低级连接器调用,另一个选项是直接调用个人签名
// configure web3, e.g. with web3Modal or in your case WalletConnect
const web3 = await web3Modal.connect();
const provider = new providers.Web3Provider(web3);
const signer = provider.getSigner()
const address = await signer.getAddress();
let signedMessage;
if (web3.wc) {
signedMessage = await provider.send(
'personal_sign',
[ ethers.utils.hexlify(ethers.utils.toUtf8Bytes(rawMessage)), address.toLowerCase() ]
);
}
else {
signedMessage = await signer.signMessage(rawMessage)
}
const verified = ethers.utils.verifyMessage(rawMessage, signedMessage);
不像@Vyacheslav所描述的那样调用低级连接器调用,另一个选项是直接调用personal_sign
// configure web3, e.g. with web3Modal or in your case WalletConnect
const web3 = await web3Modal.connect();
const provider = new providers.Web3Provider(web3);
const signer = provider.getSigner()
const address = await signer.getAddress();
let signedMessage;
if (web3.wc) {
signedMessage = await provider.send(
'personal_sign',
[ ethers.utils.hexlify(ethers.utils.toUtf8Bytes(rawMessage)), address.toLowerCase() ]
);
}
else {
signedMessage = await signer.signMessage(rawMessage)
}
const verified = ethers.utils.verifyMessage(rawMessage, signedMessage);
对于其他人,这里有一个最终的解决方案非常感谢Vyacheslav。你是一个真正的传奇人物。请加入我们的代币电报。我想给你一些代币,以供你消磨时间。我的名字马克,请在电报中告诉我。再次感谢你brother@EDeveloper看来我错过了这条评论的通知。我很高兴这个解决方案对你有效。你重新命名了你的电报频道了吗?对其他人来说,这里有一个最终的解决方案,非常感谢Vyacheslav。你是一个真正的传奇人物。请加入我们的代币电报。我想给你一些代币,以供你消磨时间。我的名字马克,请在电报中告诉我。再次感谢你brother@EDeveloper看来我错过了这条评论的通知。我很高兴这个解决方案对你有效。你重新命名电报频道了吗?