我们已经学习了关于LightWallet的理论,现在是时候用LightWallet和Hooked-Web3-Provider创建钱包服务了。钱包 服务将允许用户生成独一无二的种子,显示地址和相关余额,最后将允许用户发送以太币给其他账户。所有操作都在客户端上进行,这样比较容易取得用户的信任。 用户必须记住种子或者把它存储在某个地方。

5.6.1 必要条件

在开始创建钱包服务之前,应确保运行geth开发实例(即挖矿),它已启动了HTTP-RPC服务器,允许来自任何域名的客户端请求,最后解锁账户0。运行下面的代码:

其中,--rpccorsdomain用于允许一些特定域与geth通信。需要提供一个以空格分隔的域名列表,例如“http://localhost:8080 https://mySite.com *”。它还支持*通配符。--rpcaddr表示geth服务器可以到达哪个IP地址。默认的是127.0.0.1,所以如果它是一个托管服务器,就不能使用服务器的公共IP地址到达它。因此,将它的值改为0.0.0.0,这表示该服务器可以使用任何IP地址到达。

5.6.2 项目结构

在本章的练习文件中,你将发现Final和Initial两个目录。Final包含项目的最终源代码,而Initial包含可以用于迅速创建应用的空的源代码文件和库。

为了测试Final目录,需要在其中运行npm install,然后使用Final目录中的node app.js命令运行该应用。

在Initial目录中,你将发现一个public目录和两个文件(app.js和package.json)。package.json包含应用的后端相关内容,把后端源代码放在app.js里。

public目录包含与前端相关的文件。在public/css中会发现bootstrap.min.css,它是 bootstrap库;在public/html中会发现index.html,把应用的HTML代码放在这里;在public/js目录中将发现 Hooked-Web3-Provider、web3js和LightWallet的.js文件。在public/js中还会发现一个main.js文 件,把应用的前端JS代码放在这里。

5.6.3 创建后端

先来创建App后端。首先,在Initial目录中运行npm install,为后端安装所需相关内容。

运行快捷服务并用于index.html文件和静态文件的完整后端代码如下:

上述代码无须解释。

5.6.4 创建前端

现在开始创建App前端。前端所包括的主要功能有生成种子、显示种子地址和发送以太币。

编写应用的HTML代码。

上述代码的执行过程如下:

1)把Bootstrap 4样式表排入队列。

2)显示一个信息框,上面将显示多个信息。

3)得到一个表单,上面有一个输入框和两个按钮。输入框用于输入seed或者在生成新的seed时显示seed。

4)Generate Details按钮用于显示地址,Generate NewSeed按钮用于生成一个新的、独一无二的seed。用户单击Generate Details按钮就调用generate_Addresses()方法,单击Generate New Seed按钮就调用generate_seed()方法。

5)这时就有了一个空的有序列表。当用户单击Generate Details按钮时,将动态显示seed地址、余额和相关私钥。

6)最后有另外一张表单,其中有from地址、to地址和要转账的以太币数量。from地址必须是当前未排序列表中显示的地址之一。

现在编写HTML代码调用的每个函数的实现。首先编写代码,生成一个新的seed。将这段代码放入main.js文件:

keystore命名空间的generateRandomSeed()方法用于生成一个随机seed。它用接受一个可选参数,即一个表示额外的熵的字符串。

在一些算法中或者需要随机数的地方会用到熵。熵通常来自于硬件源或者已经存在的硬件源,例如鼠标移动,或者特别提供的随机数生成器。

生成一个独特的seed需要非常高的熵。LightWallet内置了生成唯一seed的方法。 LightWallet生成熵使用的算法取决于环境。但是如果能生成更好的熵,就可以把生成的熵传送给generateRandomSeed(),它将在 内部与generateRandomSeed()生成的熵进行拼接。

生成随机seed之后,调用generate_Addresses方法。该方法以seed作为参数,并在其中显示地址。在生成地址之前,它会问用户想要多少个地址。

generate_Addresses()方法的实现如下。把如下代码放入main.js文件中:

上述代码的执行过程如下:

1)首先有一个变量totalAddresses,它存储用户希望生成的地址总数。

2)检查参数seed是否定义了。如果没有定义,则从输入栏抓取seed。这样做,generate_Addressess()方法可以用于显示信息seed,如果用户单击Generate Details按钮,还同时生成一个新的seed。

3)使用isSeedValid()方法验证keystore命名空间的seed。

4)请用户输入想要生成和展示多少地址并进行验证。

