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

导入钱包
通过插件提供方法,根据助记词|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. vue.js小总结

    Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统; 指令带有前缀 v-,以表示它们是 Vue 提供的特殊特性; v-for 指令可以绑定数组的数据来渲染一个项目列 ...

  2. python:解析js中常见的 不带引号的key的 json

    首先要明晰一点,json标准中,key是必须要带引号的,所以标准json模块解析不带引号的key的 json就会抛错 不过有一些lib可以帮我们解析 如:demjson(链接) >>> ...

  3. scapyd部署出现的问题的解决方案

    使用scrapyd-deploy部署时,发现spiders为0的排查,首先用 scrapy list 看一下是否可以识别 windows下 scrapyd-deploy无后缀文件不能启动: 解决方案一 ...

  4. Python3 venv 创建虚拟环境

    简介 Python3.3以上的版本通过venv模块原生支持虚拟环境,可以代替Python之前的virtualenv. 该venv模块提供了创建轻量级"虚拟环境",提供与系统Pyth ...

  5. 时间戳转换成时间js(年-月-日,例如“2017-04-22”)

    function GetDateByShiJianChuo(timespan) { var date = new Date(parseInt(timespan.replace("/Date( ...

  6. 记录一波由会话堵塞导致tomcat应用故障事件

    一.故障基本信息 发生时间 消除时间 故障历时 故障类别 影响 2018-5-17 18:14:30 2018-05-18 08:58:15 16小时 应用故障 业务瘫痪,用户投诉 二.故障现象 AP ...

  7. xamarin android网络请求总结

    xamarin android中网络请求的框架非常多,在项目中使用的是第三方的一个网络请求框架restsharp,应该是github上.net网络请求最多star的框架,没有之一.这里就简单汇总了其他 ...

  8. 转载iOS开发中常见的警告及错误

    iOS警告收录及科学快速的消除方法     前言:现在你维护的项目有多少警告?看着几百条警告觉得心里烦么?你真的觉得警告又不是错误可以完全不管么? 如果你也被这些问题困惑,可以和我一起进行下面的操作. ...

  9. iOS 8 中如何集成 Touch ID 功能

    2013年9月,苹果为当时发布的最新iPhone产品配备了一系列硬件升级方案.在iPhone 5s当中,最具创新特性的机制无疑要数围绕Home按钮设计的超薄金属圈,也就是被称为Touch ID的指纹传 ...

  10. Opencv(C++)实现二阶线性插值

    #include<opencv2\opencv.hpp> #include<iostream> using namespace cv; using namespace std; ...