p2p、分布式,区块链笔记(IPFS): 论文Merkle-CRDTs : Merkle-DAGs meet CRDTs

paper code
Merkle-CRDTs : Merkle-DAGs meet CRDTs 添加链接描述
  • 本文研究了实现冲突自由复制数据类型(CRDTs)的传输和持久化层的Merkle-DAGs,并提出了Merkle-CRDTs这一术语。本文概述了相关概念、属性、优势和局限性。研究表明,Merkle-DAGs可以充当逻辑时钟(logical clocks),使Merkle-CRDTs在具有弱消息层保证和大量副本的系统中简化收敛数据类型的设计和实现。Merkle-CRDTs可以利用分布式技术(如DHTs和PubSub算法)的可扩展性,利用内容寻址的安全性和去重特性。这类内容导向的系统可能包括对等内容交换、移动设备、物联网设备之间的同步应用,或运行在网页浏览器中的用户应用。

I. INTRODUCTION

  • 区块链技术的出现推广了点对点网络以及被称为Merkle DAGs的加密有向无环图的使用,以在加密货币等应用程序中实现全球分布式和最终一致的数据结构。在这些系统中,Merkle DAG是一种内容寻址的数据结构(content-addressed data structure),用于提供因果关系信息和对象的自我验证,这些信息可以在无信任的对等环境中轻松有效地共享。在对抗场景中,需要维护和应用某些规则来向区块链添加新块,这通常需要使用共识算法(consensus algorithms)。

  • 在分布式系统中获得最终一致性的另一种方法是使用无冲突复制数据类型(CRDT)[30],[33]。CRDT在非对抗性场景中很有用,在这种场景中,已知参与的副本行为正确。CRDT依赖于数据对象本身的一些属性,这些属性使其能够收敛到一个全局的、唯一的状态,而不需要达成共识。CRDT有两种主要形式:

    • 基于状态的CRDTs1(Also known as Convergent CRDTs or CvRDTs)——其中副本的状态形成一个连接半格(join-semilattice),并在其提供的保证下合并
    • 基于操作的CRDTs2(Also known as Commutative CRDTs or CmRDTs.)——其中交换操作由每个副本广播并应用于本地状态。此外,δ-CRDT是基于状态的CRDT的优化,以减少副本发送的有效载荷的大小。
  • Merkle DAG和CRDT都提供了有趣的特性:前者允许分布式系统利用内容寻址层进行数据的解析/可发现性和自我验证,而不管源位置如何;后者允许全球国家趋同,而不需要通常复杂而昂贵的共识机制。通过在Merkle DAG节点中嵌入CRDT对象,我们获得了两个世界的最佳属性,即我们获得了一个可以利用DAG作为逻辑时钟的收敛系统。此逻辑时钟由每个复制品提供和构建,无需协调。副本可以在没有交付保证的松散网络环境中无中断运行。正如我们将看到的,基于Merkle CRDT的系统完全不知道系统如何在副本之间宣布和发现数据,因此能够利用DHT和PubSub机制提供的不同方法,而不依赖于它们的特定版本。这与传统的共识算法形成鲜明对比,例如Raft,它与特定的消息传播协议相关联。

  • InterPlanetary文件系统提供了一个内容寻址的对等文件系统[14],它支持Merkle DAG与任意格式或有效载荷的无缝同步,使其成为PeerPad或OrbitDB等不同类型分布式应用程序的强大构建块,这两种应用程序都由CRDT和IPFS提供支持。IPFS不仅为处理内容寻址数据(如我们将使用的Merkle DAG)提供了合适的环境,还允许我们的CRDT应用程序与分布式系统的较低级别完全分离:网络传输、发现和数据传输设施都是模块化的,可以独立交换和调整。利用这种系统大大简化了CRDT层的设计和优化,使其能够很好地适应其要服务的用例。

  • 在本文中,将我们所说的Merkle CRDT形式化。目的是概述它们的性质、优点和局限性,以便为未来在该领域的研究和优化奠定基础。例如,Merkle CRDT允许在网络中的真实系统中构建完全分布式的键值存储,没有消息传递保证,并且完全灵活的副本集可以随时增长和收缩,而不会影响CRDT层。

  • 本文的其余部分组织如下:在第二节中,我们首先介绍相关的背景概念和现有技术。在第三节中,我们展示了系统模型的特点,并介绍了存储和同步Merkle CRDT所需的设施

