洞见 | Blockchain UX

Ajian   |     |   1579 次阅读

编者注:2018 年 12 月 1 日,我们在上海举办了“洞见”系列活动的第二期,主题为“公链的基础设施”。下文为 Kai 的演讲整理稿。Kai 从账户管理和日常使用的角度出发,分析了不同公链的用户体验;这些细节丰富的表述,既反照出不同公链的设计原理,又充分体现了工程师们在公链给出的大条件下的创造力。

Blockchain UX

今天我讲的主题是 Blockchain UX,区块链的用户体验。我选择的切入点是钱包,一方面,钱包是用户跟区块链的交互界面,是公链的基础设施;另一方面,因为链本身有很多不同的特点,因此相关的钱包在使用上也会有一些特别的地方。其实也是想讲一下公链的特点跟我们这些使用区块链的人有什么样的关系。

About imToken and imToken News

稍微介绍一下 imToken。imToken 是钱包,钱包在公链的基础设施中是非常重要的一环了。区块链说的再好,牛吹的再多,最终还是要有用户来用;那么对普通人来说,如果你既不挖矿,也不是写合约的,那么你最需要的就是一个东西,能够转账、能够看到你的资产、能够调用链上那些很好用的功能。这就是我们钱包。

而钱包最关心的有两点,第一点是友好(friendly)。举个简单例子,去年 ICO 的时候,假如你是不是一个懂技术的人,你不会调用合约,那么你是很难去参与众筹活动的,那 imToken 可以帮大家一键完成 ICO。这是很重要的一点,就是好用,方便。另外一点是,用户既然用区块链去做了一些事情,那么肯定在链上会有资产;链上有了资产之后,或者说你在任何地方有了资产之后,你最关心的肯定是:我的资产安不安全?这两点就是钱包的终极目标:安全,好用。

我们的 Vision 是”make blockchain happen“。我们希望区块链这个这么新这么好的技术,能够在未来派上用场;而我们可以作为基础设施而存在。

然后稍微讲一下我们最近在做的事情。我不知道这里有多少我们的用户,其实我们现在的用户大头还是在我们最早开发那个版本,也就是 1.x 上。去年我们开始做 imToken 2.0,现在我们希望用户能够逐步迁移到这个新版本上。新的版本上会有更多新的东西,是一个全新的架构,它会更好用更安全,能够让每个用户享受到一些最近几年新出来的东西,比如说比特币的隔离见证,以及最近很火的 EOS,还包括更好的 dApp Browser,比如说 MakerDAO 或是其它的一些游戏,这些功能在 imToken 2.0 上会使用得更流畅一些。

我今天的演讲是这样的一个思路,就是跟大家一起走一遍,看钱包这个基础设施给用户提供了那些功能,然后讨论一下这些东西跟我们每个人有什么直接的关系。

账户(Account)

对于账户而言,其实有个在线和离线的区别。那么大家可以猜一下,比特币、EOS 还有以太坊,这几条公链的账户分别是离线的还是在线的?可以稍微思考一下。

我对这件事情的理解是:对比特币而言,就是一个纯粹的离线的方案;对 EOS 而言,是一个在线的方案;然后对于以太坊来说,它可以兼容离线和在线的账户

没人用的地址

关于离线和在线,很重要的一点是,你是否能转账给一个不存在的地址。如果你们可以转账给一个不存在的地址的时候,它很可能是一个离线的方案。如果有时候你转账的时候,你说唉呀我转错了,比如说那串地址很长,长得很像哈希值,然后你去转账,转过去之后你才发现,根本没有人有这个账号,(如果会出现这种情况)那么这个公链很可能用的是离线账户方案。

此外,还有很重要一点是:如果我们想要个钱包,那么你是否需要联网才能获得一个钱包。这也是跟用户紧密相关的事情。比方说,如果你需要一个以太坊钱包,那么你可以离线生成一个钱包,比特币也是一样。但对于 EOS 来说,如果你想要一个账户,你必须在线,你不能够用一个离线的设备去创建一个 EOS 账户。这是由公链给基础设施带来的特点。以太坊比较有趣的一点是,你既可以创建一个离线账户,也可以创建一个在线账户,这个我后面再解释。

离线账户的生成方式

