首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何验证以太坊的metamask签名?

如何验证以太坊的metamask签名?
EN

Stack Overflow用户
提问于 2021-04-27 14:53:42
回答 1查看 269关注 0票数 0

我想在前端用metamask签署一条简单的消息,并在后端验证它,以便登录用户。

因此,在前端,我这样做:

代码语言:javascript
运行
复制
const accounts = await web3.eth.getAccounts();
let sign = await web3.eth.personal.sign(`some message here`, accounts[0], '');

用Rust写的后端验证签名最好的方式是什么?对于这样的任务,什么样的板条箱最好?我真的很感激任何真正的代码,因为我是Rust的新手。

谢谢你,?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-31 20:50:54

这对我来说很有效:

代码语言:javascript
运行
复制
    use web3::signing::{keccak256, recover};

    pub fn eth_message(message: String) -> [u8; 32] {
        keccak256(
            format!(
                "{}{}{}",
                "\x19Ethereum Signed Message:\n",
                message.len(),
                message
            )
            .as_bytes(),
        )
    }

    #[test]
    fn test_recover() {
        let account = "0x63f9a92d8d61b48a9fff8d58080425a3012d05c8".to_string();
        let message = "0x63f9a92d8d61b48a9fff8d58080425a3012d05c8igwyk4r1o7o".to_string();
        let message = eth_message(message);
        let signature = hex::decode("382a3e04daf88f322730f6a2972475fc5646ea8c4a7f3b5e83a90b10ba08a7364cd2f55348f2b6d210fbed7fc485abf19ecb2f3967e410d6349dd7dd1d4487751b").unwrap();
        println!("{} {:?} {:?}", account, message, signature);
        let pubkey = recover(&message, &signature[..64], 0);
        assert!(pubkey.is_ok());
        let pubkey = pubkey.unwrap();
        let pubkey = format!("{:02X?}", pubkey);
        assert_eq!(account, pubkey)
    }

在原始邮件中添加以下内容非常重要

format!("{}{}{}","\x19Ethereum Signed Message:\n",message.len(),message)并对其进行哈希处理。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67278243

复制
相关文章

相似问题

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