一句话:提出 Propel 语言与类型系统,用类型检查自动验证 CRDT 实现所需的交换、结合、幂等等代数性质。
CRDT 依赖 merge 函数满足交换律、结合律与幂等性,但现有测试、模型检验和机器化证明难以直接验证具体实现。本文提出 Propel:一种带类型系统的编程语言,其类型可表达 CRDT 正确性所需的代数性质。Propel 通过和类型指导情况分析、函数类型中的代数性质支持归纳,并借助重写规则推导表达式的相等或不等关系。作者将 Propel 实现为 Scala 嵌入,编写并验证多个 CRDT,与四种先进验证工具对比。结果显示 Propel 能自动推导常见开源 CRDT 实现所需的性质,甚至在对比工具超时的情况下仍能成功。
Conflict-Free Replicated Data Types (CRDTs) are a recent approach for keeping replicated data consistent while guaranteeing the absence of conflicts among replicas. For correct operation, CRDTs rely on a merge function that is commutative, associative and idempotent. Ensuring that such algebraic properties are satisfied by implementations, however, is left to the programmer, resulting in a process that is complex and error-prone. While techniques based on testing, automatic verification of a model, and mechanized or handwritten proofs are available, we lack an approach that is able to verify such properties on concrete CRDT implementations. In this paper, we present Propel, a programming language with a type system that captures the algebraic properties required by a correct CRDT implementation. The Propel type system deduces such properties by case analysis and induction: sum types guide the case analysis and algebraic properties in function types enable induction for free. Propel’s key feature is its capacity to reason about algebraic properties (a) in terms of rewrite rules and (b) to derive the equality or inequality of expressions from the properties. We provide an implementation of Propel as a Scala embedding, we implement several CRDTs, verify them with Propel and compare the verification process with four state-of-the-art verification tools. Our evaluation shows that Propel is able to automatically deduce the properties that are relevant for common CRDT implementations found in open-source libraries even in cases in which competitors timeout.
@article{paperbot1988,
title = {Type-Checking CRDT Convergence},
author = {George Zakhour and Pascal Weisenburger and Guido Salvaneschi},
journal = {Proceedings of the ACM on Programming Languages},
volume = {7},
number = {PLDI},
year = {2023},
doi = {10.1145/3591276}
}