# 一文了解去中心化存储新贵：动态存储解决方案Ceramic

By [千里马](https://paragraph.com/@testin) · 2022-02-17

---

本文仅做行业学习交流之用，不构成任何投资建议

**“求种子”时代的存储协议：BitTorrent**

说起BitTorrent，很多人会觉得陌生。但提到下载“种子”，相信不少人能回想起几年前为了玩游戏或看电影在网络上到处“求种子”的情景，这里的种子就是BitTorrent的下载术语。种子文件就是记载下载文件的存放位置、大小、下载服务器的地址、发布者的地址等数据的一个索引文件。

简单来说，BitTorrent是一种P2P下载协议，比起传统的从网站服务器下载的方式要高效许多。举一个形象的例子，学生时代班里的同学聚在一起抄作业，但只有一个同学写了作业，其他所有同学都要抄这一份答案。每个同学抄作业的速度不一样，一旦想抄作业的人多起来，这个流程就很难进行。因此普遍的做法是，一些同学抄选择题，一些同学抄填空题，一些同学抄问答题，然后大家换着抄，效率一下就上去了。

BitTorrent原理和“抄作业“类似，每个需要下载文件的用户只下载文件的一部分，在下载的同时，我们的电脑会充当服务器将下载的此部分文件传输给其他的用户。也就是说在我们下载的同时，我们也在上传（别人从我们的电脑上下载的部分），\*\*所以说在享受别人提供的下载的同时，我们也在贡献。\*\*因此下载这个文件的用户越多，种子就越多，同步进行的速度越快，下载的速度也会越快。

**去中心化存储的先行者：IPFS**

尽管大大提升了下载效率，BitTorrent仍然存在一些问题，为了优化这些问题，就不得不提到IPFS。相信许多读者一定更熟悉IPFS，现在鼎鼎大名的去中心化存储项目例如Arweave和Filecoin，就是以IPFS为基础建立的。IPFS的中文译为星际文件系统，是一个可分布式存储且共享文件的网络传输协议。

用BitTorrent下载时必须使用种子文件，用户需要将所有下载内容的地址放在这个种子文件当中才能进行下载。IPFS的显著优势之一是采用了DAG数据结构存储数据，这种数据结构的好处体现在：IPFS是以\*\*基于内容而不是基于地址的寻址方式存储和寻找文件的。\*\*这意味着如果我们要寻找一个文件，我们不需要知道它在哪里，只需要知道它包含的是什么内容。IPFS会为每个文件生成一个唯一的哈希值（例如QmSNssW5a9S3KVRCYMemjsTByrNNrtXFnxNYLfmDr9Vaan），当用户需要检索这个文件时，只需要问IPFS谁有这个哈希（QmS…Vaan）就可以完成检索。因为哈希值能防止重复存储，所以相同内容的文件不会被IPFS重复存储。这样的做法优化了存储，也提高了网络性能。

**动态存储的解决方案：Ceramic**

通过上述描述，细心的读者可能会发现IPFS存在一个巨大的缺陷。在IPFS中，文件一旦被存储是不能在系统中修改的，因为修改文件内容会改变文件的哈希值，用户无法通过原始的哈希值找到更改的文件。这是IPFS被大家所诟病的一个痛点：\*\*不善于存储需要随时更新升级的文件。\*\*因此，人们急需一种高效且去中心化存储动态数据的解决方案。

值得庆幸的是，人们对这个赛道的探索已经开始了。关注Web 3.0、SocialFi或者DID的朋友一定听闻过这个项目的大名——Ceramic。Ceramic是一个用于创建、托管和共享数据的去中心化开源平台，不少DID和Social Graph都是基于Ceramic上构建的。前文提到，IPFS在存储静态文件方面表现良好，但其本身缺乏计算和状态管理能力，无法实现更高级的类似数据库的功能，例如可变性、版本控制、访问控制和可编程逻辑。而Cermaic的出现，使得以上问题得到了一定程度的解决。

**高效的版本控制**

在Ceramic里，每条存储信息都表示为可叠加的log（计算机里记录程序运行情况的日志文件），称为一个Stream。Stream在概念上类似于Git。\*\*Git是一个开源的分布式版本控制系统，可以有效、高速地处理大大小小的项目版本管理，是目前最流行的版本控制软件，可用来存储代码、跟踪修订历史记录、合并代码更改，恢复为较早的代码版本等等。\*\*Git处理数据时像一个“快照”，这与我们用google docs共享文档并查看历史版本有一点相似。每当你提交更新或保存数据状态时，它就会对当时的全部文件创建一个快照并保存这个快照的索引。如果文件没有修改，Git 不再重新存储该文件，而是只保留一个链接指向之前存储的文件，大大提高了效率。

实际上，IPFS上也可以使用Git来存储动态数据。但是开发者需要在Git里新建一个hash-log文件，用以记录每次Git log和IPFS哈希更新的映射表，并且需要手动保持同步动态，或者运用IPNS命名系统保持动态更新。这样的操作费时费力，效率很低。

\*\*Ceramic采用了“叠加log”的方式，StreamID不会根据内容改变而改变，因此可以非常便捷地存储修改版本或者回溯之前的版本，不必再频繁更改哈希值。\*\*此外，Ceramic在其他存储协议之上搭建了一层新的layer，意味着其可组合性很高。用户可以自行选择将数据存储在哪里，包括去中心化的Arweave、Filecoin，中心化的AWS等等，都可以利用Ceramic实现自动化版本控制。并且因为每个Stream只存储log而不是数据，Ceramic不需要一个global ledger来全局同步数据状态，因此Ceramic的横向可扩展性是非常高的。

便捷的身份验证和访问控制

除了版本控制的优势之外，Ceramic还提供了非常便捷的身份验证和访问控制。当新数据要被添加进Stream时，修改者需要验证身份，否则将不能对数据进行修改。\*\*不同的Stream可以要求不同的身份验证机制，而Ceramic提供了非常强大的内嵌身份验证机制—— DID。\*\*例如适合终端用户的3ID DID，适合开发者的key DID，支持用NFT进行身份验证的NFT DID和适合DAO等需要多重身份验证的Safe DID等，保障了数据的安全性。同时，Ceramic还赋予了Stream可编程逻辑，例如如果Stream A状态改变，则Stream B可被访问并且升级等等。

Ceramic的出现极大赋能了Web 3.0的建设。目前已经有很多DID以及Web3.0社交平台项目在Ceramic上开发。值得关注的有Social Graph Middleware平台CyberConnect，Web3.0 Twitter的Orbis，即时通讯平台The Convo Space等等。我们很期待Ceramic的基础设施能够给应用层带来的新的可能。

---

*Originally published on [千里马](https://paragraph.com/@testin/ceramic)*
