dapp获取钱包地址,及签名

npm install ethersimport {ethers} from 'ethers'
const accounts = await ethereum.request({method: 'eth_requestAccounts'});
// 获取钱包地址
this.form.address = accounts[0]
console.log("accounts:" + this.address)const provider = new ethers.BrowserProvider(window.ethereum)
//签名
const signer = await provider.getSigner()
const signature = await signer.signMessage(this.form.address)
console.log("signature:" + signature);        

ethers.verifyMessage(nonce, signature) 在后端的实现

Java 后端项目 maven导入web3j

<dependency><groupId>org.web3j</groupId><artifactId>core</artifactId><version>4.5.16</version>
</dependency>

Java main方法示例代码

import org.web3j.crypto.ECDSASignature;
import org.web3j.crypto.Hash;
import org.web3j.crypto.Keys;
import org.web3j.crypto.Sign;
import org.web3j.utils.Numeric;import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;public class SignInWithEthereum {public static void main(String[] args) {String address = "0x4adbe2009cff6a1e9d280d28815c49e91b8ebad0";String nonce = "3618473";String signature = "0x9a38fb504315869609ef2e948b1a80f670e6ff725d16b5ae443b118eb2d108bc3c659c2417d96bbff240b44d4f1078fde73b72f83cc71e4e726640bc19a9c2a91c";String MESSAGE_PREFIX = "\u0019Ethereum Signed Message:\n";try {String digest = Hash.sha3(Numeric.toHexStringNoPrefix((MESSAGE_PREFIX + nonce.length() + nonce).getBytes(StandardCharsets.UTF_8)));byte[] signatureBytes = Numeric.hexStringToByteArray(signature);byte v = signatureBytes[64];if (v < 27) {v += 27;}byte[] r = (byte[]) Arrays.copyOfRange(signatureBytes, 0, 32);byte[] s = (byte[]) Arrays.copyOfRange(signatureBytes, 32, 64);Sign.SignatureData signatureData = new Sign.SignatureData(v, r, s);int header = 0;for (byte b : signatureData.getV()) {header = (header << 8) + (b & 0xFF);}if (header < 27 || header > 34) {System.out.println("false");}int recId = header - 27;BigInteger key = Sign.recoverFromSignature(recId,new ECDSASignature(new BigInteger(1, signatureData.getR()), new BigInteger(1, signatureData.getS())),Numeric.hexStringToByteArray(digest));if (key == null) {System.out.println("false");}String signAddress = ("0x" + Keys.getAddress(key)).trim();System.out.println("signAddress:" + signAddress);if (address.toLowerCase().equals(signAddress.toLowerCase())) {System.out.println("true");}} catch (Exception e) {System.out.println("false");}}
}

