Cardano的轻钱包

有时候用户体验和安全性/去中心化/隐私性等特性是冲突的,比如大家都想要的轻钱包。

不过首先要声明我们这里指的轻钱包不是所谓的交易所钱包或者服务器钱包,我还是认为钱包的底线依然是:私钥必须加密存放在用户的设备上, 并且代码应该开源,使得大家可以验证这一点,具体大家可以参考前一篇: 关于钱包的安全性

比特币PoW机制利用SPV机制算是比较好的解决了轻钱包的问题,只需要同步几百M数据,同时可以保留和全节点钱包类似的安全性和隐私性。 其中根本原因还是因为PoW协议的简洁性,共识协议相关的信息(算力)已经包含在哈希值里面了,只需要拿着区块头就可以确认链数据的正确性。 而且比特币一个区块头只需要80个字节。作为对比以太坊的区块头是500多个字节,Cardano是600多个字节,而且Cardano目前的共识协议相关的验证所需要用到的MPC中间数据,还不在区块头中, 意味着类似SPV的轻钱包模型,基本上没有可行性。

Cardano区块头格式(n表示一个整数,编码长度可变) :

protocol magic : n
 hash(prev header): 32
 body proof
   tx proof
     number : n
     merkle root: 32
     hash(witnesses): 32
   mpc proof
     hash(data): 32
     hash(vss certificate): 32
   hash(delegate payload): 32
   hash(update payload): 32
 consensus data
   slotid: (n, n)
   leader public key: 64
   difficulty: n
   signature: 64 * 4
 extra block data: 0 

当然,在Cardano去中心化之前,不去校验区块数据其实没有太大问题,因为目前数据来源本来也都是官方的服务器,不存在信任问题。 如果Cardano去中心化后能够实现Ouroboros Praos,轻钱包问题很可能还会有更完美的解决方案。

OK,暂时选择不纠结数据校验的问题之后,就只剩下几个问题需要考虑:

  • 钱包恢复
    钱包恢复操作的本质就是在链上找出属于这个钱包的所有地址。 目前Cardano官方钱包生成地址的索引不是按顺序来的,这导致恢复钱包需要检查链上所有地址,这个是目前官方钱包恢复钱包操作慢的主要原因。 这个问题可以通过实现 BIP44 规范解决,生成新地址的索引是连续的。在恢复钱包的时候,只要按顺序检查每个地址在链上是否存在, 直到遇到第一个链上不存在的地址时(或者允许少量的空间),就可以认为恢复完成了。 但是要升级到BIP44规范不是一个向后兼容的操作,所以很可能新钱包不能支持大家直接恢复目前官方钱包里面的钱包。 但是大家依然可以使用原来的助记词创建新钱包,然后在目前官方钱包上做一笔转账,就可以转换到新钱包上来。
  • 下载数据
    轻钱包的关键就是要尽量减少需要下载的数据。在放弃校验数据的情况下,我们首先可以把区块中大部分的数据移除,只需要保留区块头中少量数据用于处理可能的分叉和回滚, 以及区块体中的交易数据本身。其次我们希望尽可能只下载我们自己钱包相关的数据,而不是把所有人的交易数据都下载下来。一个naive的实现方式就是, 把自己钱包的地址集合传给服务器,然后让服务器过滤掉不相关的信息,但是这样就彻底破坏了UTxO模型的隐私保护的优势了。
UTxO模型的隐私性
比特币(以及Cardano结算层)的UTxO模型相比以太坊的账户模型,一个很大的优势就是更好的隐私保护,因为UTxO模型可以做到每次交易都使用新的地址,这样别人知道你一个地址, 没办法关联到你其他地址,所以他只能在链上查询到你这一个地址的交易历史,而无法查看你整个钱包的交易历史。当然根据地址与地址之间转账的情况, 有时候可以猜到一些地址之间关联性,所以这种隐私保护也不是绝对的,但是毕竟比没有强。但是如果把自己的地址集合全部发送给服务器的话, 也就完全暴露了自己所有地址的隐私信息了。

那么有没有可能既保护好隐私,有可以少下载一些数据呢,其实比特币的SPV轻钱包早就有解决方案了,也就是所谓的bloom filter技术(BIP37)。 它会把你的地址集合哈希(哈希表的哈希,而不是密码学的哈希)到一个bitmap的索引,你把这个bitmap传给服务器,服务器下发所有匹配这个bitmap的信息下来, 因为碰撞的存在,里面会有部分来自其他人的信息,本地再做一层过滤就可以了。你还可以调整这个bitmap的大小,在隐私性和数据下载量之间权衡,bitmap越大,隐私保护越好, 但是数据下载量也会增大。

这是我目前能想到的针对Cardano轻钱包最好的实现方式了,官方最近也发布一个开发中的轻钱包项目,目前看代码直接采用上传地址集合的做法, 问题确实简化了,但我认为哪怕是在目前中心化的阶段,也不应该直接放弃隐私性的考虑。

欢迎关注 小艾钱包开发进展

编辑于 2018-08-20

文章被以下专栏收录

    从程序员角度介绍区块链技术的文章(想支持我可以送我点ada:DdzFFzCqrhsu76B2Qd7dsKMvwEugFZ4ZWoRfP5ih9wUQGA2XsDAe1GXZYqtQJ8Cvftu33GyYH2PQogSSkFrfk6ooVTZsZgMCkj3r5hXn)