5)keystore命名空间中的私钥总是加密存储的。在生成密钥时,需要进行加密;在签署交易时,需要解密。衍生对 称加密密钥的密码可以由用户输入,或者提供一个随机字符串作为密码。为了使用户体验更好,生成一个随机字符串,将它用作密码。对称加密密钥没有存储在 keystore命名空间里,因此只要进行与私钥相关的操作,例如生成密钥、访问密钥等,就需要从密码生成密钥。

6)使用createVault方法创建keystore实例。createVault用一个对象和一个回调函数作为 参数。对象可以有4种属性:password、seedPharse、salt和hdPathString。password是必选项,其他的都是可选 项。如果不提供seedPharse,它会生成和使用一个随机seed。拼接salt与password,以提高对称密钥加密技术的安全性,因为攻击者不 仅要找到password还得找到salt。如果不提供salt,它就会随机生成。keystore命名空间存储未加密的salt。 hdPathString用于为keystore命名空间提供默认衍生路径,即生成地址、签署交易等。如果不提供衍生路径,则使用该衍生路径。如果不提供 hdPathString,则默认值为m/0'/0'/0'。这个衍生路径的默认目的是签名。可以创建新的衍生路径或者使用keystore实例的 addHdDerivationPath()方法重写当前衍生路径的purpose。还可以使用keystore实例的 setDefaultHdDerivationPath()方法改变默认衍生路径。最后,一旦keystore命名空间被创建,就通过回调函数返回实例。 所以,这里仅用keyword和seed创建了一个keystore。

7)生成用户指定数量的地址及其相关密钥。从一个seed中可以生成数百万个地址,因为keystore不知道用户想 生成多少个地址,所以在此之前不会生成任何地址。在创建keystore之后,使用keyFromPassword方法从密码中生成对称密钥,然后调用 generateNewAddress()方法生成地址及其相关密钥。

8)generateNewAddress()有3个实参,即密码衍生的密钥、生成地址的数量和衍生路径。因为没有提 供衍生路径,它使用keystore的默认衍生路径。如果多次调用generateNewAddress(),它会从在最后一次调用中创建的地址重新开 始。例如,如果调用该方法两次,每次生成两个地址,则将得到前四个地址。

9)使用getAddresses()获取存储在keystore上的全部地址。

10)使用exportPrivateKey方法解码和检索地址私钥。

11)使用web3.eth.getBalance()获取地址余额。

12)在未排序的列表中显示全部信息。

上面介绍了从seed生成地址及其私钥的方法。现在编写send_ether()方法的实现,该方法用于从一个由seed生成的地址发送以太币。

相关代码如下。将这段代码放入main.js文件:

上述代码直到由seed生成地址的部分都无须解释。然后给ks的passwordProvider属性分配一个回调函数。该回调函数在签署交易时被调用, 以获取密码解码私钥。如果不提供,LightWallet就会提示用户输入密码。此时,通过传送keystore作为交易签署者创建一个 HookedWeb3Provider实例。当自定义服务提供方想签署交易时,它调用ks的hasAddress方法和signTransactions 方法。如果要签署的地址不在生成的地址之中,ks将向自定义服务提供方返回错误。最后使用web3.eth.sendTransaction方法发送一些 以太币。

5.6.5 测试

钱包服务的创建已经完成了,让我们测试一下,确保它像预想的那样工作。首先,在Initial目录中运行node app.js,然后在浏览器中访问http://localhost:8080,运行界面如图5-11所示。

图 5-1

单击Generate New Seed按钮,生成一个新的seed。提示输入一个数字,代表要生成地址的数量。可以输入任何数字,但是为了实现测试目的,给出一个大于1的数。运行界面如图5-2所示。

图 5-2

现在测试发送以太币,需要发送一些以太币到从coinbase账户中生成的地址之一。一旦发送一些以太币到生成的地址 之一,即单击Generate Details按钮更新用户界面(UI),尽管并不需要测试使用钱包服务发送以太币。确保再次生成同一个地址。此时的运行界面如图5-3所示。

图 5-3

在From address栏中输入列表中有余额的账户的地址,然后在To address栏输入另一个地址。为了进行测试,可以输入显示的任意其他地址。接着输入一个以太币数量,该值要小于等于地址账户中以太币的余额。运行界面如图5-4所示。

图 5-4

单击Send Ether按钮,即可在信息框中看到交易哈希。等待挖出交易。同时在很短的时间内,可以单击Generate Details按钮查询交易是否被挖出。如果交易被挖出,则运行界面如图5-5所示。

如果每件事都和刚才解释的一样,那么钱包服务就已经就绪了。实际上,可以把该服务部署到一个自定义域名,让公众使用它。

