以太坊去中心化web钱包开发系列。这个系列将开发一个钱包,可以从头开始实际使用。这个系列是理论和实践的结合。有四篇文章:创建钱包账户,导入导出账户密钥库文件,显示钱包信息,发起签名交易,发送令牌。这是第一篇文章,主要介绍钱包会实现什么功能,如何创建钱包账号。这个钱包是基于ethers.js?进行开发。
我们先明确一下定义。什么是去中心化钱包,账户密钥的管理,交易的签署都是在客户端完成的,也就是私钥相关的信息都在用户手中,钱包的开发者是无法接触到私钥信息的。
对应的集中式钱包是私钥托管在中央服务器,比如交易所的钱包。
web wallet,或web wallet,是指钱包以网页的形式展示,而去中心化的web wallet则在浏览器中完成交易签名等操作。其他形式的钱包,如Android钱包或iOS钱包,其开发思路与web钱包相同,因此正文也可以作为在其他平台开发钱包的参考。但这一系列文章主要集中在钱包功能的实现上,没有太多考虑用户体验。
一个钱包通常主要包括以下功能:
账户管理(主要是私钥的管理):账户创建、账户导入导出账户信息显示:如以太坊余额、代币余额。传送函数:发送以太坊和令牌这些函数将基于以太坊. js开发,以太坊. js和web3.js一样,也是一套与以太坊区块链交互的库。不仅如此,以太坊(Ethereum.js)还实现了BIP 39等相关提案,其文档可在此链接阅读。
这些功能主要表现在钱包的两个界面,一个是账户管理,一个是账户信息显示和转账。接下来逐一介绍
看过上一篇文章了解开发高清钱包所涉及的BIP32、BIP44、BIP39的同学会知道,创建账户有两种方式:
直接生成32字节的数字作为私钥,通过助记符确定性地导出私钥可以使用ethers.utils.randomBytes生成一个随机数,然后用这个随机数创建一个钱包,比如代码:[1var wallet=新乙醚。钱包(private key);Console.log('账户地址:' wallet . address ');上面代码的wallet是ethers中的一个wallet对象。除了。address属性,它还有获取余额和发送事务等方法,这些将在后面的文章中介绍。
注意ethers.utils.randomBytes生成的字节是一个字节数组。如果要用十六进制数显示,需要转换成BigNumber码如下:
12 let key Number=ethers . utils . bignome ify(私钥);console.log(randomNumber。_ hex);现在,我们结合接口,实现账户的完整创建。其效果图如下。当私钥被加载时,帐户被创建。
接口代码(HTML)代码如下(主要是定义了表格中的一个输入框和一个按钮):
12345678910112私钥:加载私钥对应的逻辑代码(JavaScript)如下:
123456788 var submit=$(' # select-submit-Private key ');//生成默认私钥let random number=ethers . utils . bignumberify(ethers . utils . random bytes(32));inputprivatekey . val(random number。_ hex);//点击“加载私钥”时,创建对应的wallet submit . click(function(){ var Private Key=input Private Key . val();if 尚力财经小编2022 (privateKey.substring(0,2)!=='0x '){ private key='0x ' private key;} var wallet=新醚类。wallet(private key));});如果用户提供现有帐户的私钥,将会导入其原始帐户。
用助记符创建钱包账户
我们需要Mr是一个随机数,然后用随机数生成助记符,再用助记符创建钱包账户。设计的API有:
12345678910 var rand=ethers . utils . random bytes(16);//生成助记符var mnemonic=ethers . utils . HD node . entropytommonic(rand);var path=' m/44 '/尚力财经小编202260 '/0 '/0/0 ';//通过助记符创建一个wallet ethers . wallet . from mnemonic(助记符,路径);现在我们结合界面用助记符创建一个钱包账户,渲染如下:
界面代码(HTML)代码如下(主要定义表格中的两个输入框和一个按钮):
1234567891011213141516助记符:路径:下推对应的逻辑代码(JavaScript 1234567891011121314151616var input path=$(' # select-助记符-路径');var submit=$(' # select-submit-mnemonic ');//生成助记符var mnemonic=ethers . utils . HD node . entropytonemonic(ethers . utils . random bytes(16));inputPhrase.val(助记符);Submit.click(function() {//检查助记符是否有效。如果(!ethers . utils . HD node . is valid mnemonic(input phrase . val()){ return;}//通过助记符创建钱包对象var wallet=ethers . wallet . from mnemonic(input phrase . val()、input path . val());});
同样,用户可以提供一个由他们保存的助记符来导入他们的钱包。遗憾的是ethers.js暂时不支持通过添加密码作为盐来保护种子(也可能是我没发现。如果我知道,希望你能给我反馈)。如果需要这个功能,可以引入bip39和ethereumjs-wallet库来实现。这些代码可以参考理解开发高清钱包所涉及的BIP32、BIP44和BIP44。总结其实ethers还提供了一种更简单的创建钱包的方法:参考文献:ethers.js本文由专栏作家“小熊座”上传发布。未经允许,请勿转载。
标签: do