Blockstack

6.824 2020 Lecture 20: Blockstack

为什么研究Blockstack?

  • 它涉及了我们关心的三个问题:
    1. 如何建立命名系统-PKI-关键的缺失部分
    2. 区块链的非加密货币的使用
    3. web网站非常不同的架构,可能有天会更好
  • Blockstack是已经被公司部署、开发的系统
  • 它确实有一些用户和一些应用程序为此编写的
  • 但它是一种探索,事情如何的不同以及更好,并不是”一定就是对的”

什么是中心化的应用?

  • 应用的构建方式,将数据的所有权,转移给用户,而不是一个中心化的web网站
  • 现在和以前,都有许多对这种观点的探索
  • 比特币的成功激励了最近的探索

以前:一般(中心化)的web网站

[user browsers, net, site’s web servers w/ app code, site’s DB]

用户数据是藏在应用代码后面的,比如博客推文,gmail,piazza,reddit评论,照片风险,日历,医疗记录等; 这种方式已经非常成功了,方便代码编写;

那为什么不完美呢?

  • 用户如果想看自己的数据,必须用web网站的UI
  • web网站设置规则,谁可以访问
  • web网站可能窥探数据,并卖给广告商
  • web网站的员工可能窥探数据做私用
  • 令人失望,因为它通常是用户自己的数据!

问题的设计视角: 在用户、应用+数据之间,做了很大的界面划分, 应用+数据方便了web网站的作者, 但是HTML作为界面,是UI类的,在用户控制和访问自己的数据时,并不总是很友好

新的:去中心化应用

[user apps, general-purpose cloud storage service, naming/PKI]

这种架构将用户数据从应用代码中剥离, 在用户+应用、数据之间,做了很大的划分, 所以用户数据的概念很清楚,就是用户自己控制、自己所有的, 就好像你拥有自己笔记本中的数据,或者Athena账号里的数据

存储系统的要求:

  • 在云端,你可以通过任何设备访问
  • 通用的,类似文件系统
  • 数据所有者付费和控制
  • 在多用户的应用,用户共享、模块化权限控制
  • 用户的多个应用间共享、模块化权限控制
  • 类似之前的服务,比如Amazon S3

关键点?

  • 方便用户切换应用,因为数据和应用(或者web网站)不是绑定的
  • 方便应用看多种不同类型的数据:日历/邮件、备份、文件浏览器
  • 私有vs窃取(假设端到端加密)

去中心化的应用可能是怎样工作的? 一个简单的: 应用:两个用户间分析代办列表

1
[UI x2, check-box list, "add" button]
  • 两用户都添加代办事项
  • 两用户都可以标记事务为完成
  1. 一个公共存储系统,key/value数据,U1和U2
  2. 用户U1和U2在自己的计算机上运行应用,可能是浏览器的js,应用读取其他用户的公共的数据,并保存到自己的用户数据中
  3. 应用不用访问服务器,因为它只能用存储系统
  4. 每个用户创建文件,写下代办事项,在文件中标记事项为完成
  5. 每个用户的UI代码周期性扫描来自其他用户的代办事项文件。

关键点: 服务是存储,和应用是独立的,所以用户可以切换应用,自己写,并加密防止窥探、删除自己的代办事项、备份、和邮件应用集成

会有问题吗?

去中心化是痛苦的:

  1. 每个用户的类文件系统的存储比专用sql的数据库的灵活性要差
  2. 无可信任的服务器,比如,可以看报价,而不揭露
  3. 加密隐私、权限使得一切更复杂
  4. 对用户和程序员都很不好

当前的web网站架构运行很好

  1. 易于编码
  2. 软件+数据的中心化控制易于改变和调试
  3. 性能和可靠性都有好的方案
  4. 方便应用规范的安全性的实施
  5. 成功的盈利模式(广告)

现在来看看Blockstack

为什么Blockstack关注命名系统?

  • 名称反应了人类用户,比如”robertmorris”
  • 名称->用户的数据位置(在Gaia),所以多用户可以通信
  • 名称->公钥,为了端对端的数据安全
    • 所以我可以检查我真的得到你的数据
    • 所以我加密的数据只有你能解密
    • 因为存储系统是非可信的
  • 缺乏好的全局PKI一直在摧毁许多基于安全的构想,所以Blockstack从命名系统入手

