很早就了解到 RUM,这段时间从开发者视角接触了一下它的核心——quorum的运作,以及恬不知耻地骚扰霍炬一段时间后,觉得自己现在的理解程度可以帮助到一些人了,在这里整理、分享一下,欢迎你纠正我。
quorum 是什么?
启动 quorum full node 的时候,会用到许多 libp2p 格式的网络地址。
libp2p 是一个用于计算机在网络上互相发现、交换数据的 p2p 库,它的开发团队及继承自BT下载的开发团队。如果你把它看作一种“基础设施”的话,那么 quorum 就定义了一种组织和维护数据的协议(很有网络架构的传输层和协议层的那个意思)。
libp2p 是公路和汽车,quorum 提供了一种基于前者的物流服务。
每一个 rum 组的数据都是一条区块链,生产者(producer,默认是 owner)有权限在上面写入新数据,生产了新的数据(trx)可以同步给其他节点。
如果只有一个 producer,也就是 owner,且只有它会向外发送数据,那么就很像传统的中心化服务了:服务器(woner,唯一的producer)往数据库(区块链)里写数据,用户访问服务器(owner)获取新数据。
在 Rum System 描述的网络结构中,中心化只是一种特殊情况。
那么 quorum 的分布式设计是如何把事情变得好玩的呢?
Quorum 至少要解决这几个问题:
- 如何保证群组数据的持久化?
- 如何让用户能互相同步数据?
- 怎么同时拥有多个 producer?
如何保证群组数据的持久化?
传统的社交媒体服务,是不会向用户直接提供元格式(数据库格式)的数据的,即使是用户自己产生的数据,也只能自己用爬虫爬下来。
但是在 quorum 的体系中,每个节点都在本地保存了一份群组的原始数据(那条区块链),所以这个群组内发生的所有事,所有成员都是能通过这条区块链恢复这个群组的全部内容的。
如何让用户能互相同步数据?
目前有两个同步数据的协议,pubsub 和 rex ,前者是直接找 owner 要数据,后者是从相邻所有人手里要。
如果这个群组里有开启 rex 的节点,那么你就可以向网络联通更好的节点获取数据。
你可以在官方的 rum app 的实验室中开启了 “Rum Exchange” 选项,但是会稍微多耗一点流量,因为你在向外发送数据。但是群组的联通性会和数据同步速度会好很多。
如何让大家都能向组中写入新的数据(怎么同时拥有多个 producer)?
这可能还是个拜占庭将军问题,现在的 quorum 主分支(包括 rum app)其实是把添加 producer 的权利给到了群组 owner,但是会出现很多问题,最致命的就是这个新的 producer 的设备性能和网络联通性都很差(类似拜占庭将军问题中不可靠的兄弟部队),会导致群组出块很不流畅。
目前官方在 producer_sync 这个新分支上开发新的共识机制,试图“自动化”地添加 producer,或者是在被 owner 添加 producer 之后,再动态地调节他们的工作。
有兴趣的可以试一下。
以上是我在接触 rum 的代码(quorum)时真实遇到的一些的疑问以及我自己的解答,谢谢霍大大和 rum 团队不耐其烦地给我解释我的问题。
如果文章有错误,请直接指出,感激不尽。
如果你还有什么其他问题,欢迎你直接评论或私聊我 Mixin:37206436