Java 封装的工具类

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;import org.web3j.crypto.ECDSASignature;
import org.web3j.crypto.Hash;
import org.web3j.crypto.Keys;
import org.web3j.crypto.Sign;
import org.web3j.crypto.Sign.SignatureData;
import org.web3j.utils.Numeric;public class EthersUtils {private static final String MESSAGE_PREFIX = "\u0019Ethereum Signed Message:\n";public static String verifyMessage(String message, String signature) {return EthersUtils.recoverAddress(EthersUtils.hashMessage(message), signature);}public static String hashMessage(String message) {return Hash.sha3(Numeric.toHexStringNoPrefix((EthersUtils.MESSAGE_PREFIX + message.length() + message).getBytes(StandardCharsets.UTF_8)));}public static String recoverAddress(String digest, String signature) {SignatureData signatureData = EthersUtils.getSignatureData(signature);int header = 0;for (byte b : signatureData.getV()) {header = (header << 8) + (b & 0xFF);}if (header < 27 || header > 34) {return null;}int recId = header - 27;BigInteger key = Sign.recoverFromSignature(recId,new ECDSASignature(new BigInteger(1, signatureData.getR()), new BigInteger(1, signatureData.getS())),Numeric.hexStringToByteArray(digest));if (key == null) {return null;}return ("0x" + Keys.getAddress(key)).trim();}private static SignatureData getSignatureData(String signature) {byte[] signatureBytes = Numeric.hexStringToByteArray(signature);byte v = signatureBytes[64];if (v < 27) {v += 27;}byte[] r = (byte[]) Arrays.copyOfRange(signatureBytes, 0, 32);byte[] s = (byte[]) Arrays.copyOfRange(signatureBytes, 32, 64);return new SignatureData(v, r, s);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/886098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【51单片机】LCD1602液晶显示屏

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 LCD1602存储结构时序结构 编码 —— 显示字符、数字 LCD1602 LCD1602&#xff08;Liquid Crystal Display&#xff09;液晶显示屏是…

【Python · PyTorch】卷积神经网络(基础概念)

【Python PyTorch】卷积神经网络 CNN&#xff08;基础概念&#xff09; 0. 生物学相似性1. 概念1.1 定义1.2 优势1.2.1 权重共享1.2.2 局部连接1.2.3 层次结构 1.3 结构1.4 数据预处理1.4.1 标签编码① One-Hot编码 / 独热编码② Word Embedding / 词嵌入 1.4.2 归一化① Min-…

网络组以及网络组与网卡绑定应用场景的区别

网卡绑定在博主上一篇文章 “网络组”通常指的是一个逻辑上的网络分组&#xff0c;可以在不同的上下文中有不同的含义。根据不同的技术或场景&#xff0c;网络组的定义可能会有所不同。以下是几种常见的解释&#xff1a; 1. 虚拟局域网 (VLAN) 中的网络组 在网络管理中&…

Qt 之 qwt和QCustomplot对比

QWT&#xff08;Qt Widgets for Technical Applications&#xff09;和 QCustomPlot 都是用于在 Qt 应用程序中绘制图形和图表的第三方库。它们各有优缺点&#xff0c;适用于不同的场景。 以下是 QWT 和 QCustomPlot 的对比分析&#xff1a; 1. 功能丰富度 QWT 功能丰富&a…

谷歌DeepMind推出了一种新的方式来“窥探”AI的“内心”

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

蓝队知识浅谈(上)

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;蓝队基础之网络七层杀伤链_哔哩哔哩_bilibili 本文主要分享一些蓝队相关的知识。 首先我们先来了解一下什么是蓝队&#xff1f; 蓝队是信息安全领…

PowerBI 用RANK,RANKX和TOPN 排名的简单示例

1. 销量表 2. 添加计算总销量的度量值&#xff0c;它将在RANK和RANKX里被使用 总销售量 SUM(销量[销售量]) 3.计算排名的度量值 RANK函数 排名 RANK(ALL(销量[产品]),ORDERBY([总销售量],DESC)) RANKX函数: 排名2 RANKX(ALL(销量),[总销售量],,DESC,Skip) 4.页面上添…

【EmbeddedGUI】脏矩阵设计说明

脏矩阵设计说明 背景介绍 一般情况下&#xff0c;当屏幕内容绘制完毕后&#xff0c;实际应用通常需要更新屏幕中的一部分内容&#xff0c;而不是单纯显示一个静态图片在那。 如下图所示&#xff0c;屏幕中有一个图片控件&#xff08;Img2&#xff09;和一个文本控件&#xf…

【蓝牙协议栈】【BLE】【IAS】蓝牙立即警报服务

蓝牙IAS协议&#xff08;Immediate Alert Service&#xff09;介绍 Immediate Alert Service&#xff08;IAS&#xff0c;立即警报服务&#xff09; 是蓝牙低功耗&#xff08;Bluetooth Low Energy, BLE&#xff09;中的一个标准服务&#xff0c;主要用于发出立即警报。它通常…

Java安卓开发——用户权限篇(第十期)

1&#xff0c;权限概要&#xff1a; 权限分为两种级别&#xff1a;【Normal&#xff08;普通&#xff09;级】 和 【Dangerous&#xff08;危险&#xff09;级】 其中&#xff0c;【普通级】则不需要程序进行用户权限申请&#xff0c;但是【危险级】则是不申请就没有。 所有权限…

深入理解 Spring Boot 中的 Starters

一、引言 在 Spring Boot 开发中&#xff0c;Starters 是一个非常重要的概念。它们为开发者提供了一种便捷的方式来集成各种功能和技术&#xff0c;大大简化了项目的配置和开发过程。理解 Spring Boot 中的 Starters 对于提高开发效率、降低项目复杂度以及实现快速迭代至关重要…

「QT」文件类 之 QTextStream 文本流类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制…

mysql 配置文件 my.cnf 增加 lower_case_table_names = 1 服务启动不了的原因

原因&#xff1a;在MySQL8.0之后的版本&#xff0c;只允许在数据库初始化时指定&#xff0c;之后不允许修改了 mysql 配置文件 my.cnf 增加 lower_case_table_names 1 服务启动不了 报错信息&#xff1a;Job for mysqld.service failed because the control process exited …

PVE纵览-安装系统卡“Loading Driver”的快速解决方案

PVE纵览-安装系统卡“Loading Driver”的快速解决方案 文章目录 PVE纵览-安装系统卡“Loading Driver”的快速解决方案摘要通过引导参数解决PVE安装卡在“Loading Driver”问题官方解决方法 关键字&#xff1a; PVE、 显卡、 Loading、 Driver、 nomodeset 摘要 在虚拟机…

[Android]相关属性功能的裁剪

1.将home界面的search bar 移除 /src/com/android/launcher3/graphics/LauncherPreviewRenderer.java // Add first page QSBif (FeatureFlags.QSB_ON_FIRST_SCREEN) {CellLayout firstScreen mWorkspaceScreens.get(FIRST_SCREEN_ID);View qsb mHomeElementInflater.infla…

Git的概念、安装、操作与分支管理和图形化界面TortoiseGit(小乌龟 )的安装与使用

目录 一、Git 概述 简介 安装 使用场景 二、Git 操作详解 使用git管理文件版本 使用 Git 管理代码 三、分支操作 使用小乌龟操作分支 创建新的分支 两个分支合并 四、总结 在当今的软件开发和文档编写等领域&#xff0c;版本控制工具至关重要。Git 作为其中的佼佼者…

边缘计算在智能制造中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 边缘计算在智能制造中的应用 边缘计算在智能制造中的应用 边缘计算在智能制造中的应用 引言 边缘计算概述 定义与原理 发展历程 …

设计模式之装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)

前言&#xff1a; 两个本想描述一样的意思的词&#xff0c;只因一字只差就让人觉得一个是好牛&#xff0c;一个好搞笑。往往我们去开发编程写代码时也经常将一些不恰当的用法用于业务需求实现中&#xff0c;但却不能意识到。一方面是由于编码不多缺少较大型项目的实践&#xff…

使用热冻结数据层生命周期优化在 Elastic Cloud 中存储日志的成本

作者&#xff1a;来自 Elastic Jonathan Simon 收集数据对于可观察性和安全性至关重要&#xff0c;而确保数据能够快速搜索且获得低延迟结果对于有效管理和保护应用程序和基础设施至关重要。但是&#xff0c;存储所有这些数据会产生持续的存储成本&#xff0c;这为节省成本创造…

Linux初体验

任务描述 欢迎进行Linux世界&#xff0c;当你下载、安装了某个Linux发行版(笔者喜欢使用Ubuntu)&#xff0c;体验了Linux桌面并安装了一些你喜爱和需要的软件之后&#xff0c;应该去了解下Linux真正的魅力所在&#xff1a;命令行。每一个Linux命令其实就是一个程序&#xff0c;…