我们先看一下这条曲线(Secp256k1)。现在主要就是用这条曲线来创建公私钥对,然后你就有了一个钱包,你可以拿相关的地址去收款。这条曲线也是很重要的一个基础设施。

Keys

大家都知道账户一定会有私钥。但用户在接触不同的公链和不同场景的时候,你需要的私钥数量是不一样的

如果是一个比特币账户的话,那么你可能会有一大串的私钥,因为比特币是一个找零机制,你可能收款的时候用一个地址,找零的时候用另一个地址,你在收款和找零的时候用的可能是两个地址;然后你每一次去收款,找零的时候都可以用不同的地址。每个地址都对应着一把私钥,那么一个比特币钱包,比如 imToken 2.0,你从零开始用了一段时间之后,你在本地使用的这个钱包实际上是帮你管理着一大堆的私钥。

然后以太坊的话,如果你使用的是离线账户,你只会有一把私钥;换言之,一个地址对应一把私钥,就是一个账户。

但 EOS 提供的机制又是不一样的,就是说你有很多把私钥,但是是绑在一个账户上,就是你每次都用同一个账户去收款,但是这个账户上绑的这个公私钥对是可以随时去换的。很像你家的钥匙,你家比如说有两把钥匙,但是你可以把这个钥匙换掉;就像一个密码锁,它可以有很多组密码,而且可以随时删掉一部分密码。EOS 的机制跟这个密码锁很像:你有很多把私钥,但是你可以随时去换掉。

那么,在这种情况下,如何保证它们的安全,这就要看公链给你的基础条件是什么样的。比如说,如果你手上有很多把私钥,那么实际上用户管理的时候,你面对的就不是一把私钥两把私钥这样子,比特币用的实际上是一套助记词。对于以太坊来说,你可以导出私钥,当然也可以导出加密的私钥,它用的是第三方开发的 keystore 的格式。对于 EOS 来说,它可以分级管理:你可以设计某一把私钥是可以控制我的账户的,剩下的是平时用来转账的;甚至还有一个比较极端的例子,大家知道 EOS 是一个 dPoS 机制,最终出块是由 BD 来做的,这些 BD 会专门生成一把私钥,让他们的出纳到链上把他们的出块奖励领回来,但这把私钥只能够把钱从链上领回来,而不能把钱转出去。EOS 的私钥和账户可以说是解耦的状态,你可以设置很多策略,就像一个公司里面有出纳,有财务,然后出纳可能还有不同的出纳,比如说进账的、出账的还有对公打款的。EOS 给你提供了这样一个机制,你可以设置各种不同的权限。

以太坊的在线账户

以太坊的在线账户其实就是一个智能合约。这个事情已经存在蛮久了,比如一些多签名的钱包。这些持有资产的钱包不是一个离线的、有自己私钥的一个账户,而是一个合约,这个合约还设置了好几组私钥可以来管理不同的事情,比如设置了三把私钥,那么在转账的时候你要集齐两把私钥的签名才可以转账。

这个在线账户后来有一个改进,就是 EIP1014,是去年 8 月上线的。这个改进是说,一个合约的地址,在部署之前,是可以提前知道的。这个改进的好处在哪里?好处在于把在线的账户变得有些离线化。你可以给一个还不存在的合约的地址转账,然后别人就没法弄清楚这个账户到底是一个多签名合约,还是一个由人控制的外部地址;这样就可以防范其他人对合约的攻击。因此,你可以拿一个尚未部署的合约的地址去收钱,然后等到需要用钱的时候再部署合约,把钱拿出来用。这个就是最近蛮流行的 Gnosis Safe 做的事情,他们自己管这个叫“Smart Wallet”,他们觉得,我们应该能像 EOS 那样,能够更方便地管理自己的账户。

在这种时候,其实你需要的不是一个账户,而是一个合约;在这方面,以太坊本身对智能合约的支持也能给我们很多的帮助。除了 EIP1014,其实还有好几个 EIP 在推进这个事情,包括有一个概念叫做 universal logins,比如说,当你是一个合约管理的时候,你怎样去恢复你的账户,是可以用智能合约去管理的事情;又比如说当你拿私钥去备份的时候,可能你备份的是一串数字,而不是现在这样有数字有英文的私钥。这里就为个人的钱包提供了很强的扩展性,你可以有不同的形式来备份和管理。

