说在前面的话
在开发设计去中心化数据库 @DB3 Network(https://github.com/dbpunk-labs/db3)的过程中,常思考去中心化的一些最本质的问题,我们做底层基础设施开发,需要逻辑清晰。接下来,我会写一系列文章,把我的思考以文字或者视频的方式传达出来,从技术的梳理我们是什么看待去中心化的,以及 DB3 Network 在其中的定位是什么样的。文章内容尽量会以最简单的方式探索去中心化,尽量少用专业的术语,一切从用户使用角度出发。欢迎关注我的系列文章,内容涵盖但不限于:
最基础的去中心化网络,非区块链和区块链
非区块链的去中心化网络的一些经典项目
区块链协议中主要做数据存储和数据处理的项目
每个数据协议(网络)的定位和解决的问题
去中心化数据库意义和作用,以及一些重点项目
一些有代表性的 web3 应用的数据层架构
去中心化数据库 DB3 Network 的开发设计思路 ( 我的创业项目 )
….
没有区块链也可以去中心化?
问题描述
文章并不会从金融货币的视角,而是从用户的实际使用 app 为出发点。用户在使用 app 的时候,尤其是泛社交类应用 app 的时候,最核心关注的是三件事情:
1、能访问我自己个人数据
2、我能产生数据发出去给别人看
3、我能看到其他人的数据
在 web2 ,因为各种各样的问题,用户会关心自己的账号不能再登录应用,以至于丢失自己全部信息。去中心化网络还没出现之前,人们已经在研究解决这类问题。
为了能随时访问自己的数据,不被任何第三方限制使用,显然最好的方式是本地存储(Local First),应用的远端服务器只是一个备份,最典型的应用就是 Git,即便 GitHub 现在删库删表,网站关停, 我们也不会有太大的担心,因为我本地还有一份代码,问题 1 就解决了。
但是远端服务器关停了,也不是没问题,它会让协同工作变得麻烦了。自己多个设备在不同的地方编辑同一份文件,同事之间共同开发一份代码,都是需要协同,没有远端云服务,就出现了问题 2,和问题 3:我不能提交发送数据,也看不到别人的数据。
解决方案,阶段一:
很容易想到,首先我们的数据都保存到了本地,而远端服务只是一个临时存储空间(缓存), 当远端的服务停掉后,我的本地多个设备里还有数据,同事的本地设备里也有数据,只是目前我们不能相互看到对方的数据了。这时,我们只需要自己再部署一个服务节点,两个人都把本地 client 链接到新的服务器就可以了,相互同步数据。
但是,说起来简单,做起来难,我们大概率不知道远端的服务器代码是什么,数据怎么通信交互的,更不可能自己写这些代码。所以,最好的方式是,这个应用程序的 server 代码是开源的,比如,GitHub 把他们系统的代码都告诉大众,说”如果我的服务挂掉了,你们就自己用我的代码重新建一个 Server“ 。这样带来的好处是,任何人使用 GitHub 的时候,都不会担心他们做什么”邪恶“的事情,用户跟 server 之间初步建立了一种 trustless 的关系。
下图:下载开源代码,自己运行一个新的 server,进行数据协同。
到一步的时候,前面我提到的用户所关注的三个问题,基本得到了解决,虽然道路很坎坷:
1、我写的数据都在本地,不担心访问不到;
2、我写的数据可以发送到一个 Server,一个 Server 挂了或作恶,我们再建一个,不担心数据共享问题。
解决方案,阶段二:
看起来两个人的数据协同是没什么问题了,但是有成千上万个人怎么办,难道每个人都要这样做吗?人人开发者?要一个一个告诉他们,换服务器了,每个人都把手机、电脑上的 app 连接换个新的服务器地址?显然是不靠谱的。
一个 Server 挂了,还得花时间去部署一个新的,有没有更方便的方式?
当然有,我们一开始就搞多个 Server, 相互独立(独立性很重要),它们不单独属于任何一个人或者机构,最重要的是,Server 之间能够有个统一的协议同步数据,应用 client 可以自动连接不同的 server。如下图:
这样看起来,感受好多了,不担心哪个 server 挂掉了,server 和 server 之间都是 p2p 的连接,相互同步最新数据。
做 web3 久了,上面这张图是不是有点眼熟?但它其实完全不是区块链,它只是个网络。
待解决的问题
问题依然还有很多,这里拎出来最主要的几个:
1、谁来运维每个 server?我作为用户,原本只想用服务,没想要自己还要运行 server;
2、如果自己不运行服务器,用第三方的,那他给我返回错误的数据怎么办,不正确保存我的数据怎么办?
3、数据量大,server 存储不下怎么办?
4、server 跟 server 之间数据冲突不一致怎么办?
5、任何一个 server 都能同步数据,那岂不是毫无隐私?
6、…
先说隐私
对于隐私,最简单粗暴的做法,就是端到端的加密,比如 server 上存的都是加密数据,任何人拿到数据后,也不知道写的是什么,即使这样,开放的网络还是会暴露一些元信息,比如,我今天几点几分、给服务器提交了几次数据等,A 和 B 之间通话了多少次,虽然不知道交流的内容, 是可以被追踪到的, 所以,对于隐私级别高的场景, 干脆就不用这种方案,或者几个节点都是 private 的。
数据冲突
比如 A 和 B 同时在本地协作编辑文件,A 把一个数字从 1 改成了 2, B 同时把数据从 1 改成了 3,然后差不多同时提交,那服务器应该保存什么?更复杂一点情况,A 连接的是服务器 server1, B 连接的是服务器 server2, A、B 提交的数据分别被两个服务器接受了,后面 server1 和 server2 同步数据的时候,依谁的呢?目前,可以采用 CRDTs 的标准协议去统一管理合并冲突, 保证数据的最终一致性。
数据量太大,存不下
开放的网络节点可是任何形式的,说不定其中一个服务节点就是一个台式机,根本存不了多少数据。这就出现了选择性存储数据,不同 server 只存储感兴趣的数据,比如下图中这个 server-3, 就重点只选择性地存储 client3 的数据,说不定这是 client-3 自己运行的一个节点,但它并不是孤立的,由于节点之间有统一协议,毫不影响它从其它节点同步保存一些数据,但它并没有保存网络中所有的数据。
谁来运行 server
前面说了,用户 A 和用户 B 之间如果都是程序员,都可以运行自己 server,这时候,运行 server 的人和使用 client 的是同一拨人,大家都是自己人。
但是,用户量大的 app,显然不会所有人都是 server 运行者,大部分人只是 app 的用户。所以,分工就出现了,出现两波人:一批是我们这些普通的 app 用户,还有一批就是相对专业运行 server 的人, 下图中这些 Good people 都是专业的,他们之间相互独立,运行很多 server 给普通用户使用。
但是,既然是开放网络,跟 web2 的套路不一样了,没有商业公司”免费“给你保存数据了。既然有分工,就有利益分配,毕竟,不会有人免费帮你保存数据。
方式只有一种:无他,付费。
我作为 server 运行者,遵循特定的文件协议同步数据,用户有数据想要我的服务节点,给我按月存储量付费就好了,但是你最好本地保存一份数据,服务商很可能随时跑路(不可信),我跑路之后,你再用另外一个 server。
现在问题看起差不多解决了。作为用户,我不担心数据丢了,我本地保存的有,也不再担心某个单一的网站把我的账号封了拒绝我登录,因为我可以登录别人提供的服务器, 也不担心看不到别人的数据了, 也不用自己跑服务器,只需要付点费用就能用了。
如果微博是运行在这样一个网络中,我再不担心有人封了我的账号了,我想发文章、发帖子就发,可以发到多个服务器上,其他人也可以很容易就看到我发的信息。
大呼, 去中心化真的好棒!
到目前为止, 我都还没提多少区块链的概念,貌似去中心化这件事情就搞定得差不多了。所以去中心化不一定需要区块链。目前,这套架构比较知名的,就是 IPFS 协议了,全称InterPlanetary File System, 翻译成中文,叫星际文件系统, 很霸气的名字。前面提到的付费存储服务,在 IPFS 中,就叫做 Pinning service。
IPFS 提供了三个最基本的东西:
1、一套 server 的运行代码,任何都能拿过来运行;
2、一个标准文件协议,叫 Libp2p,所有的 server 之间都是通过这个协议相互之间同步数据;
3、内容寻址能力, 这个不说了,在我这篇文章里不重要。
节点作恶,篡改数据怎么办
要什么区块链?他看起来不那么重要, 最近宣传火热的社交协议 Nostr 就完全不需要 Blockchain。
可是,区块链终究还是存在了, 为什么要区块链?
因为上面这个网络体系中还有很多问题没有解决,问题还是继续存在:
我付钱给某个服务器存储数据,但是这个服务器还是会出问题,它临时变卦,收了我的钱,但是选择直接跑路了怎么办,而且更糟糕的事,我依赖的那个服务器偷偷修改了我存储的数据怎么办 ?我最好再多找几个服务器帮我存数据,当我发现某个服务器返回给我的结果和别的服务结果不一样的时候,应该要采纳多数一致的那个,比如我们在 3 和服务上都存了一个 V 的值,我们查询的时候,一个服务器返回的是 V=1,另外 2 个返回的都是 V=2,显然,我们就采用 V=2。
但是,我作为用户很不爽,为什么服务器那边把我的数据搞错了, 我都付费了。在一个不可信任的网络中,就是一个完全的黑暗森林,我们不能信任任何一个节点。
为了解决这种不信任,在用户和 server 之间,最好能有个执法人员监督他们,如果他们删除了我们的数据,或许修改了我们的数据,能做到以下几点:
1、错误能及时发现, 2、出错会有惩罚。
如果没有这些合理安全的保障,这套机制就非常难大规模推广,不可能有什么人愿意把重要的数据放在这样一个不靠谱的系统中,也就不太会有很多开发者去投入资源开发产品给人们使用。
可是,在一个开放的互联网里,公平正义的执法人去哪里找呢?区块链出现让这个问题有了解决方案。区块链意义就在于,它能够以网络协议的方式,引入 Token 这个有神秘魔法的东西,通过经济利益来让 server 和 server 之间,server 和 client 之间产生博弈,引入奖励和惩罚机制,达到一个动态的平衡。
区块链在文件存储系统中的意义
前面,我们提到了,在 web3 应用的开中,我们需要去中心化,而且发现去中心化并不一定需要区块链。但是我们发现,在一个更严谨的网络中,区块链可能是必不可少的。由于我不想把所有的知识堆砌在一篇文章中,所以,我会在后续文章中继续完善这个系列话题。
如果觉得我提供的这些知识对你有所帮助,还请关注我的公众号。
关于我
Muran 穆冉
DB3 Network Co-founder
个人 Twitter:@muran_eth
个人网站:https://muran.me
DB3Network:
为让更多的开发者,能迅速开发真正意义去中心化应用,我们正在搭建一个去中心化的数据库网络:DB3 Network。
如果你对 web3 的应用开发感兴趣,无论是社交、论坛、网站等,需要存储关系型数据,都可以采用 DB3 Network 作为数据层。
网站:https://db3.network
开源数据库:https://github.com/dbpunk-labs/db3
官推:@Db3Network
【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。