主页 > 下载imtoken安卓版官网 > ChainDesk-比特币钱包开发5 新钱包:生成子账户地址和路径
ChainDesk-比特币钱包开发5 新钱包:生成子账户地址和路径
作者:ChainDesk 李旭,ChainDesk 区块链行业分析师,ChainDesk 区块链工程师
ChainDesk官网:
本文阅读时间:3分钟
课程目标
掌握连接比特币官网和测试网的开发
学习创建钱包和备用钱包
生成账户地址
前言
比特币账户通过bip协议生成种子,然后扩展成多个子地址。 这些子地址可以从同一个种子中导出,知道其中一个子账户的私钥无法推导出兄弟节点和父节点的私钥,所以将同一个种子扩展生成的子账户统一为一个账户,并为每笔交易使用其新的子地址,这样更安全,更难追踪。 这个大账户通常被称为钱包。 因此,要对账户进行操作比特币助记词路径,我们需要先创建一个钱包账户,所以本章的内容是学习如何创建钱包以及钱包的一些常用功能。
1.获取钱包客户端对象
在上一章的内容中,已经将创建钱包客户端对象的方法封装到了Models/walletClient.js文件中的getWalletClient()方法中,如下:
229BFB5D-C02D-4D37-91BC-3A130B729290
现在client对象还没有生成认证,可以看到__proto下有很多client的方法,然后通过client对象调用创建钱包。
2.创建钱包的API文档
创建钱包的API文档如下:
根据API的定义,强制参数有如下6个:
walletName:String,创建的钱包名称。
copayerName:String,创建钱包的人,即钱包的拥有者。
m:Number,钱包拥有者的数量。 如果为1,则为个人钱包; 如果大于1,则为需要多重签名的共享钱包。
n:Number,对应m,不能大于m,指定需要签名的个数。 如果是个人钱包,则为1。
opts:可选参数,是一个对象,包含单词breaks如下:
opts.network:string比特币助记词路径,钱包连接的网络类型,支持官方网络和测试网络,分别表示为:livenet、testnet。
opts.walletPrivKey:钱包私钥,不需要指定,会随机生成。
opts.id:String,钱包ID,不用指定,会自动生成。
opts.withMnemonics:String,助记词,用于生成证书,所有对钱包的操作都是用这个证书进行的。
cb:回调方法。 该方法没有返回值,响应数据通过callba传回。
3.编码创建钱包
1.小测试
根据以上分析,我们进行如下调用。
运行后生成的客户端对象如下:
AC93A428-C270-4176-AA73-00F1D9DE8EFF
可以看出创建的钱包作为客户端对象的凭证属性,里面的文字记录了钱包的详细数据。 这样,我们创建了一个比特币个人钱包,名称为“MyWallet”,所有者为“lixu”,在测试网下,默认使用BIP44协议创建账户,地址类型为P2PKH支付给公钥哈希。 另外,我们没有找到这个账户的助记词,所以创建钱包的方法有待改进,那么正确的步骤是什么呢?
2.随机助记词生成种子
我们需要在创建钱包之前调用seedFromRandomWithMnemonic()方法,通过随机助记词生成种子,以便能够导出钱包的助记词来备份钱包。后面的API文档不再赘述。 你可以在 GitHub 上查看它。 它的用法如下
注意:
密码不能忘记。 生成种子需要使用密码和助记词。 密码不同则种子不同,导致账号无法找回。 现在运行后的结果如下。
如果网络设置为testnet,则连接测试网络,如果连接官方网络,则为“livenet”。
67C44797-32E9-4A61-B06F-AC5807CC89E9
3.导出钱包
我们创建钱包后,需要使用import()方法导入钱包,下次再次使用钱包时激活,所以创建钱包后需要备份钱包数据,类似于keystore在以太坊。 备份钱包数据需要使用export()方法,将钱包对象导出保存到一个文件中,以便下次通过文件打开钱包。 接下来介绍import()方法的用法。
特别提醒:
为了让大家能够快速开发比特币钱包项目,本项目不花时间讲解非重点内容。 那么这里项目中导出的钱包为了方便说明,放在了服务器中,非常不安全。 对于有经验的开发人员来说,很自然地了解如何处理此类敏感数据。 另外,服务器是为同一个用户“lixu”创建的钱包,即代码中的“copayerName”字段。 在实际开发中,需要实现用户模块,建立用户系统,这里简称。 建议将此数据保存在客户端,需要加密。
将钱包数据存放在一个以.bat结尾的文件中,以钱包名称命名,如果钱包名称重复,钱包账户将被覆盖。 运行后,打开static/wallet_file文件夹下的MyWallet.bat文件。 它的数据存储在json字符串中,如下图所示。 使用格式化工具后,可以看到其数据为client.credentials字符串中的数据。
178ADC34-DB35-46EB-8CB8-7D4E981696A7
4.新地址
新建的钱包不会自动生成地址。 为了打开钱包时有地址,我们可以在创建成功后调用创建新地址的方法让他有第一个账户地址。 当然,它的路径必须是“M/0/0”。 接下来我们获取钱包的子账户地址进行查看。
单击此处添加图片说明
输出如下:
6C39E707-CBD1-4F76-A355-135E75123C64
4.完整的源代码
1.控制器/wallet.js
在controllers文件夹下新建wallet.js文件,实现后端钱包模块的功能。 接下来先实现创建钱包的功能。
前端需要传递walletname和password两个参数,最后将新建的第一个账户地址返回给前端。 数据结构如下:
五、项目运行效果
2018-10-30 11.25.31
项目源码Github地址