1. 业务逻辑

需要使用bip39协议将助记词转换成种子,再通过ethereumjs-wallet库生成hd钱包,根据路径的不同从hd钱包中获取不同的keypair,keypair中就包含有公钥、私钥,再通过ethereumjs-util库将公钥生成地址,从而根据助记词获取所有关联的账号,能获取到公钥、私钥、地址等数据信息。

2. 依赖库

需要用到三个库:bip39、ethereumjs-wallet/hdkey、ethereumjs-util。先安装依赖库,cd到项目跟路径运行命令npm i bip39 ethereumjs-wallet ethereumjs-util。

  • bip39:随机产生新的 mnemonic code,并可以将其转成 binary 的 seed。

  • ethereumjs-wallet:生成和管理公私钥,下面使用其中 hdkey 子套件来创建 HD 钱包。

  • ethereumjs-util:Ethereum 的一个工具库。

示例

let bip39 = require('bip39')
let hdkey = require('ethereumjs-wallet/hdkey')
let util = require('ethereumjs-util')//npm install bip39 ethereumjs-wallet ethereumjs-util
// https://iancoleman.io/bip39/ 验证结果// 1.生成助记词
let mnemonic = bip39.generateMnemonic()
console.log(mnemonic)//2.将助记词转成seed
let seed = bip39.mnemonicToSeed(mnemonic)
console.log("seed:" + util.bufferToHex(seed))//3.通过hdkey将seed生成HD Wallet
let hdWallet = hdkey.fromMasterSeed(seed)for (let i = 0; i < 10; i++) {//4.生成钱包中在m/44'/60'/0'/0/i路径的keypairlet key = hdWallet.derivePath("m/44'/60'/0'/0/" + i)//5.从keypair中获取私钥console.log("私钥:" + util.bufferToHex(key._hdkey._privateKey))//6.从keypair中获取公钥console.log("公钥:" + util.bufferToHex(key._hdkey._publicKey))//7.使用keypair中的公钥生成地址let address = util.pubToAddress(key._hdkey._publicKey, true)//编码地址address = util.toChecksumAddress(address.toString('hex'))console.log("地址:" + address,"\n")
}
lixu@ubuntu:~/Desktop/demo/test$ node index.js
time voyage seven believe muscle trumpet later breeze pool fiscal sibling ribbon
seed:0x626f88b9b4cbb2ed80add9c4e55ca55adbaac00e92c64d928b28ec9de7e28123f1af597f4b51fc038b9c5e8fda2c7de72247eeda8de4b5af62780532022daba6
私钥:0x2798514577bba989dffe72dd123463a65900364155a3c1e62dde505958dc3a51
公钥:0x035988bc5e8e1d131013dc1d23512df7e0c4a69dfacef5f32d703da08329fd5a64
地址:0xbE0BbaBc3a715c63819D95A6C44A1491F95556CC私钥:0x58f10113e17d4174b83155d5964bae42f8f0d29b72a43640a6e64c455d8de4a4
公钥:0x03b72425de3522df8bd806ec6f6522365db089fca744e009a02bdef21d1b9ebbce
地址:0xaC6971406c4875395e872Bf31C2D66F037719F2f私钥:0xbc0c6cb947ae40720b0f9528f44fee327d934f2d6033e59e30500b2ae7a35957
公钥:0x039ae6575ad989deacc3508acd4be6e3b0b251986f1e09f29e239f271e45cbcbd1
地址:0xDc0d11A2Db3fC7C5c8213b876c13B742DC6a13f3......私钥:0x7eda34db3e6ad7174c85588263e5cd5cef76472c3f6102ace44687775b775d61
公钥:0x02154b7c8a4911f66f3b528f0e3976f67369a7525d5b4d23bd7a314274cdd6f190
地址:0x599f3e52979b8d4Ab1Ff40637fA6fE5A2caBD4c1lixu@ubuntu:~/Desktop/demo/test$

demo

