Skip to content

Latest commit

 

History

History
211 lines (132 loc) · 18.9 KB

whitebook.md

File metadata and controls

211 lines (132 loc) · 18.9 KB

P2PDB 白皮书

介绍

P2PDB 是一个点对点数据库,这意味着每个对等点都有自己的特定数据库实例。数据库在对等点之间自动复制,从而在任何对等点更新时生成数据库的最新视图。也就是说,数据库被拉到客户端。

这意味着每个应用程序都包含他们正在使用的完整数据库。与客户端-服务器模型相比,这反过来又改变了数据建模,客户端-服务器模型通常为所有数据使用一个大数据库:在 P2PDB 中,应该根据该数据的访问权限进行存储、“分区”或“分片”。例如,在类似微博的应用程序中,推文不会保存在数百万用户同时写入的全局“推文”数据库中,而是每个用户都有自己的微博数据库。要订阅别的用户推文,只需关注主题(topic)

一、行业背景

1、离线优先应用

离线优先web浏览器的运行应用程序,可将客户端产生的数据存储在p2pdb中,举个实际场景: 在实体行业,线下实体店需要多台收银系统,目前普遍的解决方案是采用在线收银系统,数据交换通过中心化的云服务器,当网络不佳、甚至出现断网时,直接会影响到线下实体店收入,导致线下实体店无法正常营业,而更好的解决方法应该是使用离线存储,当网络恢复后再将数据上报,那么离线情况下数据的一致性如何保障, 使用raft协议可以在离线的情况下通过局域网搭建离线存储网络,但是类似Raft Paxos 强一致性协议有着天然的缺陷,当节点一半以上不可用时,集群将无法工作,线下实体店的收银系统经常会开机及关机、在业务低峰期会关闭多余的收银机,因此需要一种更有效地解决方案。

2、分布式边缘缓存

在全球化的今天,我们经常会浏览各个国家、省份的网站数据,由于服务器节点分布在全球不同范围,导致访问及慢,如从大陆访问美国服务器,具有高延迟。尽管CDNS厂商提供了分布式文件云存储,但是cdns花费高昂,IPFS出现优化了这一问题,但是IPFS中的filecoin 仅仅只是解决了文件存储,对于交换数据要求快的数据库存储尚欠缺可行的方案。

3、dapp去中心化应用

dapp 既去中化的应用,也称之为分布式应用,它被认为开启了web3.0时代, DApp通过网络节点去中心化操作。可以运行在用户的个人设备之上,比如:手机、个人电脑等终端设备,DApp运行在对等网络。不依赖中心服务器,不需要专门的通信服务器传递消息,也不需要中心数据库来记数据。数据保存在用户个人空间,可能是手机,也可能是个人云盘,p2pdb 设计天然符合去中心化标准,会成为dapp 应用程序数据存储的绝佳选择。

4、多人在线协作

客户端应用多人在线协作时。需解决并发相互冲突问题,基于merkle-CRDT的不可篡改日志,自动解决数据最终一致性问题。

5、物联网

物理网应用接入p2pdb实现边缘存储,在云端部署一个订阅节点,可实现自动采集所有边缘节点的物联网数据,由数据库层面实现的数据对等同步,省去了应用层面的诸多麻烦。

二、满足条件

要解决以上行业问题,需要实现以下目标

  • 1、低延迟:网络稳定情况下,秒级实现百台节点同步数据
  • 2、大规模:支持成千上万台节点运行
  • 3、高性能:单机查询qps 1万以上、写入qps 5千以上
  • 4、去中心化:点对点对等网络
  • 5、存储安全:可验证的数据结构
  • 5、传输安全:公私钥加解密
  • 6、最终一致性机制
  • 7、历史日志不可篡改
  • 8、共识机制
  • 9、开源免费
  • 10、轻松升级和bug恢复
  • 11、社区自治
  • 12、支持主流编程语言

三、技术原理摘要

点对点通信