文章贡献:

  • 本文的贡献如下:

    • 本文将Merkle Clocks定义为基于Merke DAG的逻辑时钟,以表示分布式系统中的因果关系信息。使用Merkle DAGs嵌入因果关系信息是加密货币和Git等源代码控制系统的核心,但它们很少被单独视为一种逻辑时钟。本文证明了Merkle时钟可以用来代替CRDT传统上使用的其他逻辑时钟,如版本向量(version vectors)和向量时钟(vector clocks)。本文证明,Merkle Clocks实际上可以被视为CRDT对象本身,可以同步和合并,本文可以正式证明不同副本之间的最终一致性。
    • 本文将Merkle CRDT定义为CRDT有效载荷的通用传输和持久层,它利用Merkle时钟的特性,使用DAG同步器和广播器通过设计提供每个对象的因果一致性(causal consistency)。这使得在消息传递层保证较弱且有大量副本的系统中可以使用简单的CRDT类型。
  • 我们在这篇论文中的目的是表明,副本之间的最终一致性可以在所有对等体都相等的情况下独立于底层传输机制来实现。这意味着Merkle CRDT可以在任何底层对等体发现和路由系统(例如DHT、PubSub)之上实现。我们认为,这是一个非常强大的概念,有可能导致新的最终一致性系统设计。它也与传统的共识算法(如Raft)有着根本的不同,在Raft中,在任何给定的时间都需要有一个从所有其他对等体收集最新状态的领导者对等体。因此,我们不提供对这些传统方法的评估,因为它们的要求和设计原则根本不同。

  • 在第四节中,我们介绍了Merkle Clocks,并在前几节的基础上,在第五节中定义了Merkle CRDT。我们讨论了不同的CRDT有效载荷(无论是基于操作、基于状态还是基于δ)如何从Merkle CRDT中受益。最后,我们在第六节中描述了Merkle CRDT的一些局限性和低效性,并介绍了克服它们的技术。

II. BACKGROUND & RELATED WORK

A. Eventual consistency 最终一致性

  • 分布式系统中的最终一致性(EC)是指系统副本之间的状态可能不同,但如果有足够的时间,也许在网络分区、停机和其他可能性得到解决之后,系统设计将确保状态在任何地方都是相同的。
  • 最终一致性定义的主要弱点是,它无法保证共享状态何时收敛,或者在此之前允许各个状态发散多少。强最终一致性(SEC)通过建立额外的安全保证来解决这些问题:如果两个副本收到了相同的更新,它们的状态将是相同的。
  • 共识算法,或者对本文更重要的是无冲突复制数据类型(CRDT),是在分布式系统中实现(强)最终一致性的方法。

