分布式系统学习小记17 —— 区块栈 Blockstack

“Hi,这是小5自学算力大集群相关知识的第17篇笔记。这期将是区块链技术的第三期,同时也是分布式系统学习小记的完结篇。这次我们将围绕三个主题开始对 区块栈 Blockstack 进行了解。”

摘要

我们本次将围绕三个主题进行展开学习:

1.如何构建命名系统或真正意义上的公钥基础设施,该设施能够将名称映射到公钥;

2.作为一种非加密货币的区块链应用,区块链除了金融领域之外,是否还有其他用途;

3. Blockstack 实际上是对互联网服务或网站构建方式提出了一种截然不同的架构设想,与当前的网站构建方式有着显著不同的特性。

在正式开始之前不妨先了解一下”去中心化“意味着什么。如果将数据所有权从集中控制的网站(如普通网页服务器)转移出来,以某种方式将用户信息控制权更多地交到用户自己手中。从而使得用户拥有了自己的数据。而不是 Facebook、Gmall 或其他平台那样本质上拥有用户数据。

在众多典型的集中式网站上,存在着大量数据,从某种意义上讲这些数据属于用户,比如用户的 Gmail 邮箱,但实际上是 Gmall 或 Reddit 等平台掌控着这些数据,包括用户在他人文章下的评论。

这种配置取得了极大的成功,其中一个原因就是编程极其简单,但这套架构并不完美。其一,若我将邮件存储在 Gmail 中,则我必须使用 Gmall 的界面才能访问它。如果是用户的数据,比如我的照片或帖子,用户无法过多控制网站对其的处理,这实在不是什么好事。另一个可能的问题是,网站能够窥探我的个人信息。他们可能在查看我的电子邮件,以便考虑向我展示广告,或者告诉他们的广告客户当前人们感兴趣的内容。更糟糕的是,网站上的一些员工可能存在腐败行为,出于个人原因可能会窥探用户的数据。或许运营该网站的公司完全合规,但并不能保证所有员工始终遵守所有规则。

  • 尝试建立一种去中心化架构

假设有一大群用户,而用户们使用的是iPad、浏览器或其他类似设备。在这个新的去中心化方案中,我们将把所有的应用程序代码运行在客户端机器上,即用户的机器上,这与传统的本地应用很类似。

但基于互联网的应用真正有趣之处在于,可以将数据存储在云端,如果你拥有多个设备可以从任何一台设备访问你的数据,比如你的 iPhone 或笔记本电脑。而且,如果将数据存储在云端,就可以与他人共享数据。构建多用户应用程序,例如你可能知道的 eBay、Reddit ,或是共享日历等。

去中心化愿景的另一端则会有一个存储系统,某种云存储系统,我们所指的是一种你可以购买的服务,或许来自亚马逊的AWS,或任何其他地方,它将为你存储数据。比如我只是需要编辑一些文档,但我希望将它们保存在云端。当然,网络中的其他用户也可以购买自己的云存储空间并进行使用。

基于上述的架构。如果你想在这样的系统上构建一个类似 Facebook 的应用,该应用将知晓我的好友信息,并主动访问我的好友存储空间,以获取更新、照片或任何好友存储在自己空间中的内容。我将不再需要访问 Facebook 的网站,而是从 Facebook 下载一个应用程序并运行,该应用程序会知道如何找到我的朋友并查看他们存储的数据。

如果我的朋友将一张照片上传到他们的存储空间,这仍然是他们付费购买的存储空间,这张照片属于他们。 他们可以将其用于 Facebook ,也可以用于其他应用程序,因为这些应用程序与数据现在是相当分离的,而不是像现有架构中那样结合在一起。

在这种架构中,用户真正拥有、支付并组织自己的存储,数据的实际所有权和控制权归属用户的概念更为清晰。一个更为微妙的问题是,我可能会运行多个应用程序,其中一些是我不信任的。比如我只是从互联网上下载了一些多用户游戏,我不想在我玩那个游戏的时候,它能够查看我的电子邮件。这意味着,我们不仅需要对用户的权限有所概念,还可能希望拥有一种附属权限,能够讨论的不仅仅是作为个整体的这个用户,而是在运行应用程序时,该用户拥有特定的权限,比如仅限于游戏文件。

那么这种架构的要点是什么呢?

这或许能让用户对其数据拥有更多控制权,可能会让用户更容易切换应用程序。比如我上传了一堆照片,并且正在使用一款照片组织应用或照片编辑应用,由于我的照片与该应用完全独立,我可以在场换照片应用的同时,或许还能继续使用我已存储的那套原有的照片。

在这种架构中,开发能够处理多种类型数据的应用程序可能更为便捷。比如让我的电子邮件系统能够查看我的日程安排。

最后,在隐私和防窥探方面可能存在明显优势。与其将我的数据托付给一个不知其如何处理数据的网络服务,如果我们策略得当,便可运用加密技术。应用程序可以在数据离开我的客户端机器之前对其进行加密。这样一来,存储在此处的唯一内容就是加密后的数据。当我再次读取时,该回的是加密数据,然后在我的本地机器上进行解密。

那这种架构存在的问题又有哪些呢?

一个问题是,存在像 eBay 或Reddit 这样的网站,其数据并非明确归属于单一用户。有一些巧妙的算法, Reddit 正在运行,以决定首页上项目的顺序。这与投票以及谁知道的其他因素有关。那些算法运行在何处?它们从哪里获取数据?又或许,它们将关于首页的结论存储在哪里?

另一种看似难以实现的网站类型是 eBay ,在这里你想要与其他人竞标。eBay会告知你是否拥有当前最高出价,这意味着eBay需要查看其他人的出价,但那些竞价是私密的。你不想让别人看到你的出价,因为那样他们只需比你高出1分钱就能以低成本赢得竞标。

