创建钱包
创建钱包流程: 生成随机助记词 => 通过助记词创建钱包=>钱包信息和加密明文(私钥和密码加密)

导入钱包
通过插件提供方法,根据助记词|keyStore|私钥,找到钱包信息(地址和私钥)=>钱包信息和加密明文(私钥和密码加密)AES加密存入localStorage

生成记忆助词

var mnemonic = ethers.utils.HDNode.entropyToMnemonic(ethers.utils.randomBytes());

创建钱包

  if (!ethers.utils.HDNode.isValidMnemonic(mnemonic)) {
result.success = false;
result.message = "mnemonic Invalid";
} else {
var wallet = ethers.Wallet.fromMnemonic(mnemonic);
result.data = {
privateKey: wallet.privateKey,
path: wallet.path,
address: wallet.address,
mnemonic: mnemonic
}

找回钱包

 if (req.body.type == "privateKey") {//根据私钥
var wallet = new ethers.Wallet(req.body.data);
result.data = wallet.address
} else {//根据记忆帮词
var mnemonic = ethers.Wallet.fromMnemonic(req.body.data);
var wallet = new ethers.Wallet(mnemonic.privateKey);
result.data = wallet.address;
}

源码

inde.html

<!DOCTYPE html>
<html lang="zh-CN"> <head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>new a wallet</title>
<style>
.input-group{
margin-bottom: 10px;
}
</style>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
</head> <body>
<div class="container">
<div class="page-header">
<h1>x-wallet demo</h1>
</div> <div class="row">
<h3>new a wallet</h3>
<div class="col-12">
<div class="input-group">
<span class="input-group-addon text-primary" id="generate-mnemonic">generate mnemonic</span>
<input id="mnemonic" type="text" class="form-control" aria-describedby="generate-mnemonic">
<div class="input-group-btn">
<button id="GenerateMnemonic" class="btn btn-primary" type="submit">create</button>
</div>
</div>
</div>
<div class="col-12">
<div class="input-group">
<span class="input-group-addon text-primary">create a wallet</span>
<input type="text" class="form-control" disabled id="new-wallet">
<div class="input-group-btn">
<button id="createWallet" class="btn btn-primary" type="submit">create</button>
</div>
</div>
</div>
<div class="col-12">
<p id="wallet-content">
<p>
</div>
<h3>Retrieve the wallet</h3>
<div class="col-12">
<div class="input-group">
<span class="input-group-addon text-primary" id="group-by-privateKey">Group by privateKey</span>
<input id="retrieve-privateKey" type="text" class="form-control" aria-describedby="group-by-privateKey">
<div class="input-group-btn">
<button id="retrieve-waller-privateKey" class="btn btn-primary" type="submit">Retrieve</button>
</div>
</div>
</div>
<div class="col-12">
<div class="input-group">
<span class="input-group-addon text-primary" id="group-by-mnemonic">Group by mnemonic</span>
<input id="retrieve-mnemonic" type="text" class="form-control" aria-describedby="group-by-mnemonic">
<div class="input-group-btn">
<button id="retrieve-waller-mnemonic" class="btn btn-primary" type="submit">Retrieve</button>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
<script type="text/javascript">
$(function () {
$("#GenerateMnemonic").on('click', function () {
$.post("http://localhost:8888/generateMnemonic", {}, function (res) {
var mnemonic = $('#mnemonic');
mnemonic.val(res.data);
})
}) $("#createWallet").on('click', function () {
$.post("http://localhost:8888/createWallet", {
mnemonic: $('#mnemonic').val()
}, function (res) {
if (res.success) {
$("#wallet-content").html("address:" + res.data.address + "<br/>" +
"privateKey:" + res.data.privateKey + "<br/>" +
"mnemonic:" + res.data.path + "<br/>");
}
$("#new-wallet").val(res.data.address);
})
}) $('#retrieve-waller-privateKey').on('click', function () {
$.post("http://localhost:8888/retrieveWallet", {
type: "privateKey",
data: $("#retrieve-privateKey").val()
}, function (res) {
if (res.success) {
alert("wallet:" + res.data);
}
})
}) $('#retrieve-waller-mnemonic').on('click', function () {
$.post("http://localhost:8888/retrieveWallet", {
type: "mnemonic",
data: $("#retrieve-mnemonic").val()
}, function (res) {
if (res.success) {
alert("wallet:" + res.data);
}
})
}) })
</script>
</body> </html>

app.js

var express = require('express');
var ethers = require('ethers');
var app = express();
var bodyParser = require('body-parser');
var urlencodedParser = bodyParser.urlencoded({
extended: false
}) app.use(express.static('public')); app.get('/', function (req, res) {
res.sendFile(__dirname + "/app/index.html");
})
app.post('/generateMnemonic', urlencodedParser, function (req, res) {
var mnemonic = ethers.utils.HDNode.entropyToMnemonic(ethers.utils.randomBytes());
var result = {
success: true,
message: "success",
data: mnemonic
} res.send(result);
res.end();
}) app.post('/createWallet', urlencodedParser, function (req, res) {
var result = {
success: true,
message: "success",
data: null
}
var mnemonic = req.body.mnemonic;
if (!ethers.utils.HDNode.isValidMnemonic(mnemonic)) {
result.success = false;
result.message = "mnemonic Invalid";
} else {
var wallet = ethers.Wallet.fromMnemonic(mnemonic);
result.data = {
privateKey: wallet.privateKey,
path: wallet.path,
address: wallet.address,
mnemonic: mnemonic
}
}
res.send(result);
res.end();
}) app.post('/retrieveWallet', urlencodedParser, function (req, res) {
var result = {
success: true,
message: "success",
data: null
}
if (req.body.type == "privateKey") {
var wallet = new ethers.Wallet(req.body.data);
result.data = wallet.address
} else {
var mnemonic = ethers.Wallet.fromMnemonic(req.body.data);
var wallet = new ethers.Wallet(mnemonic.privateKey);
result.data = wallet.address;
}
res.send(result);
res.end();
}) var server = app.listen(, function () {
var host = server.address().address
var port = server.address().port
console.log("server start port:" + port)
})

效果:

此随笔乃本人学习工作记录,如有疑问欢迎在下面评论,转载请标明出处。

如果对您有帮助请动动鼠标右下方给我来个赞,您的支持是我最大的动力。

nodejs 使用 ethers创建以太坊钱包的更多相关文章

  1. (转)以太坊 钱包 创建 导入 Keystore

    最近闲来无事 研究了下以太坊钱包 下边分享下 准备工作 : 需要用到的加密:BIP32 BIP39 BIP44 SCRYPT 加密算法 githab地址 https://github.com/Nova ...

  2. 以太坊钱包Geth使用命令

    一.启动以太坊钱包Geth 打开一个控制台,执行同步区块命令 #同步测试链geth --fast --cache=512 --rpc --rpcapi personal,db,eth,net,web3 ...

  3. [币严区块链]数字货币交易所之以太坊(ETH)钱包对接(四) 使用web3j对接以太坊钱包

    本文给大家介绍了 Web3j Java 版本的框架的基本使用,大家可根据本文的内容进行扩展性的练习,对其他 API 的使用进行尝试. 使用web3j对接以太坊钱包 一.开发准备事项 启动 Geth 此 ...

  4. 一键创建以太坊ERC20代币教程

    30秒极速创建以太坊ERC20代币 傻瓜式创建,界面化创建,自动创建代币,简单好用 合约采用新版 5.10 新版合约编译器,合约代码100%安全无任何漏洞 下面是详细的使用和创建教程 1.点击创建ER ...

  5. PPT分享 | 以太坊钱包分析与介绍

    艾伯特AI人工智能(公众号:aibbtcom)按: (编者按:本文为姗姗来迟的Meetup系列推文.12月3日,林修平在亚太区以太坊社区培训与交流Meetup深圳站上跟我们分享了他对以太坊各种钱包模式 ...

  6. c#实战开发:用.net core开发一个简单的Web以太坊钱包 (六)

    今天就来开发一个C# 版的简易钱包 先回顾以前的内容 c#实战开发:以太坊Geth 命令发布智能合约 (五) c#实战开发:以太坊Geth 常用命令 (四) c#实战开发:以太坊钱包快速同步区块和钱包 ...

  7. 牛奶ddw如何通过以太坊钱包实现互相打赏

    很多朋友不清楚如何转账ddw,但是万能的网友是无敌的,这两天就自己摸索的一点经验总结下今天的转账经验. 1. 提取到自己的账户 这个大家都知道如何操作,使用官方的钱包 在“日日盈app”中点击&quo ...

  8. 以太坊钱包开发系列4 - 发送Token(代币)

    以太坊去中心化网页钱包开发系列,将从零开始开发出一个可以实际使用的钱包,本系列文章是理论与实战相结合,一共有四篇:创建钱包账号.账号Keystore文件导入导出.展示钱包信息及发起签名交易.发送Tok ...

  9. 以太坊钱包开发系列2 - 账号Keystore文件导入导出

    以太坊去中心化网页钱包开发系列,将从零开始开发出一个可以实际使用的钱包,本系列文章是理论与实战相结合,一共有四篇:创建钱包账号.账号Keystore文件导入导出.展示钱包信息及发起签名交易.发送Tok ...

随机推荐

  1. 创建本地数据库mySQL并连接JDBC

    转自: http://blog.csdn.net/wei_chong_chong/article/details/44830491 如何创建本地数据库MySQL并连接JDBC 转载 2015年04月0 ...

  2. hibernate MTM 联合主键

    //适用于表里没有其他列,只有主键 //Course.java实体类 package com.tao.pojo; import java.util.HashSet; import java.util. ...

  3. 【LOJ #6094. 「Codeforces Round #418」归乡迷途】

    题目大意: 传送门. lca说的很明白就不重复了. 题解: 先膜一发lca. 大体读完题以后我们可以知道对于第i个节点最短路一定是连向1到i-1中的某个点. 然后我们考虑将到1距离(这里及以下均是最短 ...

  4. BZOJ_1180_[CROATIAN2009]OTOCI_LCT

    BZOJ_1180_[CROATIAN2009]OTOCI_LCT Description 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作:  1.bridge A ...

  5. 正则表达式(Regular expressions)使用笔记

    Regular expressions are a powerful language for matching text patterns. This page gives a basic intr ...

  6. create react app 项目部署在Spring(Tomcat)项目中

    网上看了许多,大多数都是nginx做成静态项目,但是这样局限性太多,与Web项目相比许多服务端想做的验证都很麻烦,于是开始了艰难的探索之路,终于在不经意间试出来了,一把辛酸... 正常的打包就不说了. ...

  7. 基于Java实现红黑树的基本操作

    首先,在阅读文章之前,我希望读者对二叉树有一定的了解,因为红黑树的本质就是一颗二叉树.所以本篇博客中不在将二叉树的增删查的基本操作了,需要了解的同学可以到我之前写的一篇关于二叉树基本操作的博客:htt ...

  8. LeetCode算法题-Unique Morse Code Words(Java实现)

    这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...

  9. 微服务架构 - 巧妙获取被墙的Docker镜像

    在国内由于种种原因,有些Docker镜像直接是获取不到的,特别是k8s中的一些镜像.本人在部署k8s中的helm组件时需要获取tiller镜像,如果直接用如下命令: docker pull gcr.i ...

  10. angular2-7中的变化监测

      最近做公司新项目用的angular7,中碰到了一个很头疼的问题在绑定对象中的数据改变时,页面视图没有跟新,需点击页面中的时间元素后才会更新.以前使用angularJs也经常碰到类似情况,这种时候一 ...