想知道更多关于区块链技术知识,请百度【链客区块链技术问答社区】
链客,有问必答!!

以太坊去中心化网页钱包开发系列,将从零开始开发出一个可以实际使用的钱包,本系列文章是理论与实战相结合,一共有四篇:创建钱包账号、账号Keystore文件导入导出、展示钱包信息及发起签名交易、发送Token(代币),这是第一篇,主要介绍钱包将实现哪些功能及怎么创建钱包账号,本钱包是基于ethers.js 进行开发。
去中心化网页钱包
先明确一下定义,什么是去中心化钱包,账号秘钥的管理,交易的签名,都是在客户端完成, 即私钥相关的信息都是在用户手中,钱包的开发者接触不到私钥信息。
对应的中心化钱包则是私钥由中心服务器托管,如交易所的钱包就是这种。
网页钱包,或者叫web钱包,是指钱包以网页的形式展现,去中心化网页钱包则交易的签名等操作是在浏览器里完成。
其他形式的钱包,如Android钱包或iOS钱包其开发思路和web钱包一样,因此文本对开发其他平台的钱包也有参考意义,不过本系列文章主要侧重在钱包功能的实现,并未过多考虑用户体验。
钱包功能
一个钱包通常主要包含的功能有:
账号管理(主要是私钥的管理):创建账号、账号导入导出
账号信息展示:如以太币余额、Token(代币)余额。
转账功能:发送以太币及发送Token(代币)
这些功能将基于 ethers.js 进行开发, ethers.js 和web3.js 一样,也是一套和以太坊区块链进行交互的库,不仅如此,ethers.js 还对BIP 39等相关的提案进行了实现,可以在这个链接阅读其文档。
这些功能主要表现为钱包的两个界面,一个界面是:账号管理,一个界面是进行账号信息展示及转账。下面逐个进行介绍
创建钱包账号
读过上一篇文章理解开发HD 钱包涉及的 BIP32、BIP44、BIP39的同学,会知道创建账号,可以有两种方式:
直接生成32个字节的数当成私钥
通过助记词进行确定性推导出私钥
使用随机数作为私钥创建钱包账号
即方式一,可以使用ethers.utils.randomBytes生成一个随机数,然后使用这个随机数来创建钱包,如代码:
var privateKey = ethers.utils.randomBytes(32);
var wallet = new ethers.Wallet(privateKey);
console.log("账号地址: " + wallet.address);
上面代码的 wallet 是 ethers 中的一个钱包对象,它除了有代码中出现的.address 属性之外,还有如 获取余额、发送交易等方法,在后面的文章会进行介绍。
注意ethers.utils.randomBytes 生成的是一个字节数组,如果想用十六进制数显示出来表示,需要转化为BigNumber代码如下:
let keyNumber = ethers.utils.bigNumberify(privateKey);
console.log(randomNumber._hex);
现在我们结合界面,完整的实现创建账号,其效果图如下,加载私钥时创建账号。
界面代码(HTML)代码如下(主要是在表格中定义个一个输入框及一个按钮):

            <table><tr><th>私钥:</th><td><input type="text" placeholder="(private key)" id="select-privatekey" /></td></tr><tr><td> </td><td><div id="select-submit-privatekey" class="submit">加载私钥</div></td></tr></table>

对应的逻辑代码(JavaScript)如下:
// 使用JQuery获取两个UI标签

var inputPrivatekey = $('#select-privatekey');
var submit = $('#select-submit-privatekey');

// 生成一个默认的私钥

let randomNumber = ethers.utils.bigNumberify(ethers.utils.randomBytes(32));
inputPrivatekey.val(randomNumber._hex);

// 点击“加载私钥”时, 创建对应的钱包

submit.click(function() {var privateKey = inputPrivatekey.val();if (privateKey.substring(0, 2) !== '0x') { privateKey = '0x' + privateKey; }var wallet = new ethers.Wallet(privateKey));});

如果用户提供一个已有账号的私钥,则会导入其原有账号。
通过助记词方式创建钱包账号
这是目前主流常见钱包的方式,关于助记词推导过程请阅读理解开发HD 钱包涉及的 BIP32、BIP44、BIP39。
我们需要先生成一个随机数,然后用随机数生成助记词,随后用助记词创建钱包账号,设计到的API有:

var rand = ethers.utils.randomBytes(16);

// 生成助记词
var mnemonic = ethers.utils.HDNode.entropyToMnemonic(rand);

var path = "m/44'/60'/0'/0/0";

// 通过助记词创建钱包
ethers.Wallet.fromMnemonic(mnemonic, path);
现在我们结合界面来实现一下通过助记词方式创建钱包账号
界面代码(HTML)代码如下(主要是在表格中定义个两个输入框及一个按钮):

<table><tr><th>助记词:</th><td><input type="text" placeholder="(mnemonic phrase)" id="select-mnemonic-phrase" /></td></tr><tr><th>Path:</th><td><input type="text" placeholder="(path)" id="select-mnemonic-path" value="m/44'/60'/0'/0/0" /></td></tr><tr><td> </td><td><div id="select-submit-mnemonic" class="submit">推倒</div></td></tr>
</table>

对应的逻辑代码(JavaScript)如下:

var inputPhrase = $('#select-mnemonic-phrase');
var inputPath = $('#select-mnemonic-path');
var submit = $('#select-submit-mnemonic');

// 生成助记词

var mnemonic = ethers.utils.HDNode.entropyToMnemonic(ethers.utils.randomBytes(16));
inputPhrase.val(mnemonic);submit.click(function() {
// 检查助记词是否有效。if (!ethers.utils.HDNode.isValidMnemonic(inputPhrase.val())) {return;}

// 通过助记词创建钱包对象

   var wallet = ethers.Wallet.fromMnemonic(inputPhrase.val(), inputPath.val());
});

