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

news2025/1/16 5:44:28

上一节我们讲了如何通过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;
}

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

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

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

相关文章

跟着GPT学设计模式之桥接模式

说明 桥接模式&#xff0c;也叫作桥梁模式&#xff0c;英文是 Bridge Design Pattern。在 GoF 的《设计模式》一书中&#xff0c;桥接模式是这么定义的&#xff1a;“Decouple an abstraction from its implementation so that the two can vary independently。”翻译成中文就…

我真是服了!你们刚开始学习的时候也是造火箭吗?能不能有一个简单的纯纯纯html模板给我学学,真的看不懂好嘛!

做一个个人博客第一步该怎么做&#xff1f; 好多零基础的同学们不知道怎么迈出第一步。 那么&#xff0c;就找一个现成的模板学一学呗&#xff0c;毕竟我们是高贵的Ctrl c v 工程师。 但是这样也有个问题&#xff0c;那就是&#xff0c;那些模板都&#xff0c;太&#xff01;…

弧形导轨的设计要求

制造业设备种类越来越多&#xff0c;非标自动化设备渐渐成了主力市场&#xff0c;其中弧形导轨线体作为非标自动化运输中的基石&#xff0c;承担了运输&#xff0c;定位&#xff0c;特殊工位组装&#xff0c;其设计要求也非常严格。 1、精度要求&#xff1a;弧形导轨需要具备高…

大数据 - HBase《一》- Hbase基本概念

目录 1.1. Hbase简介 1.2 Hbase,Hive, Mysql对比 1.3 Hbase数据模型 &#x1f959;region(区域) &#x1f959;rowkey(行键) &#x1f959;列族&#xff08;column family) &#x1f959;列&#xff08;column Qualifier) &#x1f959;版本&#xff08;version)-默认按…

如何仅用3行代码,搞定业务敏感数据加解密?

01 引子&#xff1a;一个数据安全的故事 一个风和日丽的早上&#xff0c;某家快递物流公司内。 &#xfeff;张老板看着电脑屏幕&#xff0c;眉头紧锁。电脑屏幕上赫然写着&#xff0c;“疑似45亿条个人信息泄露&#xff0c;电商物流行业数据安全警铃再响”。据传&#xff0c;…

代码学习记录18

随想录日记part18 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.13 主要内容&#xff1a;今天的主要内容是二叉树的第七部分&#xff0c;主要涉及二叉搜索树的最近公共祖先 &#xff1b;二叉搜索树的最近公共祖先&#xff1b;删除二叉搜索树中的节点 。 23…

国内使用GPT4的5种解决方案,最后一个是全场最佳

ChatGPT4是目前世界上最先进的自然语言处理模型 大家都知道ChatGPT4特别好用 我个人来说&#xff0c;基本上每天都会用GPT来查资料、写代码和润色文章 但是在国内&#xff0c;使用ChatGPT4&#xff0c;是有一定门槛的 门槛一 mo法问题 ChatGPT的网站&#xff0c;国内是无法访问…

javaEE13(网站第8章两个课后题)

1、对“jspservletjavabean实现分页查询”功能做如下补充&#xff1a; &#xff08;1&#xff09;记录批量删除&#xff1a;每个记录前添加复选框&#xff0c;点击批量删除&#xff0c;删除选中记录。 增加跳转到任意页功能。用户可改变每页记录条数。 页面&am…

ImportError: Plotly express requires pandas to be installed.

在 Python3 环境下&#xff0c;使用 plotly 绘图时&#xff0c;发生了如下错误&#xff1a; ImportError: Plotly express requires pandas to be installed. 通过排查发现是使用了折行导入时报错的&#xff1a; import plotly.express as px 通过检索找到了解决办法&#xff0…

VScode Error Lens插件

安装完成之后&#xff0c;当我们输入一些错误的语法格式的时候&#xff0c;它都会有一些提示&#xff01; 一开始是英文提示 修改为中文提示 设置搜索 typescript.local

【gpt实践】李某的AI课程值199吗

先说个人的答案&#xff1a;不值。但也不是说毫无价值&#xff0c;只是他的价值没那么高。 文末分享该课程&#xff0c;大家有兴趣可以看看&#xff0c;该课程是否有价值。 “清华博士”推出的199元的AI课程销售额竟然突破了5000万。这一数字让人惊叹&#xff0c;也引发了人们…

免费AI软件开发工具测评:iFlyCode VS CodeFlying

前言 Hello&#xff0c;各位看官&#xff0c;今天为大家带来两款人工智能的软件开发工具的测评&#xff0c;他们分别是iFlyCode和CodeFlying&#xff0c;我相信当大家看到这两款产品名字的时候不禁都会有些好奇&#xff0c;两个产品都有Code 和Fly两个元素&#xff0c;那他们之…

Consul 配置持久化

当我们在consul的key-value中配置了几个字段 访问后的结果: 但是当我们在控制台输入命令重启consul服务后: consul agent -dev 刚刚设置的key-value值便消失不见了 此时就要进行 consul 持久化配置. 第一步:在consul文件夹下创建 1.空文件夹mydata 2.新建文件consul_star…

电脑截图的方式有哪些?

针对使用电脑截图&#xff0c;可以下个截图软件&#xff0c;到目前位置感觉用得不错的是Snipaste这一款&#xff0c;看下图所示。下载链接 Snipaste - 截图 贴图 需要根据自己的电脑配置&#xff0c;选择下载对应的版本。就不详细介绍怎么安装了。 具体操作&#xff1a;在电脑…

在linux上部署yolov5和安装miniconda3

第一步&#xff1a;安装miniconda3 官网&#xff1a;Miniconda — Anaconda documentation 这四个命令快速而安静地安装最新的64位版本的安装程序&#xff0c;然后自行清理。要为Linux安装Miniconda的不同版本或体系结构&#xff0c;请在wget命令中更改.sh安装程序的名称。 …

安卓 OpenGL ES 学习笔记

文章目录 OpenGL 学习笔记OpenGL 是什么&#xff1f;OpenGL ES是什么&#xff1f;怎么用&#xff1f;hello world如何实现动画效果 参考文章 OpenGL 学习笔记 OpenGL 是什么&#xff1f; OpenGL&#xff08;Open Graphics Library&#xff09;是一个跨平台的图形编程接口&…

MySQL8 设置大小写敏感

问题描述 今天对我本地的数据库迁移服务器上&#xff0c;完成之后启动项目报错 说数据库中不存在 quartz_LOCKS 这张表 我打开服务器上面的数据上面展示的表名是 quartz_LOCKS&#xff0c;然后通过查询 lower_case_table_names 配置可知 show variables like lower_case_tabl…

图片格式转换怎么操作?这一个方法快快收藏

图片格式转换能够改变图片的质量、大小兼容性。不同的图片格式用途也不同&#xff0c;当我们需要转换图片格式的时候要怎么操作呢&#xff1f;下面&#xff0c;小编给大家分享一款操作简单&#xff0c;小白也能轻松上手的图片转换器&#xff08;https://www.yasuotu.com/geshi&…

[ThinkPHP]Arr返回1

$detailId (int)Arr::get($detail, null); var_dump($detailId); 打印结果&#xff1a;int(1) 原因&#xff1a; vendor/topthink/think-helper/src/helper/Arr.php

Spring启动“--”设置参数没生效

现象 在idea中启动SpringBoot项目时&#xff0c;使用“--”设置的启动参数没有生效&#xff0c;如修改端口号“--server.port8082” 原因 排查发现是因为在使用SpringApplication.run启动项目时&#xff0c;没有将args参数传入run方法。 修复方案 SpringApplication.run参数中…