查看原文
其他

产品揭秘 | 同时支持多条公链的节点钱包是这样做出来的

罗鹏 区块链大本营 2019-02-15


众所周知,在传统互联网领域,已经拥有种类繁多的优秀产品,给人们的生活带来了前所未有的改变。而对于区块链行业而言,还处于一个发展早期,基于区块链的产品并不算丰富,对于大多数公链来讲,钱包则应该是他们的标配产品。纵然是标配,做出一款好的区块链钱包却并没那么简单。


在区块链的世界,钱包是一个重要的入口,它的核心用途是存放数字资产和进行转账交易。通常是通过私钥+密码的方式保护资产的安全,如果私钥丢失,便会造成数字资产的丢失,因此在区块链世界中,用户一定要保存好自己的私钥。


区块链钱包根据安全性和易用性通常可分为:


节点钱包


  • 该类钱包需要下载整个区块链数据,是一个完整的区块链节点

  • 由于节点钱包可作为链上的一个节点,有所有交易的详细信息,所以其稳定性和安全性都较高

  • 节点钱包会参与网络维护


SPV钱包


  • 无需下载整个区块数据,只下载区块头数据即可

  • 使用SPV钱包需要理解两个词:“交易验证”和“支付验证”,交易验证涉及验证余额是否充足,交易是否双花等,支付验证只判断该笔交易是否被验证过,得到了多少个确认

  • 虽然SPV钱包避免了下载大量数据的问题,但它只能做支付验证


轻钱包


  • 无需下载任何区块数据,发起交易时只需对交易签名然后广播即可

  • 轻钱包的数据实时地从节点获取,因此,节点服务器的性能决定了轻钱包的性能,但该类钱包的便捷性较高


硬件钱包


  • 硬件钱包是把私钥放在USB设备里,安全性极高

  • 该类钱包需要软件和物联网硬件结合,使用比较麻烦


目前使用较多的是节点钱包,不过很多节点钱包都存在一些相同的问题,例如:


  • 使用麻烦,更换设备就需重新下载节点程序,并且同步数据时间比较长

  • 如果要使用多种数字货币,就需要下载多个节点钱包

  • 节点钱包UI更新困难,如果要更新UI,就要重新下载或更新节点程序


本文将主要针对节点钱包进行介绍和剖析。由于篇幅有限,其余类型的钱包这里就不展开讲了,有兴趣的同学可以自行查资料了解。




节点钱包的基本功能和原理


节点钱包需要下载整个区块链的数据,节点程序运行起来后会不断去同步区块数据,保证本地节点的区块数据和链上其它节点数据的一致性。


当用户发起一笔交易,节点钱包会用本地的私钥对交易进行签名然后广播到网络中,整个签名过程都发生在本地,因此安全性会得到极大的保障,此外当本地节点收到其他节点广播的消息后也会将该消息广播给它所连接的节点。


节点会不断去连接最长链,若本地节点当前处于分叉链,则会自动回滚,然后去同步最长链的区块数据。


节点钱包实际就是一个客户端程序,需要占用硬盘空间和内存资源。对于钱包用户来讲,节点钱包可以提供的基本功能通常如下:


  • 生成和备份私钥,保存所有账户

  • 实时展示资产情况

  • 进行转账收款等操作

  • 参与链的网络维护 


其中参与链的网络维护是节点钱包和其他类型钱包最大的区别,节点程序是其他类型钱包能够稳定运行的基础。不少用户选择节点钱包的原因也是想通过参与网络维护来获得奖励。


节点钱包的基础功能并不多,但对每一项功能的稳定性要求很高,满足这些基本功能后,那该节点钱包可以被定义为可用。在这个阶段,通过交互设计带来的体验提升是有限的。


交互设计提升的体验是视觉和操作上的,但一切的交互体验都是建立在功能完备的基础上。因此我们想要节点钱包在体验上有质的改变,还应该先从功能上下手。



可作为本地服务器的节点钱包


通过节点钱包的工作机制我们可以看出,它相对比较重,当用户更换设备或设备不在身边时,需要重新下载节点程序,然后等待同步数据完成。这样对于用户使用产品的即时性就大大降低,那么我们是否有办法可以解决这样的问题,让用户不受地点和时间的限制呢?


其中一种处理方式就是:中心化结合非中心化。其中中心化指的是我们可以提供一个web版本的钱包给用户,前端页面通过https请求连接链上的某个节点来获取整个链的数据来展示给用户。