点对点通信是一种网络上的计算机直接与另外的计算机连接并传输数据的通信方式。传统意义上的互联网服务,往往是由大型的服务提供商来提供数据和内容,而普通用户通过个人计算机与域名解析连接到它们的服务器端来获得数据和内容。

就像两个人在聊天软件上聊天,虽然是一对一的聊天,但通信内容其实是经过聊天软件背后的大型公司的内部服务器中转的。这种大型的公司为用户提供便利服务的同时,也在互联网上形成了中心化的节点,掌控了海量的用户隐私信息,增加了安全风险。

而在使用点对点通信的计算机网络中,每台计算机通过互联网协议(IP)地址与另一台计算机直接通信,通过一定的数据加密手段,可以最大限度地保障安全。同时,通过将数据分布在无数个网络节点上,也防止了单一中心化节点出现问题之后网络瘫痪情况的出现。

因此,点对点通信是去中心化网络的基础

非对称加密技术

当人们在谈论区块链中的公钥和私钥的时候,实际上就已经在谈论非对称加密技术了。

表面上看,公钥与私钥代表的是两段成对出现的貌似随机的字符串,实际上,公钥大多时候是通过私钥生成的。

有两种情况:一是信息发送方使用私钥对信息进行加密,信息接收方通过对应的公钥进行解密,从而证明该信息确实是由该私钥拥有者发出的。一般我们把这种加密称为数字签名。二是信息发送方通过公钥对信息进行加密,信息接收方只有通过对应私钥才能进行解密,从而保证在公共互联网上传输的加密消息只有指定的接收方可以解密阅读。

这两方面的作用为分布式的网络提供了必要的安全保护,使得在开放的网络中传递加密信息成为可能,同时也提供了一种不需要可信第三方鉴别的认证技术(数字签名)

共识算法

共识算法是数据库事务达成分布式系统共识的一种算法,由于点对点网络下存在着或高或低的网络延迟,所有各个节点接收到的事务的先后顺序可能不一样,因此需要设计一种机制让对点节点在差不多的时间内发生的事务的先后顺序达成共识,这就是共识算法。

CRDT 无冲突复制数据类型

由于可以使用直接传输进行在线和离线通信,因此必须有一种方法来保持所有消息之间的连贯性和顺序,尤其是在与多个参与者的对话中。例如,如果 Alice 和 Bob 与其他几个人在一个聊天组中,并且他们都因乘坐地铁而失去了互联网连接,那么他们仍然可以使用 BLE 在同一对话中相互通信,从而创建此对话的并行版本。当他们重新上线时,BLE 版本和 Internet 版本将不得不合并。因此,有必要使用一种算法来确保所有对等方在同步后具有完全相同的排序消息列表。

这个问题的解决方案是无冲突复制数据类型 (CRDT),它是一种数据结构,允许在分布式系统上对消息进行一致的排序,CRDT 提供乐观复制和强最终一致性,确保一旦同步,每个对等点都将具有相同版本的消息列表。

每条消息都链接到其父级,这是此时连接在一起的对等方之一在对话中发送的最后一条消息。当对话的在线和离线版本同步时会出现问题:一些消息链接到同一个父级,链表变成有向无环图 。

avatar

这会导致创建几个最终需要合并的并行分支。 P2PDB 通过使用Lamport Clock 来实现这一点:每条消息将包含一个Lamport Clock,合并后的列表将根据其值进行排序。

Lamport 时钟

Lamport 时钟是一个包含两个字段的结构:一个身份公钥和一个计数器,该计数器为相关用户/身份发布的每条消息递增 更多详情

// golang
type lamportClock struct {
    time int
    id   crypto.PublicKey
}

比较函数很简单,它会首先检查计数器值之间的差距,如果没有,它会检查身份公钥之间的字典差距,知道给定的身份不能用相同的计数器发布两条消息价值。

// golang
func compareClock(a, b lamportClock) int {
    dist := a.time - b.time

    if dist == 0 {
        dist = comparePubKey(a.id, b.id) // Returns lexicographic distance
    }

    return dist
}

merkle-clock