Blockstack声明命名很难,描述为”Zooko三角”

  1. 唯一,每个名称对每个人的含义都是一样的
  2. 人类可读
  3. 去中心化

声明:三个都很重要(有争议) 声明:任何两个都容易,但三个就难了

每对属性的例子?

  • 唯一+人类可读:邮件地址
  • 唯一+去中心化:随机选择公钥
  • 人类可读+去中心化:通讯录

为什么满足三个是很难的? 我们可以在上面的组合,把缺失的一个补上吗?不行,看上去都不可行

Blockstack是怎么解决的?

  • Blockstack产生一个有序的区块链
  • Blockstack在区块上,记录名称声明记录
  • 如果我的记录声明”rtm”,在第一个块上,则我拥有它
  • 唯一?
  • 人类可读?
  • 去中心化?

这种命名空间对去中心化的应用好吗?

是唯一的吗?

  • 是的:我可能记下了我所知道的名称
  • 是的:我给你一个名称,你就能用
  • 是的:我可以看到ACL,猜测含义
  • 不是:人类可读不是特别成功,如果我从全局池里选一个, 比如robert_morris_1779,这是我吗?还是其他人?那”rtm@mit.edu”?
  • 不是:我怎么找到你的blockname的名称?我怎么确认真的是你?

其他的想法:

  • 只用公钥,放弃人类可读的名称
    • 每个人在通信列表中存储他们懂的名称
    • 自然的去中心化
    • 非”唯一的”,因此不需要比特币
  • 可靠地验证人类身份的中央实体

Blockstack里的块(pieces)是什么?

  • client, browser, application, blockstack.js
  • Blockstack Browser (运行在客户机上)
  • Bitcoin’s block-chain
  • Blockstack servers
    • 读取区块链
    • 解析Blockstack的名称记录,更新数据库
    • 接受client的名称查询RPC
    • 名称->公钥+zone hash
  • Atlas服务器(存储zone记录)
    • 比特币的一个名称记录对于Atlas的zone记录
    • zone记录包含我的Gaia数据存放位置
    • key是内容的hash,所以他们是不可变的
    • 你可以把Atlas看做为了驾校Blockstack的比特币交易的大小
    • Atlas在每台服务器保存全部的数据库
  • Gaia服务器
    • 为每个用户分离存储区域,即用户端
    • key->value
    • 它后面是Amazon S3、Dropbix等,Gaia使他们看起来都一样
    • 大多数用户使用Blockstack提供的Gaia存储
    • 用户信息包含用户的公钥,对每个应用的公钥
    • 用户有许多其他文件,包含应用数据
    • 用户可以签名或者加密Gaia上的数据
  • A3、Dropbox等
    • 作为Gaia的后端

命名创建过程

如何注册一个Blockstack的名称?

  1. 用户通过运行Blockstack软件
  2. 用户必须拥有一些比特币
  3. 两个比特币交易:preorder, registration
  4. preorder交易:
    • 给”burn”地址注册费用
    • hash(名称)
  5. registration交易:
    • 名称
    • 所有者的公钥
    • hash(zonefile)
  6. Blockstack信息隐藏在交易中,比特币并不知道,但是比特币的签名和hash包括Blockstack的信息

为什么是两个交易? 前端运行

为什么注册费用?毕竟这不该花

要是客户端尝试注册已有的名称?

要是两个客户端同时注册相同的名称?

攻击者可能变更名称->key的绑定关系吗?毕竟,任何人都可以提交比特币交易

Blockstack可以改变名称->key的绑定关系吗?

存储

客户端从哪获取数据?

  • 用户拥有的名称和key
  • 应用可能大家都知道的keys,比如”profile”或者”todo-list”
  • 比特币/blockstack、hash(zone)、gaia address

客户端如何检查从Gaia获取的数据是对的?