对于交易的签名,在本地浏览器中用JavaScript完成,这样也保证了私钥不会被发送到网络中,保证了资产的安全。非中心化指的是当用户可以使用常用设备时,可以打开web钱包然后把连接的服务器切换到本地的节点程序,这样可以极大加快响应速度,提升用户的使用体验。


这种方式就和之前直接运行节点程序一样,只是将UI单独剥离出来了。用户还可以切换到自己认为更加稳定或带宽更高的远程节点服务器上,这些都是可配置的。



通过中心化结合非中心化的方式,在之前节点钱包基础上增加了以下功能提供给用户:


  • 直接通过网页即可使用区块链钱包

  • 根据实际情况切换所连接的节点程序


通过这两个功能便解决了节点钱包UI更新困难的问题,UI资源存放在中心化服务器上,可随时更新。同时也解决了钱包更换设备需重新下载钱包的问题。用户可在任何地方连接自己运行的节点或者可信节点。


当然,最好的方式肯定是连接本地节点,避免了可能由于网络带来的不稳定问题。通过中心化结合非中心化的方式就让节点钱包的体验开始走向易用方向了。



基于模块化设计的节点运行多条链


随着区块链领域的产品落地,区块链产品会逐渐走入我们的日常生活,然而我们需要的产品服务,是一条链没办法全部解决的。那我们肯定会涉及到使用多条链,这就意味着我们需要在自己的设备上去下载并运行多个钱包,这显然是不合理的。我们需要寻求某种方式,让我们可以更方便地使用区块链服务。


NULS——一个可定制的区块链基础设施,给我们提供了一个解决方案,通过模块化设计让节点钱包同时支持多条链。关于NULS,有兴趣的同学可以直接去官网nuls.io进行了解,本文我将直接讲解决方案。


首先,大家需要理解一种程序设计思想-模块化设计,它指的是对众多功能按照某种维度进行划分,设计出一系列功能模块,通过对模块的选择和组合可以构成不同的产品,这个过程有点类似于使用不同形状的乐高积木来搭建一些建筑。


其次,大家还需了解一个产品——链工厂(链工厂是NULS的一个产品),链工厂就是基于模块化架构开发的一个产品,这个产品提供的主要功能就是快速低成本造链。在链工厂中,用户可以根据实际的业务需求按照以下步骤快速生成并运行一条新链。


  • 在模块仓库中挑选合适的模块,例如共识模块,网络模块,账本模块,业务模块等等

  • 配置初始参数,例如发行量,初始持有Token的地址

  • 打包生成链的程序包

  • 程序生成后可选择直接通过链工厂的云节点来运行新链,这样可以节省用户自己搭建环境的时间


那么链工厂的节点是如何办到同时作为链工厂和其他链的节点钱包呢?


我们知道链工厂是模块化架构,因此其节点钱包是通过不同的模块组合而成的,而通过链工厂造出的链也是模块化架构。


链工厂的节点只要包含新链节点的模块,那么新链的节点钱包就相当于是链工厂节点钱包的子集,那链工厂的节点自然就可以作为新链的节点钱包运行了,且用户还可以在链工厂节点钱包中自由安装或卸载某些链,也就是说用户可以自由选择节点钱包支持哪些链。



通过模块化设计+链工厂的解决方案,节点钱包就又在之前的中心化结合非中心化的方式上增加了以下功能提供给用户:


  • 支持同时作为多条链的节点钱包

  • 自由安装或卸载某些链


链工厂的节点钱包可同时作为多条链的节点钱包,解决了用户需要下载不同链的节点钱包问题,更加符合用户的实际使用场景,能给用户带来更好的使用体验。




总结


随着业务的发展会持续不断产生新的需求,我们需要通过调整或者改进我们的产品去快速应对这些变化,正如在本文所分享的一样,在区块链行业初期,用户只是需要一个可管理资产,转账的钱包,于是我们提供了包含这些功能的钱包给用户,但随着发展,用户对钱包的使用频率增加,于是对钱包的稳定性和易用性要求开始提高。


我们就应对变化,用中心化和非中心化结合的方式解决了即时性的问题。在可预见的将来,区块链产品会逐渐走入我们的生活,我们的节点钱包需要支持多条链,我们便提出单个节点钱包支持多链的解决方案。


我们需要通过一种循序渐进的方式来逐渐打磨一款高易用性的区块链钱包,让用户能够体验到一款优秀的区块链钱包应该是什么样子。


作者:罗鹏,NULS产品经理,负责钱包,浏览器,链工厂等一系列产品。



— END —



推荐阅读


点击“阅读原文”,打开APP 阅读更顺畅哟!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存