Merkle-clock 的M 是一个Merkle-DAG,其中每个节点代表一个事件,换个角度说,给定系统中的一个事件,我们可以在这个DAG中找到一个代表它的节点,并允许我们将它与其他事件进行比较排序。DAG是通过一些简单的规则合并其它节点DAG来构建的,新事件被添加为新的根节点(现有节点的父节点),需要注意的是,Merkle-clock在给定的时间可能有多个根。

例如,给定 Mα和 Mβ(α 和 β 是这些 DAG 中的单个根):

  1. 如果 α = β 不需要任何动作,因为它们是相同的 DAG。
  2. 否则如果 α ∈ Mβ,我们保留 Mβ作为我们的新时钟,因为 Mα中的历史已经是它的一部分。在这种情况下,我们说 Mα < Mβ。
  3. 否则如果 β ∈ Mα,我们出于同样的原因保留 Mα。在这 种情况下,我们说 Mβ< Mα。
  4. 否则,我们通过保持两个 DAG 原样来合并两个时钟,因此 有两个根节点,这些节点由 α 和 β 引用。请注意,Mα和 Mβ可能完全不相交,也可能不相交,这取决于它们是否共 享一些更深的节点。如果我们想记录一个新事件,我们可 以创建一个新的根 γ,它有两个孩子,α 和 β。

我们已经可以看到,通过确定一个 MerkleClock 是否包含在另一个 MerkleClock 中,我们在 Merkle-Clocks 之间引入了顺序的概念。以同样的方式,我们在每个时钟中的节点之间有一个顺序的概念,因为较早发生的事件将始终是较晚发生的事件的后代。此外,我们还引入了一种根据它们的比较方式合并Merkle-Clocks 的方法。生成的 Merkle-Clock 始终包含来自两个 Merkle-Clock 的因果关系信息。这最终意味着每个副本中存储在 Merkle-Clock 中的因果关系信息在合并后将收敛到同一个Merkle-Clock。Merkle-Clocks 提供的因果顺序在构建具有类似规则的Merkle-DAG 时被嵌入,并且通常被忽略为非常直观的东西。然而,重要的是要形式化我们如何定义 Merkle-Clocks 之间的顺序,并证明在它们同步和合并时维护因果关系信息。

P2P对等网络

对等网络是一种网络结构的思想。它与目前网络中占据主导地位的客户端/服务器(Client/Server)结构(也就是WWW所采用的结构方式)的一个本质区别是,整个网络结构中不存在中心节点(或中心服务器)。在P2P结构中,每一个节点(peer)大都同时具有信息消费者、信息提供者和信息通讯等三方面的功能。从计算模式上来说,P2P打破了传统的Client/Server (C/S)模式,在网络中的每个节点的地位都是对等的。每个节点既充当服务器,为其他节点提供服务,同时也享用其他节点提供的服务。

简单的说,P2P就是直接将人们联系起来,让人们通过互联网直接交互。P2P使得网络上的沟通变得容易、更直接共享和交互,真正地消除中间商。 P2P另一个重要特点是改变互联网现在的以太网站为中心的状态、重返“非中心化”,并把权力交还给用户。 对等网络是对分布式概念的成功拓展,它将传统方式下的服务器负担分配到网络中的每一节点上,每一节点都将承担有限的存储与计算任务,加入到网络中的节点越多,节点贡献的资源也就越多,其服务质量也就越高。

对等网络可运用存在于 Internet 边缘的相对强大的计算机(个人计算机),执行较基于客户端的计算任务更高级的任务。现代的PC具有速度极快的处理器、海量内存以及超大的硬盘,而在执行常规计算任务(比如:浏览电子邮件和 Web)时,无法完全发挥这些设备的潜力。新式PC很容易就能同时充当许多类型的应用程序的客户端和服务器(对等方)。

avatar

P2P网络技术的特点体现在以下几个方面:

  • 去中心化

