uniapp开发DAPP钱包应用(二) Vue + Java

上一节我们讲了如何通过vue uniapp还有web3以及需要准备的相关组件,来搭建了DAPP开发的环境。

这一节,我们来说说如何用代码来实现DAPP相关接口。

1. ethers实现类 

导入组件


import { ethers , providers , utils  } from "ethers";
import tokenABI from '@/utils/tokenABI.json'
export class MetaEthers {}

初始化


static #provider = null ;
static #account = null ;
static #message = 'sign message'
static #max = '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'
constructor(){
    check();
    if(!MetaEthers.#provider)MetaEthers.#provider = new ethers.providers.Web3Provider(window.ethereum);
} 
function check(target){
     if(typeof window.ethereum == 'undefined')
   throw uni.showToast({title: "MetaMask is unInstalled!", icon: "none"})
}

获取钱包地址

// 获取钱包地址
  async setAccounts(){
      let account = await MetaEthers.#provider.send("eth_requestAccounts", []);
      MetaEthers.#account =  account instanceof Array ? account[0] : account;
      let info = JSON.parse(localStorage.getItem('userinfo'))
      if( info && MetaEthers.#account.toLowerCase() !== info.chain_address){
          this.destory()
          throw t('dismacth');
      } else{
          return MetaEthers.#account;
      }     
  }

签名获取


// 签名
async sign(){
    if(!MetaEthers.#account) throw { reason: t('wallet_warning'), errType: -1 }
    const signer = MetaEthers.#provider.getSigner();
    let signature = await signer.signMessage(MetaEthers.#message)
    console.log( utils.verifyMessage(MetaEthers.#message, signature).toLowerCase() )
    return signature;
}

余额获取


// 钱包余额
async getWallet(){
    if(!MetaEthers.#account) throw { reason: t('wallet_warning'), errType: -1 }
    let Contract = new ethers.Contract(
        tokenAddress,
        tokenABI,
        MetaEthers.#provider.getSigner()
    );
    let value = await Contract.balanceOf(MetaEthers.#account);
    return ethers.utils.formatUnits(value, 18)
}

2. 实现签名登录

import {
  MetaEthers
} from '@/utils/metamask.js'

let MetaWallet = {
  destory: () => {}
};

// 通过实现类,获取地址及签名,后端进行验证
let chain_address = await MetaWallet.setAccounts();
let signature = await MetaWallet.sign();
const {
  data,
  code
} = await walletLogin({
  method: "POST",
  query: {
    chain_address,
    message: MetaEthers.getMessage(),
    signature,
  },
});

后端实现

/**
 * <b>功能描述:</b>验签<br>
 * <b>修订记录:</b><br>
 */
public static Boolean isSignatureValid(final String address, final String signature, final String message) {
    log.info("isSignatureValid invoked for Address {} with Signature {} and Message {} ", address, signature, message);
    final String personalMessagePrefix = "\u0019Ethereum Signed Message:\n";
    boolean match = false;

    final String prefix = personalMessagePrefix + message.length();
    final byte[] msgHash = Hash.sha3((prefix + message).getBytes());
    final byte[] signatureBytes = Numeric.hexStringToByteArray(signature);
    byte v = signatureBytes[64];
    if (v < 27) {
        v += 27;
    }
    final Sign.SignatureData sd = new Sign.SignatureData(v,
            Arrays.copyOfRange(signatureBytes, 0, 32),
            Arrays.copyOfRange(signatureBytes, 32, 64));
    String addressRecovered = null;
    // Iterate for each possible key to recover
    for (int i = 0; i < 4; i++) {
        final BigInteger publicKey = Sign.recoverFromSignature((byte) i, new ECDSASignature(
                new BigInteger(1, sd.getR()),
                new BigInteger(1, sd.getS())), msgHash);

        if (publicKey != null) {
            addressRecovered = "0x" + Keys.getAddress(publicKey);
            if (addressRecovered.equalsIgnoreCase(address)) {
                match = true;
                break;
            }
        }
    }
    return match;
}

当验签成功后,即实现登录,接下来基本都业务相关代码,自行开发吧!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QML 控件添加键盘事件

在QML中&#xff0c;可以使用Keys类型来处理键盘事件。以下是一个简单的示例&#xff0c;演示如何在QML控件中添加键盘事件&#xff1a; import QtQuick 2.12 import QtQuick.Window 2.12Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Recta…

DFS算法详解及例题

DFS:往深搜索&#xff0c;执着&#xff0c;确认从底下返回后的每个人的节点都已经用完&#xff0c;空间占用少&#xff0c;爆搜。 BFS:每一层搜索&#xff0c;稳重&#xff0c;(当一个图的权重都为1时搜到的一定是最短路) 下面我们以dfs的一道经典例题来讲解 代码: #include…

Ubuntu18.04 安装搜狗输入法

一. 概述 自己的Ubuntu 18.04系统配置中文搜狗输入法&#xff0c;安装步骤&#xff0c;亲测可用 二. 安装步骤 2.1 确认系统版本和CPU架构 查看Ubuntu系统版本号&#xff0c;通过命令 lsb_release -a wuubuntume:~$ lsb_release -a No LSB modules are available. Distr…

基于SpringBoot的“智慧食堂”系统(源码+数据库+文档+PPT)

基于SpringBootVue的智慧食堂系统的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootVUE工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统登录界面图 系统首页界面图 用户注册界面图 菜…

项目总结.

文章目录 1.DDD结构基础2. 抽奖领域3. 发奖领域4.活动领域5. 支撑领域应用层编排 1.DDD结构基础 包含&#xff1a; 接口层、应用层、领域层、基础层&#xff1b;通用包、接口层、接口定义。 接口层&#xff1a;实现RPC接口定义&#xff0c;引入应用层服务&#xff0c;封装具体的…

日期问题 刷题笔记

思路 枚举 19600101 到20591231这个区间的数 获得年月日 判断是否合法 如果合法 关于题目给出的日期 有三种可能 年/月/日 日/月/年 月/日/年 判断 是否和题目给出的日期符合 如果符合 输出 闰年{ 1.被4整除不被100整除 2.被400整除} 补位写法“%02d" 如果不…

【C语言步行梯】自定义函数、函数递归详谈

&#x1f3af;每日努力一点点&#xff0c;技术进步看得见 &#x1f3e0;专栏介绍&#xff1a;【C语言步行梯】专栏用于介绍C语言相关内容&#xff0c;每篇文章将通过图片代码片段网络相关题目的方式编写&#xff0c;欢迎订阅~~ 文章目录 什么是函数库函数自定义函数函数执行示例…

STM32 ADC数模转换器

单片机学习&#xff01; 目录 文章目录 前言 一、ADC简介 1.1 ADC名称 1.2 ADC功能 1.3 分辨率与转换时间 1.4 输入电压与转换范围 1.5 输入通道 1.6 增强功能 1.7 自动监测输入电压范围 1.8 STM32F103C8T6 ADC资源 二、逐次逼近型ADC 2.1 ADC内部结构原理图 2.2 输入通道选择 …

AI 驱动的医疗变革:迈向未来医疗新生态

直面呼啸而来的人工智能&#xff0c;医疗行业将首当其冲&#xff0c;发生翻天覆地的变化。美国心脏病学家兼基因学教授埃里克托普在《未来医疗》中预测&#xff0c;未来人类将拥有“健康小助手”——个人医疗数据和处理能力&#xff0c;还能轻松预防疾病。诸多评论家也持类似观…

Jade 处理XRD并计算半峰宽FWHM、峰面积、峰强度等数据

1.打开软件 2.导入测试的XRD数据 3.平滑数据 4.抠一下基底 5.分析具体数据 6.按住鼠标左键&#xff0c;在峰底部拉一条线&#xff0c;尽量和基底持平 7.结果就出来了&#xff0c;想要的都在里面&#xff0c;直接取值就行

数据分析-Pandas如何观测数据的中心趋势度

数据分析-Pandas如何观测数据的中心趋势度 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据…

Stable Diffusion 模型:从噪声中生成逼真图像

你好&#xff0c;我是郭震 简介 Stable Diffusion 模型是一种生成式模型&#xff0c;可以从噪声中生成逼真的图像。它由 Google AI 研究人员于 2022 年提出&#xff0c;并迅速成为图像生成领域的热门模型。 数学基础 Stable Diffusion模型基于一种称为扩散概率模型(Diffusion P…

16 OpenCV Laplance算子

文章目录 图像的二阶导数Laplance算子代码示例 图像的二阶导数 在二阶导数的时候&#xff0c;最大变化处的值为零即边缘是零值。通过二阶 导数计算&#xff0c;依据此理论我们可以计算图像二阶导数&#xff0c;提取边缘。 Laplance算子 void Laplacian( InputArray src, Output…

Java代码审计安全篇-SSRF(服务端请求伪造)漏洞

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计&#xff0c;记录自己的学习过程&#xff0c;还希望各…

【C++进阶】C++多态概念详解

C多态概念详解 一&#xff0c;多态概念二&#xff0c;多态的定义2.1 多态构成的条件2.2 什么是虚函数2.3 虚函数的重写2.3.1 虚函数重写的特例2.3.2 override和final 2.4 重载和重写&#xff08;覆盖&#xff09;和重定义&#xff08;隐藏&#xff09;的区别 三&#xff0c;抽象…

性能指标:QPS、TPS、系统吞吐量理解

一、QPS&#xff0c;每秒查询 QPS&#xff1a;Queries Per Second意思是“每秒查询率”&#xff0c;是一台服务器每秒能够相应的查询次数&#xff0c;是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。 互联网中&#xff0c;作为域名系统服务器的机器的性能经…

[leetcode~dfs]1261. 在受污染的二叉树中查找元素

给出一个满足下述规则的二叉树&#xff1a; root.val 0 如果 treeNode.val x 且 treeNode.left ! null&#xff0c;那么 treeNode.left.val 2 * x 1 如果 treeNode.val x 且 treeNode.right ! null&#xff0c;那么 treeNode.right.val 2 * x 2 现在这个二叉树受到「污…

02.JavaScript的运算符和语句

JavaScriptt的运算符和语句 一.运算符 算术运算符 数字是用来计算的&#xff0c;比如&#xff1a;乘法 * 、除法 / 、加法 、减法 - 等等&#xff0c;所以经常和算术运算符一起。 算术运算符&#xff1a;也叫数学运算符&#xff0c;主要包括加、减、乘、除、取余&#xff…

python自学7

第二章第一节面向对象 程序的格式都不一样&#xff0c;每个人填写的方式也有自己的习惯&#xff0c;比如收集个人信息&#xff0c;可能有人用字典字符串或者列表&#xff0c; 类的成员方法 类和对象 构造方法 挨个传输值太麻烦了&#xff0c;也没有方便点的&#xff0c;有&…

每日一题——LeetCode2129.将标题首字母大写

方法一 个人方法 将字符串转为数组&#xff0c;遍历数组&#xff0c;对数组的每一个元素&#xff0c;先全部转为小写&#xff0c;如果当前元素长度大于2&#xff0c;将第一个字符转为大写形式 var capitalizeTitle function(title) {titletitle.split( )for(let i0;i<tit…