{"content":{"title":"区块链以太坊比特币HD多链钱包","body":"​\r\n## **一、什么是HD钱包：**\r\n     它是分层确定性（Hierarchical Deterministic）钱包的缩写 HD Wallets，是目前广泛使用的虚拟货币钱包标准。HD钱包从单个根种子（root seed）中创建，为128到256位的随机数，任何兼容HD钱包的根种子也可重新创造整个HD钱包，所以拥有HD钱包的根种子就等于拥有了所有密钥，方便存储、导入及导出。\r\n\r\n## **二、BIP32/BIP39/BIP44含义：**\r\nBIP32：定义 Hierarchical Deterministic wallet (简称 \"HD Wallet\")，是一个系统可以从单一个 seed 产生一树状结构储存多组            keypairs（私钥和公钥）。好处是可以方便的备份、转移到其他相容装置（因为都只需要 seed），以及分层的权限控制等\r\n\r\nBIP39：将 seed 用方便记忆和书写的单字表示。一般由 12 个单字组成，称为 mnemonic code(phrase)，中文称为助记词或助记码\r\n\r\nBIP44：基于 BIP32 的系统，赋予树状结构中的各层特殊的意义。让同一个 seed 可以支援多币种、多帐户等。各层定义如下：\r\n\r\nm / purpose' / coin_type' / account' / change / address_index\r\n\r\n其中的 purporse' 固定是 44'，代表使用 BIP44。而 coin_type' 用来表示不同币种，\r\n\r\n例如 BTC 就是 0'，ETH 是 60'   ETC 是 61\r\n\r\n## **三、多链钱包的助记词、私钥、地址生成。**\r\n 注：所需要的依赖包安装\r\n\r\n```\r\n安装 bip39：https://www.npmjs.com/package/bip39\r\n\r\nnpm install bip39  --save  \r\n\r\n安装 ethers.js：  https://docs.ethers.io/ethers.js/html/index.html\r\n\r\nnpm install ethers  --save\r\n\r\n安装 bitcoinjs-lib：https://www.npmjs.com/package/bitcoinjs-lib\r\n\r\nnpm install bitcoinjs-lib  --save\r\n\r\n安装 eosjs-ecc：https://github.com/EOSIO/eosjs-ecc#randomkey\r\n\r\nnpm install eosjs-ecc --save\r\n```\r\n\r\n```\r\n//引用依赖(根据工程环境安装的不同版本对应使用)\r\nimport { ethers } from 'ethers';\r\nimport bitcoin from 'bitcoinjs-lib';\r\nimport bip39 from 'bip39';\r\nimport bip32 from 'bip32';\r\nimport eosEcc from 'eosjs-ecc';\r\n```\r\n### 1、HD钱包助记词生成：\r\n\r\n```\r\nethers.js生成助记词：\r\nvar mnemonic = ethers.Wallet.createRandom().mnemonic\r\nbip39生成助记词：\r\nvar mnemonic = bip39.generateMnemonic()\r\n```\r\n### 2、BTC钱包通过助记词生成私钥、公钥、地址：\r\n\r\n```\r\n//设置生成测试or正式环境的钱包\r\nconst network = bitcoin.networks.bitcoin\r\n// 计算seed:\r\nconst seed = bip39.mnemonicToSeed(mnemonic)\r\nconst root = bip32.fromSeed(seed,network)\r\nconst path = \"m/44'/0'/0'/0/0\";\r\nconst keyPair = root.derivePath(path)\r\nconst privateKey = keyPair.toWIF()\r\nconsole.log(\"BTC私钥：\", privateKey)\r\nconst publicKey = keyPair.publicKey.toString(\"hex\")\r\nconsole.log(\"BTC公钥：\", publicKey)\r\nlet address = bitcoin.payments.p2pkh({ pubkey: keyPair.publicKey , network:network})\r\nconsole.log(\"BTC地址：\", address.address, \"\\n\")\r\n```\r\n### 3、ETH钱包通过助记词生成私钥、公钥、地址：\r\n\r\n```\r\nvar Wallet = ethers.Wallet.fromMnemonic(mnemonic);\r\nvar privateKey = Wallet.privateKey;\r\nconsole.log(\"ETH私钥：\",privateKey)\r\nvar address = Wallet.address;\r\nconsole.log(\"ETH地址：\",address)\r\nvar compressedPublicKey = Wallet.compressedPublicKey;\r\nconsole.log(\"ETH公钥：\",compressedPublicKey)\r\n\r\n//生成新的助记词、私钥、地址\r\nvar wallet = ethers.Wallet.createRandom();\r\nlet mnemonic = wallet.mnemonic;\r\nvar address = wallet.address;\r\nconsole.log(\"ETH地址：\"address)\r\nvar privateKey = wallet.privateKey;\r\nconsole.log(\"ETH私钥：\",privateKey)\r\nvar compressedPublicKey = wallet.signingKey.keyPair.compressedPublicKey;\r\nconsole.log(\"ETH公钥：\",compressedPublicKey)\r\n\r\n```\r\n### 4、EOS钱包通过助记词生成私钥、公钥：\r\n\r\n```\r\nvar eosPrivate = eosEcc.seedPrivate(mnemonic);\r\nconsole.log(\"EOS私钥：\",eosPrivate)\r\nconst  eosPubkey = eosEcc.privateToPublic(eosPrivate);\r\nconsole.log(\"EOS公钥：\",eosPubkey)\r\n\r\n //随机生成新的私钥公钥\r\neosEcc.randomKey().then(privateKey => {\r\n     console.log('Private Key:\\t', privateKey) \r\n     console.log('Public Key:\\t', eosEcc.privateToPublic(privateKey)) \r\n  })\r\n\r\n\r\n如何注册EOS账户：\r\n需安装： \r\nnpm install eosjs --save\r\neos环境配置：\r\nvar Eos = require('eosjs')\r\nvar eosConfig = {\r\n    keyProvider: ['私钥'], // 配置私钥字符串\r\n    httpEndpoint: 'http://51.15.224.168:8888', //DEV开发链url与端口\r\n    //httpEndpoint: 'https://nodes.get-scatter.com', //主网\r\n    chainId: \"038f4b0fc8ff18a4f0842a8f0564611f6e96e8535901dd45e43ac8691a1c4dca\", // 通过cleos get info可以获取chainId\r\n    //chainId: \"aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906\", //主网\r\n    broadcast: true,\r\n}\r\nvar eos = Eos(eosConfig)\r\n\r\n            var creatoraccount = \"accounthr123\"; //主账号\r\n            var newaccount = \"sdrghiochaiq\"; //新账号\r\n            var newaccount_pubkey = pubkey; //新账号的公钥\r\n            //构建transaction对象\r\n            eos.transaction(tr => {\r\n                //新建账号\r\n                tr.newaccount({\r\n                    creator: creatoraccount,\r\n                    name: newaccount,\r\n                    owner: newaccount_pubkey,\r\n                    active: newaccount_pubkey\r\n                })\r\n\r\n                //为新账号充值RAM\r\n                tr.buyrambytes({\r\n                    payer: creatoraccount,\r\n                    receiver: newaccount,\r\n                    bytes: 3072\r\n                })\r\n                //为新账号抵押CPU和NET资源\r\n                tr.delegatebw({\r\n                    from: creatoraccount,\r\n                    receiver: newaccount,\r\n                    stake_net_quantity: '1.0000 EOS',\r\n                    stake_cpu_quantity: '1.0000 EOS',\r\n                    transfer: 0\r\n                })\r\n            }).then(r => {\r\n                console.log(r);\r\n            }).catch(e => {\r\n                console.log(e)\r\n            });\r\n           \r\n        }catch (e){\r\n            \r\n        }\r\n\r\n\r\n```\r\n测试结果：\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2022/11/ad8ZWiO2637232b61d79b.png)\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2022/11/jo5eUkUX636b09b854fd5.png)\r\n学如逆水行舟，不进则退。心似平原跑马，易放难收。全栈工程师是指掌握多种技能，并能利用多种技能独立完成产品的人。 也叫全端工程师(同时具备前端和后台能力)，英文Full Stack engineer。【人工智能】【区块链】【系统/网络/运维】【云计算/大数据】【数据库】【移动开发】【后端开发】【游戏开发】【UI设计】【微服务】【爬虫】【Java】【Go】【C++】【PHP】【Python】【Android/IOS】【HTML/CSS】【JavaScript】【Node】。。。\r\n\r\n欢迎各位大神萌新一起专研分享各行各业技术!\r\n\r\nChain区块链开发社区：593674370"},"author":{"user":"https://learnblockchain.cn/people/12241","address":null},"history":"QmWRTFxD8iAkPWbme9qpjTPbA4kmqNNWc7konvf2Fm8HNt","timestamp":1668486525,"version":1}