然后就是OrbitDB!

由 Rorical 发布

最近正在设想一个分布式去中心化的插画分享系统,最重要的其实就是元数据的存储位置。一个去中心化的系统,数据能存哪里呢?
来罗列一下:

  1. 区块链呀!这里怎么能少得了!信息不能篡改所以适合元数据的记录
  2. IPFS等分布式文件存储系统。适合存这种插画等等的大文件。
  3. 貌似缺少一个能够存结构化数据并且还可以修改的东西。我目前已知的有Orbitdb, Aviondb和Threadsdb。

作为一个插画分享系统,如果每次发布插画元数据都要一点点Gas并且不能删除的话,实在是有点为难了,所以存标题介绍什么的呀就应该不能用区块链了。当然它还是有用滴,比如用Token来打通创作者和支持者(订阅和约稿,还有,点赞!)或者盗版追踪和追责。
那么我们得退而求其次。来看看IPFS,一个众所周知的文件寻址系统。虽然可以存一些结构化数据(IPLD),但是权限控制以及读取方面对结构化数据很不友好。或者说,它就不是为了结构化数据而生的。
然后就是Orbitdb。
Orbitdb是个搭建在IPFS之上的数据库。官网是https://orbitdb.org/
它使用了IPFS来存储每个数据库的元数据,用IPFS的PubSub来同步所有节点的数据库(我没测试过PubSub的性能但是我其实不太看好)。采用CRDTs来合并数据操作所以是最终一致性的。看到这里我认为它其实是个蛮好的解决方案。
Aviondb是基于Orbitdb之上构建的一个类似Mongodb的Document数据库。因为也是采用了Orbitdb所以不做探讨。

orbitdb工作流程

通过对Orbitdb内代码以及文档的阅读,我们不难看出它的工作流程。
首先是创建或者打开数据库。在打开时,Orbitdb首先会根据输入的数据库地址和访问权限生成一个IPFS的文件Hash,并且尝试打开。如果没有则会生成内容并写入。写入的内容是个IPLD。输出的数据库地址就像这样:

/orbitdb/zdpuAvhRbvRrJsE4hLK62rVZjmH6pTyMbLUshZ61AR5Bu2h1e/0x7260A0c7F495390Cf0D86389b2Ecd195A9a6d047

其中第二段表示了这个数据库元数据在IPFS上的地址,如果看一下它看起来像这样:
数据库元数据
name就是这个数据库的名字,type是它的类型,接下来会说。accessController则指定了它的权限,就是谁可以写入和更改(也是索引了两层ipfs地址)。
根据这些内容的指定,Orbitdb可以成功实例化一个数据库,并且接下来创建一个Leveldb到它的文件夹。。你没听错,是LevelDB。

Orbitdb借助IPFS存储数据库元数据的原因,我认为是可以让数据库通过两种方式被读取:

  1. 直接通过数据库地址。这样Orbitdb会直接读ipfs并且获取相关的数据库名字,类型和权限
  2. 通过数据库名字,类型和权限也可以推出地址,所以知道这三个也可以

既然通过Leveldb在本地创建了个数据库,那数据从哪里来?这里就需要ipfs的pubsub上场了。
ipfs的pubsub是一个消息的订阅系统。由topic区分,订阅者可以选择subscribe一个topic,发送者也可以publish信息到一个topic。
每个数据库都会有个自己的topic,orbitdb会订阅相关topic。如果更改数据库的话,它会帮你自动发送一个pub让其它也在线的并且订阅相同数据库的orbitdb更新。在接受到信息时,orbitdb先会过一遍权限检查(签名对不对呀),然后看消息顺序。如果可以的话,就会把这个操作记录进leveldb并且触发replicated事件。

orbitdb数据库类型

首先来介绍一下数据库的类型,在Orbitdb里分别分为:

  1. log (append-only)
  2. feed 是可以修改的log
  3. keyvalue 我们很熟悉的键值数据库
  4. docs 文档数据库,类似Mongodb那种吧
  5. counter 就是负责计数的。可以防止冲突

所有这些都是基于 ipfs-log 来的,这是个immutable, operation-based conflict-free replicated data structure (懒得再翻译了),所有完全不用担心数据冲突。
然后上面的这些store都extend了Store类。