在线账户的好处就是能让你拥有各种策略,不再是一把私钥对应一个地址,拿地址去收款,然后每次都要备份这把私钥。还比如说,最近有个项目,叫 gridplus,它的智能合约可以帮忙扣水电费,但每个月只能扣一次钱,而且扣款有上限。又或者说,就像我们现实中的商业用例,储值卡,比如你去全家可以用他们的储值卡消费,那么你也可以用合约来实现,往这个合约里充的钱就是在这里使用的,这就可以推广到现实的商业领域中。

公链如果能给我们提供这些功能,用户的账户管理就可以更灵活一些。

Naming Service(命名服务)

假如我现在拥有一个钱包,那我收款的时候,我是用什么样的形式让别人来打款给我?

比如 EOS,在获得账户的时候你要注册一个账户名,就像 QQ 靓号这样,你要去注册,那么你可以选择注册一个有意思的名字,比如说我们公司有个人注册了个名字叫做“打死都不要”。你看我们公司的人就喜欢干这样的事情。

对于以太坊而言,它有一个通过智能合约实现的类似的服务,ENS,以太坊域名服务。这个也是帮助你在传播自己的地址的时候,用一种更友好、别人更容易记更少犯错的形式,把地址传播出去。

那么,这两条链其实是通过不同的方式去完成这个事情,一个是原生的,在链的共识层大家做了这么一个命名服务;而在以太坊上,它构建了一个智能合约的平台,然后这个平台上有人实现了这样的服务

隐私性

对用户而言,还会关心的一个事情是隐私性。

大家可能很多时候都会听到,区块链不同于传统银行,它是一个什么公开的账本,对吧?那么既然是公开的话,如何在公开一部分数据的同时把隐私保护做好呢?这个也是很多区块链团队在研究的事情。当然,做的最好的就是 Zcash、门罗币之类的。最近有好几部电影都是讲,某个人用比特币收赃款然后被抓,另一些人用了门罗币,明明是同样的事情,但什么事也没有,就是说没有追溯到他是谁。

比特币的话,像刚刚说的那样,就是每次收款的话,都能够用同一套助记词推导出一个新的地址;因为一套助记词可以推导出很多个地址,那别人也没办法知道这些地址之间是不是有关联的。因此,很对时候,对于一个外部的观察者而言,这笔钱你是转给了自己,还是转给了别人,他是不知道的。

以太坊和 Zcash 的方法是,他们使用了一套叫做零知识证明的技术,用这种技术来保护隐私性。 但是以太坊在实现 zk-SNARK 的时候,它并不是在协议层原生地实现了这么一套东西,不是说以后在以太坊上转账会是完全隐私的情况,它的思路跟前面提到的 ENS 是一样的。以太坊本身就是做了一个智能合约平台,然后有这个想法有这个需求想做这个事情的,你可以自己去构建这个功能。

TPS 与用户体验

waiting

在 TPS 这个事情上,对用户来说最直观的感受、最直接的相关性就是:在一条低 TPS 的链上,就像大家平时接触到的 PoW,你的转账要等待确认,先是打包上链然后等待确认,这个过程是跟出快速度有关的。就像比特币,大家要完成一笔交易,先是交易被打包到区块中,需要十分钟,然后要完整确认的话,需要 6 个块到 10 个块(正常来说 6 个块已经很难被逆转了),那么相当于比特币转账需要一个小时,才能够确认下来。

对于高 TPS 的链比如 EOS 来说,当初我们刚接入的时候就是发现,事情完全不一样,转完就立马确认,这个对用户体验来说是完全不一样的东西。假如说一个区块链它能做到的一个很高很高的 TPS,就像支付宝这样的话,那么就是即时确认,就是我转过去,成功的话,那我真的就已经转出去了,而不像目前有一些链,要等 6 个块 10 个块,要很久才能得到确认。

encrypted private key

这样的高 TPS 还涉及到另一个事情:账户的私钥,如果要做安全存储,肯定是要加密的。我觉得任何一个你在市面上看到的钱包产品,你的账户的私钥肯定是加密存下来的,区别在于我什么时候去解开。

