一款BCH DApp的诞生

DApp的兴起

现在的区块链,处在一个爆发的前夕,之前的ICO狂躁,带来了一定的迷茫,但是大家都在说2018年是区块链应用元年,今年一定会有区块链的杀手级应用落地,然而得有人不断地在里面投入和试错,才能诞生这么一个杀手级应用。为此我们也进行了初期的尝试,基于BCH的公链,做了一款身份验证、密码管理的应用。做区块链DApp的过程中,时常会怀疑自己做的是不是伪需求,因为区块链的个性鲜明,使得开发起来挺别扭的。虽然获得了数据的安全性,但是开发效率却不高,需要自己定义一套协议,存取的方式也需要做一次加解密。

报名BCH Geek大赛

近期,刚好来自重庆的盖茨实验室举办了一场BCH和EOS社区的极客大赛,大赛吸引了一批开发者和在校大学生的踊跃参与,从中也诞生了许多的优秀的应用,给我们带来许多启发,虽然暂时还只是一个雏形,不能有清晰明确的商业模式,但也是非常伟大的尝试。当然,我们也报名参加了这次的大赛,虽然仅了解了一点皮毛,但是我们还是鼓起勇气报名了。

我们给战队取名叫【神雕侠侣】,因为神雕侠和satoshi还挺谐音的,算是致敬中本聪吧。我们团队由两人组成,一个是我,另外一个是我女朋友,两个人一个负责开发,一个负责产品和运营。

image
邓国东,曾任职于腾讯、ViaBTC,从事Web系统、数字货币矿池及钱包开发,是一个面向全栈的技术开发人员。有志于通过技术,让更多人从区块链中受益。

image
杨春萍,任职于漫游超人,擅长品牌及产品社交媒体运营运营,精通两微一端及数字媒体传播,曾主要负责漫游超人品牌植入《唐人街探案2》项目营销。

刚上台介绍战队的时候,我一个人上去,他们以为我是那只雕。。。
既然报名了,那就硬着头皮也要上,于是也赶工了几天,终于将这个demo给做出来了。

为啥要做一个密码管理DApp

我们生活中需要使用到非常多的账号密码,然而这里有非常多的安全隐患,有许多人使用的账号密码甚至泄露已久,相当于在互联网里面裸奔,并没有什么隐私可言,甚至切身利益有可能被人随时掠夺。就密码来说,我们有许多的痛点:

  • 密码多(多到记不住)
  • 密码弱(密码很容易破解)
  • 密码重复(一个被破解,连带其它遭殃)
  • 不好输入(手动输入很繁琐)

我一开始就有一个愿望解决这些真实存在的痛点,能否开发一个使用区块链作为分布式存储方案的密码管理器呢?
答案是可行的,参考LastPass和1Password等竞品后,我们设计出了IFPassword,基本思路如下:

  • IFPassword配套有网站、小程序、浏览器插件
  • 用户通过浏览器插件可方便地添加账号密码、填写账号密码
  • 重要的密码数据将存储在去中心化存储上
  • 不重要的信息存储在IFPassword服务器上

于是我们初步实现了添加账号密码、填写账号密码的基础功能,当然,一开始只是为了验证这个流程,没有做到非常好的用户体验。

区块链知识

BCH上有一个OP_RETURN的操作码,在写入一笔交易的时候,允许在OP_RETURN上附带一个数据,大小为220Byte,足够塞下一条微博、一段哈希了。像之前诞生的memo——区块链上的微博,keyport——区块链上的微信等等都是基于OP_RETURN来存储的数据,我们实现的这个密码管理器,也是讲数据通过比特币采用的椭圆曲线算法加密后放置到OP_RETURN上的,它的安全级别和比特币是一样的。

那么如何写入这个OP_RETURN呢?其实也很简单,如果你连接的是一个比特币的节点,那么你只需要构造交易的时候,将这段数据写入输出的data字段,然后签名之后广播即可:

1
bitcoin-cli createrawtransaction '[{"txid":"3b0da5fd1beb71e1f47da2f3e9bd1af2e7026fd0282d18d9777a13e49089d146", "vout":0}]' '{"bitcoincash:qpktcr9pj6dh8vgepuvumymhwrg7536d7u4qsvdvhc": 0.00001500, "data": "6f11616d6f4141414b3034514477712b77574b384b462f567a793362375a4a6c6d4549475a79783070464d73347842447432424d4c4c65414a547449376b63622b43377a6e69455132554e4968353734626c4d5456534d786a43654d764f617162636641465966677868594a39557642526b687a365a63776361377437506a315a367171704e2f46363955774d2f68514a776c432b71694254314f596470686352656c4e664945314e55484a30745450742f644e4746565731712b673d3d"}'

如上面代码所示,将加密后的数据编码成了16进制写入了交易中,广播出去之后,就可以在区块链浏览器中看到这样的数据了,这个数据就是日后恢复数据的关键,不过千万不能把私钥给泄露了出去,泄露出去拿到私钥的人就可以解密这段消息了。
image

最终效果

编程实现了上述的写入区块链的逻辑以及相关的交互之后,大致的最终效果如下:

image
用插件管理TOTP二次验证,实现快速查看填写。

image
在插件中添加站点的账号密码。

image
在插件中查看各个网站的账号密码,可以复制粘贴到登录表单中。

启发

现在的互联网进入移动互联网以后,变成了一个个信息孤岛,大家在岛上玩得不亦乐乎,但是如果一个岛要到另外一个岛,那成本就高了。然而发明互联网的初衷,就是让人与人、人与物能够互相联通,然而现在却是越来越封闭了,并且原本属于用户的数据以及权利,被各个大公司垄断,并且他们还不能提供连续的服务,说不定哪天说停就停。我们需要一个能够持久存储你的数字资产的东西,一个人人能够使用,信息能够充分流淌的工具,就像早期的互联网一样,在上面探索可以不断发现新的东西,在区块链上,也是这样,顺藤摸瓜,能够发现许多的新东西。

我们做的这个玩意,它对我们还是有一点启发的:

  1. 数据是用户的资产,用户可以选择公开、加密它,也可以选择转让、授权给他人
  2. 数据是不需要依赖一个中心的,大家存储,大家使用,突破空间、突破时间的限制

未来,信息存储的方式以及内容分发的方式将产生极大的改变,试想这样一个问题,你是如何存储你的所有照片的?存在自己硬盘,需要常常备份,还是存在照片管理软件或在线空间,非常不方便管理和移动。然而,其实你的照片可以存储得无处不在,随时要随时取,并且永久保存,不会消失,你拥有对它的所有权利,你可以加密,你可以卖给别人,可以授权他人使用,等等。用户将重新获得数据的自由。