B. Merkle DAGs

  • 有向无环图(DAG)是一种边有方向且不允许循环的图。例如,像A→B→C这样的链表是DAG的实例,其中A引用B,以此类推。我们说B是A的子节点或后代,节点A与B有链接。相反,A是B的父节点。我们称DAG中任何其他节点的非子节点为根节点。Merkle DAG是一个DAG,其中每个节点都有一个标识符,这是使用SHA256等加密哈希函数对节点内容(节点携带的任何不透明有效载荷及其子节点的标识符列表)进行哈希运算的结果。这带来了一些重要的考虑因素:

    • a) Merkle DAGs只能从叶子构建,也就是说,从没有子节点的节点构建。父母被添加在孩子后面,因为必须提前计算孩子的标识符才能将他们链接起来。
    • b) Merkle DAG中的每个节点都是(子)Merkle DAG本身的根,并且该子图包含在父DAG中
    • c) Merkle DAG节点是不可变的。节点中的任何更改都会改变其标识符,从而影响DAG中的所有升序,本质上创建了一个不同的DAG。
      .
  • 通过哈希值识别数据对象(如Merkle DAG节点)称为内容寻址。因此,我们将节点标识符命名为内容标识符或CID。

  • 例如,在前面的链表中,假设每个节点的有效载荷只是其后代的CID,则为:A = Hash(B) → B = Hash© → C = Hash(∅)。Hash函数的属性确保在创建Merkle DAG时不存在循环。

  • Merkle DAGs是自我验证和不可变的结构。节点的CID明确地链接到其有效载荷的内容及其所有后代的内容。因此,具有相同CID的两个节点明确表示完全相同的DAG。这将是有效同步Merkle CRDT的关键属性,而无需复制完整的DAG,如IPFS等系统所利用的。

  • Merkle DAGs被广泛使用。像Git[17]这样的源代码控制系统[13]使用它们来高效地存储存储库历史,从而能够消除对象的重复并检测分支之间的冲突。在像Dy-namo[19]这样的分布式数据库中,Merkle树用于有效比较和协调副本之间的状态。在哈希历史[22]中,内容寻址用于指代表示状态的Merkle树。

  • Merkle DAG也是区块链的基础块——它们可以被视为具有单个分支的Merkle DAG——以及它们最常见的应用:加密货币(例如[3]、[1]、[18])。比特币等加密货币[26]受益于链中编码的嵌入式因果关系信息:链中较深区块的交易总是发生在较早区块的交易之前。加密货币的主要问题之一是让所有参与的同行就链的尖端/头部/根部达成一致。除此之外,一些交易的非交换性质需要一个共识机制,该机制强制只有有效的块才能成为新的根。

  • 许多这些系统的一个共同点是,Merkle DAG隐式地嵌入了因果关系信息。DAG可以显示某个事务先于另一个事务,或者Git提交需要合并而不是快速转发。这将是我们在Merkle CRDT中使用的属性之一,本文对此进行了明确阐述,并与其他称为逻辑时钟的因果编码机制进行了对比。

C. Logical clocks

  • 因果收敛系统的设计涉及不同副本之间发散状态版本的协调,例如,当事件同时发生时。
  • 这要求我们能够识别两个事件是否实际上是同时发生的,以及两个状态是否由于并发更新或其他原因而实际上不同,例如一个副本收到了更多的更新。
  • 问题本质上是跟踪不同事件发生的顺序。例如,给定一个值在不同副本中多次写入寄存器,我们希望注册表中的最终值是最后一次写入的值。
  • 理想情况下,我们应该能够对系统中的所有事件进行排序,以便我们能够确定哪个是寄存器的实际最后一次更新。
  • 用时间戳标记事件可以给我们提供以下信息:如果所有事件都有时间戳,任何副本都可以建立它们发生的顺序,并使用该信息来决定最终状态应该是什么样子。然而,在分布式系统中,不可能可靠地使用时间戳[27],因为并非每个副本都能与全局时间完美同步。“挂钟”也很容易被模拟或欺骗,这在没有信任的对等系统中是有问题的。
  • 逻辑时钟是全球时间的替代品。它们提供了对分布式系统中不同参与者已知的事件之间的因果信息进行编码的方法。
  • 基本思想是,尽管我们可能不知道所有事件在全球范围内发生的顺序,但每个副本至少知道自己发出的事件的顺序。接收到该信息的任何其他副本都会知道,稍后由其自身发出的任何事件都发生在这些事件之后。本质上,这就是所谓的因果史。
  • 逻辑时钟是因果历史的表示[12],并提供事件之间的偏序。也就是说,给定两个事件a和b,逻辑时钟应该能够告诉我们a是否发生在b之前(a→b),反之亦然(b→a),或者a和b同时发生( a ∣ ∣ b a || b a∣∣b)。
  • 逻辑时钟的实际实现通常涉及附加到系统中每个事件的元数据。最常见的逻辑时钟形式之一是版本向量[28]:每个副本都维护并广播一个向量,跟踪所有副本的状态在哪个版本上。当副本对状态进行修改时,它会增加其版本。当一个副本合并来自不同副本的状态时,它会在本地版本和其他副本随事件提供的版本之间取最高值。因此,给定两个事件a、b,其版本向量为 V a V^a Va V b V^b Vb:a→b如果 V i a ≤ V i b V^a_i ≤ V^b_i ViaVib,对于向量中的每个位置i。如果a ¬ \neg ¬ →b和b ¬ \neg ¬→a,根据这个定义,a和b是并发的。
  • 正如我们所看到的,版本向量是紧凑的,因为它们不需要存储完整的因果历史,而只需要一个数字来指示每个副本的历史有多长。版本向量取决于副本的数量,因此它们可能需要进一步优化,以便在有许多副本或副本数量不稳定的情况下正常工作。
  • 本文证明了Merkle DAG可以作为逻辑时钟。正如我们将展示的那样,Merkle Clocks提供了一组不同的属性,但编码了关于事件的相同因果信息。