假如一条链,它的 TPS 不那么高的话,因为用户肯定不会经常在一秒内转好几次账,所以我们在设计钱包的时候,不会把解开的私钥存起来。

但对于 TPS 比较高的链比如 EOS,假如你要在上面玩一个博彩游戏,你可能一分钟之内要拿你的私钥来签十几次名。那么对于用户体验而言,如果你每次前面都要输一次密码,一分钟输入十几二十次密码,用户肯定是受不了的。所以现在主流的一些用户量比较大的 EOS 钱包,他们会把你的私钥存下来。就是说你的私钥在手机上是加密存储的,但是一旦解开的话,钱包可能会存着,因为他知道你肯定要频繁使用;你进入 dApp 的时候,他很可能会帮你把私钥要先存下来,你在 dApp 里面玩的时候,私钥就存在内存里,随时准备帮你做签名。

dApp

类似地,TPS 对应用开发也有一个非常重要的影响。

假如我在一个 TPS 比较低的链上,我会想着让用户操作的次数尽可能少一点,让用户做一次操作能完成的事情多一点。

而对于 TPS 比较高的链来说,开发者其实不太需要关注这个事情,因为钱包这个基础设施它能够帮忙。当然前面说的那种操作可能稍微不那么安全,但确实可以让你的签名更块。

所以对于开发者来说,它的体验会是完全不一样的。那么在这一点上,就推广区块链而言,我们的理解是,最好 dApp 开发者不需要关注太多的事情、开发的门槛尽可能低、他可以随心所欲地开发出尽可能好用的 dApp。但是在以太坊上,如果一个团队实现了了一个东西需要反复签名,这样的产品很有可能是不受欢迎的。

data capacity

另一个相关的事情是,假如一个链它是很快的,那么它产出的区块可能很多,人们的转账可能也很多,就是说他的数据生成速度会非常快,这个对钱包设计也会有影响。比如说,比特币会有一种 Light Node 的概念,你的钱包就是一个轻节点;但对于 EOS 来说,没有这个条件。 因为,假如我一台手机,每分钟要同步的区块有几十兆,那么我用一个小时岂不是要几百兆的存储空间,对用户来说肯定是不能接受的。

所以,一条区块链的 TPS 越高,它的节点可能就越少,因为对于一个节点来说,它需要负担就是所有数据存储的费用。而且这件事情还有个反面,就是说,假如我是一个矿工,或是一个 validator,出块速度那么高的话,我为此需要付出的成本是很高的。所以如果行情像最近这样的话,那些 EOS 的 dPoS 节点,因为他们的速度很快,那么他们的服务器的价格可能很高,那么当我运维这个节点服务器的价格已经高到我每天出块的奖励都没法弥补的时候,大家觉得会发生什么事,就是他不会想去做这个事情,他不再想去竞选 BP,因为竞选回来是无利可图的。

所以说,高 TPS 也反映在,做全节点的或是做区块浏览器的,做数据挖掘的,他们成本会变高。所以 TPS 不同,周围的整个基础设施的相关参与者,他们的成本、他们做所谓事情是不一样的。

治理

Proof of What? What can token holders do?

治理这个概念在这里比较宽泛。最简单的就是,Po 什么什么鬼,对吧。PoW 就是挖矿,PoS 就是投票。无论怎么样,它决定了参与的形式。

比如比特币,要开会的话,他会找谁?以太坊也是一样,要开会的话,肯定有这些负责挖矿的矿工要参与。但是像 EOS 这样的 dPoS 机制的话,要去参与的人就不仅仅是负责出块的,这个你可以认为是一种新的矿工,还有一些持币的人,他们可以投票。那么对用户而言,它可能是完全不一样的。在 PoW 中,持有一种币,你只能花掉;但在 dPoS 中,持有代币你不仅可以花掉,还可以拿它来投票,决定谁能出块。这个对钱包设计来说也是不一样的。比如说 EOS 刚上线的时候,很重要的一部分就是我们一同来投票,然后投票工具都有一大堆,但你不可能在 PoW 里面看到这个事情。

How to recover your lost?

