DApp创建本地钱包并实现签名转账(BSC,Polygon,ETH)

article/2025/9/11 2:53:14

文章目录

    • 1. 项目准备
    • 2. 钱包相关概念
    • 3.随机创建一个钱包
    • 4.根据助记词导入钱包
    • 5.根据keystore导入钱包
    • 6.签名转账

前端创建本地钱包并实现签名转账(BSC,Polygon,ETH)

1. 项目准备

  1. 安装ether.js
npm install --save ethers

引入ether.js:的三种方法

  • es3:
var ethers = require(‘ethers’);
  • es5/es6
const ethers = require(‘ethers’);
  • javascript/typescript es6
import ethers from ‘ethers’;

2. 钱包相关概念

这里默认为你已经了解 地址、密码、私钥、助记词、Keystore 之间的关系,所以不再过多介绍,只列出他们之间的关联:

地址 = 银行卡号密码 = 银行卡密码私钥 = 银行卡号+密码助记词 = 银行卡号+密码Keystore = 加密私钥Keystore + 密码 = 私钥

3.随机创建一个钱包

使用到的ethers的Wallet类:

ethers.Wallet.createRandom()

createRandom 返回一个带有随机私钥的新钱包,由加密安全的熵源生成。如果当前环境没有安全的熵源,则会抛出错误。
使用此方法创建的钱包将具有助记词

  createNewWallet() {let walletRandom = ethers.Wallet.createRandom()// 钱包助记词对象let mnemonic = walletRandom.mnemonic//钱包助记词单词let phrase = mnemonic.phrase//path: "m/44'/60'/0'/0/0",let path = mnemonic.path//钱包地址let address = walletRandom.address//钱包公钥let publicKey = walletRandom.publicKey//钱包私钥let privateKey = walletRandom.privateKey//通过用户设置的密码生成keystore文件let password = "123456"walletRandom.encrypt(password).then((keystory_string) => {let keystory_json = JSON.parse(keystory_string)//钱包的keystore字符串this.keystory = keystory_stringconsole.log(keystory_json)})//可以通过AES对称加密把钱包的助记词加密存储在本地let encryptPassword = "1234qwer"let encryptedPhrase = encryption(phrase, encryptPassword)console.log('加密后的助记词:', encryptedPhrase)let decryptedPhrase = decryption(encryptedPhrase, encryptPassword)console.log('解密后的助记词:', decryptedPhrase)}
import * as CryptoJS from 'crypto-js'//数据对称加密
function encryption(data, password) {let encrypted = CryptoJS.AES.encrypt(data, password);return encrypted.toString()
}//数据解密
function decryption(encrypted, password) {let decrypted = CryptoJS.AES.decrypt(encrypted, password);return decrypted.toString(CryptoJS.enc.Utf8);
}

4.根据助记词导入钱包

  ethers.Wallet.fromMnemonic( mnemonic [ , path , [ wordlist ] ] ) ⇒ Wallet

从助记短语中创建实例。

如果没有指定path,则使用以太坊的默认path路径(如m/44’/60’/0’/0/0).

如果不指定wordlist,则使用English Wordlist。

  async createWalletByPhrase() {//默认路径let path = ethers.utils.defaultPath//要导入的钱包助记词let phrase ='able fee damage express dilemma visit fine claim similar attract awkward market'let mnemonic = ethers.Wallet.fromMnemonic(phrase)//钱包私钥let privateKey = mnemonic.privateKey//通过钱包私钥创建钱包实例let wallet = new ethers.Wallet(privateKey)//钱包公钥let publicKey = wallet.publicKey//钱包地址let address = wallet.address//通过用户设置的密码生成keystore文件let password = "123456"wallet.encrypt(password).then((keystory_string) => {let keystory_json = JSON.parse(keystory_string)let keystory = keystory_stringconsole.log(keystory_json)})}

5.根据keystore导入钱包

ethers.Wallet.fromEncryptedJson( json , password [ , progress ] ) ⇒ Promise< Wallet >source

从加密的JSON钱包创建一个实例。

如果提供了进度,它将在解密期间被调用,其值介于0到1之间,表示一个完成进度。

  createWalletByKeystory() {//要导入的钱包keystorelet keystory ='{"address":"df9e902814baba3ddc6b4a1ac9db11bc79eda07f","id":"60db3db5-ef64-400a-b25e-3615a9bdfa24","version":3,"crypto":{"cipher":"aes-128-ctr","cipherparams":{"iv":"f4c7ece791d112dc408537203aa2bb10"},"ciphertext":"acba3333e3d7078e2186ebd561c28bf0e4a8c105e4b1eec40bec20616441cc31","kdf":"scrypt","kdfparams":{"salt":"f1e8acd43868559c1ecda1c9b31489efd12f6c7c9302710b957a3b779dd6ec54","n":131072,"dklen":32,"p":1,"r":8},"mac":"e466473ae761f98b1f26354e27305ce23e41b5d5c8a5674b65675bdfbf848718"},"x-ethers":{"client":"ethers.js","gethFilename":"UTC--2023-03-25T03-36-38.0Z--df9e902814baba3ddc6b4a1ac9db11bc79eda07f","mnemonicCounter":"e4482220566b9a9f9d821c1352d1708f","mnemonicCiphertext":"7357682acae64479641611e17e1c6473","path":"m/44'/60'/0'/0/0","locale":"en","version":"0.1"}}'//改keystore创建时使用的密码let password = "123456"ethers.Wallet.fromEncryptedJson(keystory, password).then((wallet) => {console.log('wallet实例:', wallet)//钱包地址let address = wallet.address//钱包公钥let publicKey = wallet.publicKey//钱包私钥let privateKey = wallet.privateKey//默认的路径let path = ethers.utils.defaultPath})}

6.签名转账

  async sendTransaction() {//ETH// let network = 'goerli'// let contractAddress = ''//Polygon// let network = 'maticmum'// let contractAddress = ''//BSC// let network = 'https://bsc-dataseed.binance.org/'let network = 'https://data-seed-prebsc-1-s1.binance.org:8545/'let contractAddress = ''//使用Infura作为RPC使用//let projectId = ''// let provider = new ethers.providers.InfuraProvider(network, projectId)let provider = new ethers.providers.JsonRpcProvider(network);let privateKey = '0x0fb9146e20a3bd3497b47de967316c8aa7f83818ddc62429a24774f0df1f8065'let wallet = new ethers.Wallet(privateKey, provider)// let balance = await wallet.getBalance('latest')// console.log('余额:', balance)// console.log('余额:', ethers.utils.formatEther(balance))// console.log(await wallet.getChainId())// return/**//ETH转账let tx = {to: '',value: ethers.utils.parseEther('0.001'),chainId: ethers.BigNumber.from('5').toHexString()}let res = await wallet.sendTransaction(tx)console.log(res)*//***//使用signers进行ERC20转账let contract = new ethers.Contract(contractAddress, GBK.abi, wallet)console.log(contract)let balance = await contract.balanceOf(wallet.address)balance = ethers.utils.formatEther(balance)console.log(balance)let res = await contract.transfer('', ethers.utils.parseUnits('1'))console.log(res)*/}

http://chatgpt.dhexx.cn/article/PBROeh8D.shtml

相关文章

使用ethers.js开发以太坊Web钱包 - 将私钥保存在客户端

为什么需要 Keystore 文件 通过这篇文章理解开发HD 钱包涉及的 BIP32、BIP44、BIP39&#xff0c;私钥其实就代表了一个账号&#xff0c;最简单的保管账号的方式就是直接把私钥保存起来&#xff0c;如果私钥文件被人盗取&#xff0c;我们的数字资产将洗劫一空。 Keystore 文件就…

CEX暴雷怎么办 一文读懂加密钱包产业现状

你的钱其实并不在你的借记卡里&#xff0c;借记卡只是授权你的银行帐户向银行系统数据库发送交易。同样&#xff0c;你的代币也并不在你的加密钱包里。加密钱包只是持有私有密钥以证明对数字资产的所有权&#xff0c;而这些资产是存储在公共区块链网络上的。私钥能让你对加密钱…

区块链隐私保护文献 An Efficient NIZK Scheme for Privacy-Preserving Transactions over Account-Model Blockchain

读&#xff1a;An Efficient NIZK Scheme for Privacy-Preserving Transactions over Account-Model Blockchain 本文的目的 找到一种适用于轻量级设备及智能合约的高效零知识证明 前人的工作 不能直接迁移UTXO模型的隐私保护方案的原因 在考虑用户余额的隐私时&#xff0…

最新消息,我的Zcash钱包收到鱼池的ZEC打款了

最新消息&#xff0c;我的Zcash钱包收到鱼池的ZEC打款了 有图有真相哈&#xff0c;竟然价值17元啊&#xff0c;哈哈&#xff0c;看到钱途了。。。 如果你们需要测试打款的&#xff0c;可以往我Zcash钱包打款哈 我的Zcash钱包地址&#xff1a;t1PH7xk25VYdJcR5TnkEuEq8jpsiQ…

区块链钱包—BTC Java版离线签名交易

对于离线交易不做过多解释~&#xff0c;说白了就是拿上一笔未发出交易记录进行私钥的签名然后广播到链上。 主要是对区块链离线交易进行utxo上链。 代码参考&#xff1a; https://gitee.com/DHing/signature-transaction UnspentUtxo交易查询参考&#xff1a;https://blog.c…

Zcash钱包(ZEC钱包)官方客户端常见命令实测(一)

一、如何查询链接节点 $ ./src/zcash-cli getpeerinfo 二、如何获取一个 t- 开头的钱包地址 $ ./src/zcash-cli getnewaddress 三、如何获取一个 z- 开头的钱包地址 $ ./src/zcash-cli z_getnewaddress

通过代码生成以太坊助记词、根据钱包地址获取私钥

生成助记词、公私钥 新建一个目录 在目录下执行 npm init &#xff08;需安装nodejs&#xff09;nodejs中文官网 安装依赖 &#xff08;没有yarn的需要安装&#xff0c;直接执行 npm install -g yarn&#xff09; yarn add bip39 ethereum-hdwallet 在目录下新建js文件 将下…

windows下的Zcash钱包(ZEC钱包)-zcash4win 1.0.12

官方下载地址&#xff1a;https://zcash4win.com/ 百度云盘下载地址&#xff1a;https://pan.baidu.com/s/1i46zcSt 密码: by6b QQ群交流分享&#xff1a;480956296

windows下的Zcash钱包(ZEC钱包)-zcash4win 1.0.11

官方下载地址&#xff1a;https://zcash4win.com/ 下载完后&#xff0c;直接下一步下一步&#xff0c;安装即可 技巧&#xff1a; 1、安装好后打开&#xff0c;开始下载文件&#xff0c;然后关闭 2、下载这两个文件&#xff1a;https://s3.amazonaws.com/zcashfinalmpc/sprou…

可能最详细的教程,新手如何获取Zcash钱包(ZEC钱包)官方客户端地址的方法

折腾了2天&#xff0c;终于折腾出了Zcash的官方地址了&#xff08;非第三方交易平台的&#xff09; 先上个图&#xff0c;有图有真相嘛&#xff0c;哈哈&#xff0c;图片有水印&#xff0c;看下面那个命令也是获取钱包地址的 好了&#xff0c;开始上教程&#xff0c;我这边使用…

今天终于找到了一款windows下的Zcash钱包(ZEC钱包),推荐给大家

折腾了好几天&#xff0c;想说下linux真心不适合我这类新人&#xff0c;所以导出百度&#xff0c;终于在官网看到一个链接 MacOS&#xff0c;想来这个应该是苹果系统的&#xff0c;有苹果&#xff0c;肯定也会有Windows的&#xff0c;于是点进去继续淘宝 后台请教朋友&#xff…

可能最详细的教程,新手如何获取Zcash钱包(ZEC)官方地址的方法

折腾了2天&#xff0c;终于折腾出了Zcash的官方地址了&#xff08;非第三方交易平台的&#xff09; 先上个图&#xff0c;有图有真相嘛&#xff0c;哈哈&#xff0c;图片有水印&#xff0c;看下面那个命令也是获取钱包地址的 好了&#xff0c;开始上教程&#xff0c;我这边使用…

Python中使用中文正则表达式匹配指定的中文字符串

业务场景&#xff1a; 从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下. 难点: 处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发挥作用,必须非常谨慎.推荐最好统一为utf8编码,如果不是这种最优情况,也有酌…

验证中文名字---正则表达式

验证中文名字—正则表达式 效果 正确演示 错误演示 运用知识点 正则表达式 ps http://www.bejson.com/convert/unicode_chinese/ unicode编码&#xff08;了解&#xff09; 打开浏览器 F12 控制台 输入 escape(“淦”) unescape("%u6DE6") 在这里插入图片描…

在js中用正则匹配中文

在JavaScript中&#xff0c;用正则表达式如何匹配中文字符&#xff08;包括繁体、简体&#xff09;&#xff1f; 答案就是用中文字符集来匹配&#xff0c;中文字符集为[\u4e00-\u9fa5] <!DOCTYPE html> <!-- 文档申明&#xff1a;让浏览器用H5的标准解析当前网页 --…

正则表达式 判断是否是中文

&#xff08;一&#xff09;字母、数字、下划线、汉字正则表达式 1. 只有字母、数字和下划线且不能以下划线开头和结尾的正则表达式&#xff1a;^(?!_)(?!.*?_$)[a-zA-Z0-9_]$ 只有字母和数字的&#xff1a; ^[a-zA-Z0-9_]$ 2. 至少一个汉字、数字、字母、下划线: &qu…

正则中文匹配

这篇文章主要讲如何使用正则匹配中文字符&#xff0c;中文正则表达式的匹配规则不像其他正则规则一样容易记住&#xff0c;下面一起看看这个中文正则表达式是怎么样的。 \w匹配的仅仅是中文&#xff0c;数字&#xff0c;字母&#xff0c;对于国人来讲&#xff0c;仅匹配中文…

js正则中文

hi&#xff0c;大家好   今天跟小伙伴们浅谈以下如何用正则表示中文以及如何去运用。众所周知中文在计算机中是不能进行存储的。那我们是以什么办法让我们和计算机进行更好的沟通呢&#xff1f; 常用的几种中文编码格式 utf-8编码   utf-8又称“万国码”&#xff0c;可以同…

python正则如何匹配中文汉字

正则表达式匹配中文汉字&#xff0c;在实际应用中十分常见。 比如&#xff1a;爬虫网页文本提取、验证用户输入标准等。 以下面文本字符串为例&#xff0c;匹配出astr这个字符串中的所有汉字。 import re astr aaaaa何时when 杖尔看see南雪snow&#xff0c;我me与梅花plum bl…

Guava: Joiner

Joiner 字符串拼接对象 on 基本实例 Joiner.on(" ").join("四川省","成都市","金牛区").toString() 1 on 以空格为分隔符join内是拼接的对象:迭代器对象、数组、可变参数等 result 四川省 成都市 金牛区 1 特殊处理 动态拼接…