D. Conflict-Free Replicated Data Types (CRDTs)

  • CRDTs(可重复合并数据类型)是一种数据类型,通过对状态和/或修改操作的特定要求,确保在分布式系统中不同副本之间达到强一致性。此外,CRDTs 还具有单调性(monotonicity)的特征。应用于数据类型的单调性概念是指每次更新都是一种“膨胀”,即状态会不断增加(不是在大小上,而是在相对于先前状态的意义上)。这意味着状态之间总是存在一种顺序关系。单调性意味着,无论更新发生的顺序如何,都不需要对状态进行回滚。
  • CRDTs 主要有两种类型:基于状态的 CRDTs 和基于操作的 CRDTs。在基于状态的 CRDTs 中,系统中的所有状态——即不同副本和不同时间的状态——形成一个单调的联合半格(join-semilattice)。这意味着,对于任何两个状态 X 和 Y,它们都可以被“合并”(⊔),结果是一个新的状态,对应于 X 和 Y 的最小上界(LUB)。换句话说,每次对状态的修改都必须是“膨胀”,且两个状态 X 和 Y 的联合是包含 X 和 Y 的最小状态(LUB)。联合半格是一个部分有序集合,其 LUB 是能包含半格中所有状态的最小状态。这意味着⊔操作必须是幂等的(X ⊔ X = X)、交换的(X ⊔ Y = Y ⊔ X)和结合的((X ⊔ Y) ⊔ Z = X ⊔ (Y ⊔ Z))。
  • 在基于状态的 CRDT 中,副本会修改其状态或进行“膨胀”,然后将结果状态广播给其他副本。接收到状态后,其他副本会将其与本地状态合并。状态的属性确保,如果副本正确接收了来自其他副本的状态,并且反之亦然,那么这些副本最终会收敛到相同的状态。
  • 另一方面,基于操作的 CRDTs [30]不对状态本身施加任何属性,而是对修改状态的操作施加要求。这些操作必须是可交换的(即使对于同时发生的不同操作也是如此)。在基于操作的 CRDT 中,副本广播的是操作而不是状态。如果两个副本同时发生了两个操作,那么其他副本应用这些操作的顺序无关紧要:最终的状态将是相同的。
  • 因此,如果操作广播未能到达某个副本(例如由于网络故障),该副本将无法应用这些操作,导致状态无法收敛。因此,与基于状态的 CRDTs 不同,基于操作的 CRDTs 的最终一致性需要一个可靠的消息层来确保所有操作最终都被传递[11]。此外,如果操作不是幂等的,消息层还需确保每个操作仅传递一次。
  • 一些基于操作的 CRDTs 还可能要求因果传递:如果一个副本先发送了操作 a,再发送操作 b(a → b),那么 a 应该始终在 b 之前被传递到其他副本。
  • 这些属性和要求确保了状态和操作型 CRDTs 的每个对象之间的因果一致性:状态的更新将保持它们之间的因果关系。例如,在一个仅增长集合(Grow-Only Set, G-Set)中,当一个副本先添加元素 A,再添加元素 B 时,任何其他副本都不会有这样的集合:其中包含元素 B 但不包含元素 A。
  • 逻辑时钟,如前面所述,通常用于实现 CRDT 类型:它们有助于识别两个更新是否同时发生并需要合并。CRDTs 已在各种应用和分布式数据库中成功使用和优化,其中 Basho 的 Riak 是最著名的例子之一。Logical clocks, as seen in the previous section, are commonly used to implement CRDT types: they are useful to identify when two updates happen concurrently and need
    merging. CRDTs have been successfully used and optimized in
    different applications and distributed databases, Basho’s Riak
    [15], [16] being one of the most prominent examples.