还有另一方面,在 dPoS 中因为是固定的出块人,出了什么事情你可以去申诉。EOS 社区中的很多人(都有这种申诉经历),比如说我的钱包被盗了,或者账户出现了什么问题,比如说我参加 EOS 的 ICO 但是最后钱包映射的时候出错了,就是 EOS 主网上线之后我要领这个代币,我这个流程我怎么操作错了。对于一个相对中心化的链来说,在治理上,你可以做申诉;你遇到问题可以去找他,然后让他帮你恢复帮你处理这个事情。 但是对相对而言比较去中心化的治理来说,就拿同一件事情来说好了,如果你在一个以私钥为基础的体系中把钱丢了,就真的丢了,没有办法;还有另外的可能就是像当年以太坊 The DAO 事件一样,当整个社区遭受了一次大家称为攻击的事情之后,资产被黑客转走了,这个时候,社区还有可以做的一件事情就是硬分叉,就说我把某一个损失整个在这条链的数据上把它改掉。当然这个事情是得到所有人的认可。

tx cost

转账的成本是什么?

对于 PoW 而言,我们付的钱叫做矿工费

那么在比特币上你是怎么样去付这个矿工费的呢?比如说我要给另一个人转账,转十块钱,但我肯定不是刚好有一笔价值 10 块钱的 UTXO 可以转给他,那么我会有一些零钱找回来。就好像你在日常生活中,你可能去吃个饭,99 块钱,用纸币去付,然后他要找你一块钱,他找半天没找到,这时候你可能就会让他不用找了对吧?比特币也是类似的机制,就是你在转一笔钱的时候,你的 UTXO 输入和输出中间的差额就会变成矿工费。这个矿工费决定了你的交易的确认速度是不一样的,比如在网络特别堵的时候,矿工会选择矿工费更大的交易。

以太坊采取的是类似的机制,但也有一些不一样的地方。比特币很像生活中的小费,小费就是我要给多少就给多少。但是在以太坊上,你要给矿工费的时候,不完全取决于你想给多少给多少,因为就像上面说的,以太坊是一个智能合约平台,你做的每一个操作,不管是转账还是调用合约,他要算出来你这个计算过程需要多少的成本,用一个叫做 Gas 的单位来衡量,计算出你的操作需要多少的 Gas 数量,再乘以你为每个 Gas 愿意付出的价格,这个才是矿工最终拿到的收益。

但 PoS 会相对不一样。最近以太坊就在推这个事情,就是资源的租赁。EOS 的话比较奇怪,资源租赁之后就直接给了他的用户。用户要用的时候也必须去租资源,也就是出块的节点需要用到的一些计算机资源,那么在 EOS 里面,是由用户来直接承担这个成本。

以太坊最近也在考虑做类似的事情,因为不同的合约用到的存储空间是非常不一样的。比如说某种代币,它做了一个很大规模的空投,而另一种代币,只是你自己发来收藏一下,其实它们用到的存储是完全不一样的。那么存储的费用其实最终会落到网络中的节点上,构建账本所需要的各种费用都是由全节点来承担的。

那么这里面就存在一个问题,就是资源提供者如何收费的问题(也就是用户如何为资源使用支付的问题)。比如,你用比特币转账的时候,你支付矿工费,矿工把你的交易打包到区块里,以太坊也是一样,矿工把你的状态写到 Merkle Trie 里面。那么最终,这个链的基础设施参与方如何跟用户结算呢?是用资源租赁的形式,还是在使用的时候一次性收费呢?

对于说用户体验来说,这是完全不一样的。如果要用户自己去租的话,很可能会遇到一个很尴尬的情况,就是我现在要去做转账,但是我拥有资源不够,那这时候怎么办?这时候我只靠外部人把这个东西租了给我,或者说我有某种渠道去获取这些资源,但是,在极端情况下你可能会陷入一种困境,就是无论如何都无法完成这种操作,那么你的账户就会锁死在那里。

tx logic

一笔交易里面的逻辑,能做多少做多少事情,在不同的链上其实也是不太一样的。

比如说比特币,你的交易里面要使用一些逻辑的话,实际上不是别人写好的东西你去用,而是说你在签名的时候,你要决定说这笔钱以后要怎么样才能取出来,这是你签名的时候决定的。这也是 BCH 之前分叉的时候他们争论的一个点,就是为了把这功能变得更强,我能够加一些怎样的逻辑进去?他们有一些分歧,然后就分叉了。

