R3 研究院旨在用商业语言为决策者以及分布式账本技术爱好者提供关于分布式账本技术的简明报告。这些报告是由该领域的专家基于对该技术的实际经验撰写。
目录:
1. 可用性:为什么要使用分布式账本?
2. 治理机制:谁规定规则?
3. 有意义的比较:哪一个更好?
4. 密钥管理:如何进行交易?
5. 敏捷性:使用哪些算法?
6. 互通性:如何互相交流?
7. 扩展性:为什么存储每一笔交易?
8. 成本效益:什么是最便宜的方法?
9. 隐私:如何保护数据?
10. 扩展性:我们需要完全同意吗?
*免责声明:本白皮书仅供一般信息的讨论,对于使用、依赖或根据白皮书中的信息采取行动所造成的直接或间接损失,贡献者不承担任何责任。这些观点研究人员和相关作者的观点并不一定反映R3或R3联盟成员的观点。
2009年1月,比特币的匿名创始人中本聪向世界发布了比特币。在接下来的几年里,这种加密货币及其底层技术被称为区块链,在起起伏伏中几乎没有人能预测到它的发展。一方面它得到了世界上一些国家政府的赞扬,有些人预测“区块链”有一天会像“互联网”一样遍布全球。另一方面它又被一些国家政府禁止使用,也有些人已经宣布它的“漂流”和“死亡”。比特币的价格在2013年晚些时候涨到了1200美元/比特币,但在接下来的一年里,比特币的价格在200美元/比特币到500美元/比特币之间徘徊,然后在2016年又开始稳步攀升,目前的价格已接近其早期的峰值。
多年来讨论主要集中在比特币上,后来人们开始意识到区块链的更多潜力,以及“下一代”,如以太坊,Steem,Zcash相继被推出。更成熟的公司也意识到区块链恢复力、完整性等更抽象属性的价值,并将其重新应用于特定行业,创造了一个更广泛的技术类别,称为分布式账本,并形成了产业联盟,如R3和Hyperledger。
在许多未知因素中,有一点却越来越清楚,即分布式账本即使最终可能不会像“互联网”那样,但仍将以这样或那样的形式存在。然而,分布式账本从现在的情形到被广泛采用还有很长的路要走,还有许多重要的决定要做,这些决定将会影响到最终产品的安全性和适用性。
接下来,本文作者列出了这条道路上的十大障碍,以及作为一个社区可以如何做(和一直在做)来解决这些障碍。所有的观点都是作者作为这个研究领域长期和积极的参与者的见解,并且为了避免把这份报告变成一本大部头的书,作者不得不略去了许多有趣的解决方案。这些问题的排序略微简略,是从最小到最紧急或者说更准确地说,从最广泛的到最具体的问题排序。但是如果不考虑如何解决这些障碍而想要广泛、有效和持久的采用分布式账本技术,这是不可能的。
1. 可用性:为什么要使用分布式账本?
问题:可用性指的是什么?它有什么使用上的问题?在这种情形下有几种可能,例如,有人可能会说,目前开发的分布式账本没有特别好的交互界面,如果没有专家的知识,就很难使用。一定程度上确实是这样,但人们应该预期任何新技术都会出现这些问题,并进一步预期这些问题会随着时间的推移和使用量的增加而得到解决。(在这里,关系型数据库和图形化发展,如果不完美的话,用户界面的开发可以作为有用的历史记录。)
因此,一个可能更有趣的“可用性”问题是:终端用户真正想从分布式账本中得到什么?目前终端用户互动使用的大多数已开发的密码是已经存在了几个世纪的风格。如果你想隐藏与某人的对话内容,请使用加密。如果你想让某人相信你所说的真实性,可以使用电子签名。但是,就最终用户的需求而言,分布式账本的完全公开可验证性(或可追责性、不可变性等)真正对应的是什么呢?
潜在的和正在开发的解决方案。就我所知,几乎没有。到目前为止,对这方面的研究大多集中在更迫切需要解决的架构问题上,这个将在后面进行讨论。事实上,大多数终端用户可能对分布式账本的属性不感兴趣(就像他们也可能对常规数据库的属性不感兴趣一样)。然而,考虑到越来越多的用户已经在比特币这样的平台上进行了互动,以及所讨论的分布式账本的潜力,人们认为通过使用这些技术可以实现哪些具体的好处仍然值得探索。
2. 治理机制:谁规定规则?
问题。分布式账本的美妙之处在于,没有一个实体能够控制网络所做的决策;例如,在比特币中,只有在网络中的大多数节点都同意该行为的有效性时,币才会产生或从一方转移到另一方。当任何一个节点变得过于强大时,这个过程就会受到威胁,在这些去中心化网络的运作上有一个更大的问题隐现:首先谁来决定哪些行动是有效的?事实是,所有这些网络运作都是按照一套既定的规则运行的,“谁制定规则和谁执行规则至少同等重要”。
在制定规则的过程中,即使是去中心化的网络也会产生严重的中心化。在比特币中,新区块加入链的速度,参与者将交易封存到账本中的奖励,以及许多其他参数都由中本聪提出的,此后一直没有改变。以太坊目前在其网络中实施了四个所谓的“硬分支”,在这四个分支中,参与者基本上必须切换到一个新的软件版本,以遵守一组核心开发者创建的新规则。
这些越来越常见的加密货币基础结构治理机制崩溃时,最有趣的影响之一是,第一次有许多人才意识到它的存在。因此,问题不仅仅在于我们不知道如何治理这些技术或者治理结构是中心化的,而且有点讽刺的是,我们需要在这些结构如何运作以及谁负责治理的这些方面更加透明。
潜在的和正在开发的解决方案。有几篇研究论文关注的是执行规则的实体如何维持去中心化,尽管在更普遍的分布式账本中,如何激励参与者帮助维护账本仍是一个有待解决的问题。(例如,除了谷歌或其他大型证书颁发机构之外,还不清楚还有谁愿意花费必要的资源来维护一个具有证书透明性的日志服务器,而且这不会为这些实体带来明确的回报。)
就制定规则的实体而言,几乎没有提出什么解决方案。“Satoshi Oath”概述了一个誓言,作者认为任何人都必须创建一个基于区块链的应用程序,但这仍然只是一个指导原则。广泛的分布式账本诸如R3和Hyperledger项目选择了一种基于联盟的方法,而其他诸如证书透明的项目选择了一种非常中心化的方法。然而,正如第3项所示,这些方法之间的比较如何,以及随着这些平台的普及,这些结构将如何发展,都还不清楚。
3. 有意义的比较:哪一个更好?
问题。比特币是第一种基于我们现知的区块链架构的加密货币,但肯定不是最后一个。现在市面上有成千上万的加密货币可选择,每个都有自己独特的卖点。以太坊提供了一种表达性更强的脚本语言和维护状态。莱特币可以比比特币的区块创建更快。狗币有一只可爱的狗!除了区块链之外,还有许多基于替代共识协议的加密货币提案,如股权证明、PBFT、两阶段委托等。以及在非货币相关设置下的建议,如证书透明度、R3 Corda和超账本结构,这些仍适用于分布式账本的大保护伞下。
在这样一个日益庞杂的情形中,自然会出现的一个问题是如何区分在这些方案中哪一个是最适合给定应用程序的解决方案。你是需要一个区块链,还是数据库?也许一个Excel电子表格就足够了?回到第1项,你想要的满足的性质是什么?你需要完全的公共可验证性吗?(如果需要,为什么?)即使有人可以指定必要属性的列表,目前仍不清楚哪些平台支持哪些属性以及支持的程度如何。
潜在的和正在开发的解决方案。最近的一些研究则从不同的加密货币选择不同的参数(例如,比特币10分钟产生区块vs莱特币使用2.5分钟间隔)和影响这些参数对系统的安全这些方面来看待问题,会发现例如相同级别的安全对所谓“自私矿业”攻击是通过在以太坊的37块区块和比特币的6块区块(由于相对陈旧块率的两个平台)来实现的。该工作特别关注基于工作证明的加密货币,因此没有扩展到更通用的分布式账本或基于替代共识协议的加密货币(见第3项的例子)。
4. 密钥管理:如何进行交易?
问题。一件有趣的事:2013年初,我在我的电脑上使用Ubuntu工作。在过去的四年里,我一直在定期地进行升级,但是系统已经达到了太多的线程影响其功能的地步,因此我决定重新安装操作系统。考虑到我桌面上所有的都是版本控制下的存储库,我在没有备份的情况下执行了安装。在安装完成后不到五分钟,我就想起了一个可怕的事实,我的比特币钱包在桌面上。幸运的是我只有很少的比特币存储,但多年来很多人都发生类似的事件,他们失去了更多,公开报道事件中最惨的是有人失去了7500比特币。关键是一旦钱包遗失或你的钱被盗,底层加密和交易的不可逆性意味着没有办法恢复。在一个公开的例子中,利用代码漏洞The DAO背后的智能合约在遭到攻击后,社区无能为力做任何事除了看他们偷走所有内部的资金存储(之前,一些以太坊治理机制开发者讨论用第9项创建并主张用硬叉修复损害)。
虽然这些事件对涉事的个人有严重的财务影响,但是他们应该不会对如同“狂野西部”世界般不受管制的加密货币出现这些情况而感到惊讶。随着人们提议更加主流的使用加密货币,比如将比特币钱包集成到Linux发行版中,人们可能还对这种类型的钱包没有准备,缺乏经验,因而可能会导致更多更严重的后果。因此我们需要更加稳健的,能够更好地解决钥匙丢失和被盗的方案。
潜在的和正在开发的解决方案。为了解决这个问题一个常用的有潜力的比特币技术是使用多重签名,其中多方将它们的公钥连接起来共同创建一个地址,其签名的某个子集可以满足其内容。例如,在3-3多重签名地址中,三方都需要签名,而在3- 1地址中,任何一个签名就够了。2-3多重签名地址可以说是防止密钥丢失的最佳防御方法,因为即使丢失了一个密钥,存储在该地址中的资金仍可被访问(而且额外的好处是,攻击者需要访问两个单独的密钥才能从该地址窃取)。
类似地,我们可以讨论秘密共享,即密钥在某个可信任朋友(或设备)的数字之间分割而不会串通,但是会在任何时候甚至他们的共享钥匙丢失时也会有所帮助。然而,对于这些解决方案,我们必须理解如果它们工作的威胁对于某些场景(回到第10项)是真实的,我们希望能够分发、存储和使用这些密钥。这也是一个有待解决的问题需要找出解决办法,使人们能够像以前那样轻松地重新获得失去的资金,用户可以重新访问他们忘记密码的账户。
5. 敏捷性:使用哪些算法?
问题。如第2项所讨论的,在许多加密货币中,规则似乎是从上到下:比特币使用ECDSA而不是曲线sec256k1,尽管这看起来像是一个奇怪的选择。比特币地址的计算方法是获取ECDSA公钥、执行SHA-256、执行扩展的RIPEMD-160、再次执行SHA-256,并重新安排此输出的字节和扩展的RIPEMD-160散列的输出,并将结果转换为base58字符串。治理开发人员已经决定了好的利害关系证明协议(更多关于第3项的内容,它将取代Ethash成为Ethereum中的共识协议)。
除了这些严格规范带来的治理问题之外,还有经常发生地加密原语中断问题。最终,计算机可能会变得足够强大,以至于SHA-256不再被认为是安全的。也许量子计算机很快就会出现,并且允许任何拥有量子计算机的人伪造ECDSA签名。虽然这两件事发生之前可能会有足够的警告和时间给开发人员,让他们切换到更安全的选择(无论如何这个问题会远远超出了分布式帐本本身!)。有一种说法是即使在为用户提供多个选项的今天,选择仍然还是使用系统如TLS。然而,与TLS一样,敏捷性可能会引发危险的攻击,因此在实现它的方式和支持加密原语的方式上都需要非常谨慎。
潜在的和正在开发的解决方案。几乎所有加密货币都没有实现敏捷性:对于每个密码原语,都有一个这样的实例。一个有争议的例外是以太坊,人们可以在其中技术上编码任何密码原语,甚至通过在合约中包含自定义库代码,有些东西在智能合约中是完全不安全的。然而,底层密码学(即,在网络中点对点检查用于验证个人交易)与其他加密货币一样严格。
也许是因为不受加密货币经常遇到的意识形态思维的阻碍,行业主导的分布式账本要灵活得多。例如在Corda,个人用户在形成合约时可以从可用的算法中自主选择。在超级账本结构,参与者基本上可以插入他们自己的共识协议。这里,是否可做根本不是问题,但如何将这些不同的选项组合(例如,如果两种不同的共识协议就总账的两部分达成一致,这意味着什么?),并且这些选项对整个系统的安全有什么影响,才是值得考虑的问题。
6. 互通性:如何互相交流?
问题。有些人相信未来会有一个单一的分类账(比如“互联网”),事实上,一般用途的平台理论上是可以的:如果其他问题在此列表被解决,并且支持大多数已知的分布式分类账的应用。然而,更有可能的情况是,不同的公司将根据其特殊要求采用不同的账本。例如,需要一组固定的银行达成一致意见的金融应用程序更有可能采用Corda或Hyperledger Fabric这样的平台,而需要完全开放参与的应用程序更有可能采用比特币或以太坊这样的平台。
为了实现广泛讨论的为分布式账本消除(或至少显著开放)特有的贮仓问题,因此必须实现某种互操作性,或一组允许这些不同的账本相互对话的方法。
潜在的和正在开发的解决方案。在基于区块链平台的领域内,侧链的想法提供了一个简单的方式,将动作从一个区块链转换到另一个,即在一个分类账中公布的交易对另一个分类账产生影响。不过这些侧链的安全性,到目前为止的研究还相对较少。因此,虽然侧链已经引起了很大的关注,但现在还没有看到太多的采用。
除此之外,还有许多尝试在分布式账本和真实世界的数据之间提供界面交互,如Town Crier和Oraclize.it。另外,Corda和Hyperledger Fabric试图在被选择的协议中实现模块化(见第6项),这意味着它们被设计为跨整个系统的不同用途进行互操作,但就我所知,在现有的解决方案之间几乎没有界面交互的尝试。
7. 扩展性:为什么存储每一笔交易?
问题。扩展性意味着很多事情。第1项讨论了利用网络中增加的计算能力来扩展处理单个交易所需的时间的必要性。另一个方面是,随着系统变得越来越流行,扩展性不应该显著增加系统用户的存储负载,因为这阻碍了参与并增加了进入的障碍。然而,出于完整性的目的,在我们期望完全公开可验证性(在第10项中进一步讨论)的系统中,不从分类账中删除条目是很重要的。主要问题在于如何在这两种(看似矛盾的)要求之间取得平衡。
在某些应用程序中,提供完全的可审核性非常重要(例如,为了满足监管要求),我们不得不增加参与者的存储负载。特别是在消费者应用程序中,实际上没有必要存储每笔交易,例如,我们今天不太可能想要或需要对2010年初的某人的咖啡购买进行有意义的检查。事实上,长期保留这些信息显然与用户的隐私相抵触(第2条)。
此外,在略微改变的信任模型中,比起愿意“归档”的用户,“随意”的用户可能更愿意卸载掉系统的审计程序。因此,归档用户可以存储整个分类账,而随意用户可以只存储需要核对的个人交易的有效性信息。
潜在的和正在开发的解决方案。比特币钱包在智能手机上运行的主要创新是,按照SPV客户的想法,目前构成完整比特币的账本没有100G的存储,类似于上面提到的临时用户。这些客户从归档的节点检索,并且只存储区块链沿线区块的标头,而不是它们的全部内容,并依赖这些标头检查重复消费(SPV表示要简化支付验证)。虽然客户已经广泛采用这些方法,但是其安全性,尤其是隐私还不完善,人们对其了解也不够。
另一个主要的发展将有助于防止在账本中的过多交易,包括闪电网络(Lightning network)。更普遍的说法是,这是一项最近越来越活跃的允许双方开通支付渠道的研究。使用这种渠道,一对配对交易可以被放入账本中,分别用来开启和关闭该渠道,但是许多单独的支付仍然可以发生。同样,尽管这种方法看起来很有前途,并引起了极大的关注,但使用这种通道的安全和隐私方面仍然没被研究清楚。
最后,另一个有前途的方法是如第10项所讨论的分片分类账。如果以某种方式实现后,参与者不需要存储(甚至不需要听到)与他们无关的交易,比如,我不需要储存每个人早上买的咖啡的交易,只要存我自己的。虽然这大大降低了单个用户的存储需求,但它对于了解存储最终单调增长的分类账的实际成本非常重要。
8. 成本效益:什么是最便宜的方法?
问题。人们对比特币及其基于工作证明的共识算法有诸多抱怨。可以把它的用电量与整个国家的用电量相比较,或者至少是这样大型发电厂,可以说简直是“环境灾难”。虽然很多争论都被夸大了,但事实是工作证明确实是非常昂贵的,如果它能以更便宜的方式达到同样的效果,当然会是件好事。
为此,人们已经提出了大量替代的共识协议,甚至使用替代加密货币。点点币,Nxt和黑币都在使用权益证明,以太坊则有一个计划过渡的(例如:硬叉子)权益证明。Casper,在接下来的两年内使用权益证明。英特尔的锯齿湖平台使用时间证明(PoET),这依赖于它的SGX架构。Permacoin建议重新利用挖掘过程来执行有用的工作,比如归档重要信息。最受欢迎的基于比特币的建议之一,Bitcoin-NG,建议单独使用工作证明,以选择一个周期性的“领导人”,然后可以迅速地(无需执行大量计算)证明单个交易。
如果向外扩展到一般的分布式账本,备选的共识协议列表就会增加,并且开始包括更熟悉的算法:两阶段提交、Raft、PBFT等。这些协议往往比加密货币中使用的“x证明”协议效率高得多,但它们需要一组固定的已知参与者。正如第8项所述,我们需要的是一种能够提供权衡的方法,在日益增长的共识协议中提供有意义的比较,并了解每个协议在给定的环境中所能提供的好处。
潜在的和正在开发的解决方案。在分布式账本研究社区,这似乎是最积极探索的问题。除了上述协议之外,还有几十篇文章提出了自己的建议,都是针对上述协议的(尤其是权益证明,在我写这篇文章时,它似乎是“圣杯”)。因此,在这个列表上的所有项目,似乎是我最希望在不久的将来可以看到的一套可行的解决方案。
9. 隐私:如何保护数据?
问题。大量的研究都集中在加密货币用户的匿名性上(比如保护参与者的身份),然而很少有研究关注他们的隐私。例如,比特币用户在技术上是“假名”的,因为他们的链上身份与真实世界的身份并没有内在联系,但每一笔交易的细节——例如,比特币的交易量仍然是完全透明的。假设我们考虑更多的平台和更奇特的案例,比如将健康记录存储在分布式账本上意味着交易将包含有关患者姓名的信息(比如他们真实世界的身份),他们的年龄,医疗程序的性质和理由,等等。虽然简单的解决方案是加密该数据并只向必要的各方提供解密密钥,但事实是,加密方案与所有加密原语一样,会被破坏(见第5项)或被盗用,因此这并不能提供一个长期的隐私解决方案。
即使在匿名方面,仍然有很多工作要做。一项长期的研究已经证明了比特币匿名性的局限性。虽然一些新兴平台如Monero和Zcash承诺要改进,然而它们可能还是有一些弱点,这些弱点将随着协议规范的不完善而出现。
潜在的和正在开发的解决方案。最简单的解决方案之一是将交易只发送给那些你信任的知道相关细节的参与者,这类似于我们在第10项中讨论的基于分片的解决方案。考虑隐私是很重要,因为交易可能在最初的参与者之外共享,或者可能有必要向一个参与者隐藏某些细节,但向另一个参与者披露这些细节。
一个通用的解决方案是Hawk,其中用户可以隐藏他们交易的细节,但仍然说服其他的参与者交易是有效的。虽然有用,但Hawk是特定的以太坊,并使用相当先进的密码,因此,一般的分布式账本如何实现轻量级的隐私和灵活的态度仍然是一个开放的问题。
10、扩展性:我们需要完全同意吗?
问题。可以说,完全分布式账本的最大障碍是坚持网络中的每个节点都需要对整个分类账的完整状态达成一致。 除了前面所提出的问题,这种方法(例如第6项),意味着分布式帐不能根据能力去处理越来越多的交易(吞吐量)的同时确保用户不需要等待交易的延迟。换句话说,加入网络的计算能力越强,网络在吞吐量和延迟方面的性能就越差。这正是由于每个节点必须就每个交易达成一致的要求,就意味着系统中的交易越多,节点等待它们充斥网络的时间就越长。
既然完整复制违反了分布式系统最基本的特性之一,我们可能会很自然地问自己:为什么要这样做?其中的一个主要好处是由这一需求启用的加密货币具有完全的公开可验证性:任何参与者都可以自己验证系统的功能正确,例如,重播所有交易并确保没有违反任何商定的规则。如果只有某些节点同意分类账的某些部分,那么就没有一个参与者能够满足可验证性。因此,为了提高吞吐量和减少延迟,必须在避免完整复制(这通常使用分片的技术完成,其中每个参与者只在给定的分片内看到交易)和至少在某种程度的开放性和可验证性之间提供平衡。
潜在的和正在开发的解决方案。这个话题已经得到了相当多的关注,学术上建议采用某种形式的分片来解决。类似地,许多行业提案采用一种分片方式,例如在Corda中,参与者只需要在与他们直接相关的交易上达成共识就可以了,而在证书透明度上,同样不需要在总账内容上达成全球共识。虽然这些方法可以实现更好的可扩展性,但它们也带来了完全去中心化解决方案无法实现的可验证性问题。例如,如果只有某些参与者看到某些交易,其他参与者如何知道他们的交易是遵守全球规则的?在缺乏这样一套全球规则的情况下,我们还能满足什么有意义的诚信概念呢?从这个清单上的所列的项目中,我们再次看到每个平台不可能提供一个独一无二的完美的解决方案,而是一组权衡——必须根据每一项所使用的技术来进行平衡。
参阅:
[1] J. Bonneau, A. Miller, J. Clark, A. Narayanan, J. A. Kroll, and E. W. Felten. Research perspectives and challenges for Bitcoin and cryptocurrencies. In Proceedings of the IEEE Symposium on Security and Privacy, 2015.
[2] J. Brekke and E. Haase. Satoshi Oath, 2016. http://ipfs.b9lab.com:8080/ipfs/
QmXysWEAexXQqYZhTGpECvksnaBkSEWHdGhM7vNeHxue2g/.
[3] M. Chase and S. Meiklejohn. Transparency overlays and applications. In Proceedings of ACM CCS 2016, 2016.
[4] G. Danezis and S. Meiklejohn. Centrally banked cryptocurrencies. In Proceedings of NDSS 2016, 2016.
[5] I. Eyal, A. E. Gencer, E. G. Sirer, and R. van Renesse. Bitcoin-NG: a scalable blockchain protocol. In Proceedings of NSDI 2016, 2016.
[6] A. Gervais, G. Karame, K. Wüst, V. Glykantzis, H. Ritzdorf, and S. Capkun. On the security and performance of proof of work blockchains. In Proceedings of ACM CCS 2016, 2016.
[7] A. Kosba, A. Miller, E. Shi, Z. Wen, and C. Papamanthou. Hawk: The blockchain model of cryptography and privacy-preserving smart contracts. In Proceedings of the IEEE Symposium on Security and Privacy, 2016.
[8] V. Lehdonvirta. The blockchain paradox: Why distributed ledger technologies may do little to transform the economy, 2016. http://blogs.oii.ox.ac.uk/policy/the-blockchainparadox-why-distributed-ledger-technologies-may-do-little-to-transform-theeconomy/.
[9] L. Luu, V. Narayanan, K. Baweja, C. Zheng, S. Gilbert, and P. Saxena. A secure sharding protocol for open blockchains. In Proceedings of CCS 2016, 2016.
[10] A. Miller, A. Juels, E. Shi, B. Parno, and J. Katz. Permacoin: Repurposing Bitcoin work for data preservation. In Proceedings of the IEEE Symposium on Security and Privacy, 2014.
[11] F. Zhang, E. Cecchetti, K. Croman, A. Juels, and E. Shi. Town Crier: an authenticated data feed for smart contracts. In Proceedings of CCS 2016, 2016.
R3是一家运用分布式账本技术构建下一代金融服务基础设施的企业软件公司。R3的成员来自六大洲的80多家全球金融机构和监管机构。它是金融市场上同类组织中最大的合作联盟。联盟成员在项目、研究、监管外展和专业服务中具有深刻见解。团队由金融业资深人士、技术专家和新科技企业家组成,汇集了来自电子金融市场、密码和数字货币的专业知识。
C.rda是一个与同行完全同步并且用于记录、管理和执行机构金融协议的开源、财务级分布式账本。Corda是唯一被设计为以解决金融行业的具体需求的分布式账本平台,是R3公司与由80多家世界领先银行和金融机构组成的联盟一年多来密切合作的结果。
来源:Sarah Meiklejohn
翻译:Emily|达瓴智库