并且,一旦涉及复杂的多用户应用场景。例如用户组,利用密码学解决隐私问题可能会变得相当棘手。

  • Blockstack 具体实现

首先, Blockstack 需要一种方法来映射名称到存放你数据的位置。

第二,是需要能够进行验证这确实是所需的正确数据之类的操作。之所以这样做,是为了不必信任存储服务。为了能够验证这是正确的数据,我们需要一种方法将名称映射到公钥。我们将假设,在存储数据时,您首先会使用您的公钥对其进行签名。因此,我们需要同时将名称映射到查找个人数据的位置,以及将名称映射到公钥,以便我们在检索数据时能够验证这些数据确实是由您所写,而非存储服务或其他任何人炮制的误导性内容。

这种公钥命名机制实际上还有其他用途。如果我想加密数据,使得只有你能够阅读,那么我可能会采用的方法是使用你的公钥来加密数据或某个其他密钥。从而确保只有你的私钥才能解密阅读。因此,若要实现加密访问控制列表(ACL),或几乎任何权限方案、访问控制方案,我需要能够指明可以使用数据的人员。

将人们的名字映射到公钥上,这通常被称为公钥基础设施,即 PKI 。

这样,人们可以对自己产生的数据、电子邮件进行签名,并验证从他人处接收到的电子邮件或数据的签名,同时还能加密以确保隐私,使得只有预期的接收者才能解读这些数据。

那么,在已知我想与之通信的人的身份的情况下,如何找到他们的公钥?这里首先涉及到的是关于“名称”的类型特性。“名称”需要同时满足这三个条件是困难的,其中一个特性是它们的唯一性。这意味着这些名称具有全局意义,它以相同的方式映射到相同的数据位置,指向同一个公钥。第二个特性是其具有人类可读性。第三是命名系统的去中心化,即名称分配的去中心化。这种直观的困难在于,如果你有一个去中心化的系统,即不存在一个负责分配名称的实体。这就很难确保唯一性。需要拥有去中心化和唯一的名称则可能会失去可读性。

Blockstack 之所以引人关注,一个重要原因在于他们正努力构建一个全球规模的公钥基础设施。

Blockstack 的解决“名称”的方式是依赖比特币生成单一有序交易日志的能力。比特币系统能迅速解决任何分叉问题,并促使所有人就比特币区块链的区块顺序达成一致。一旦我们有了比特币,它能在交易序列上达成共识,我们就可以将任何交易插入到比特币的日志中。这些交易,除了可能是有效的比特币交易外,还可能隐藏着名称预订记录。这涉及到了比特币区块链上的一种命名机制。

如果我想注册一个名字,比如我可以选择任何我喜欢的名字。只要它还没有被使用,我就可以提交一个比特币交易。它将会表示:请保留,请分配名称 XXX,并将其映射到我的公钥以及关于数据存储位置的信息。

每当遇到一条记录, Blockstack 服务器便会考虑将此映射添加到其名称数据库中。在比特币区块链中,它们有一套规则来拒绝不良的 Blockstack 交易。即所有区块栈服务器都在监视比特币链,区块栈服务器在审视比特币链上的连续交易时会先看到我的分配,随后才会看到另一方对同一名字的分配。规则是:如果一个名称已经被分配,它就不能再次被分配。所以区块栈服务器将忽略这次尝试注册名称的操作。是一种先到先得的命名分配机制。

对于任何一个名称,所有节点都能看到,并且就该名称的首次注册达成共识。因此,它既具有唯一性,也具有全局意义。名称可以是任何内容,所以在这里使用人类可读的名称是完全合理的。

然而该系统中的一个缺陷是,尽管名称具有唯一性和可读性,但随着名称被占用后不断复杂或者由于名称已经被注册,导致现实中想通过名称来找到对应的人变得非常困难。

  • Blockstack 大致结构

在底层,存在着比特币系统,随着比特币区块运转,而在比特币未察觉的情况下,这些区块堆栈交易随之进行。

其上层存在一组块栈命名系统服务器。这些 Blockstack 命名服务服务器会读取区块链并累积形成一个数据库。至少在最初阶段,比特币区块链中所包含的是公钥以及描述每个用户数据存储位置信息的加密哈希值。

命名系统服务器的上层存在一个名为 Atlas 的中间层,其主要任务是将存储在比特币中的信息哈希映射到区域信息,每个用户对应一个区域记录。

其再上一层是 Blockstack 自己的 Gaia 服务器。这些仅仅是存储服务器,它们了解不同的 Bloskstack 用户,并为他们存储键值对。所有 Blockstack 应用都预期数据由 Gaia 中的所有者签名,并且使用公钥来验证您对数据所做的签名。

  • Blockstack 是否真的需要使用比特币?

毕竟比特币并不那么理想。例如注册一个名称所需支付的费用,在比特币上的价值波动幅度。是否可以不使用比特币,而是通过类似于证书透明性的机制,来强制执行关于名称的适当规则。

尽管证书透明度可以揭示冲突,即两个人注册两个人注册了相同的名字。比如如果你要求每个人都将其名字注册提交到延书透明度日志中。但证书透明度并不能解决所有权冲突问题。你可能会认为顺序就是够了,但是不同证书透明日志中的相同记录可能会有不同的顺序。毕竟没有什么强制要求不同的透明日志必须保持完全相同的顺序。

比特币是如何确保区块链的每个副本都保持相同顺序的呢?这个问题的答案实际上归结于比特币的挖矿。如果你不进行挖矿,那么如何明确地强制达成记录顺序上的一致性就不那么清晰了。


以上内容来自对 MIT 《分布式系统 6.824》的学习笔记,在此特别声明。