nodejs 使用 ethers创建以太坊钱包
创建钱包
创建钱包流程: 生成随机助记词 => 通过助记词创建钱包=>钱包信息和加密明文(私钥和密码加密)
导入钱包
通过插件提供方法,根据助记词|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创建以太坊钱包的更多相关文章
- (转)以太坊 钱包 创建 导入 Keystore
最近闲来无事 研究了下以太坊钱包 下边分享下 准备工作 : 需要用到的加密:BIP32 BIP39 BIP44 SCRYPT 加密算法 githab地址 https://github.com/Nova ...
- 以太坊钱包Geth使用命令
一.启动以太坊钱包Geth 打开一个控制台,执行同步区块命令 #同步测试链geth --fast --cache=512 --rpc --rpcapi personal,db,eth,net,web3 ...
- [币严区块链]数字货币交易所之以太坊(ETH)钱包对接(四) 使用web3j对接以太坊钱包
本文给大家介绍了 Web3j Java 版本的框架的基本使用,大家可根据本文的内容进行扩展性的练习,对其他 API 的使用进行尝试. 使用web3j对接以太坊钱包 一.开发准备事项 启动 Geth 此 ...
- 一键创建以太坊ERC20代币教程
30秒极速创建以太坊ERC20代币 傻瓜式创建,界面化创建,自动创建代币,简单好用 合约采用新版 5.10 新版合约编译器,合约代码100%安全无任何漏洞 下面是详细的使用和创建教程 1.点击创建ER ...
- PPT分享 | 以太坊钱包分析与介绍
艾伯特AI人工智能(公众号:aibbtcom)按: (编者按:本文为姗姗来迟的Meetup系列推文.12月3日,林修平在亚太区以太坊社区培训与交流Meetup深圳站上跟我们分享了他对以太坊各种钱包模式 ...
- c#实战开发:用.net core开发一个简单的Web以太坊钱包 (六)
今天就来开发一个C# 版的简易钱包 先回顾以前的内容 c#实战开发:以太坊Geth 命令发布智能合约 (五) c#实战开发:以太坊Geth 常用命令 (四) c#实战开发:以太坊钱包快速同步区块和钱包 ...
- 牛奶ddw如何通过以太坊钱包实现互相打赏
很多朋友不清楚如何转账ddw,但是万能的网友是无敌的,这两天就自己摸索的一点经验总结下今天的转账经验. 1. 提取到自己的账户 这个大家都知道如何操作,使用官方的钱包 在“日日盈app”中点击&quo ...
- 以太坊钱包开发系列4 - 发送Token(代币)
以太坊去中心化网页钱包开发系列,将从零开始开发出一个可以实际使用的钱包,本系列文章是理论与实战相结合,一共有四篇:创建钱包账号.账号Keystore文件导入导出.展示钱包信息及发起签名交易.发送Tok ...
- 以太坊钱包开发系列2 - 账号Keystore文件导入导出
以太坊去中心化网页钱包开发系列,将从零开始开发出一个可以实际使用的钱包,本系列文章是理论与实战相结合,一共有四篇:创建钱包账号.账号Keystore文件导入导出.展示钱包信息及发起签名交易.发送Tok ...
随机推荐
- Python cmp() 函数
描述 cmp(x,y) 函数用于比较2个对象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1. 语法 以下是 cmp() 方法的语法:cmp( ...
- java正则使用方法
import java.util.regex.Matcher;import java.util.regex.Pattern; public class RegexMatches{ public ...
- java中&和&& | 和||的区别
我想很多人在学习java的时候,或者其他语言(如:C#,.Net等)都会遇到 &和&& 然而,如果你没有真正的理解他们的意思,这会给你思路上面带来很大的麻烦 在这篇blog中, ...
- 关于table表格 td里内容较多换行的处理方法
最近在用table的时候由于td内容较多默认换行了,很不美观.于是找到处理方法: 在声明table的时候添加一个样式: <table id="tbOffice" data-r ...
- MIP 技术交流分享(3月15日)
3月15日下午,MIP 团队工程师与58赶集的 Web 前端工程师进行了一次面对面的技术交流. 在这次交流中,MIP 工程师主要分享了 MIP 技术原理,MIP 加速原理,以及 MIP 为开发者提供的 ...
- Apache Mina -2
我们可以了解到 mina是个异步通信框架,一般使用场景是服务端开发,长连接.异步通信使用mina是及其方便的.不多说,看例子. 本次mina 使用的例子是使用maven构建的,过程中需要用到的jar包 ...
- pytest进阶之配置文件
前言 pytest配置文件能够改变pytest框架代码的运行规则.比如修改pytest收集用例的规则,添加命令行参数等等!下面我们来一一讲解常用的一些配置项 Help 通过命令pytest --hel ...
- 深度召回模型在QQ看点推荐中的应用实践
本文由云+社区发表 作者:腾讯技术工程 导语:最近几年来,深度学习在推荐系统领域中取得了不少成果,相比传统的推荐方法,深度学习有着自己独到的优势.我们团队在QQ看点的图文推荐中也尝试了一些深度学习方法 ...
- web项目自定义路由_实现静态资源URL控制
前言: IIS会默认把:图片.JS.HTML.CSS这些文件当成静态资源处理,为了减少服务器压力,默认这些静态资源是不走URL路由规则控制的. 作为小白及初学者,本人对这些了解甚少,补充基础知识吧: ...
- Java设置PDF有序、无序列表
文档中的设置有序或无序列表是一种反应内容上下级关系或者内容相同属性的方式,与单纯的文字叙述相比,它能有效增强文档内容的条理性,突出重点.因此,本文将分享通过Java编程在PDF文档中设置有序或无序列表 ...