网络中的资源和服务分散在所有节点上,信息的传输和服务的实现都直接在节点之间进行,可以无需中间环节和服务器的介入,避免了可能的瓶颈。P2P的非中心化基本特点,带来了其在可扩展性、健壮性等方面的优势。

  • 可扩展性

在P2P网络中,随着用户的加入,不仅服务的需求增加了,系统整体的资源和服务能力也在同步地扩充,始终能比较容易地满足用户的需要。理论上其可扩展性几乎可以认为是无限的。例如:在传统的通过FTP的文件下载方式中,当下载用户增加之后,下载速度会变得越来越慢,然而P2P网络正好相反,加入的用户越多,P2P网络中提供的资源就越多,下载的速度反而越快。

  • 健壮性

P2P架构天生具有耐攻击、高容错的优点。由于服务是分散在各个节点之间进行的,部分节点或网络遭到破坏对其它部分的影响很小。P2P网络一般在部分节点失效时能够自动调整整体拓扑,保持其它节点的连通性。P2P网络通常都是以自组织的方式建立起来的,并允许节点自由地加入和离开。

  • 高性价比

性能优势是P2P被广泛关注的一个重要原因。随着硬件技术的发展,个人计算机的计算和存储能力以及网络带宽等性能依照摩尔定理高速增长。采用P2P架构可以有效地利用互联网中散布的大量普通结点,将计算任务或存储资料分布到所有节点上。利用其中闲置的计算能力或存储空间,达到高性能计算和海量存储的目的。目前,P2P在这方面的应用多在学术研究方面,一旦技术成熟,能够在工业领域推广,则可以为许多企业节省购买大型服务器的成本。

  • 隐私保护

在P2P网络中,由于信息的传输分散在各节点之间进行而无需经过某个集中环节,用户的隐私信息被窃听和泄漏的可能性大大缩小。此外,目前解决Internet隐私问题主要采用中继转发的技术方法,从而将通信的参与者隐藏在众多的网络实体之中。在传统的一些匿名通信系统中,实现这一机制依赖于某些中继服务器节点。而在P2P中,所有参与者都可以提供中继转发的功能,因而大大提高了匿名通讯的灵活性和可靠性,能够为用户提供更好的隐私保护。

四、版本证明 VOS

Proof of vension ,类似pos、存储证明的一种算法,存储版本最完整的节点可以打包区块,根据IPFS协议存储到全球范围不同的服务器节点,以达到数据永久保存的目的

五、日志不可篡改

不可篡改指的是,每次生成的变动日志,通过广播到所有节点,每过十分钟会被打包成一个块日志上传到区块链上,此时日志内容是无法进行篡改,参考以太坊、比特币协议

六、关键术语

1、节点共识

节点共识是指,历史发生的数据变更不可篡改、节点每十分钟会达成一次共识,完成共识时变更日志会永久保存,每个节点都会保存一份完整的变更日志,同时会生成一份数据快照,用于快速恢复数据。

2、版本证明

版本证明是指发生共识时,优先选择版本证明最完整的节点作为数据一致性校验的节点,剩余节点将根据数据版本最全的节点进行数据校对,最终生成数据快照和历史日志块

3、轻节点

遵循默克尔有向无环图结构,对于边缘节点,只需要下载最近10分钟前的日志。

4、数据存储快照及日志

存储变更日志(类似mysql binlog日志,每十分钟生成一次),数据快照(全量数据,用于快速恢复跟备份)

5、私网

P2PDB并不仅仅是为公网设计,同时也允许企业根据P2PDB 搭建私网,私网跟公网一样具有高分区容错性、可用性、但是安全性、跟可控度会更高。

6、公私钥

公私钥是了提供数据在传输过程中的安全性,节点在数据传输前根据发放的公钥对数据进行加密,只有掌握私钥的的用户才能解出秘文。

7、版本快照

版本快照是按照一定时间跟规律产生,用于数据快速恢复,或发生并发冲突时用于解决冲突的一种恢复机制,版本快照提供自定义快照存储及FIELCOIN快照存储两种方式

七、该白皮书参考摘录来源