但对于以太坊和 EOS 而言,他们就是一个智能合约平台,那么你在发交易做一个逻辑调用的时候,实际上你是调用,不是一个确定的东西,而是别人写好了一个业务逻辑你去用。这个就比较符合我们传统互联网上的一些商业。就好像是团购,那么团购是别人先设计好,然后你来去做团购这个事情;而比特币,假如你用同样的角度去理解的话,相当于是我去买单的时候,我自己把团购这个逻辑塞进去

总结一下,tx logic 就是说一个用户在转账的时候,能做多少事情。比特币就像我们前面说的,是 UTXO 机制,那么一笔钱可以有很多个输出(找零),我可以在签名的时候决定这些找零要怎么样才能使用,也就是让逻辑发挥出它的作用。对以太坊来说,我一次转账的时候只能调用一个合约。对 EOS 来说,它会更先进一些,就是一笔转账中我能做的事情更多,我可以做十个事情,一百个事情,只要我资源足够,我都能去做。

Scale

我最近跟很多侧链啊、二层网络的项目接触,但实际上这些东西离钱包的用户来说会更远一些。

现在大家看到的扩展方向,像大家前面一直提的侧链,还有最近出现的 Layer-2 项目,很多时候是让交易在链下完成,但是这个东西肯定是受到一些密码学机制去保护的。

另外就是分片,就是整个网络里面可以分成多少个分片。比如说以太坊,它的目标是我能够把这些基础设施分成一千片,那么比起现在的单一一片,一个网络,我们的处理速度能够增大一千倍。

consensus range

从上述我们就可以看出来,当我们遭遇可扩展性问题的时候,大家的其中一种思路就是把共识的范围缩小

就像 Nervos 经常举的一个例子:我去做一个转账,是否需要得到全世界的共识?或者说,我只是想在这里给在座各位发个代币,又或者只是想玩一个游戏,游戏结束后才上链结算,那么我们玩这个游戏的过程其实不用上链,不用得到全世界的共识,只是游戏结束之后的这个结果,我可以去全球见证一下。就是说我们玩游戏输跟赢的过程在这里决定的(不用上链),这些输跟赢合计到最后产生的资产变化,是想拿到链上去结算、得到全球共识的。

上面所说的侧链也好,Layer-2 也好,他们做的事情就是把你的资产先记一下,在链上锁住,然后我们在链下继续操作这个资产,然后最终我们结算时候,再回到链上

跨链

有个事情最后再提一下,就是跨链。跨链最简单的方法就是用 Hash Lock。这个其实已经有一些团队在开发了,也很简单,就是这条链上拿一个哈希值把你的资产锁住,然后在另一条链上,你去证明这个哈希值是什么,把你的资产拿回来;当然一开始的时候需要有一些基础设施,能让你在两边把资产都锁定住。

明年跟后年会上线的两个跨链项目是 Cosmos 和 Polkadot。Cosmos 他们做的叫 IBC,叫做“区块链间通讯协议”,就是你能拿某一个链上的资产,把它发到另一条链上,比如说你在 EOS 上有一个资产,你可以把它寄到以太坊上。说起来很简单,但我觉得最终要落地的时候会很复杂,比如说以太坊的 ETH,假如说有了跨境基础设施之后,你可能会分散在多个链上,那么如果我要知道你有多少 ETH,我要把你的资产所在的所有链都看一遍。

去中心化存储

还有一个是去中心化存储。当初在链上存储很贵,大家都想说把这个存储成本转嫁到用户市场或者开发者身上。在去中心化存储中,现在最流行的做法就是:我把一个文件存到 IPFS 上,IPFS 会给你一个访问文件的哈希值,你把这个哈希值放到链上,比如以太坊上,然后去见证这个哈希值存不存在,然后大家可以看到这个存储的结果。

但是去中心化存储就会遇到一个问题,就是前面说的数据的隐私性,假如你把一个很大数据丢到这个去中心化网络里面,你如何能保证这个数据是隐私的,比如说只有你自己能访问,而且只有你自己能改,别人改不了,其实都是一些很大的话题。


作者: Kai

imToken 首席架构师。

 
0 人喜欢