客户端如何知道从Gaia的数据是最新的(最后一个版本)?

  • 写入数据的签名
  • 其他人如何获得所有者的公钥,去验签?

隐私加密? 如果只有所有者能看数据?如果除了所有者,其他用户也要看数据呢?

私钥

不能离开用户设备,所以除了你的设备和Blockstack软件,你不必想象任何东西,你的每个设备都是主私钥的拷贝

主(master)私钥只有Blockstack浏览器可以访问

  • 应用访问和使用它,都是非常敏感的
  • 受密码保护,用户处于活动状态后解除

Blockstack浏览器给每个应用分发私钥

  • 所以每个应用或多或少都是分隔的加密存储
  • 让不同应用间的写作更难
    • 有时这是我们需要的
    • 但有时我们希望不同应用间相互分享

讨论

有些问题需要思考,关于命名,关于去中心化应用,你可以批判性的看待或者当做未来的开发的领域

Q:Blockstack可以当做e-mail的PKI,映射rtm@mit.edu为我的公钥? Blockstack vs 邮箱地址?Blockstack的名称是什么含义?

Q:为什么PKI系统一般很难?

  • 丢失密码和恢复的key(母亲的娘家姓、SMS、e-mail?)
  • 名称意味着什么?反映我们真实的id吗?
  • 从我想和谁通信,哪个名称的直觉概念,怎么延伸?
  • 一些成果,比如Keybase

Q:对于命名和PKI,分布式中是否有强值(strong value) 我们能否有中心化,但安全的命名系统?谁可以作为被全局信任的系统? 一个中心化的权威到底能带来什么价值?可以更方便的和去中心化适配吗?

Q:Blockstack可以用CT的模式替换比特币吗?

  • CT不能解决冲突,只能暴露他们,不同的CTlog可能顺序不一样,所以解决不了谁先到的。 比特币命名解决了分叉和一致性
  • 与垃圾邮件相比,Blockstack的付费方面看起来很重要,依赖电子货币
  • 一般地,开放的区块链看起来只是在写加密货币

Q:Blockstack方便程序员吗?

  • 所有代码都在客户端,不在服务器
    • 难以有应用特地的数据
    • 对Reddit、Hacker News的索引、投票统计、前端页面排序
  • sql查询
  • 加密的访问控制,分组、撤销等
  • 难以一起查看其它用户的秘密,和保存秘密,比如eBay
  • 用户非常热情时,可能才是值得的

Q:去中心化的用户所有的存储对用户隐私是好的吗?

  • 这比相信Facebook/Google等网站保存用户数据隐私更好吗?考虑其他用户、hacker、公司员工?
  • Blockstack存储可以记录你的访问记录吗?
  • 要是应用在你计算机上窥视你呢?毕竟,它依然是Facebook或其他公司写这些应用。
  • 加密访问控制是真的灵活吗?
  • 你依然要相信数据保存服务提供方,相信提供的数据版本是最新的,如果你相信他们,为什么不让他们也保存秘密?

Q:去中心化的用户所有的存储,方便用户控制吗? 用户可以为相同的数据,切换不同的应用? 用户可以在多应用使用相同的数据? 给定不同的应用格式,甚至都不能运行?

Q:用户愿意为Gaia存储付费吗?

结论

我们能从Blockstack学到什么?

  • 我觉得全局的去中心化版本是很吸引人的
  • 全部都是依赖于PKI——所以这里的任何进展都很重要:从用户到公钥的一般性映射非常有用
  • 很惊喜,我们可以有去中心化的、人类可读的名称分配,但不晓得是不是一个好主意
  • 长应用分离出云数据看起来是个好想法,但是开发者不欢迎(比如没有sql),不晓得用户是否关心,不晓得用户是否会为存储付费
  • 点对点的加密,保护隐私看起来是个好想法,私钥管理是痛苦的,脆弱的;加密使得分享和访问控制很尴尬
  • 你仍然需要相信一些供应商软件,不晓得都运行在自己的机器,而不是供应商的服务器,是否是一个巨大的胜利?

话虽如此,如果Blockstack之类的能成功,那就太棒了。