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

导入钱包
通过插件提供方法,根据助记词|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. windows 搭建 IBM Hyperledger Fabric(超级账本)开发环境

    一.概述 Hyperledge fabric项目是IBM开源的区块链项目.Github地址:https://github.com/hyperledger/fabric 想对fabric有具体的认识,可 ...

  2. 在MFC中通过访问IP地址下载文件到本地

    void CDownLoad::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 CDialogEx::OnOK(); UpdateData(TRUE); CStri ...

  3. 【最小生成树+贪心】BZOJ1821: [JSOI2010]Group 部落划分 Group

    Description 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成 ...

  4. BZOJ_1598_[Usaco2008 Mar]牛跑步_A*

    BZOJ_1598_[Usaco2008 Mar]牛跑步_A* Description BESSIE准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘, 然后走回牛棚. B ...

  5. CAN总线的显性电平与隐性电平

    读CAN总线的书时,都会涉及到总线电平的问题,CAN总线的电平分为显性电平与隐性电平,这是CAN总线物理层的核心部分,也是总线仲裁的基础.那何为显性,何为隐性呢? 根据孔丙火(微信公众号:孔丙火)的理 ...

  6. 关于Python元祖,列表,字典,集合的比较

      定义 方法 列表 可以包含不同类型的对象,可以增减元素,可以跟其他的列表结合或者把一个列表拆分,用[]来定义的 eg:aList=[123,'abc',4.56,['inner','list'], ...

  7. 大数据小视角2:ORCFile与Parquet,开源圈背后的生意

    上一篇文章聊了聊基于PAX的混合存储结构的RCFile,其实这里笔者还了解一些八卦,RCfile的主力团队都是来自中科院的童鞋在Facebook完成的,算是一个由华人主导的编码项目.但是RCfile仍 ...

  8. 点击a标签实现txt文件另存的效果

    亲测成功,使用servlet实现的,核心代码: 前台代码: function downModel(filePath){ var formFile=$("<form>") ...

  9. 10位时间戳使用moment转化为日期

    前情提要: 需要把后台传过来的10位时间戳转化格式为:‘YYYY-MM-DD HH:mm:ss’的日期展示在页面上.本来是自己写了个函数,但是奈何leader说我们项目用了moment了,你为什么不用 ...

  10. Vue.js-09:第九章 - 组件基础再探(data、props)

    一.前言 在上一章的学习中,我们学习了 Vue 中组件的基础知识,知道了什么是组件,以及如何创建一个全局/局部组件.不知道你是否记得,在上一章中,我们提到组件是一个可以复用的 Vue 实例,它与 Vu ...