div*_*yan 5 ethereum ethers.js wallet-connect
我正在尝试使用以太币通过钱包连接签署消息,但在使用 ambire 钱包验证消息时遇到问题,它没有返回任何响应。
const signMessage = async () => {
try {
console.log("started");
// 1.] create a provider
const walletConnectProvider = new WalletConnectProvider({
infuraId: "3cd774e14cf34ff78167908f8377051c", // Required
// qrcode: true
});
// 2.] enable provider
await walletConnectProvider.enable();
// console.log(walletConnectProvider.wc.accounts[0]);
let rawMessage = "Hello World";
let rawMessageLength = new Blob([rawMessage]).size;
let message = ethers.utils.toUtf8Bytes(
"\x19Ethereum Signed Message:\n" + rawMessageLength + rawMessage
);
message = ethers.utils.keccak256(message);
var params = [
walletConnectProvider.wc.accounts[0],
message,
];
// 3.] sign message
const provider = new providers.Web3Provider(walletConnectProvider);
const signer = provider.getSigner();
let signature = await signer.signMessage(message);
console.log("signature", signature);
// 4.] verify message
let verified = await ethers.utils.verifyMessage(message, signature);
console.log("verified", verified);
} catch (err) {}
};
Run Code Online (Sandbox Code Playgroud)
Ivo*_*Ivo 14
您还需要一些东西:
signer.signMessage,即 rawMessage: await signer.signMessage(rawMessage)- 因为钱包(无论是否是 Ambire)都会添加前缀在 JS 中(警告:未测试),这看起来有点像这样:
const signerAddr = await signer.getAddress();
if (provider.getCode(signerAddr) === '0x') {
// Regular RSV sig verification
verified = signerAddr === (await ethers.utils.verifyMessage(message, signature));
} else {
// Smart contract wallet (EIP 1271) verification: see https://eips.ethereum.org/EIPS/eip-1271 for more info
const EIP1271ABI = ['function isValidSignature(bytes32 _hash, bytes memory _signature) public view returns (bytes4 magicValue)'];
const EIP1271MagicValue = '0x1626ba7e';
const signerEIP1271Contract = new ethers.Contract(signerAddr, EIP1271ABI, provider);
const rawMessageLength = new Blob([rawMessage]).size;
const message = ethers.utils.toUtf8Bytes(
"\x19Ethereum Signed Message:\n" + rawMessageLength + rawMessage
);
const messageHash = ethers.utils.keccak256(message);
verified = EIP1271MagicValue === (await signerEIP1271Contract.isValidSignature(messageHash, signature));
}
Run Code Online (Sandbox Code Playgroud)
注意:我们 Ambire 团队目前正在制定一份关于如何验证所有类型签名(EIP1271、EIP712、712+1271、常规)的综合指南,希望能够通过 ethers.js 文档链接到该指南。
编辑:我们发布了一个库,使这一切变得更加容易,请查看: https: //github.com/AmbireTech/signature-validator/ - 我们建议您使用它
| 归档时间: |
|
| 查看次数: |
5584 次 |
| 最近记录: |