let bip39 = require('bip39')
let hdkey = require('ethereumjs-wallet/hdkey')
let util = require('ethereumjs-util')module.exports = {getPrivatekeyWithMnemonic: (mnemonic, derivePath) => {//将助记词转成seedlet seed = bip39.mnemonicToSeed(mnemonic)//通过hdkey将seed生成HDWalletlet hdWallet = hdkey.fromMasterSeed(seed)//生成钱包中在m/44'/60'/0'/0/0路径的第一个帐户的keypair。let key = hdWallet.derivePath(derivePath)//获取私钥return util.bufferToHex(key._hdkey._privateKey)}
}
let menmonicModel = require("../models/mnemonic")module.exports = {......unlockAccountWithMnemonic: async (ctx) => {//1.获取助记词let mnemonic = ctx.request.body.mnemonicconsole.log("mnemonic:",mnemonic)//2.通过助记词获取私钥/*注意这里为了简化前端实现过程,故只获取了助记词的第一对公私钥,即"m/44'/60'/0'/0/0",在实际开发工作中需枚举路径"m/44'/60'/0'/0/0"的最后一位0,可继续取值为0,1,2,3,4……*/let privatekey = menmonicModel.getPrivatekeyWithMnemonic(mnemonic, "m/44'/60'/0'/0/0")console.log("私钥:"+privatekey)//3.通过私钥解锁账户let account = web3.eth.accounts.privateKeyToAccount(privatekey)console.log("account:",account)//4.将账户信息返回给前端ctx.body = await setResponseData(account)},
}
//通过助记词解锁账户
function unlockAccountWithMnemonic() {let mnemonic = $("#input-mnemonic").val()console.log(mnemonic)$.post("/unlock/mnemonic", `mnemonic=${mnemonic}`, function (res, status) {console.log(status + JSON.stringify(res))if (res.code == 0) {//将服务端返回的账户信息显示到页面//configAccountInfo(res.data)} })
}

web3通过助记词获取所有关联的账号:公钥、私钥、地址相关推荐

  1. PHP使用web3还原助记词

    PHP使用web3还原助记词 function generateAddress( $mnemonic = '' ){global $eth ;$data = $eth->generateAddr ...

  2. 详解私钥、密码、keystore和助记词

    文章以及资料(开源):github地址 文章目录 密码 私钥 keystore 助记词 以太坊对BIP的支持 密码.私钥.keystore与助记词的关系 如何解锁账户 密码 首先明白密码不是私钥,它是 ...

  3. android web3j 代币查询_wallet-eth 以太坊代币钱包 助记词 私钥 keystore 转账

    wallet-eth-android wallet-eth 以太坊代币钱包 助记词 私钥 keystore 转账(bip39.bip32.bip44.web3j) 生成钱包地址 // 生成钱包地址 W ...

  4. 以太坊---「地址、密码、私钥、助记词、Keystore 」那些事

    想知道更多关于区块链技术知识,请百度[链客区块链技术问答社区] 链客,有问必答!! 国内最好的以太系钱包当属 imToken,在使用钱包时,有几个名词必须深刻理解,不然就有可能造成区块链资产的损失,这 ...

  5. coldwallet java eth_wallet-eth 以太坊代币钱包 助记词 私钥 keystore 转账

    wallet-eth-android wallet-eth 以太坊代币钱包 助记词 私钥 keystore 转账(bip39.bip32.bip44.web3j) 生成钱包地址 // 生成钱包地址 W ...

  6. 密码、私钥、keystore与助记词之间的关系

    密码.私钥.keystore与助记词之间的关系 一.它们关系可以用下面的图来表述. 二.私钥 基于以上的分析,我们对以太坊钱包的账号系统有了一个很好的认识,那么我们在使用钱包的过程中,该如何保管自己的 ...

  7. 助记词创建以太坊钱包源码_墨客科普 | MOAC区块链钱包账号管理

    本文简单描述钱包账号管理的一些方法. 一.术语 1.1 gas,Gas Limit和Gas Price 在墨客区块链上,发送代币或调用智能合约.执行写入操作,需要支付矿工计算费用,计费是按照Gas计算 ...

  8. 以太坊BIP39助记词到公钥地址的原理与细节

    以太坊基础-你真的懂吗 以太坊私钥 eg: fad9c8855b740a0b7ed4c221dbad0f33a83a49cad6b3fe8d5817ac83d38b6a19 由256位:不考虑0x前缀 ...

  9. php实现助记词转TRX,ETH 私钥和钱包地址

    TRX助记词转地址网上都是Java,js或其他语言开发的示例,一个简单的功能需要依赖其他环境来实现表示不能忍,毕竟php是世界上最好的语言.[狗头] 一.知识准备 要实现助记词转TRX私钥和地址,先需 ...

最新文章

  1. 简单介绍自动化运维工具clip
  2. 面试官问我:spring、springboot、springcloud的区别,我笑了
  3. 良好的编码习惯 —— 5 个提高代码质量的技巧
  4. pytorch按维度取数据0917
  5. yuv420,yuv420p,yuv420sp,nv12,nv21,I420,YV12概念区别
  6. 每天学点linux之-rmdir,cp,mv
  7. QML TableView表格使用示例
  8. 响应json数据之响应json格式数据
  9. Linux内存压力,linux下的CPU、内存、IO、网络的压力测试
  10. 牛客练习赛70 重新排列
  11. QT安装和Hello,world
  12. css word-wrap_CSS中分词“ break-all”和“ break-word”的值之间的差异
  13. 算法面试中单链表专题
  14. 朋友很喜欢打篮球,我用Python爬取了1000张他喜欢的NBA球星图片送给他【内附源码】
  15. 洛谷——P1008 [NOIP1998 普及组] 三连击
  16. 【MyBatis笔记】使用注解开发
  17. 《21世纪英汉汉英双向词典》《朗文当代英语辞典第五版》《牛津高阶英汉双解词典第7版》...
  18. office 2007插入带圈字符
  19. [ZZ] HD7970GE vs GTX770
  20. python如何计算等额本息还款_银行等额本息还款算法

热门文章

  1. 什么是架构,什么是架构师?
  2. 苹果设备号、IOS版本号、IOS版本编号大全
  3. 关于毕业设计汇报PPT
  4. Android的IPTV机顶盒是你在家庭多媒体设备
  5. 【基于侧扫声呐和SFS方法的地形三维重构】(一)增益补偿和斜距校正
  6. 步步高家教机 H8S H9A 破解纯净原生系统 线刷包
  7. qq邮箱格式的Java代码_java mail qq邮箱配置 实例
  8. oracle数据库表单,Oracle常用数据库系统表单以及SQL的整理
  9. java实现手机截屏工具
  10. STM32开发笔记71: 解决FreeRTOS任务的内存分配问题