同样用户可以提供一个其保存的助记词来导入其钱包,有一些遗憾的是,ethers.js 暂时不支持通过添加密码作为Salt来保护种子(也可能是我没有找到,如果知道的同学,希望反馈下),如果需要此功能可以引入bip39 和 ethereumjs-wallet 库来实现,代码可参考理解开发HD 钱包涉及的 BIP32、BIP44、BIP39。

以太坊钱包开发系列 - 创建钱包账号相关推荐

  1. 以太坊钱包开发系列3 - 展示钱包信息及发起签名交易

    最新内容会更新在主站深入浅出区块链社区 原文链接:使用 ethers.js 开发以太坊 Web 钱包 3 - 展示钱包信息及发起签名交易) 以太坊去中心化网页钱包开发系列,将从零开始开发出一个可以实际 ...

  2. 以太坊钱包开发系列4 - 发送Token(代币)

    以太坊去中心化网页钱包开发系列,将从零开始开发出一个可以实际使用的钱包,本系列文章是理论与实战相结合,一共有四篇:创建钱包账号.账号Keystore文件导入导出.展示钱包信息及发起签名交易.发送Tok ...

  3. 以太坊构建DApps系列教程(六):使用定制代币进行投票

    在本系列关于使用以太坊构建DApps教程的第5部分中,我们讨论了如何为Story添加内容,查看如何添加参与者从DAO购买代币的功能以及在Story中添加提交内容.现在是编写DAO最终形式的时候了:投票 ...

  4. 以太坊构建DApps系列教程(二):构建TNS代币

    在本系列关于使用以太坊构建DApps教程的第1部分中,我们引导大家做了两个版本的本地区块链进行开发:一个Ganache版本和一个完整的私有PoA版本. 在这一部分中,我们将深入研究并构建我们的TNS代 ...

  5. 第一行代码:以太坊(1)-创建自己的私有区块链

    本文会利用以太坊客户端(geth)搭建一个私有区块链,并在这个私有区块链上挖矿,通过本文的案例,读者可以更深入理解区块链.以太坊.挖矿的理论. 通过阅读本文,您可以: 掌握搭建以太坊开发环境的方法 掌 ...

  6. 以太坊java开发指南_java以太坊开发库ethereumj

    EthereumJ是以太坊协议的纯Java实现.有关以太坊及其目标的高级信息,请访问ethereum.org,其 白皮书 提供了一个完整的概念的概述,和 黄皮书 一起提供了协议的正式定义. 我们尽可能 ...

  7. 以太坊Dapp开发通过truffle部署合约

    以太坊Dapp开发通过truffle部署合约 Truffle是一个非常流行 DApp 开发框架,他可以帮我们处理掉大量无关紧要的小事情,让我们可以迅速开始写代码-编译-部署-测试-打包DApp这个流程 ...

  8. 以太坊DApp开发环境搭建

    2019独角兽企业重金招聘Python工程师标准>>> 以太坊DApp开发环境搭建分为Ubuntu.Windows.mac下的搭建.目的为开发者提供一个以太坊开发.测试的搭建开发环境 ...

  9. 以太坊DApp开发入门教程——Node.js和truffle框架打造区块链投票系统

    第一节 课程概述 本课程面向初学者,内容涵盖以太坊开发相关的基本概念,并将手把手地教大家如何构建一个 基于以太坊的完整去中心化应用 -- 区块链投票系统. 通过本课程的学习,你将掌握: 以太坊区块链的 ...

最新文章

  1. N个免费DevOps开源工具,没用过,至少应该了解!
  2. android edittext标签,TagEditText,类似微博标签的文本控件
  3. python没用_大部分Python资料都没有说到的重点-用实战教你解决问题的思路
  4. LeetCode算法题14:递归和回溯2
  5. 【实战】感恩教师节小程序制作
  6. padavan安装php,求助!帮忙解决newifi3路由器安装hiboy老毛子系统后开启onmp后打开phpmyadin出错!...
  7. selenium通过autoit实现上传和下载
  8. sql中数据类型的转换(自己写比较累哈,偷偷懒,转下别人的)
  9. MAC修改保存bash_profile文件
  10. VMware vSphere 性能优化设计经验+优化方法 | 周末送资料
  11. windows和linux下读取文件乱码的终极解决办法!
  12. MATLAB中的光照处理
  13. .相亲过程:你有房子么?你有钱么?你有能力么? 【结婚吧】【先买房子在结婚】【先赚钱再买房子再结婚】都没有【拜拜~~】 利用if嵌套做相亲过程...
  14. 关于在联想电脑管家更新网卡驱动后无法显示可用网络wifi的问题!
  15. linux删除磁盘设备,linux添加,移除scsi设备
  16. [经验] (转帖)IGBT终于不炸了!详解逆变H桥IGBT单管驱动+保护
  17. 荐书 | 抑郁症的自助手册,觉察自我的钥匙
  18. html页面加文字水印
  19. netcfg android
  20. Excel文档中字符型数据转化为数字类型

热门文章

  1. 如何学习streamdecoder类_2019年终巨献:一份拿下了阿里、网易、滴滴等大厂offer的学习笔记...
  2. 基于Java的设计开题报告_基于Java的电子邮件的收发系统的设计与实现开题报告...
  3. git@github.com: Permission denied (publickey).
  4. MYSQL在centos上主从配置
  5. BZOJ3570 : DZY Loves Physics I
  6. 多线程 - 你知道线程栈吗
  7. HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面...
  8. angular 加入原生html,Angular HTML绑定
  9. 安卓APP_ 控件(5)—— ProgressBar
  10. linux php cli 太多,【linux】php cli 处理能力到底有多强?