图 5-5

来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=556

'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })(); '); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();

5.6 创建钱包服务相关推荐

  1. 百度的新手法挣钱手段,指数创建关键词服务

    前一段时间,百度指数一直在做修改,先是限制了账号一天只能创建5个关键词,后面又变成一个账号总共只能创建5个关键词,一时间变得洛阳纸贵,淘宝上的创建关键词百度指数服务,一时间价格飙到了500元以上一个. ...

  2. 用.NET创建Windows服务

    用.NET创建Windows服务 译者说明:我是通过翻译来学习C#的,文中涉及到的有Visual Studio.NET有关操作,我都根据中文版的VS.NET显示信息来处理的,可以让大家不致有误解. 作 ...

  3. 用C#创建Windows服务(Windows Services)

    转载自 hyslove 最终编辑 hyslove Windows服务在Visual Studio 以前的版本中叫NT服务,在VS.net启用了新的名称.用Visual C# 创建Windows服务不是 ...

  4. 创建ssh 服务的镜像

    $ sudo docker run -ti ubuntu:14.04 /bin/bash #首先,使用我们最熟悉的 「-ti」参数来创建一个容器. root@fc1936ea8ceb:/# sshd ...

  5. 为私有Kubernetes集群创建LoadBalancer服务

    MetalLB - 可以为私有 Kubernetes 集群提供LoadBalancer类型的负载均衡支持. 在Kubernetes集群中,可以使用Nodeport.Loadbalancer和Ingre ...

  6. 杂记2:VS2013创建Windows服务实现自动发送邮件

    这篇随笔里,我将介绍如何用VS2013开发Windows服务项目,实现的功能是定时发送电子邮件. 开发环境:VS2013,SQL Server2008,采用C#语言开发 步骤一:创建Windows服务 ...

  7. C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案

    C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案 参考文章: (1)C#/.NET基于Topshelf创建Windows ...

  8. 【VMCloud云平台】SCVMM配置(九)创建Web服务模板

    继续上一篇完成SCVMM创建SQL服务模板后,本篇将继续讲述云平台中的第一个组件--SCVMM创建第一个Web服务模板(即下图中的SCVMM01,蓝色为未实现,绿色为计划中,红色为实施中). 1. 登 ...

  9. (转)创建Windows服务(Windows Services)N种方式总结

    转自:http://www.cnblogs.com/aierong/archive/2012/05/28/2521409.html 最近由于工作需要,写了一些windows服务程序,有一些经验,我现在 ...

最新文章

  1. Windows 7 搭建 Mobile 6 真机调试开发环境
  2. Spring3MVC+Mybatis3.1框架下的事务
  3. 半监督学习技术在金融文本分类上的实践
  4. 大数据WEB阶段(四)JavaScript
  5. python工作台_FreeCAD二次开发-创建Python工作台,添加菜单栏和工具条,FreeCAD命令
  6. 四叶草剧场服务器维修价格,四叶草剧场不合理报酬机制是什么-不合理报酬机制和收益详解-Appfound...
  7. Magento创建多语言店铺的方法
  8. Node.js ORM 框架 Sequelize 重要更新 v5 发布
  9. 将excel文件中的数据导入导出至SQL数据库中(Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0|office2003和office2007)...
  10. pyton人值得拥有
  11. 制作自己专属的抓包工具
  12. 使用IIS Live Smooth Streaming技术搭建流媒体直播系统
  13. jira 工作日志导出 工具
  14. 水泊梁山迎圣诞,Python 抽奖助好汉
  15. 网络安全:namp扫描工具
  16. Golang 调用MySQL存储过程
  17. 需要达到什么水平才能找到一份计算机实习?
  18. 51单片机之外部中断方式 ——— INT0 中断
  19. yasm/nasm not found or too old. Use --disable-yasm for a crippled build.
  20. Android四大天王

热门文章

  1. 通过python利用Django框架搭建一个属于自己的免费网站(已更新)
  2. 足病危害不容忽视 鞋柜革命势在必行
  3. 尚医通开发笔记(结尾含部分bug修复方法)
  4. 很久之前自己写的太空游戏flash
  5. 由开始日期和有效天数算截止日期
  6. 纺织行业系统_纺织行业ERP哪个好
  7. 浩辰3D制图软件中薄壁功能的使用技巧
  8. PADS VX2.8 router亮显模式的设置方法
  9. 上市公司女性高管指标 1999-2020年(内附详细指标说明及代码)
  10. 贝叶斯优化优秀论文总结目录