6.824 2020 Lecture 20: Blockstack
为什么研究Blockstack?
- 它涉及了我们关心的三个问题:
- 如何建立命名系统-PKI-关键的缺失部分
- 区块链的非加密货币的使用
- 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 |
|
- 两用户都添加代办事项
- 两用户都可以标记事务为完成
- 一个公共存储系统,key/value数据,U1和U2
- 用户U1和U2在自己的计算机上运行应用,可能是浏览器的js,应用读取其他用户的公共的数据,并保存到自己的用户数据中
- 应用不用访问服务器,因为它只能用存储系统
- 每个用户创建文件,写下代办事项,在文件中标记事项为完成
- 每个用户的UI代码周期性扫描来自其他用户的代办事项文件。
关键点: 服务是存储,和应用是独立的,所以用户可以切换应用,自己写,并加密防止窥探、删除自己的代办事项、备份、和邮件应用集成
会有问题吗?
去中心化是痛苦的:
- 每个用户的类文件系统的存储比专用sql的数据库的灵活性要差
- 无可信任的服务器,比如,可以看报价,而不揭露
- 加密隐私、权限使得一切更复杂
- 对用户和程序员都很不好
当前的web网站架构运行很好
- 易于编码
- 软件+数据的中心化控制易于改变和调试
- 性能和可靠性都有好的方案
- 方便应用规范的安全性的实施
- 成功的盈利模式(广告)
现在来看看Blockstack
为什么Blockstack关注命名系统?
- 名称反应了人类用户,比如”robertmorris”
- 名称->用户的数据位置(在Gaia),所以多用户可以通信
- 名称->公钥,为了端对端的数据安全
- 所以我可以检查我真的得到你的数据
- 所以我加密的数据只有你能解密
- 因为存储系统是非可信的
- 缺乏好的全局PKI一直在摧毁许多基于安全的构想,所以Blockstack从命名系统入手
Blockstack声明命名很难,描述为”Zooko三角”
- 唯一,每个名称对每个人的含义都是一样的
- 人类可读
- 去中心化
声明:三个都很重要(有争议) 声明:任何两个都容易,但三个就难了
每对属性的例子?
- 唯一+人类可读:邮件地址
- 唯一+去中心化:随机选择公钥
- 人类可读+去中心化:通讯录
为什么满足三个是很难的? 我们可以在上面的组合,把缺失的一个补上吗?不行,看上去都不可行
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的名称?
- 用户通过运行Blockstack软件
- 用户必须拥有一些比特币
- 两个比特币交易:preorder, registration
- preorder交易:
- 给”burn”地址注册费用
- hash(名称)
- registration交易:
- 名称
- 所有者的公钥
- hash(zonefile)
- 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之类的能成功,那就太棒了。