E. Sync Protocols in Information-Centric Networks

  • 有多种类型的逻辑时钟与前面讨论的版本向量相似,但满足了不同的需求或解决了它们的一些缺点:向量时钟[21]、有界版本向量[8]、虚线版本向量[29]、树时钟[24]或间隔树时钟[9]就是其中的一些。
  • 最近在信息中心网络(ICN)领域的分布式数据集同步方面有大量工作[32],[31],[35],[7]。以信息为中心的架构提倡在网络层直接命名内容,并基于内容名称和(在某些情况下)最长前缀匹配进行后续路由和转发(由核心网络路由器)。
  • ChronoSync[35]正在利用命名数据网络架构[34]的功能来同步不同数据集之间的状态。ChronoSync是一种数据层机制,然而,它利用了NDN所构建的分层和灵活的命名方案。受Merkle树的启发,ChronoSync正在使用加密摘要和过滤器来同步对等体之间的数据集。ChronoSync利用了底层网络(NDN)的基于名称的特性,并为每个对等体分配了一个唯一的发布前缀。这种独特的前缀,加上序列号和网络层持久/长寿命的“兴趣包”,正在取代其他方法试图用时钟和CRDT做的大部分工作。虽然在网络层集成同步功能允许更原生的设计,但一些功能不可避免地会丢失。例如,ChronoSync无法处理同时(并发)的数据发布。RoundSync[32]通过将同步过程拆分为多个轮次,部分解决了这个问题。
  • VectorSync[31]是ChronoSync[35]的增强版本,它使用版本向量使对等体之间的同步更加高效。如前所述,版本向量在检测不一致性方面比简单的消息摘要更有效。然而,与该领域的其他提案类似,VectorSync需要实现“基于领导者的成员管理”,以处理更新数据集状态的活跃成员。
  • 在网络的网络层本地集成分布式数据集同步功能显然是一项先进的努力,但也有其自身的挑战。我们相信,Merkle CRDT带来的“传输无关”状态同步的优势可以应用并提高ChronoSync、RoundSync或VectorSync等协议的性能。另一方面,通过命名网络对象直接处理基于Merkle CRDT的状态同步,为Merkle CRDTs带来了标准ICN优势。因此,我们认为这两种不同的状态同步方法是互补的。

F. IPFS: The InterPlanetary File System

  • IPFS[14]是一个内容寻址的分布式文件系统。它使用分布式哈希表(DHT)来宣布和发现哪些副本(或对等体)提供特定的Merkle DAG节点。它实现了一个名为bitswap的节点交换协议,用于从任何提供者检索DAG节点。IPFS建立在libp2p之上[5],libp2p是一种用于P2P网络的模块化网络协议栈,它还提供了主要基于发布-订阅模型的高效广播机制[2]。
  • IPFS还使用IPLD,行星间链接数据格式[4],这是一个用任意节点格式描述Merkle DAG并支持多种类型CID的框架[6],这使
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值