orbitdb权限控制

orbitdb里面有一个叫identity的东西,数据库的权限控制有它参与。
翻一翻 https://github.com/orbitdb/orbit-db-identity-provider ,我们可以看到有orbitdb自己的identity,以太坊的还有DID(Decentralized Identifiers).它们都实现了Identity接口。
再翻一翻 https://github.com/orbitdb/orbit-db-access-controllers ,里面有 AccessController 接口,orbitdb的权限控制就实现了它,当然也可以自己定制一个。

未完待续.............


11 条评论

  1. EL_File4138
    EL_File4138 · 2021-06-27 06:15

    我最近写ACG Market的核心框架部分刚好碰到IPFS的immutable data部分……不过问题已经变相解决了,比用orbitdb更精简而且虽然没用到类似ipns这种“官方钦定”的mutable data存储但反而更适合我的用途……
    顺带我论文已经起笔了,Rori也该快点了

    1. EL_File4138
      EL_File4138 回复 EL_File4138 · 2021-07-18 12:35

      https://nvd.nist.gov/vuln/detail/CVE-2021-34527#match-6799633
      https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-34527

    2. EL_File4138
      EL_File4138 回复 EL_File4138 · 2021-07-15 21:49

      Done

    3. Rorical
      Rorical 回复 EL_File4138 · 2021-07-15 09:11 作者

      P09pqWH/uTvGO93QQEM7CLW0T4Tc00GMjlbNHrD1KRkf/Z2Pu5POU5RHes29rMzQh8UCLtcpUIlmpOZNSRgiDeNUHM2WZmRj/L0ITYn6lh3Y2/jwNyedNu9O/J8118HSqdh+ArjXATBS3E7jwCFPjA==

    4. Rorical
      Rorical 回复 EL_File4138 · 2021-07-09 10:00 作者

      何时放假,网站都炸了

      1. EL_File4138
        EL_File4138 回复 Rorical · 2021-07-24 10:00

        今天回家

      2. EL_File4138
        EL_File4138 回复 Rorical · 2021-07-11 12:09

        7/25左右……
        论坛炸了就炸了吧,应该是cf那边某证书过期了
        话说epq你选的是哪个来着……我白皮书写到4k词了,也许能帮你糊弄一波

        1. Rorical
          Rorical 回复 EL_File4138 · 2021-07-12 00:00 作者

          真的太巧了,7/25我开学

          1. EL_File4138
            EL_File4138 回复 Rorical · 2021-07-13 21:49

            aL0hKrFdPyllQedpNmaKxybqan+Ns4WHkg6DiBckFytJOYAuCNucHVUpnOxFeECNk1lG6kPodKSExkSr5DJHoMw+UlkMo4JRt+YBQ//mWxUHd/DqVBs9kLyL/Aanp+t77ywyZ8HgXd9FD9rI4D7duj+zN5d0IcTK09BVccbi1GB64K+8uwvp8fJ3lSXyUqZXSYNp0obWV2KNqBRYeTSo2A==

            https://aesencryption.net/ 256bit ,密码是我假期邮件里的
            解密不了告诉我

            又:wieOQhP/zNv/RLf1gdTW1fBZlkz7bTLOOTj9czTfnLXzkzcPFxeKDrtO+Ox8qer25vGDhNbhYI0FxeVjyDjQFm/fdq1QotfGKzIWEAH90H7YTNjk/8Vng2SIJlQyhuHoyMdoCaTiWm3rodaaXkvdZ/hWsPNJ1MZ1exOb3LyTct8CH8jGYtU5QBHWDR05P8zo
            自用

        2. Rorical
          Rorical 回复 EL_File4138 · 2021-07-11 23:22 作者

          不是,是网站整个瘫痪了,因为cloudraft那边的到期了,我改不了服务器ns地址...域名在你那里

    5. Rorical
      Rorical 回复 EL_File4138 · 2021-06-27 13:47 作者

      类似思路我也在rss3轻皮书里找到
      https://gateway.pinata.cloud/ipfs/QmPYZWZeKJt2b6CrmPcEPfUtAzUW44mD16vUK6fVfM1pvS

发表评论