From 790ab5828fca592ead3436e4fec3532bf102e04e Mon Sep 17 00:00:00 2001 From: amaury Date: Tue, 17 Dec 2024 14:57:43 +0100 Subject: [PATCH] hard push --- .devcontainer/devcontainer.json | 32 + .devcontainer/install-tools.sh | 15 + .../Anglais_avril_2024/conclusion/index.tex | 15 + .../consistency/byzantin.tex | 14 + .../Anglais_avril_2024/consistency/faible.tex | 122 ++++ .../Anglais_avril_2024/consistency/forte.tex | 45 ++ .../Anglais_avril_2024/consistency/index.tex | 8 + .../Anglais_avril_2024/distr_sys/bases.tex | 32 + .../Anglais_avril_2024/distr_sys/index.tex | 2 + .../images/carte_criteres.png | Bin 0 -> 162861 bytes .../LIS/Anglais_avril_2024/intro/index.tex | 4 + .../LIS/Anglais_avril_2024/intro/suite.tex | 17 + .../LIS/Anglais_avril_2024/main.tex | 60 ++ .../Anglais_avril_2024/schemas/ccv_hc_1.png | Bin 0 -> 73194 bytes .../schemas/convergence_hc_1.tex | 41 ++ .../schemas/convergence_hc_2.tex | 41 ++ .../schemas/linearisation_atomicite_hc.tex | 26 + .../schemas/linearisation_regularite_hc.tex | 26 + .../schemas/linearisation_surete_hc.tex | 26 + .../schemas/localiteetat_hc_1.tex | 34 ++ .../schemas/localiteetat_hc_2.tex | 32 + .../schemas/validite_hc_1.tex | 31 + .../schemas/validite_hc_2.tex | 31 + .../Anglais_avril_2024/schemas/wcc_hc_1.tex | 42 ++ .../Anglais_avril_2024/schemas/wcc_hc_2.tex | 29 + .../Anglais_avril_2024/schemas/wcc_hc_3.tex | 41 ++ .../LIS/DALGO_6_juillet_2023/main.tex | 2 +- docs/rapport/CRDT/intro/index.tex | 45 ++ docs/rapport/CRDT/main.tex | 34 ++ docs/rapport/CRDT/sources.bib | 549 ++++++++++++++++++ docs/sujetThese/sujet-cifre.bib | 462 +++++++++++++++ docs/sujetThese/sujet-cifre.tex | 380 ++++++++++++ .../images/local1/local1.latex | 43 ++ .../images/local2/local1.latex | 64 ++ .../images/local2/local2.latex | 41 ++ .../images/local2/local2fail.latex | 44 ++ .../localiteEtat/localiteEtatFail.latex | 84 +++ .../images/seriaized/serialized.latex | 57 ++ 38 files changed, 2570 insertions(+), 1 deletion(-) create mode 100644 .devcontainer/devcontainer.json create mode 100755 .devcontainer/install-tools.sh create mode 100644 docs/presentations/LIS/Anglais_avril_2024/conclusion/index.tex create mode 100644 docs/presentations/LIS/Anglais_avril_2024/consistency/byzantin.tex create mode 100644 docs/presentations/LIS/Anglais_avril_2024/consistency/faible.tex create mode 100644 docs/presentations/LIS/Anglais_avril_2024/consistency/forte.tex create mode 100644 docs/presentations/LIS/Anglais_avril_2024/consistency/index.tex create mode 100644 docs/presentations/LIS/Anglais_avril_2024/distr_sys/bases.tex create mode 100644 docs/presentations/LIS/Anglais_avril_2024/distr_sys/index.tex create mode 100755 docs/presentations/LIS/Anglais_avril_2024/images/carte_criteres.png create mode 100644 docs/presentations/LIS/Anglais_avril_2024/intro/index.tex create mode 100644 docs/presentations/LIS/Anglais_avril_2024/intro/suite.tex create mode 100755 docs/presentations/LIS/Anglais_avril_2024/main.tex create mode 100755 docs/presentations/LIS/Anglais_avril_2024/schemas/ccv_hc_1.png create mode 100755 docs/presentations/LIS/Anglais_avril_2024/schemas/convergence_hc_1.tex create mode 100755 docs/presentations/LIS/Anglais_avril_2024/schemas/convergence_hc_2.tex create mode 100755 docs/presentations/LIS/Anglais_avril_2024/schemas/linearisation_atomicite_hc.tex create mode 100755 docs/presentations/LIS/Anglais_avril_2024/schemas/linearisation_regularite_hc.tex create mode 100755 docs/presentations/LIS/Anglais_avril_2024/schemas/linearisation_surete_hc.tex create mode 100755 docs/presentations/LIS/Anglais_avril_2024/schemas/localiteetat_hc_1.tex create mode 100755 docs/presentations/LIS/Anglais_avril_2024/schemas/localiteetat_hc_2.tex create mode 100755 docs/presentations/LIS/Anglais_avril_2024/schemas/validite_hc_1.tex create mode 100755 docs/presentations/LIS/Anglais_avril_2024/schemas/validite_hc_2.tex create mode 100755 docs/presentations/LIS/Anglais_avril_2024/schemas/wcc_hc_1.tex create mode 100755 docs/presentations/LIS/Anglais_avril_2024/schemas/wcc_hc_2.tex create mode 100755 docs/presentations/LIS/Anglais_avril_2024/schemas/wcc_hc_3.tex create mode 100644 docs/rapport/CRDT/intro/index.tex create mode 100644 docs/rapport/CRDT/main.tex create mode 100644 docs/rapport/CRDT/sources.bib create mode 100644 docs/sujetThese/sujet-cifre.bib create mode 100644 docs/sujetThese/sujet-cifre.tex create mode 100644 out/docs/rapport/rapport_etat_art/images/local1/local1.latex create mode 100644 out/docs/rapport/rapport_etat_art/images/local2/local1.latex create mode 100644 out/docs/rapport/rapport_etat_art/images/local2/local2.latex create mode 100644 out/docs/rapport/rapport_etat_art/images/local2/local2fail.latex create mode 100644 out/docs/rapport/rapport_etat_art/images/localiteEtat/localiteEtatFail.latex create mode 100644 out/docs/rapport/rapport_etat_art/images/seriaized/serialized.latex diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..810862f --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,32 @@ +// Add you DevContainer configuration in this file +// See: https://containers.dev/ for the "official" DevContainer specifications +{ + "name": "latex-default", //Add the name your DevContainer Here, + "image": "pandoc/latex:latest-ubuntu", //Add the name of your Docker image here. See: https://hub.docker.com for available containers + "containerEnv": { //Add your build arguments here + "DEBIAN_FRONTEND": "noninteractive" + }, + "runArgs": [], //Add you docker run arguments here + "updateContentCommand": ".devcontainer/install-tools.sh", //Path to the installation script run inside the DevContainer + // "customizations": { + // //Add your customizations here + // }, + // "forwardPorts": [], //Add your port forwarding from inside/oustide here + "workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/containers,type=bind", //Add your local mounting inside the DevContainer here + "workspaceFolder": "/workspaces/containers", //Add your workspace folder here + "customizations": { + "vscode": { + "extensions": [ + "james-yu.latex-workshop", + "eamodio.gitlens", + "jenselme.grammalecte", + ], + "settings": { + "grammalecte.allowedExtension": ".md,.rst,.adoc,.asciidoc,.creole,.t2t,.tex", + } + } + }, + "features": { + "ghcr.io/devcontainers/features/git:1": {}, + } +} \ No newline at end of file diff --git a/.devcontainer/install-tools.sh b/.devcontainer/install-tools.sh new file mode 100755 index 0000000..798680a --- /dev/null +++ b/.devcontainer/install-tools.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# Update package lists +apt update + +# Install Git +# apt install -y git +tlmgr install preprint + +# installation de grammalecte +apt install python3 unzip -y +mkdir /root/.grammalecte +cd /root/.grammalecte +wget https://grammalecte.net/zip/Grammalecte-fr-v2.1.1.zip +unzip Grammalecte-fr-v2.1.1.zip \ No newline at end of file diff --git a/docs/presentations/LIS/Anglais_avril_2024/conclusion/index.tex b/docs/presentations/LIS/Anglais_avril_2024/conclusion/index.tex new file mode 100644 index 0000000..ce0c070 --- /dev/null +++ b/docs/presentations/LIS/Anglais_avril_2024/conclusion/index.tex @@ -0,0 +1,15 @@ +\begin{frame} + \frametitle{My work} + + \begin{block}{What's next ?} + \begin{itemize} + \item Study and formalize some "in-prod" algorithms using weak consistency in byzantine contexts. + \item Continue the collaboration with Parsec: + \begin{itemize} + \item formalize a list of properties + \end{itemize} + \item identifies which applications are suitable for each class of weak consistency. + + \end{itemize} + \end{block} +\end{frame} \ No newline at end of file diff --git a/docs/presentations/LIS/Anglais_avril_2024/consistency/byzantin.tex b/docs/presentations/LIS/Anglais_avril_2024/consistency/byzantin.tex new file mode 100644 index 0000000..60cb02d --- /dev/null +++ b/docs/presentations/LIS/Anglais_avril_2024/consistency/byzantin.tex @@ -0,0 +1,14 @@ +\begin{frame} + \frametitle{The Byzantine context associated with the weak consistency} + + \begin{block}{Some questions about:} + \begin{itemize} + \item is the weak consistency introduces more or less possibility of malicious behaviors. + \item is the cost to make a system Byzantine Fault Tolerant is higher or lower with weak consistency. + \end{itemize} + \end{block} + + The state of the art is poor about these questions and few formalized algorithms are available. + + +\end{frame} \ No newline at end of file diff --git a/docs/presentations/LIS/Anglais_avril_2024/consistency/faible.tex b/docs/presentations/LIS/Anglais_avril_2024/consistency/faible.tex new file mode 100644 index 0000000..2b9c8c0 --- /dev/null +++ b/docs/presentations/LIS/Anglais_avril_2024/consistency/faible.tex @@ -0,0 +1,122 @@ +\begin{frame} + \frametitle{The models of consistency} + + \begin{columns} + \column{0.6\textwidth} + \footnote{Perrin, \emph{Concurrence et cohérence dans les systèmes répartis}, 2017} + \resizebox{\columnwidth}{!}{ + \includegraphics{images/carte_criteres.png} + } + + \column{0.4\columnwidth} + \begin{block}{Les classes de cohérences} + 2 big family : + \begin{itemize} + \item Strong Consistency + \item Weak Consistency : + \begin{itemize} + \item Eventual Consistency (EC) + \item State Locality (SL) + \item Validity (V) + \end{itemize} + \end{itemize} + \end{block} + \end{columns} + \end{frame} + + \begin{frame} + \frametitle{Eventual Consistency (EC)} + + \begin{block}{Definition} + There exists a set of cofinite operations where each one must be justified with the same state. + \end{block} + + \begin{columns} + \column{0.4\columnwidth} + \begin{tcolorbox}[colframe=green!50!black] + \input{schemas/convergence_hc_1} + \end{tcolorbox} + \column{0.5\columnwidth} + $E' = \{r/(1,2)^\omega, r/(1,2)^\omega\}$ \newline + $\delta = ((1,2), \emptyset)$ is a valid state justifying $E'$. + \end{columns} + + \begin{columns} + \column{0.4\columnwidth} + \begin{tcolorbox}[colframe=red!50!black] + \input{schemas/convergence_hc_2} + \end{tcolorbox} + \column{0.5\columnwidth} + $E' = \{r/(1,2)^\omega, r/(2,1)^\omega\}$. \newline + There exists no state able to justify $E'$ because the two infinite reads are not consistent. + \end{columns} + \end{frame} + + \begin{frame} + \frametitle{State Locality} + + \begin{block}{Definition} + For all $p$, there exists one linearization that includes all the read operations of $p$. According to the local order of these reads. \\ + \end{block} + + \begin{columns} + \column{0.4\columnwidth} + \begin{tcolorbox}[colframe=green!50!black] + \input{schemas/localiteetat_hc_1} + \end{tcolorbox} + \column{0.5\columnwidth} + \begin{math} + \begin{array}{l} + \textcolor{blue}{C_{p_0} = \{r/(0,0), r/(0,2)^\omega, w(2)\}}, \\ + \textcolor{red}{C_{p_1} = \{r/(0,0), r/(0,1)^\omega, w(1)\}}, \\ + \textcolor{blue}{r/(0,0) \bullet w(2) \bullet r/(0,2)^\omega} \\ + \textcolor{red}{r/(0,0) \bullet w(1) \bullet r/(0,1)^\omega} \\ + \end{array} + \end{math} + \end{columns} + + \begin{columns} + \column{0.4\columnwidth} + \begin{tcolorbox}[colframe=red!50!black] + \input{schemas/localiteetat_hc_2} + \end{tcolorbox} + \column{0.5\columnwidth} + $E'_{p_0} = \{r/(0,0), r/(2,1)^\omega\},$ \newline + $r/(0,0) \bullet w(2) \bullet w(1) \bullet r/(2,1)^\omega$ \newline + $E'_{p_1} = \{r/(0,1), r/(2,1)^\omega\}$. \newline + There exists no linearization of $p_1$ satisfying the definition of state locality + \end{columns} + \end{frame} + + \begin{frame} + \frametitle{Validity (V)} + + \begin{block}{Definition} + There exists a cofinite set of operations such as each of them must be justified by a linearization of all the write operations. + \end{block} + + \begin{columns} + \column{0.4\columnwidth} + \begin{tcolorbox}[colframe=green!50!black] + \input{schemas/validite_hc_1} + \end{tcolorbox} + \column{0.5\columnwidth} + \begin{math} + \begin{array}{ll} + E' = & \{r/(2,1)^\omega, r/(1,2)^\omega\} \\ + & w(2) \bullet w(1) \bullet \textcolor{red}{r/(2,1)^\omega} \\ + & w(1) \bullet w(2) \bullet \textcolor{red}{r/(1,2)^\omega} \\ + \end{array} + \end{math} + \end{columns} + + \begin{columns} + \column{0.4\columnwidth} + \begin{tcolorbox}[colframe=red!50!black] + \input{schemas/validite_hc_2} + \end{tcolorbox} + \column{0.5\columnwidth} + $E' = \{r/(0,1)^\omega, r/(1,2)^\omega\}$. \\ + There is no linearization of the write operation able to justify $r/(0,1)^\omega$. + \end{columns} + \end{frame} \ No newline at end of file diff --git a/docs/presentations/LIS/Anglais_avril_2024/consistency/forte.tex b/docs/presentations/LIS/Anglais_avril_2024/consistency/forte.tex new file mode 100644 index 0000000..0d1966f --- /dev/null +++ b/docs/presentations/LIS/Anglais_avril_2024/consistency/forte.tex @@ -0,0 +1,45 @@ +\begin{frame} + \frametitle{Safety} + \begin{block}{Definition} + Each \textbf{read} operation made in the same \textbf{non-competitor} context provides the same result. + \end{block} + \begin{figure} + \input{schemas/linearisation_surete_hc} + \end{figure} + \end{frame} + + \begin{frame} + \frametitle{Regularity} + \begin{block}{Definition} + An \textbf{reading operation concurrent with a writing operation} must provide the value \textbf{before or after the write}. + \end{block} + \begin{figure} + \input{schemas/linearisation_regularite_hc} + \end{figure} + \end{frame} + + \begin{frame} + \frametitle{Atomicity} + \begin{block}{Definition} + If \textbf{two readings are non-competitor}, the second one must provide a value \textbf{at least as recent as} the previous one. + \end{block} + \begin{figure} + \input{schemas/linearisation_atomicite_hc} + \end{figure} + \end{frame} + + \begin{frame} + \frametitle{Atomic Consistency ($C_\top$)} + + \begin{block}{Définition} + Atomic consistency is the stronger consistency class. + \begin{itemize} + \item Provide an awful interactivity. + \item Need a strong synchronization between each operation. + \begin{itemize} + \item Each read or write operation locks the others and needs to wait for the release from the previous one. + \end{itemize} + \item He's used as a reference for the other consistency class. + \end{itemize} + \end{block} + \end{frame} \ No newline at end of file diff --git a/docs/presentations/LIS/Anglais_avril_2024/consistency/index.tex b/docs/presentations/LIS/Anglais_avril_2024/consistency/index.tex new file mode 100644 index 0000000..8bc1bda --- /dev/null +++ b/docs/presentations/LIS/Anglais_avril_2024/consistency/index.tex @@ -0,0 +1,8 @@ +\subsection{Strong consistency} +\include{consistency/forte.tex} + +\subsection{The compromises of the strong consistency} +\include{consistency/faible.tex} + +\subsection{In a malicious context ?} +\include{consistency/byzantin.tex} \ No newline at end of file diff --git a/docs/presentations/LIS/Anglais_avril_2024/distr_sys/bases.tex b/docs/presentations/LIS/Anglais_avril_2024/distr_sys/bases.tex new file mode 100644 index 0000000..1efe70c --- /dev/null +++ b/docs/presentations/LIS/Anglais_avril_2024/distr_sys/bases.tex @@ -0,0 +1,32 @@ +\begin{frame} + \frametitle{A distributed system} + + \begin{block}{Definition} + A distributed system is a group of \textbf{actors} able to communicate \textbf{each-other} working together to \textbf{complete a common task}. + \end{block} + + % Schéma d'un système distribué + + The system we consider in this presentation is a \textbf{asynchronous message-passing} system. + +\end{frame} + +\begin{frame} + \frametitle{A distributed system is a living system} + + A distributed system changes over time. + + There are some ways to study these changes : + \begin{itemize} + \item focus on the \textbf{churn} (node addition and removal). + \item focus on the \textbf{messages}. + \item focus on the \textbf{connectedness}. + \item focus on the \textbf{states}. $\Leftarrow$ + \item probably more... ? + \end{itemize} + + The study of the state changes is also called the study of \textbf{consistency}. + + \textbf{A small exemple}: A peer-to-peer discussion + +\end{frame} \ No newline at end of file diff --git a/docs/presentations/LIS/Anglais_avril_2024/distr_sys/index.tex b/docs/presentations/LIS/Anglais_avril_2024/distr_sys/index.tex new file mode 100644 index 0000000..ffbbf9f --- /dev/null +++ b/docs/presentations/LIS/Anglais_avril_2024/distr_sys/index.tex @@ -0,0 +1,2 @@ +\subsection{Définition} +\include{distr_sys/bases} \ No newline at end of file diff --git a/docs/presentations/LIS/Anglais_avril_2024/images/carte_criteres.png b/docs/presentations/LIS/Anglais_avril_2024/images/carte_criteres.png new file mode 100755 index 0000000000000000000000000000000000000000..cd71ddc88a22310aca2c4ce1557e5b6debbdc910 GIT binary patch literal 162861 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 z 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 PWDw=)>gTe~DWM4fQD5k+ literal 0 HcmV?d00001 diff --git a/docs/presentations/LIS/Anglais_avril_2024/schemas/convergence_hc_1.tex b/docs/presentations/LIS/Anglais_avril_2024/schemas/convergence_hc_1.tex new file mode 100755 index 0000000..9217952 --- /dev/null +++ b/docs/presentations/LIS/Anglais_avril_2024/schemas/convergence_hc_1.tex @@ -0,0 +1,41 @@ +\resizebox{\columnwidth}{!}{ + \begin{tikzpicture}[ + roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,}, + ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,}, + arrow/.style={|->, thick,}, + message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}}, + ] + + \node[roundnode] (11) {}; + \node[left] at (11.west) {$p_0$}; + \node[above] at (11.north) {$w(1)$}; + \node[roundnode] (12) [right=of 11] {}; + \node[above] at (12.north) {$I(a)$}; + \node[roundnode] (13) [right=of 12] {}; + \node[above] at (13.north) {$r/(0,1)$}; + \node[roundnode] (14) [right=35pt of 13] {}; + \node[above] at (14.north) {$r/(1,2)^\omega$}; + + \draw[arrow] (11) -- (12); + \draw[arrow] (12) -- (13); + \draw[arrow] (13) -- (14); + + \node[roundnode] (21) [below=10pt of 11] {}; + \node[left] at (21.west) {$p_1$}; + \node[below] at (21.south) {$w(2)$}; + \node[roundnode] (22) [right=of 21] {}; + \node[below] at (22.south) {$R/\emptyset$}; + \node[roundnode] (23) [right=of 22] {}; + \node[below] at (23.south) {$r/(0,2)$}; + \node[roundnode] (24) [right=35pt of 23] {}; + \node[below] at (24.south) {$r/(1,2)^\omega$}; + + \draw[arrow] (21) -- (22); + \draw[arrow] (22) -- (23); + \draw[arrow] (23) -- (24); + + \draw (24) -- (14); + + \draw[dashed] ($(14)!0.5!(13) + (0,1)$) -- ++(0, -2.9); + \end{tikzpicture} +} \ No newline at end of file diff --git a/docs/presentations/LIS/Anglais_avril_2024/schemas/convergence_hc_2.tex b/docs/presentations/LIS/Anglais_avril_2024/schemas/convergence_hc_2.tex new file mode 100755 index 0000000..bd97baa --- /dev/null +++ b/docs/presentations/LIS/Anglais_avril_2024/schemas/convergence_hc_2.tex @@ -0,0 +1,41 @@ +\resizebox{\columnwidth}{!}{ + \begin{tikzpicture}[ + roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,}, + ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,}, + arrow/.style={|->, thick,}, + message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}}, + ] + + \node[roundnode] (11) {}; + \node[left] at (11.west) {$p_0$}; + \node[above] at (11.north) {$w(1)$}; + \node[roundnode] (12) [right=of 11] {}; + \node[above] at (12.north) {$I(a)$}; + \node[roundnode] (13) [right=of 12] {}; + \node[above] at (13.north) {$r/(0,1)$}; + \node[roundnode] (14) [right=35pt of 13] {}; + \node[above] at (14.north) {$r/(1,2)^\omega$}; + + \draw[arrow] (11) -- (12); + \draw[arrow] (12) -- (13); + \draw[arrow] (13) -- (14); + + \node[roundnode] (21) [below=10pt of 11] {}; + \node[left] at (21.west) {$p_1$}; + \node[below] at (21.south) {$w(2)$}; + \node[roundnode] (22) [right=of 21] {}; + \node[below] at (22.south) {$R/\emptyset$}; + \node[roundnode] (23) [right=of 22] {}; + \node[below] at (23.south) {$r/(0,2)$}; + \node[roundnode] (24) [right=35pt of 23] {}; + \node[below] at (24.south) {$r/(2,1)^\omega$}; + + \draw[arrow] (21) -- (22); + \draw[arrow] (22) -- (23); + \draw[arrow] (23) -- (24); + + \draw (24) -- (14); + + \draw[dashed] ($(14)!0.5!(13) + (0,1)$) -- ++(0, -2.9); + \end{tikzpicture} +} \ No newline at end of file diff --git a/docs/presentations/LIS/Anglais_avril_2024/schemas/linearisation_atomicite_hc.tex b/docs/presentations/LIS/Anglais_avril_2024/schemas/linearisation_atomicite_hc.tex new file mode 100755 index 0000000..72e4f57 --- /dev/null +++ b/docs/presentations/LIS/Anglais_avril_2024/schemas/linearisation_atomicite_hc.tex @@ -0,0 +1,26 @@ +\resizebox{\columnwidth}{!}{% + \begin{tikzpicture}[ + roundedrectangle/.style={draw, rounded corners, rectangle, minimum height=10pt, minimum width=20pt}, + invisible/.style={draw=none, fill=none}, + ] + + \node[invisible] (10) {}; + \node[roundedrectangle, minimum width=150pt] (11) [right=100pt of 10] {$w_x(1)$}; + \node[invisible] (12) [right=100pt of 11] {}; + + \node[invisible] (20) [below=15pt of 10] {}; + \node[roundedrectangle, minimum width=50pt] (21) [right=25pt of 20] {\textcolor{blue}{$r/(0)$}}; + \node[roundedrectangle, minimum width=50pt] (22) [right=75pt of 21] {\textcolor{blue}{$r/(0)$}}; + \node[roundedrectangle, minimum width=50pt] (23) [right=75pt of 22] {\textcolor{red}{$r/(1)$}}; + \node[invisible] (24) [below=15pt of 12] {}; + + \node[invisible] (30) [below=15pt of 20] {}; + \node[roundedrectangle, minimum width=50pt] (31) [right=125pt of 30] {\textcolor{red}{$r/(1)$}}; + \node[roundedrectangle, minimum width=50pt] (32) [right=40pt of 31] {\textcolor{red}{$r/(1)$}}; + \node[invisible] (33) [below=15pt of 24] {}; + + \draw (10) -- (11) -- (12); + \draw (20) -- (21) -- (22) -- (23) -- (24); + \draw (30) -- (31) -- (32) -- (33); + \end{tikzpicture} +} \ No newline at end of file diff --git a/docs/presentations/LIS/Anglais_avril_2024/schemas/linearisation_regularite_hc.tex b/docs/presentations/LIS/Anglais_avril_2024/schemas/linearisation_regularite_hc.tex new file mode 100755 index 0000000..281227c --- /dev/null +++ b/docs/presentations/LIS/Anglais_avril_2024/schemas/linearisation_regularite_hc.tex @@ -0,0 +1,26 @@ +\resizebox{\columnwidth}{!}{% + \begin{tikzpicture}[ + roundedrectangle/.style={draw, rounded corners, rectangle, minimum height=10pt, minimum width=20pt}, + invisible/.style={draw=none, fill=none}, + ] + + \node[invisible] (10) {}; + \node[roundedrectangle, minimum width=150pt] (11) [right=100pt of 10] {$w_x(1)$}; + \node[invisible] (12) [right=100pt of 11] {}; + + \node[invisible] (20) [below=15pt of 10] {}; + \node[roundedrectangle, minimum width=50pt] (21) [right=25pt of 20] {\textcolor{blue}{$r/(0)$}}; + \node[roundedrectangle, minimum width=50pt] (22) [right=75pt of 21] {\textcolor{blue}{$r/(0)$}}; + \node[roundedrectangle, minimum width=50pt] (23) [right=75pt of 22] {\textcolor{red}{$r/(1)$}}; + \node[invisible] (24) [below=15pt of 12] {}; + + \node[invisible] (30) [below=15pt of 20] {}; + \node[roundedrectangle, minimum width=50pt] (31) [right=125pt of 30] {\textcolor{red}{$r/(1)$}}; + \node[roundedrectangle, minimum width=50pt] (32) [right=40pt of 31] {\textcolor{blue}{$r/(0)$}}; + \node[invisible] (33) [below=15pt of 24] {}; + + \draw (10) -- (11) -- (12); + \draw (20) -- (21) -- (22) -- (23) -- (24); + \draw (30) -- (31) -- (32) -- (33); + \end{tikzpicture} +} \ No newline at end of file diff --git a/docs/presentations/LIS/Anglais_avril_2024/schemas/linearisation_surete_hc.tex b/docs/presentations/LIS/Anglais_avril_2024/schemas/linearisation_surete_hc.tex new file mode 100755 index 0000000..fde5f3a --- /dev/null +++ b/docs/presentations/LIS/Anglais_avril_2024/schemas/linearisation_surete_hc.tex @@ -0,0 +1,26 @@ +\resizebox{\columnwidth}{!}{% + \begin{tikzpicture}[ + roundedrectangle/.style={draw, rounded corners, rectangle, minimum height=10pt, minimum width=20pt}, + invisible/.style={draw=none, fill=none}, + ] + + \node[invisible] (10) {}; + \node[roundedrectangle, minimum width=150pt] (11) [right=100pt of 10] {$w_x(1)$}; + \node[invisible] (12) [right=100pt of 11] {}; + + \node[invisible] (20) [below=15pt of 10] {}; + \node[roundedrectangle, minimum width=50pt] (21) [right=25pt of 20] {\textcolor{blue}{$r/(0)$}}; + \node[roundedrectangle, minimum width=50pt] (22) [right=75pt of 21] {\textcolor{blue}{$r/(0)$}}; + \node[roundedrectangle, minimum width=50pt] (23) [right=75pt of 22] {\textcolor{red}{$r/(1)$}}; + \node[invisible] (24) [below=15pt of 12] {}; + + \node[invisible] (30) [below=15pt of 20] {}; + \node[roundedrectangle, minimum width=50pt] (31) [right=125pt of 30] {\textcolor{red!50!blue}{$r/(27)$}}; + \node[roundedrectangle, minimum width=50pt] (32) [right=40pt of 31] {\textcolor{red}{$r/(1)$}}; + \node[invisible] (33) [below=15pt of 24] {}; + + \draw (10) -- (11) -- (12); + \draw (20) -- (21) -- (22) -- (23) -- (24); + \draw (30) -- (31) -- (32) -- (33); + \end{tikzpicture} +} \ No newline at end of file diff --git a/docs/presentations/LIS/Anglais_avril_2024/schemas/localiteetat_hc_1.tex b/docs/presentations/LIS/Anglais_avril_2024/schemas/localiteetat_hc_1.tex new file mode 100755 index 0000000..f61f58c --- /dev/null +++ b/docs/presentations/LIS/Anglais_avril_2024/schemas/localiteetat_hc_1.tex @@ -0,0 +1,34 @@ +\resizebox{\columnwidth}{!}{% + \begin{tikzpicture}[ + roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,}, + ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,}, + arrow/.style={|->, thick,}, + message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}}, + ] + + \node[roundnode, draw=red, fill=red] (11) {}; + \node[left] at (11.west) {$p_0$}; + \node[above] at (11.north) {$w(1)$}; + \node[roundnode, draw=blue, fill=blue] (12) [right=of 11] {}; + \node[above] at (12.north) {$r/(0,0)$}; + \node[roundnode, draw=blue, fill=blue] (13) [right=of 12] {}; + \node[above] at (13.north) {$r/(0,2)^\omega$}; + + \draw[arrow] (11) -- (12); + \draw[arrow] (12) -- (13); + + \node[roundnode, draw=blue, fill=blue] (21) [below=10pt of 11] {}; + \node[left] at (21.west) {$p_1$}; + \node[below] at (21.south) {$w(2)$}; + \node[roundnode, draw=red, fill=red] (22) [right=of 21] {}; + \node[below] at (22.south) {$r/(0,0)$}; + \node[roundnode, draw=red, fill=red] (23) [right=of 22] {}; + \node[below] at (23.south) {$r/(0,1)^\omega$}; + + \draw[arrow] (21) -- (22); + \draw[arrow] (22) -- (23); + + \draw[message] (11) -- ($(22)!0.5!(23)$); + \draw[message] (21) -- ($(12)!0.5!(13)$); + \end{tikzpicture} +} \ No newline at end of file diff --git a/docs/presentations/LIS/Anglais_avril_2024/schemas/localiteetat_hc_2.tex b/docs/presentations/LIS/Anglais_avril_2024/schemas/localiteetat_hc_2.tex new file mode 100755 index 0000000..3998248 --- /dev/null +++ b/docs/presentations/LIS/Anglais_avril_2024/schemas/localiteetat_hc_2.tex @@ -0,0 +1,32 @@ +\resizebox{\columnwidth}{!}{% + \begin{tikzpicture}[ + roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,}, + ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,}, + arrow/.style={|->, thick,}, + message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}}, + ] + + \node[roundnode] (11) {}; + \node[left] at (11.west) {$p_0$}; + \node[above] at (11.north) {$w(1)$}; + \node[roundnode] (12) [right=of 11] {}; + \node[above] at (12.north) {$r/(0,0)$}; + \node[roundnode] (13) [right=of 12] {}; + \node[above] at (13.north) {$r/(0,2)^\omega$}; + + \draw[arrow] (11) -- (12); + \draw[arrow] (12) -- (13); + + \node[roundnode] (21) [below=10pt of 11] {}; + \node[left] at (21.west) {$p_1$}; + \node[below] at (21.south) {$w(2)$}; + \node[roundnode] (22) [right=of 21] {}; + \node[below] at (22.south) {$r/(0,1)$}; + \node[roundnode] (23) [right=of 22] {}; + \node[below] at (23.south) {$r/(2,1)^\omega$}; + + \draw[arrow] (21) -- (22); + \draw[arrow] (22) -- (23); + + \end{tikzpicture} +} \ No newline at end of file diff --git a/docs/presentations/LIS/Anglais_avril_2024/schemas/validite_hc_1.tex b/docs/presentations/LIS/Anglais_avril_2024/schemas/validite_hc_1.tex new file mode 100755 index 0000000..1875a6b --- /dev/null +++ b/docs/presentations/LIS/Anglais_avril_2024/schemas/validite_hc_1.tex @@ -0,0 +1,31 @@ +\resizebox{\columnwidth}{!}{% + \begin{tikzpicture}[ + roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,}, + ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,}, + arrow/.style={|->, thick,}, + message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}}, + ] + + \node[roundnode] (11) {}; + \node[left] at (11.west) {$p_0$}; + \node[above] at (11.north) {$w(1)$}; + \node[roundnode] (12) [right=of 11] {}; + \node[above] at (12.north) {$r/(0,1)$}; + \node[roundnode] (13) [right=of 12] {}; + \node[above] at (13.north) {$r/(2,1)^\omega$}; + + \draw[arrow] (11) -- (12); + \draw[arrow] (12) -- (13); + + \node[roundnode] (21) [below=10pt of 11] {}; + \node[left] at (21.west) {$p_1$}; + \node[below] at (21.south) {$w(2)$}; + \node[roundnode] (22) [right=of 21] {}; + \node[below] at (22.south) {$r/(0,2)$}; + \node[roundnode] (23) [right=of 22] {}; + \node[below] at (23.south) {$r/(1,2)^\omega$}; + + \draw[arrow] (21) -- (22); + \draw[arrow] (22) -- (23); + \end{tikzpicture} +} \ No newline at end of file diff --git a/docs/presentations/LIS/Anglais_avril_2024/schemas/validite_hc_2.tex b/docs/presentations/LIS/Anglais_avril_2024/schemas/validite_hc_2.tex new file mode 100755 index 0000000..4aaec99 --- /dev/null +++ b/docs/presentations/LIS/Anglais_avril_2024/schemas/validite_hc_2.tex @@ -0,0 +1,31 @@ +\resizebox{\columnwidth}{!}{% + \begin{tikzpicture}[ + roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,}, + ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,}, + arrow/.style={|->, thick,}, + message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}}, + ] + + \node[roundnode] (11) {}; + \node[left] at (11.west) {$p_0$}; + \node[above] at (11.north) {$w(1)$}; + \node[roundnode] (12) [right=of 11] {}; + \node[above] at (12.north) {$r/(0,1)$}; + \node[roundnode] (13) [right=of 12] {}; + \node[above] at (13.north) {$r/(0,1)^\omega$}; + + \draw[arrow] (11) -- (12); + \draw[arrow] (12) -- (13); + + \node[roundnode] (21) [below=10ptof 11] {}; + \node[left] at (21.west) {$p_1$}; + \node[below] at (21.south) {$w(2)$}; + \node[roundnode] (22) [right=of 21] {}; + \node[below] at (22.south) {$r/(0,2)$}; + \node[roundnode] (23) [right=of 22] {}; + \node[below] at (23.south) {$r/(1,2)^\omega$}; + + \draw[arrow] (21) -- (22); + \draw[arrow] (22) -- (23); + \end{tikzpicture} +} \ No newline at end of file diff --git a/docs/presentations/LIS/Anglais_avril_2024/schemas/wcc_hc_1.tex b/docs/presentations/LIS/Anglais_avril_2024/schemas/wcc_hc_1.tex new file mode 100755 index 0000000..839acb3 --- /dev/null +++ b/docs/presentations/LIS/Anglais_avril_2024/schemas/wcc_hc_1.tex @@ -0,0 +1,42 @@ +\resizebox{\columnwidth}{!}{% + \begin{tikzpicture}[ + roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,}, + ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,}, + arrow/.style={|->, thick,}, + message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}}, + ] + + \node[roundnode, color=red] (11) {}; + \node[above] at (11.north) {$w(1)$}; + \node[roundnode, color=red!50] (12) [right=of 11] {}; + \node[above] at (12.north) {$r/(0,1)$}; + \node[roundnode, color=red!25] (13) [right=of 12] {}; + \node[above] at (13.north) {$r/(3,2)^\omega$}; + + \draw[arrow] (11) -- (12); + \draw[arrow] (12) -- (13); + + \node[roundnode, color=green!75!black] (21) [below=20pt of 11] {}; + \node[left] at (21.west) {$r/(3,1)$}; + \node[roundnode, color=green!95!black] (22) [right=of 21] {}; + \node[right] at (22.east) {$w(2)$}; + + \draw[arrow] (21) -- (22); + + \node[roundnode, color=blue] (31) [below=20pt of 21] {}; + \node[below] at (31.south) {$w(3)$}; + \node[roundnode, color=blue!50] (32) [right=of 31] {}; + \node[below] at (32.south) {$r/(3,1)$}; + \node[roundnode, color=blue!25] (33) [right=of 32] {}; + \node[below] at (33.south) {$r/(3,2)^\omega$}; + + \draw[arrow] (31) -- (32); + \draw[arrow] (32) -- (33); + + \draw[message] (11) -- (21); + \draw[message] (31) -- (21); + \draw[message] (21) -- (32); + \draw[message] (22) -- (13); + \draw[message] (22) -- (33); + \end{tikzpicture} +} \ No newline at end of file diff --git a/docs/presentations/LIS/Anglais_avril_2024/schemas/wcc_hc_2.tex b/docs/presentations/LIS/Anglais_avril_2024/schemas/wcc_hc_2.tex new file mode 100755 index 0000000..1651ec2 --- /dev/null +++ b/docs/presentations/LIS/Anglais_avril_2024/schemas/wcc_hc_2.tex @@ -0,0 +1,29 @@ +\resizebox{\columnwidth}{!}{% + \begin{tikzpicture}[ + roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,}, + ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,}, + arrow/.style={|->, thick,}, + message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}}, + ] + + \node[roundnode] (11) {}; + \node[above] at (11.north) {$w(1)$}; + \node[roundnode] (12) [right=of 11] {}; + \node[above] at (12.north) {$r/(2,1)$}; + \node[roundnode] (13) [right=of 12] {}; + \node[above] at (13.north) {$r/(2,1)^\omega$}; + + \draw[arrow] (11) -- (12); + \draw[arrow] (12) -- (13); + + \node[roundnode] (21) [below=20pt of 11] {}; + \node[left] at (21.west) {$r/(0,1)$}; + \node[roundnode] (22) [right=of 21] {}; + \node[right] at (22.east) {$w(2)$}; + + \draw[arrow] (21) -- (22); + + \draw[message] (11) -- (21); + \draw[message] (22) -- (12); + \end{tikzpicture} +} \ No newline at end of file diff --git a/docs/presentations/LIS/Anglais_avril_2024/schemas/wcc_hc_3.tex b/docs/presentations/LIS/Anglais_avril_2024/schemas/wcc_hc_3.tex new file mode 100755 index 0000000..6b109f9 --- /dev/null +++ b/docs/presentations/LIS/Anglais_avril_2024/schemas/wcc_hc_3.tex @@ -0,0 +1,41 @@ +\resizebox{\columnwidth}{!}{% + \begin{tikzpicture}[ + roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,}, + ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,}, + arrow/.style={|->, thick,}, + message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}}, + ] + + \node[roundnode, color=red] (11) {}; + \node[above] at (11.north) {$w(1)$}; + \node[roundnode, color=red!50] (12) [right=of 11] {}; + \node[above] at (12.north) {$r/(3,1)$}; + \node[roundnode, color=red!25] (13) [right=of 12] {}; + \node[above] at (13.north) {$r/(1,2)^\omega$}; + + \draw[arrow] (11) -- (12); + \draw[arrow] (12) -- (13); + + \node[roundnode, color=green!75!black] (21) [below=20pt of 11] {}; + \node[left] at (21.west) {$r/(0,0)$}; + \node[roundnode, color=green!95!black] (22) [right=of 21] {}; + \node[right] at (22.east) {$w(2)$}; + + \draw[arrow] (21) -- (22); + + \node[roundnode, color=blue] (31) [below=20pt of 21] {}; + \node[below] at (31.south) {$w(3)$}; + \node[roundnode, color=blue!50] (32) [right=of 31] {}; + \node[below] at (32.south) {$r/(1,3)$}; + \node[roundnode, color=blue!25] (33) [right=of 32] {}; + \node[below] at (33.south) {$r/(3,2)^\omega$}; + + \draw[arrow] (31) -- (32); + \draw[arrow] (32) -- (33); + + \draw[message] (11) -- (31); + \draw[message] (31) -- (12); + \draw[message] (22) -- (13); + \draw[message] (22) -- (33); + \end{tikzpicture} +} \ No newline at end of file diff --git a/docs/presentations/LIS/DALGO_6_juillet_2023/main.tex b/docs/presentations/LIS/DALGO_6_juillet_2023/main.tex index e8df458..ac6bf9d 100755 --- a/docs/presentations/LIS/DALGO_6_juillet_2023/main.tex +++ b/docs/presentations/LIS/DALGO_6_juillet_2023/main.tex @@ -27,7 +27,7 @@ \usetikzlibrary{positioning} \usetikzlibrary{calc} \usetikzlibrary{arrows.meta} - +& \usepackage{tcolorbox} \title[bwconsistency]{Étude de la cohérence dans les systèmes distribués} diff --git a/docs/rapport/CRDT/intro/index.tex b/docs/rapport/CRDT/intro/index.tex new file mode 100644 index 0000000..47a9e9d --- /dev/null +++ b/docs/rapport/CRDT/intro/index.tex @@ -0,0 +1,45 @@ +Les CRDT sont des types de données qui supportent de manière intrinsèque les critères de convergence (\textit{Strong Eventual Consistency}) et de cohérence pipeline (qui est un compromis entre la validité et la localité d’état). + +Pour y parvenir, un type de donnée dit CRDT doit proposer une bibliothèque d’opérations commutatives entre elles. Ainsi, pour deux suites d’opérations $S$ et $S'$, soit $L$ l’ensemble contenant tous les termes de $S$ et $L'$ l’ensemble contenant tous les termes de $S'$. Si $L$ et $L'$ sont indiscernables, alors le résultat de $S$ et $S'$ l’est aussi. \cite{defago_conflict-free_2011} + +Ces types de données présentent un très grand intérêt pour le problème de l’édition collaborative. \cite{preguica_commutative_2009, noauthor_yjsyjs_2023} En effet, elles permettent de mettre en place des approches qui sont dites "local-first". C’est-à-dire de proposer une architecture où les modifications sont dans un premier temps appliquées localement au client, pour ensuite être à termes fusionnés, sans avoir à gérer d’hypothétiques conflits (puisque le type de donnée ne le permet pas). + +\subsection{Présentation des familles de CRDT} + +Un type de donnée est dit CRDT s'il respecte les propriétés de commutativité et d’idempotence. Nous allons aborder deux grandes implémentations de CRDT : l'implémentation sous forme d'arbres binaires et celle sous forme de graphe orienté acyclique (DAG). + +L'approche en DAG \cite{jacob_analysis_2021,almeida_blocklace_2024,kleppmann_making_2022} consiste à représenter les états via les noeuds du graphe et les opérations via les arcs. Il y a donc un état initial commun à l'ensemble des membres du système du quel part entre $1$ et $n$ opérations, chaque opération donnant sur un état. Avec $n$ étant le nombre d'acteur du système. Le prérequis de la modélisation en DAG est la présence d'un ordre total entre deux opérations émise par le même acteur, et le respect de cet ordre dans l'ordre de réception de tous les acteurs. Ne pas respecter cet ordre constituerait une violation du protocole et est appelé dans la littérature "une équivocation". + +L'approche en arbre binaire \cite{weiss_logoot-undo_2012,nicolaescu_near_2016} ne se concentre pas sur l'ordre d'émission des opérations, mais sur l'ordre applicatif des opérations. Les noeuds de l'arbre deviennent donc des identifiants d'opérations, et la position d'un noeud dans l'arbre permet de déterminer son ordre d'application par rapport aux autres. L'approche en arbre apporte donc une notion d'identifiant unique possédant la propriété d'être comparables les uns aux autres, et pouvant toujours proposer une valeur entre deux bornes quelconques. Néanmoins ici l'information d'ordre partiel des opérations est perdue. + +La deuxième approche est issue d'une tentative de résolution du problème de l'édition collaborative via des CRDT. Et c'est une solution qui permet de rendre des notions non commutatives (comme l'intention de l'utilisateur dans une opération d'insertion) commutatives. + +\subsection{Différences de complexité} + +\subsubsection{Résolution de conflits} + +Les conflits n'existent pas sur les approches en DAG. En effet, les opérations sont toujours commutatives entre elles. Néanmoins pour considérer la perte de message, certaines implémentations utilisent une approche "d'arbre de hachage" pour garantir l'intégrité du DAG. Et c'est dans la gestion de cet arbre de hachage que des conflits peuvent apparaître. Ainsi au moment où N noeuds sont fusionnés par un acteur, le noeud issue de cette fusion aura pour signature une concaténation des signatures des noeuds fusionnés. Or le choix de l'ordre de fusion des noeuds et arbitraire. L'acteur ayant créé le noeud de fusion va donc réaliser un choix d'ordre de concaténation arbitraire. Et les autres acteurs devront vérifier toutes les combinaisons des noeuds "feuilles" possibles pour vérifier le choix de l'acteur initial. Ce qui fait de cette opération une opération en $O(n!)$ où $n$ est le nombre de noeuds feuilles. + +Pour ce qui est des implémentations en arbre binaire, même sans considérer le problème de perte de message, il est possible de rencontrer des conflits. Si deux acteurs insèrent un noeud à la même position, alors il y a conflit. Ces implémentations utilisent le même mécanisme pour résoudre ce problème qui est l'usage d'un identifiant d'acteur. Chaque acteur est donc identifié par un identifiant unique, comparable avec les autres. Et cet identifiant est utilisé pour déterminer l'ordre entre les opérations en conflits. Puisque un acteur ne peut pas produire deux opérations en même temps (si nous considérons tous les acteurs honnêtes), il n'y a pas de conflit insolvable. Cela vient rajouter une nouvelle contrainte sur notre modèle qui est la nécessité d'avoir un identifiant attribué à chaque acteur. Mais cela permet de résoudre le problème de conflit en temps constant $O(1)$. + +\subsection{Tolérence aux byzantins} + +\subsubsection{Equivocation} + +Une forme de comportement byzantin possible avec l'usage des CRDT est l'équivocation. Elle consiste en une violation de la propriété obligeant chaque acteur à soumettre ses opérations dans un ordre total (les unes après les autres) et de faire en sorte que cet ordre soit identique pour l'ensemble des autres acteurs du réseau. + +Ici nous considérons le scénario de la double dépense lorsque nous parlerons d'équivocation. Un acteur émet deux opérations en même temps, et les envoie à deux ensemble d'acteurs distincts. Si le protocole ne propose pas de mécanisme de gossiping alors l'équivocation peut ne jamais être détectée et donc casser la propriété de convergence inhérente aux CRDT. + +Dans le cas où un mécanisme de gossiping est mis en place, alors l'équivocation peut être détectée. Dans ce cas le système doit préserver l'intégralité des équivocations, puisque les CRDTs ne permettent pas la suppression d'opérations (la propriété "grow only"). + +A savoir qu'il existe implémentation des CRDT permettant de préserver au plus une opération équivoqué. Mais ce comportement est possible puisque l'implémentation en question se place dans un modèle synchrone, et permet au système d'ignorer des opérations (ce qui serait impossible dans un modèle asynchrone). + +Une autre solution pour mitiger (mais pas résoudre) le problème de l'équivocation est de mettre en place un système de contrôle de l'intégrité du graphe. Cela revient en réalité à avoir un système de gossiping embarqué dans l'action d'émission de l'opération. Ainsi quand un acteur veut soumettre son opération, il y attache une information sur l'état du graphe (par exemple un hash de l'ensemble des noeuds) ce qui permet aux acteurs recevant l'opération de vérifier si l'état du graphe de l'émetteur est le même que le leur. Si ce n'est pas le cas alors cela signifie qu'ils n'ont pas reçu le même ensemble d'opérations, il est alors possible pour les acteurs de détecter les noeuds manquants par des techniques de comparaison de graphe. L'avantage de cette méthode est qu'elle ne nécessite pas l'augmentation du nombre de message échangé comme le ferait un système de gossiping. Néanmoins elle ne permet pas d'assurer la détection de l'équivocation. En effet, si l'équivocation est sur la dernière opération soumise dans le système alors il n'y aura aucun moyen de la détecter et les graphes resteront divergents. + +Il est bon de noter que la détection (puis la résolution) de l'équivocation semble n'être possible que sur les implémentations en DAG. En effet, si il y a équivocation sur une opération dans un arbre binaire, on ne peut pas garder l'ensemble des opérations équivoqué. Cela casserait le caractère convergent de l'arbre puisque dans ce cas il serait possible d'avoir deux opérations avec le même emplacement dans l'arbre, et le même identifiant d'acteur. Il ne serait donc plus possible de choisir de manière déterministe l'ordre d'application des opérations. Une solution serait une approche synchrone comme il est possible de le faire dans un DAG et qui permettrait de préserver au plus une opération. Mais aucune implémentation n'a été proposée dans ce sens, et cela semble être compliqué d'appliquer cette solution sans la notion d'ordre partiel (que ne permet pas l'approche en arbre). + +\section{Extension des CRDTs} + +Les CRDTs, de par leur aspect commutatif, ne peuvent pas définir de notion d'état interdit. Tout état possible du système doit être atteignable. Ceci limite grandement les possibilités applicatives de ce type de donnée. En effet, prenons comme exemple un problème applicatif d'échange de jetons. Chaque acteur possède une quantité de jetons. Alors une propriété de ce système serait que les états possibles soient seulement ceux où l'intégralité des acteurs possèdent une quantité de jetons positive. Or un acteur peut très bien dépenser plus de jetons qu'il n'en possédait au départ si il en a reçu entre-temps. Mais cette suite d'opération ne serait pas commutative puisque suivant l'ordre d'application des opérations on pourrait avoir un acteur avec un solde négatif. + +Ce problème peut être réglé à travers l'ajout d'une surcouche aux CRDTs, nommé PCDO (Process-Commutative Distributed Objects). \cite{frey_process-commutative_2023} Cette surcouche vient en réalité créer de l'intéraction entre un ensemble d'opérations commutatives et des ensembles d'opérations non commutatives. L'ensemble d'opération commutatives est alors un ensemble d'opérations utilisable par l'intégralité des acteurs quand ils le souhaitent. Leur application ne permet pas de faire entrer le système dans un état illégal. Chaque acteur possède ensuite ses propres opérations qui, elles, ne sont pas commutatives entre elles, et qu'il est le seul à pouvoir invoquer. Si il n'y a pas d'équivocation alors ces opérations non commutatives sont ordonnées suivant un ordre total (puisque qu'un acteur ne peut pas émettre deux opérations en même temps). Ainsi il est facile pour l'ensemble du système de se rendre compte lorsqu'un utilisateur essaie d'entrer dans un état illégal et donc de ne pas considérer les opérations associées. diff --git a/docs/rapport/CRDT/main.tex b/docs/rapport/CRDT/main.tex new file mode 100644 index 0000000..12c60ae --- /dev/null +++ b/docs/rapport/CRDT/main.tex @@ -0,0 +1,34 @@ +\documentclass{article} + +\usepackage[T1]{fontenc} +\usepackage[utf8]{inputenc} +\usepackage{csquotes} +\usepackage[french]{babel} +\usepackage[affil-it]{authblk} +\usepackage{fullpage} + +\usepackage{biblatex} + +\addbibresource{sources.bib} + +\begin{document} + +\title{??? Conflict Free Replicated Data Types ???} +\author{JOLY Amaury \\ \textbf{Encadrants :} GODARD Emmanuel, TRAVERS Corentin} +\affil{Aix-Marseille Université, Scille} +\date{\today} + +\begin{titlepage} + \maketitle +\end{titlepage} + + +\section{Introduction} + +\subsection{Définition d'un CRDT} +\input{intro/index.tex} + +\printbibliography + + +\end{document} \ No newline at end of file diff --git a/docs/rapport/CRDT/sources.bib b/docs/rapport/CRDT/sources.bib new file mode 100644 index 0000000..720d15c --- /dev/null +++ b/docs/rapport/CRDT/sources.bib @@ -0,0 +1,549 @@ + +@misc{weiss_logoot-undo_2012, + title = {Logoot-{Undo} {Distributed} {Collaborative} {Editing} {System}}, + author = {Weiss, Stéphane and Urso, Pascal and Molli, Pascal}, + month = dec, + year = {2012}, + file = {Full Text PDF:C\:\\Users\\Amaury\\Zotero\\storage\\PYGQL936\\Weiss et al. - 2012 - Logoot-Undo Distributed Collaborative Editing Syst.pdf:application/pdf}, +} + +@misc{almeida_blocklace_2024, + title = {The {Blocklace}: {A} {Universal}, {Byzantine} {Fault}-{Tolerant}, {Conflict}-free {Replicated} {Data} {Type}}, + shorttitle = {The {Blocklace}}, + url = {http://arxiv.org/abs/2402.08068}, + doi = {10.48550/arXiv.2402.08068}, + abstract = {Conflict-free Replicated Data Types (CRDTs) are designed for replica convergence without global coordination or consensus. Recent work has achieves the same in a Byzantine environment, through DAG-like structures based on cryptographic hashes of content. The blocklace is a partially-ordered generalization of the blockchain in which each block has any finite number of signed hash pointers to preceding blocks. We show that the blocklace datatype, with the sole operation of adding a single block, is a CRDT: it is both a pure operation-based CRDT, with self-tagging; and a delta-state CRDT, under a slight generalization of the delta framework. Allowing arbitrary values as payload, the blocklace can also be seen as a universal Byzantine fault-tolerant implementation for arbitrary CRDTs, under the operation-based approach. Current approaches only care about CRDT convergence, being equivocation-tolerant (they do not detect or prevent equivocations), allowing a Byzantine node to cause an arbitrary amount of harm by polluting the CRDT state with an infinite number of equivocations. We show that a blocklace can be used not only in an equivocation-tolerant way, but also so as to detect and eventually exclude Byzantine behavior, namely equivocations, even under the presence of collusion. The blocklace CRDT protocol ensures that the Byzantine nodes may harm only a finite prefix of the computation.}, + urldate = {2024-04-12}, + publisher = {arXiv}, + author = {Almeida, Paulo Sérgio and Shapiro, Ehud}, + month = feb, + year = {2024}, + note = {arXiv:2402.08068 [cs]}, + keywords = {Computer Science - Data Structures and Algorithms, Computer Science - Distributed, Parallel, and Cluster Computing}, + file = {arXiv Fulltext PDF:C\:\\Users\\Amaury\\Zotero\\storage\\S73ZWXGL\\Almeida et Shapiro - 2024 - The Blocklace A Universal, Byzantine Fault-Tolera.pdf:application/pdf;arXiv.org Snapshot:C\:\\Users\\Amaury\\Zotero\\storage\\J8X5IYE4\\2402.html:text/html}, +} + + +@article{mosberger_memory_1993, + title = {Memory consistency models}, + volume = {27}, + issn = {0163-5980}, + url = {https://dl.acm.org/doi/10.1145/160551.160553}, + doi = {10.1145/160551.160553}, + abstract = {This paper discusses memory consistency models and their influence on software in the context of parallel machines. In the first part we review previous work on memory consistency models. The second part discusses the issues that arise due to weakening memory consistency. We are especially interested in the influence that weakened consistency models have on language, compiler, and runtime system design. We conclude that tighter interaction between those parts and the memory system might improve performance considerably.}, + language = {en}, + number = {1}, + urldate = {2023-06-06}, + journal = {ACM SIGOPS Operating Systems Review}, + author = {Mosberger, David}, + month = jan, + year = {1993}, + pages = {18--26}, + file = {Mosberger - 1993 - Memory consistency models.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\VF2ZNK6A\\Mosberger - 1993 - Memory consistency models.pdf:application/pdf}, +} + +@incollection{goos_causal_1995, + address = {Berlin, Heidelberg}, + title = {From causal consistency to sequential consistency in shared memory systems}, + volume = {1026}, + isbn = {978-3-540-60692-5 978-3-540-49263-4}, + url = {http://link.springer.com/10.1007/3-540-60692-0_48}, + language = {en}, + urldate = {2023-06-06}, + booktitle = {Foundations of {Software} {Technology} and {Theoretical} {Computer} {Science}}, + publisher = {Springer Berlin Heidelberg}, + author = {Raynal, Michel and Schiper, André}, + editor = {Goos, Gerhard and Hartmanis, Juris and Leeuwen, Jan and Thiagarajan, P. S.}, + year = {1995}, + doi = {10.1007/3-540-60692-0_48}, + note = {Series Title: Lecture Notes in Computer Science}, + pages = {180--194}, + file = {Raynal et Schiper - 1995 - From causal consistency to sequential consistency .pdf:C\:\\Users\\Amaury\\Zotero\\storage\\B8UNWUSA\\Raynal et Schiper - 1995 - From causal consistency to sequential consistency .pdf:application/pdf}, +} + +@phdthesis{kumar_fault-tolerant_2019, + type = {{PhD} {Thesis}}, + title = {Fault-{Tolerant} {Distributed} {Services} in {Message}-{Passing} {Systems}}, + school = {Texas A\&M University}, + author = {Kumar, Saptaparni}, + year = {2019}, + file = {Kumar - 2019 - Fault-Tolerant Distributed Services in Message-Pas.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\Q9XK77W9\\Kumar - 2019 - Fault-Tolerant Distributed Services in Message-Pas.pdf:application/pdf;Snapshot:C\:\\Users\\Amaury\\Zotero\\storage\\7JB26RAJ\\1.html:text/html}, +} + +@article{somasekaram_high-availability_2022, + title = {High-{Availability} {Clusters}: {A} {Taxonomy}, {Survey}, and {Future} {Directions}}, + volume = {187}, + issn = {01641212}, + shorttitle = {High-{Availability} {Clusters}}, + url = {http://arxiv.org/abs/2109.15139}, + doi = {10.1016/j.jss.2021.111208}, + abstract = {The delivery of key services in domains ranging from finance and manufacturing to healthcare and transportation is underpinned by a rapidly growing number of mission-critical enterprise applications. Ensuring the continuity of these complex applications requires the use of software-managed infrastructures called high-availability clusters (HACs). HACs employ sophisticated techniques to monitor the health of key enterprise application layers and of the resources they use, and to seamlessly restart or relocate application components after failures. In this paper, we first describe the manifold uses of HACs to protect essential layers of a critical application and present the architecture of high availability clusters. We then propose a taxonomy that covers all key aspects of HACs -- deployment patterns, application areas, types of cluster, topology, cluster management, failure detection and recovery, consistency and integrity, and data synchronisation; and we use this taxonomy to provide a comprehensive survey of the end-to-end software solutions available for the HAC deployment of enterprise applications. Finally, we discuss the limitations and challenges of existing HAC solutions, and we identify opportunities for future research in the area.}, + urldate = {2023-06-06}, + journal = {Journal of Systems and Software}, + author = {Somasekaram, Premathas and Calinescu, Radu and Buyya, Rajkumar}, + month = may, + year = {2022}, + note = {arXiv:2109.15139 [cs, eess]}, + keywords = {Computer Science - Distributed, Parallel, and Cluster Computing, Computer Science - Networking and Internet Architecture, Electrical Engineering and Systems Science - Systems and Control}, + pages = {111208}, + file = {arXiv.org Snapshot:C\:\\Users\\Amaury\\Zotero\\storage\\B4KCP9BG\\2109.html:text/html;Somasekaram et al. - 2022 - High-Availability Clusters A Taxonomy, Survey, an.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\K3LQZLC8\\Somasekaram et al. - 2022 - High-Availability Clusters A Taxonomy, Survey, an.pdf:application/pdf}, +} + +@book{MPBook, + title = {Concurrence et cohérence dans les systèmes répartis}, + isbn = {978-1-78405-295-9}, + abstract = {La société moderne est de plus en plus dominée par la société virtuelle, le nombre d’internautes dans le monde ayant dépassé les trois milliards en 2015. A la différence de leurs homologues séquentiels, les systèmes répartis sont beaucoup plus difficiles à concevoir, et sont donc sujets à de nombreux problèmes.La cohérence séquentielle fournit la même vue globale à tous les utilisateurs, mais le confort d\&\#39;utilisation qu\&\#39;elle apporte est trop coûteux, voire impossible, à mettre en oeuvre à grande échelle. Concurrence et cohérence dans les systèmes répartis examine les meilleures façons de spécifier les objets que l’on peut tout de même implémenter dans ces systèmes.Cet ouvrage explore la zone grise des systèmes répartis et dresse une carte des critères de cohérence faible, identifiant plusieurs familles et démontrant comment elles peuvent s’intégrer dans un langage de programmation.}, + language = {fr}, + publisher = {ISTE Group}, + author = {Perrin, Matthieu}, + month = sep, + year = {2017}, + note = {Google-Books-ID: 6DRlDwAAQBAJ}, + file = {Perrin - 2017 - Concurrence et cohérence dans les systèmes réparti.pdf:/home/amaury/Téléchargements/Perrin - 2017 - Concurrence et cohérence dans les systèmes réparti.pdf:application/pdf}, +} + +@article{van_der_linde_practical_2020, + title = {Practical client-side replication: weak consistency semantics for insecure settings}, + volume = {13}, + issn = {2150-8097}, + shorttitle = {Practical client-side replication}, + url = {https://dl.acm.org/doi/10.14778/3407790.3407847}, + doi = {10.14778/3407790.3407847}, + abstract = {Client-side replication and direct client-to-client synchronization can be used to create highly available, low-latency interactive applications. Causal consistency, the strongest available consistency model under network partitions, is an attractive consistency model for these applications.}, + language = {en}, + number = {12}, + urldate = {2023-06-06}, + journal = {Proceedings of the VLDB Endowment}, + author = {Van Der Linde, Albert and Leitão, João and Preguiça, Nuno}, + month = aug, + year = {2020}, + pages = {2590--2605}, + file = {Van Der Linde et al. - 2020 - Practical client-side replication weak consistenc.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\5TJ3SA56\\Van Der Linde et al. - 2020 - Practical client-side replication weak consistenc.pdf:application/pdf}, +} + +@book{lipton_pram_1988, + title = {{PRAM}: {A} {Scalable} {Shared} {Memory}}, + shorttitle = {{PRAM}}, + language = {en}, + publisher = {Princeton University, Department of Computer Science}, + author = {Lipton, Richard J. and Sandberg, Jonathan S.}, + year = {1988}, + note = {Google-Books-ID: 962epwAACAAJ}, + file = {Lipton et Sandberg - 1988 - PRAM A Scalable Shared Memory.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\3ZYT3WT4\\Lipton et Sandberg - 1988 - PRAM A Scalable Shared Memory.pdf:application/pdf}, +} + +@inproceedings{hutto_slow_1990, + title = {Slow memory: weakening consistency to enhance concurrency in distributed shared memories}, + shorttitle = {Slow memory}, + url = {https://www.computer.org/csdl/proceedings-article/icdcs/1990/00089297/12OmNvSKNPr}, + doi = {10.1109/ICDCS.1990.89297}, + abstract = {The use of weakly consistent memories in distributed shared memory systems to combat unacceptable network delay and to allow such systems to scale is proposed. Proposed memory correctness conditions are surveyed, and how they are related by a weakness hierarchy is demonstrated. Multiversion and messaging interpretations of memory are introduced as means of systematically exploring the space of possible memories. Slow memory is presented as a memory that allows the effects of writes to propagate slowly through the system, eliminating the need for costly consistency maintenance protocols that limit concurrency. Slow memory processes a valuable locality property and supports a reduction from traditional atomic memory. Thus slow memory is as expressive as atomic memory. This expressiveness is demonstrated by two exclusion algorithms and a solution to M.J. Fischer and A. Michael's (1982) dictionary problem on slow memory.}, + language = {English}, + urldate = {2023-06-06}, + publisher = {IEEE Computer Society}, + author = {Hutto, P. W. and Ahamad, M.}, + month = jan, + year = {1990}, + pages = {302,303,304,305,306,307,308,309--302,303,304,305,306,307,308,309}, + file = {Hutto et Ahamad - 1990 - Slow memory weakening consistency to enhance conc.pdf:/home/amaury/Téléchargements/Hutto et Ahamad - 1990 - Slow memory weakening consistency to enhance conc.pdf:application/pdf}, +} + +@article{lamport_how_1979, + title = {How to {Make} a {Multiprocessor} {Computer} {That} {Correctly} {Executes} {Multiprocess} {Programs}}, + volume = {C-28}, + issn = {1557-9956}, + doi = {10.1109/TC.1979.1675439}, + abstract = {Many large sequential computers execute operations in a different order than is specified by the program. A correct execution is achieved if the results produced are the same as would be produced by executing the program steps in order. For a multiprocessor computer, such a correct execution by each processor does not guarantee the correct execution of the entire program. Additional conditions are given which do guarantee that a computer correctly executes multiprocess programs.}, + number = {9}, + journal = {IEEE Transactions on Computers}, + author = {{Lamport}}, + month = sep, + year = {1979}, + note = {Conference Name: IEEE Transactions on Computers}, + keywords = {Computer design, concurrent computing, hardware correctness, multiprocessing, parallel processing}, + pages = {690--691}, + file = {IEEE Xplore Abstract Record:C\:\\Users\\Amaury\\Zotero\\storage\\IVGSSPNE\\1675439.html:text/html;Lamport - 1979 - How to Make a Multiprocessor Computer That Correct.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\GY8CWGUV\\Lamport - 1979 - How to Make a Multiprocessor Computer That Correct.pdf:application/pdf}, +} + +@article{lamport_interprocess_1986, + title = {On interprocess communication}, + volume = {1}, + issn = {1432-0452}, + url = {https://doi.org/10.1007/BF01786228}, + doi = {10.1007/BF01786228}, + abstract = {Interprocess communication is studied without assuming any lower-level communication primitives. Three classes of communication registers are considered, and several constructions are given for implementing one class of register with a weaker class. The formalism developed in Part I is used in proving the correctness of these constructions.}, + language = {en}, + number = {2}, + urldate = {2023-06-08}, + journal = {Distributed Computing}, + author = {Lamport, Leslie}, + month = jun, + year = {1986}, + keywords = {Communication Network, Computer Hardware, Computer System, Operating System, System Organization}, + pages = {86--101}, + file = {Lamport - 1986 - On interprocess communication.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\XV7AEARN\\Lamport - 1986 - On interprocess communication.pdf:application/pdf}, +} + +@article{misra_axioms_1986, + title = {Axioms for memory access in asynchronous hardware systems}, + volume = {8}, + issn = {0164-0925, 1558-4593}, + url = {https://dl.acm.org/doi/10.1145/5001.5007}, + doi = {10.1145/5001.5007}, + abstract = {The problem of concurrent accesses to registers by asynchronous components is considered. A set of axioms about the values in a register during concurrent accesses is proposed. It is shown that if these axioms are met by a register, then concurrent accesses to it may be viewed as nonconcurrent, thus making it possible to analyze asynchronous algorithms without elaborate timing analysis of operations. These axioms are shown, in a certain sense, to be the weakest. Motivation for this work came from analyzing low-level hardware components in a VLSI chip which concurrently accesses a flip-flop.}, + language = {en}, + number = {1}, + urldate = {2023-06-08}, + journal = {ACM Transactions on Programming Languages and Systems}, + author = {Misra, J.}, + month = jan, + year = {1986}, + pages = {142--153}, + file = {Misra - 1986 - Axioms for memory access in asynchronous hardware .pdf:C\:\\Users\\Amaury\\Zotero\\storage\\KZP2774N\\Misra - 1986 - Axioms for memory access in asynchronous hardware .pdf:application/pdf}, +} + +@article{saito_optimistic_2005, + title = {Optimistic {Replication}}, + volume = {37}, + url = {https://inria.hal.science/hal-01248208}, + doi = {10.1145/1057977.1057980}, + abstract = {Data replication is a key technology in distributed systems that enables higher availability and performance. This article surveys optimistic replication algorithms. They allow replica contents to diverge in the short term to support concurrent work practices and tolerate failures in low-quality communication links. The importance of such techniques is increasing as collaboration through wide-area and mobile networks becomes popular.Optimistic replication deploys algorithms not seen in traditional “pessimistic” systems. Instead of synchronous replica coordination, an optimistic algorithm propagates changes in the background, discovers conflicts after they happen, and reaches agreement on the final contents incrementally.We explore the solution space for optimistic replication algorithms. This article identifies key challenges facing optimistic replication systems---ordering operations, detecting and resolving conflicts, propagating changes efficiently, and bounding replica divergence---and provides a comprehensive survey of techniques developed for addressing these challenges.}, + language = {en}, + number = {1}, + urldate = {2023-06-09}, + journal = {ACM Computing Surveys}, + author = {Saito, Yasushi and Shapiro, Marc}, + year = {2005}, + pages = {42}, + file = {Saito et Shapiro - 2005 - Optimistic Replication.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\4WJX5IAN\\Saito et Shapiro - 2005 - Optimistic Replication.pdf:application/pdf}, +} + +@article{singh_zeno_2009, + title = {Zeno: {Eventually} {Consistent} {Byzantine}-{Fault} {Tolerance}}, + abstract = {Many distributed services are hosted at large, shared, geographically diverse data centers, and they use replication to achieve high availability despite the unreachability of an entire data center. Recent events show that non-crash faults occur in these services and may lead to long outages. While Byzantine-Fault Tolerance (BFT) could be used to withstand these faults, current BFT protocols can become unavailable if a small fraction of their replicas are unreachable. This is because existing BFT protocols favor strong safety guarantees (consistency) over liveness (availability).}, + language = {en}, + author = {Singh, Atul and Fonseca, Pedro and Kuznetsov, Petr and Rodrigues, Rodrigo and Maniatis, Petros}, + year = {2009}, + file = {Singh et al. - Zeno Eventually Consistent Byzantine-Fault Tolera.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\K6J2UEBK\\Singh et al. - Zeno Eventually Consistent Byzantine-Fault Tolera.pdf:application/pdf}, +} + +@inproceedings{shakarami_refresh_2019, + title = {Refresh {Instead} of {Revoke} {Enhances} {Safety} and {Availability}: {A} {Formal} {Analysis}}, + volume = {LNCS-11559}, + shorttitle = {Refresh {Instead} of {Revoke} {Enhances} {Safety} and {Availability}}, + url = {https://inria.hal.science/hal-02384596}, + doi = {10.1007/978-3-030-22479-0_16}, + abstract = {Due to inherent delays and performance costs, the decision point in a distributed multi-authority Attribute-Based Access Control (ABAC) system is exposed to the risk of relying on outdated attribute values and policy; which is the safety and consistency problem. This paper formally characterizes three increasingly strong levels of consistency to restrict this exposure. Notably, we recognize the concept of refreshing attribute values rather than simply checking the revocation status, as in traditional approaches. Refresh replaces an older value with a newer one, while revoke simply invalidates the old value. Our lowest consistency level starts from the highest level in prior revocation-based work by Lee and Winslett (LW). Our two higher levels utilize the concept of request time which is absent in LW. For each of our levels we formally show that using refresh instead of revocation provides added safety and availability.}, + language = {en}, + urldate = {2023-06-09}, + publisher = {Springer International Publishing}, + author = {Shakarami, Mehrnoosh and Sandhu, Ravi}, + month = jul, + year = {2019}, + pages = {301}, + file = {Shakarami et Sandhu - 2019 - Refresh Instead of Revoke Enhances Safety and Avai.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\XQNWKF7H\\Shakarami et Sandhu - 2019 - Refresh Instead of Revoke Enhances Safety and Avai.pdf:application/pdf}, +} + +@article{decandia_dynamo_2007, + title = {Dynamo: {Amazon}’s {Highly} {Available} {Key}-value {Store}}, + abstract = {Reliability at massive scale is one of the biggest challenges we face at Amazon.com, one of the largest e-commerce operations in the world; even the slightest outage has significant financial consequences and impacts customer trust. The Amazon.com platform, which provides services for many web sites worldwide, is implemented on top of an infrastructure of tens of thousands of servers and network components located in many datacenters around the world. At this scale, small and large components fail continuously and the way persistent state is managed in the face of these failures drives the reliability and scalability of the software systems.}, + language = {en}, + author = {DeCandia, Giuseppe and Hastorun, Deniz and Jampani, Madan and Kakulapati, Gunavardhan and Lakshman, Avinash and Pilchin, Alex and Sivasubramanian, Swaminathan and Vosshall, Peter and Vogels, Werner}, + year = {2007}, + file = {DeCandia et al. - Dynamo Amazon’s Highly Available Key-value Store.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\KDHRPBGR\\DeCandia et al. - Dynamo Amazon’s Highly Available Key-value Store.pdf:application/pdf}, +} + +@inproceedings{burckhardt_replicated_2014, + address = {San Diego California USA}, + title = {Replicated data types: specification, verification, optimality}, + isbn = {978-1-4503-2544-8}, + shorttitle = {Replicated data types}, + url = {https://dl.acm.org/doi/10.1145/2535838.2535848}, + doi = {10.1145/2535838.2535848}, + abstract = {Geographically distributed systems often rely on replicated eventually consistent data stores to achieve availability and performance. To resolve conflicting updates at different replicas, researchers and practitioners have proposed specialized consistency protocols, called replicated data types, that implement objects such as registers, counters, sets or lists. Reasoning about replicated data types has however not been on par with comparable work on abstract data types and concurrent data types, lacking specifications, correctness proofs, and optimality results.}, + language = {en}, + urldate = {2023-11-17}, + booktitle = {Proceedings of the 41st {ACM} {SIGPLAN}-{SIGACT} {Symposium} on {Principles} of {Programming} {Languages}}, + publisher = {ACM}, + author = {Burckhardt, Sebastian and Gotsman, Alexey and Yang, Hongseok and Zawirski, Marek}, + month = jan, + year = {2014}, + pages = {271--284}, + file = {Burckhardt et al. - 2014 - Replicated data types specification, verification.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\KQNF7XLE\\Burckhardt et al. - 2014 - Replicated data types specification, verification.pdf:application/pdf}, +} + +@inproceedings{tseng_distributed_2019, + title = {Distributed {Causal} {Memory} in the {Presence} of {Byzantine} {Servers}}, + doi = {10.1109/NCA.2019.8935059}, + abstract = {We study distributed causal shared memory (or distributed read/write objects) in the client-server model over asynchronous message-passing networks in which some servers may suffer Byzantine failures. Since Ahamad et al. proposed causal memory in 1994, there have been abundant research on causal storage. Lately, there is a renewed interest in enforcing causal consistency in large-scale distributed storage systems (e.g., COPS, Eiger, Bolt-on). However, to the best of our knowledge, the fault-tolerance aspect of causal memory is not well studied, especially on the tight resilience bound. In our prior work, we showed that 2 f+1 servers is the tight bound to emulate crash-tolerant causal shared memory when up to f servers may crash. In this paper, we adopt a typical model considered in many prior works on Byzantine-tolerant storage algorithms and quorum systems. In the system, up to f servers may suffer Byzantine failures and any number of clients may crash. We constructively present an emulation algorithm for Byzantine causal memory using 3 f+1 servers. We also prove that 3 f+1 is necessary for tolerating up to f Byzantine servers. In other words, we show that 3 f+1 is a tight bound. For evaluation, we implement our algorithm in Golang and compare their performance with two state-of-the-art fault-tolerant algorithms that ensure atomicity in the Google Cloud Platform.}, + booktitle = {2019 {IEEE} 18th {International} {Symposium} on {Network} {Computing} and {Applications} ({NCA})}, + author = {Tseng, Lewis and Wang, Zezhi and Zhao, Yajie and Pan, Haochen}, + month = sep, + year = {2019}, + note = {ISSN: 2643-7929}, + keywords = {asynchrony, Byzantine faults, causal memory, Computer crashes, Consensus protocol, distributed storage system, Emulation, evaluation, Fault tolerance, Fault tolerant systems, History, Servers, tight condition}, + pages = {1--8}, + file = {IEEE Xplore Abstract Record:C\:\\Users\\Amaury\\Zotero\\storage\\DDV34ULW\\8935059.html:text/html}, +} + +@misc{misra_byzantine_2021, + title = {Byzantine {Fault} {Tolerant} {Causal} {Ordering}}, + url = {http://arxiv.org/abs/2112.11337}, + abstract = {Causal ordering in an asynchronous system has many applications in distributed computing, including in replicated databases and real-time collaborative software. Previous work in the area focused on ordering point-to-point messages in a fault-free setting, and on ordering broadcasts under various fault models. To the best of our knowledge, Byzantine faulttolerant causal ordering has not been attempted for point-topoint communication in an asynchronous setting. In this paper, we first show that existing algorithms for causal ordering of point-to-point communication fail under Byzantine faults. We then prove that it is impossible to causally order messages under point-to-point communication in an asynchronous system with one or more Byzantine failures. We then present two algorithms that can causally order messages under Byzantine failures, where the network provides an upper bound on the message transmission time. The proofs of correctness for these algorithms show that it is possible to achieve causal ordering for point-to-point communication under a stronger asynchrony model where the network provides an upper bound on message transmission time. We also give extensions of our two algorithms for Byzantine fault-tolerant causal ordering of multicasts.}, + language = {en}, + urldate = {2023-07-12}, + publisher = {arXiv}, + author = {Misra, Anshuman and Kshemkalyani, Ajay}, + month = dec, + year = {2021}, + note = {arXiv:2112.11337 [cs]}, + keywords = {Computer Science - Distributed, Parallel, and Cluster Computing}, + file = {Misra and Kshemkalyani - 2021 - Byzantine Fault Tolerant Causal Ordering.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\P2R366US\\Misra and Kshemkalyani - 2021 - Byzantine Fault Tolerant Causal Ordering.pdf:application/pdf}, +} + +@article{jacob_analysis_2021, + title = {Analysis of the {Matrix} {Event} {Graph} {Replicated} {Data} {Type}}, + volume = {9}, + issn = {2169-3536}, + url = {https://ieeexplore.ieee.org/document/9351908/}, + doi = {10.1109/ACCESS.2021.3058576}, + abstract = {Matrix is a new kind of decentralized, topic-based publish-subscribe middleware for communication and data storage that is getting particularly popular as a basis for secure instant messaging. By comparison with traditional decentralized communication systems, Matrix replaces pure message passing with a replicated data structure. This data structure, which we extract and call the Matrix Event Graph (MEG), depicts the causal history of messages. We show that this MEG represents an interesting and important replicated data type for decentralized applications that are based on causal histories of publish-subscribe events: First, we prove that the MEG is a Conflict-Free Replicated Data Type for causal histories and, thus, provides Strong Eventual Consistency (SEC). With SEC being among the best known achievable trade-offs in the scope of the well-known CAP theorem, the MEG provides a powerful consistency guarantee while being available during network partition. Second, we discuss the implications of byzantine attackers on the data type’s properties. We note that the MEG, as it does not strive for consensus or strong consistency, can cope with n {\textgreater} f environments with n participants, of which f are byzantine. Furthermore, we analyze scalability: Using Markov chains, we study the number of forward extremities of the MEG over time and observe an almost optimal evolution. We conjecture that this property is inherent to the underlying spatially inhomogeneous random walk. With the properties shown, a MEG represents a promising element in the set of data structures for decentralized applications, but with distinct trade-offs compared to traditional blockchains and distributed ledger technologies.}, + language = {en}, + urldate = {2024-01-12}, + journal = {IEEE Access}, + author = {Jacob, Florian and Beer, Carolin and Henze, Norbert and Hartenstein, Hannes}, + year = {2021}, + pages = {28317--28333}, + file = {Jacob et al. - 2021 - Analysis of the Matrix Event Graph Replicated Data.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\TRSMADSW\\Jacob et al. - 2021 - Analysis of the Matrix Event Graph Replicated Data.pdf:application/pdf}, +} + +@inproceedings{kleppmann_making_2022, + address = {Rennes France}, + title = {Making {CRDTs} {Byzantine} fault tolerant}, + isbn = {978-1-4503-9256-3}, + url = {https://dl.acm.org/doi/10.1145/3517209.3524042}, + doi = {10.1145/3517209.3524042}, + abstract = {It is often claimed that Conflict-free Replicated Data Types (CRDTs) ensure consistency of replicated data in peer-topeer systems. However, peer-to-peer systems usually consist of untrusted nodes that may deviate from the specified protocol (i.e. exhibit Byzantine faults), and most existing CRDT algorithms cannot guarantee consistency in the presence of such faults. This paper shows how to adapt existing non-Byzantine CRDT algorithms and make them Byzantine fault-tolerant. The proposed scheme can tolerate any number of Byzantine nodes (making it immune to Sybil attacks), guarantees Strong Eventual Consistency, and requires only modest changes to existing CRDT algorithms.}, + language = {en}, + urldate = {2024-01-12}, + booktitle = {Proceedings of the 9th {Workshop} on {Principles} and {Practice} of {Consistency} for {Distributed} {Data}}, + publisher = {ACM}, + author = {Kleppmann, Martin}, + month = apr, + year = {2022}, + pages = {8--15}, + file = {Kleppmann - 2022 - Making CRDTs Byzantine fault tolerant.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\8K37LERF\\Kleppmann - 2022 - Making CRDTs Byzantine fault tolerant.pdf:application/pdf}, +} + +@misc{noauthor_yjsyjs_2023, + title = {yjs/yjs}, + url = {https://github.com/yjs/yjs}, + abstract = {Shared data types for building collaborative software}, + urldate = {2023-12-10}, + publisher = {Yjs}, + month = dec, + year = {2023}, + note = {original-date: 2014-07-29T19:29:45Z}, + keywords = {collaboration, collaborative-editing, crdt, decentralized, offline-first, p2p, peer-to-peer, realtime, shared-editing, yjs}, +} + +@misc{appjet_etherpad_2011, + title = {Etherpad and {EasySync} {Technical} {Manua}}, + url = {https://raw.githubusercontent.com/ether/etherpad-lite/master/doc/easysync/easysync-full-description.pdf}, + urldate = {2023-12-10}, + author = {AppJet}, + year = {2011}, + file = {easysync-full-description.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\F5SV2JTZ\\easysync-full-description.pdf:application/pdf}, +} + +@article{kleppmann_conflict-free_2017, + title = {A {Conflict}-{Free} {Replicated} {JSON} {Datatype}}, + volume = {28}, + issn = {1045-9219}, + url = {http://arxiv.org/abs/1608.03960}, + doi = {10.1109/TPDS.2017.2697382}, + abstract = {Many applications model their data in a general-purpose storage format such as JSON. This data structure is modified by the application as a result of user input. Such modifications are well understood if performed sequentially on a single copy of the data, but if the data is replicated and modified concurrently on multiple devices, it is unclear what the semantics should be. In this paper we present an algorithm and formal semantics for a JSON data structure that automatically resolves concurrent modifications such that no updates are lost, and such that all replicas converge towards the same state (a conflict-free replicated datatype or CRDT). It supports arbitrarily nested list and map types, which can be modified by insertion, deletion and assignment. The algorithm performs all merging client-side and does not depend on ordering guarantees from the network, making it suitable for deployment on mobile devices with poor network connectivity, in peer-to-peer networks, and in messaging systems with end-to-end encryption.}, + language = {en}, + number = {10}, + urldate = {2023-12-10}, + journal = {IEEE Transactions on Parallel and Distributed Systems}, + author = {Kleppmann, Martin and Beresford, Alastair R.}, + month = oct, + year = {2017}, + note = {arXiv:1608.03960 [cs]}, + keywords = {Computer Science - Distributed, Parallel, and Cluster Computing, Computer Science - Databases}, + pages = {2733--2746}, + file = {Kleppmann et Beresford - 2017 - A Conflict-Free Replicated JSON Datatype.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\BQVG57MU\\Kleppmann et Beresford - 2017 - A Conflict-Free Replicated JSON Datatype.pdf:application/pdf}, +} + +@book{Raynal18, + title = {Fault-{Tolerant} {Message}-{Passing} {Distributed} {Systems}: {An} {Algorithmic} {Approach}}, + isbn = {978-3-319-94141-7}, + shorttitle = {Fault-{Tolerant} {Message}-{Passing} {Distributed} {Systems}}, + abstract = {This book presents the most important fault-tolerant distributed programming abstractions and their associated distributed algorithms, in particular in terms of reliable communication and agreement, which lie at the heart of nearly all distributed applications. These programming abstractions, distributed objects or services, allow software designers and programmers to cope with asynchrony and the most important types of failures such as process crashes, message losses, and malicious behaviors of computing entities, widely known under the term "Byzantine fault-tolerance". The author introduces these notions in an incremental manner, starting from a clear specification, followed by algorithms which are first described intuitively and then proved correct. The book also presents impossibility results in classic distributed computing models, along with strategies, mainly failure detectors and randomization, that allow us to enrich these models. In this sense, the book constitutes an introduction to the science of distributed computing, with applications in all domains of distributed systems, such as cloud computing and blockchains. Each chapter comes with exercises and bibliographic notes to help the reader approach, understand, and master the fascinating field of fault-tolerant distributed computing.}, + language = {en}, + publisher = {Springer}, + author = {Raynal, Michel}, + month = sep, + year = {2018}, + note = {Google-Books-ID: J6BtDwAAQBAJ}, + keywords = {Computers / Computer Science, Computers / Information Technology, Computers / Networking / General, Technology \& Engineering / Telecommunications}, +} + +@article{bayuk_data-centric_2009, + title = {Data-centric security}, + volume = {2009}, + issn = {1361-3723}, + url = {https://www.sciencedirect.com/science/article/pii/S1361372309700326}, + doi = {10.1016/S1361-3723(09)70032-6}, + abstract = {The authoritative control objectives for access to data have always been something along the lines of: “Confirm that user access rights to systems and data are in line with defined and documented business needs, and that job requirements are attached to user identities…. Ensure that critical and confidential information is withheld from those who should not have access to it.”1}, + number = {3}, + urldate = {2023-12-08}, + journal = {Computer Fraud \& Security}, + author = {Bayuk, Jennifer}, + month = mar, + year = {2009}, + pages = {7--11}, + file = {Bayuk - 2009 - Data-centric security.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\2YRZBICQ\\Bayuk - 2009 - Data-centric security.pdf:application/pdf;ScienceDirect Snapshot:C\:\\Users\\Amaury\\Zotero\\storage\\KC3F5F86\\S1361372309700326.html:text/html}, +} + +@inproceedings{goyal_attribute-based_2006, + address = {Alexandria Virginia USA}, + title = {Attribute-based encryption for fine-grained access control of encrypted data}, + isbn = {978-1-59593-518-2}, + url = {https://dl.acm.org/doi/10.1145/1180405.1180418}, + doi = {10.1145/1180405.1180418}, + abstract = {As more sensitive data is shared and stored by third-party sites on the Internet, there will be a need to encrypt data stored at these sites. One drawback of encrypting data, is that it can be selectively shared only at a coarse-grained level (i.e., giving another party your private key). We develop a new cryptosystem for fine-grained sharing of encrypted data that we call Key-Policy Attribute-Based Encryption (KP-ABE). In our cryptosystem, ciphertexts are labeled with sets of attributes and private keys are associated with access structures that control which ciphertexts a user is able to decrypt. We demonstrate the applicability of our construction to sharing of audit-log information and broadcast encryption. Our construction supports delegation of private keys which subsumes Hierarchical Identity-Based Encryption (HIBE).}, + language = {en}, + urldate = {2023-12-08}, + booktitle = {Proceedings of the 13th {ACM} conference on {Computer} and communications security}, + publisher = {ACM}, + author = {Goyal, Vipul and Pandey, Omkant and Sahai, Amit and Waters, Brent}, + month = oct, + year = {2006}, + pages = {89--98}, + file = {Goyal et al. - 2006 - Attribute-based encryption for fine-grained access.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\Z9NEMU4F\\Goyal et al. - 2006 - Attribute-based encryption for fine-grained access.pdf:application/pdf}, +} + +@incollection{lee_distributed_2009, + address = {Berlin, Heidelberg}, + title = {Distributed {Attribute}-{Based} {Encryption}}, + volume = {5461}, + isbn = {978-3-642-00729-3 978-3-642-00730-9}, + url = {http://link.springer.com/10.1007/978-3-642-00730-9_2}, + abstract = {Ciphertext-Policy Attribute-Based Encryption (CP-ABE) allows to encrypt data under an access policy, specified as a logical combination of attributes. Such ciphertexts can be decrypted by anyone with a set of attributes that fits the policy. In this paper, we introduce the concept of Distributed Attribute-Based Encryption (DABE), where an arbitrary number of parties can be present to maintain attributes and their corresponding secret keys. This is in stark contrast to the classic CP-ABE schemes, where all secret keys are distributed by one central trusted party. We provide the first construction of a DABE scheme; the construction is very efficient, as it requires only a constant number of pairing operations during encryption and decryption.}, + language = {en}, + urldate = {2023-12-08}, + booktitle = {Information {Security} and {Cryptology} – {ICISC} 2008}, + publisher = {Springer Berlin Heidelberg}, + author = {Müller, Sascha and Katzenbeisser, Stefan and Eckert, Claudia}, + editor = {Lee, Pil Joong and Cheon, Jung Hee}, + year = {2009}, + doi = {10.1007/978-3-642-00730-9_2}, + note = {Series Title: Lecture Notes in Computer Science}, + pages = {20--36}, + file = {Müller et al. - 2009 - Distributed Attribute-Based Encryption.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\CWKWPE9S\\Müller et al. - 2009 - Distributed Attribute-Based Encryption.pdf:application/pdf}, +} + +@techreport{rose_zero_2020, + title = {Zero {Trust} {Architecture}}, + url = {https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-207.pdf}, + abstract = {Zero trust (ZT) is the term for an evolving set of cybersecurity paradigms that move defenses from static, network-based perimeters to focus on users, assets, and resources. A zero trust architecture (ZTA) uses zero trust principles to plan industrial and enterprise infrastructure and workflows. Zero trust assumes there is no implicit trust granted to assets or user accounts based solely on their physical or network location (i.e., local area networks versus the internet) or based on asset ownership (enterprise or personally owned). Authentication and authorization (both subject and device) are discrete functions performed before a session to an enterprise resource is established. Zero trust is a response to enterprise network trends that include remote users, bring your own device (BYOD), and cloud-based assets that are not located within an enterpriseowned network boundary. Zero trust focuses on protecting resources (assets, services, workflows, network accounts, etc.), not network segments, as the network location is no longer seen as the prime component to the security posture of the resource. This document contains an abstract definition of zero trust architecture (ZTA) and gives general deployment models and use cases where zero trust could improve an enterprise’s overall information technology security posture.}, + language = {en}, + urldate = {2023-12-08}, + institution = {National Institute of Standards and Technology}, + author = {Rose, Scott and Borchert, Oliver and Mitchell, Stu and Connelly, Sean}, + month = aug, + year = {2020}, + doi = {10.6028/NIST.SP.800-207}, + file = {Rose et al. - 2020 - Zero Trust Architecture.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\6PRUAJZ3\\Rose et al. - 2020 - Zero Trust Architecture.pdf:application/pdf}, +} + +@article{yan_flexible_2017, + title = {Flexible {Data} {Access} {Control} {Based} on {Trust} and {Reputation} in {Cloud} {Computing}}, + volume = {5}, + issn = {2168-7161}, + url = {http://ieeexplore.ieee.org/document/7208817/}, + doi = {10.1109/TCC.2015.2469662}, + abstract = {Cloud computing offers a new way of services and has become a popular service platform. Storing user data at a cloud data center greatly releases storage burden of user devices and brings access convenience. Due to distrust in cloud service providers, users generally store their crucial data in an encrypted form. But in many cases, the data need to be accessed by other entities for fulfilling an expected service, e.g., an eHealth service. How to control personal data access at cloud is a critical issue. Various application scenarios request flexible control on cloud data access based on data owner policies and application demands. Either data owners or some trusted third parties or both should flexibly participate in this control. However, existing work hasn’t yet investigated an effective and flexible solution to satisfy this demand. On the other hand, trust plays an important role in data sharing. It helps overcoming uncertainty and avoiding potential risks. But literature still lacks a practical solution to control cloud data access based on trust and reputation. In this paper, we propose a scheme to control data access in cloud computing based on trust evaluated by the data owner and/or reputations generated by a number of reputation centers in a flexible manner by applying Attribue-Based Encryption and Proxy Re-Encryption. We integrate the concept of context-aware trust and reputation evaluation into a cryptographic system in order to support various control scenarios and strategies. The security and performance of our scheme are evaluated and justified through extensive analysis, security proof, comparison and implementation. The results show the efficiency, flexibility and effectiveness of our scheme for data access control in cloud computing.}, + language = {en}, + number = {3}, + urldate = {2023-12-08}, + journal = {IEEE Transactions on Cloud Computing}, + author = {Yan, Zheng and Li, Xueyun and Wang, Mingjun and Vasilakos, Athanasios V.}, + month = jul, + year = {2017}, + pages = {485--498}, + file = {Yan et al. - 2017 - Flexible Data Access Control Based on Trust and Re.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\EGDZNP8U\\Yan et al. - 2017 - Flexible Data Access Control Based on Trust and Re.pdf:application/pdf}, +} + +@inproceedings{preguica_commutative_2009, + address = {Montreal, Quebec, Canada}, + title = {A {Commutative} {Replicated} {Data} {Type} for {Cooperative} {Editing}}, + url = {http://ieeexplore.ieee.org/document/5158449/}, + doi = {10.1109/ICDCS.2009.20}, + abstract = {A Commutative Replicated Data Type (CRDT) is one where all concurrent operations commute. The replicas of a CRDT converge automatically, without complex concurrency control. This paper describes Treedoc, a novel CRDT design for cooperative text editing. An essential property is that the identifiers of Treedoc atoms are selected from a dense space. We discuss practical alternatives for implementing the identifier space based on an extended binary tree. We also discuss storage alternatives for data and meta-data, and mechanisms for compacting the tree. In the best case, Treedoc incurs no overhead with respect to a linear text buffer. We validate the results with traces from existing edit histories.}, + language = {en}, + urldate = {2024-02-16}, + booktitle = {2009 29th {IEEE} {International} {Conference} on {Distributed} {Computing} {Systems}}, + publisher = {IEEE}, + author = {Preguica, Nuno and Marques, Joan Manuel and Shapiro, Marc and Letia, Mihai}, + month = jun, + year = {2009}, + pages = {395--403}, + file = {Preguica et al. - 2009 - A Commutative Replicated Data Type for Cooperative.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\LKX6LUIS\\Preguica et al. - 2009 - A Commutative Replicated Data Type for Cooperative.pdf:application/pdf}, +} + + +@incollection{defago_conflict-free_2011, + address = {Berlin, Heidelberg}, + title = {Conflict-{Free} {Replicated} {Data} {Types}}, + volume = {6976}, + isbn = {978-3-642-24549-7 978-3-642-24550-3}, + url = {http://link.springer.com/10.1007/978-3-642-24550-3_29}, + abstract = {Replicating data under Eventual Consistency (EC) allows any replica to accept updates without remote synchronisation. This ensures performance and scalability in large-scale distributed systems (e.g., clouds). However, published EC approaches are ad-hoc and error-prone. Under a formal Strong Eventual Consistency (SEC) model, we study sufficient conditions for convergence. A data type that satisfies these conditions is called a Conflict-free Replicated Data Type (CRDT). Replicas of any CRDT are guaranteed to converge in a self-stabilising manner, despite any number of failures. This paper formalises two popular approaches (state- and operation-based) and their relevant sufficient conditions. We study a number of useful CRDTs, such as sets with clean semantics, supporting both add and remove operations, and consider in depth the more complex Graph data type. CRDT types can be composed to develop large-scale distributed applications, and have interesting theoretical properties.}, + language = {en}, + urldate = {2023-12-08}, + booktitle = {Stabilization, {Safety}, and {Security} of {Distributed} {Systems}}, + publisher = {Springer Berlin Heidelberg}, + author = {Shapiro, Marc and Preguiça, Nuno and Baquero, Carlos and Zawirski, Marek}, + editor = {Défago, Xavier and Petit, Franck and Villain, Vincent}, + year = {2011}, + doi = {10.1007/978-3-642-24550-3_29}, + note = {Series Title: Lecture Notes in Computer Science}, + pages = {386--400}, + file = {Shapiro et al. - 2011 - Conflict-Free Replicated Data Types.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\QK99TF5K\\Shapiro et al. - 2011 - Conflict-Free Replicated Data Types.pdf:application/pdf}, +} + +@inproceedings{nicolaescu_near_2016, + address = {Sanibel Island Florida USA}, + title = {Near {Real}-{Time} {Peer}-to-{Peer} {Shared} {Editing} on {Extensible} {Data} {Types}}, + isbn = {978-1-4503-4276-6}, + url = {https://dl.acm.org/doi/10.1145/2957276.2957310}, + doi = {10.1145/2957276.2957310}, + language = {en}, + urldate = {2023-12-01}, + booktitle = {Proceedings of the 19th {International} {Conference} on {Supporting} {Group} {Work}}, + publisher = {ACM}, + author = {Nicolaescu, Petru and Jahns, Kevin and Derntl, Michael and Klamma, Ralf}, + month = nov, + year = {2016}, + pages = {39--49}, + file = {Nicolaescu et al. - 2016 - Near Real-Time Peer-to-Peer Shared Editing on Exte.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\SV3MSLKD\\Nicolaescu et al. - 2016 - Near Real-Time Peer-to-Peer Shared Editing on Exte.pdf:application/pdf}, +} + +@misc{frey_process-commutative_2023, + title = {Process-{Commutative} {Distributed} {Objects}: {From} {Cryptocurrencies} to {Byzantine}-{Fault}-{Tolerant} {CRDTs}}, + shorttitle = {Process-{Commutative} {Distributed} {Objects}}, + url = {http://arxiv.org/abs/2311.13936}, + abstract = {This paper explores the territory that lies between best-effort Byzantine-Fault-Tolerant Conflict-free Replicated Data Types (BFT CRDTs) and totally ordered distributed ledgers. It formally characterizes a novel class of distributed objects that only requires a First In First Out (FIFO) order on the object operations from each process (taken individually). The formalization relies on Mazurkiewicz traces to define legal sequences of operations and ensure a combination of Strong Eventual Consistency (SEC) and Pipleline Consistency (PC). The paper presents a generic algorithm that implements this novel class of distributed objects both in a crash- and Byzantine setting. Finally, the proposed approach is illustrated with four instances of this class of objects, namely money transfer, Petri nets, multi-sets, and concurrent work stealing dequeues.}, + language = {en}, + urldate = {2024-01-22}, + publisher = {arXiv}, + author = {Frey, Davide and Guillou, Lucie and Raynal, Michel and Taïani, François}, + month = nov, + year = {2023}, + note = {arXiv:2311.13936 [cs]}, + keywords = {Computer Science - Distributed, Parallel, and Cluster Computing}, + file = {Frey et al. - 2023 - Process-Commutative Distributed Objects From Cryp.pdf:C\:\\Users\\Amaury\\Zotero\\storage\\FUPJTWVD\\Frey et al. - 2023 - Process-Commutative Distributed Objects From Cryp.pdf:application/pdf}, +} diff --git a/docs/sujetThese/sujet-cifre.bib b/docs/sujetThese/sujet-cifre.bib new file mode 100644 index 0000000..8bc9ec3 --- /dev/null +++ b/docs/sujetThese/sujet-cifre.bib @@ -0,0 +1,462 @@ +@misc{AppJetEtherpad2011, + title = {Etherpad and {{EasySync Technical Manual}}}, + author = {AppJet}, + year = {2011}, + urldate = {2023-12-10}, + howpublished = {https://raw.githubusercontent.com/ether/etherpad-lite/master/doc/easysync/easysync-full-description.pdf}, + file = {/home/amaury/Zotero/storage/F5SV2JTZ/easysync-full-description.pdf} +} + +@article{BayukDatacentric2009, + title = {Data-Centric Security}, + author = {Bayuk, Jennifer}, + year = {2009}, + month = mar, + journal = {Computer Fraud \& Security}, + volume = {2009}, + number = {3}, + pages = {7--11}, + issn = {1361-3723}, + doi = {10.1016/S1361-3723(09)70032-6}, + urldate = {2023-12-08}, + abstract = {The authoritative control objectives for access to data have always been something along the lines of: ``Confirm that user access rights to systems and data are in line with defined and documented business needs, and that job requirements are attached to user identities{\ldots}. Ensure that critical and confidential information is withheld from those who should not have access to it.''1}, + file = {/home/amaury/Zotero/storage/2YRZBICQ/Bayuk - 2009 - Data-centric security.pdf;/home/amaury/Zotero/storage/KC3F5F86/S1361372309700326.html} +} + +@inproceedings{BurckhardtReplicated2014, + title = {Replicated Data Types: Specification, Verification, Optimality}, + shorttitle = {Replicated Data Types}, + booktitle = {Proceedings of the 41st {{ACM SIGPLAN-SIGACT Symposium}} on {{Principles}} of {{Programming Languages}}}, + author = {Burckhardt, Sebastian and Gotsman, Alexey and Yang, Hongseok and Zawirski, Marek}, + year = {2014}, + month = jan, + pages = {271--284}, + publisher = {{ACM}}, + address = {{San Diego California USA}}, + doi = {10.1145/2535838.2535848}, + urldate = {2023-11-17}, + abstract = {Geographically distributed systems often rely on replicated eventually consistent data stores to achieve availability and performance. To resolve conflicting updates at different replicas, researchers and practitioners have proposed specialized consistency protocols, called replicated data types, that implement objects such as registers, counters, sets or lists. Reasoning about replicated data types has however not been on par with comparable work on abstract data types and concurrent data types, lacking specifications, correctness proofs, and optimality results.}, + isbn = {978-1-4503-2544-8}, + langid = {english}, + file = {/home/amaury/Zotero/storage/KQNF7XLE/Burckhardt et al. - 2014 - Replicated data types specification, verification.pdf} +} + +@inproceedings{DeCandiaDynamo2007, + author = {Giuseppe DeCandia and + Deniz Hastorun and + Madan Jampani and + Gunavardhan Kakulapati and + Avinash Lakshman and + Alex Pilchin and + Swaminathan Sivasubramanian and + Peter Vosshall and + Werner Vogels}, + editor = {Thomas C. Bressoud and + M. Frans Kaashoek}, + title = {Dynamo: amazon's highly available key-value store}, + booktitle = {Proceedings of the 21st {ACM} Symposium on Operating Systems Principles + ({SOSP})}, + pages = {205--220}, + publisher = {{ACM}}, + year = {2007}, + url = {https://doi.org/10.1145/1294261.1294281}, + doi = {10.1145/1294261.1294281}, + timestamp = {Wed, 14 Nov 2018 10:55:11 +0100}, + biburl = {https://dblp.org/rec/conf/sosp/DeCandiaHJKLPSVV07.bib}, + bibsource = {dblp computer science bibliography, https://dblp.org} +} +@inproceedings{GoyalAttributebased2006, + title = {Attribute-Based Encryption for Fine-Grained Access Control of Encrypted Data}, + booktitle = {Proceedings of the 13th {{ACM}} Conference on {{Computer}} and Communications Security}, + author = {Goyal, Vipul and Pandey, Omkant and Sahai, Amit and Waters, Brent}, + year = {2006}, + month = oct, + pages = {89--98}, + publisher = {{ACM}}, + doi = {10.1145/1180405.1180418}, + urldate = {2023-12-08}, + abstract = {As more sensitive data is shared and stored by third-party sites on the Internet, there will be a need to encrypt data stored at these sites. One drawback of encrypting data, is that it can be selectively shared only at a coarse-grained level (i.e., giving another party your private key). We develop a new cryptosystem for fine-grained sharing of encrypted data that we call Key-Policy Attribute-Based Encryption (KP-ABE). In our cryptosystem, ciphertexts are labeled with sets of attributes and private keys are associated with access structures that control which ciphertexts a user is able to decrypt. We demonstrate the applicability of our construction to sharing of audit-log information and broadcast encryption. Our construction supports delegation of private keys which subsumes Hierarchical Identity-Based Encryption (HIBE).}, + isbn = {978-1-59593-518-2}, + langid = {english}, + file = {/home/amaury/Zotero/storage/Z9NEMU4F/Goyal et al. - 2006 - Attribute-based encryption for fine-grained access.pdf} +} + +@inproceedings{HuttoSlow1990, + title = {Slow Memory: Weakening Consistency to Enhance Concurrency in Distributed Shared Memories}, + shorttitle = {Slow Memory}, + booktitle = {Proceedings.,10th {{International Conference}} on {{Distributed Computing Systems}}}, + author = {Hutto, P. W. and Ahamad, M.}, + year = {1990}, + month = jan, + pages = {302--309}, + publisher = {{IEEE Computer Society}}, + doi = {10.1109/ICDCS.1990.89297}, + urldate = {2023-06-06}, + abstract = {The use of weakly consistent memories in distributed shared memory systems to combat unacceptable network delay and to allow such systems to scale is proposed. Proposed memory correctness conditions are surveyed, and how they are related by a weakness hierarchy is demonstrated. Multiversion and messaging interpretations of memory are introduced as means of systematically exploring the space of possible memories. Slow memory is presented as a memory that allows the effects of writes to propagate slowly through the system, eliminating the need for costly consistency maintenance protocols that limit concurrency. Slow memory processes a valuable locality property and supports a reduction from traditional atomic memory. Thus slow memory is as expressive as atomic memory. This expressiveness is demonstrated by two exclusion algorithms and a solution to M.J. Fischer and A. Michael's (1982) dictionary problem on slow memory.}, + langid = {english}, + file = {/home/amaury/Téléchargements/Hutto et Ahamad - 1990 - Slow memory weakening consistency to enhance conc.pdf} +} + +@article{KleppmannConflictFree2017, + title = {A {{Conflict-Free Replicated JSON Datatype}}}, + author = {Kleppmann, Martin and Beresford, Alastair R.}, + year = {2017}, + month = oct, + journal = {IEEE Transactions on Parallel and Distributed Systems}, + volume = {28}, + number = {10}, + eprint = {1608.03960}, + primaryclass = {cs}, + pages = {2733--2746}, + issn = {1045-9219}, + doi = {10.1109/TPDS.2017.2697382}, + urldate = {2023-12-10}, + abstract = {Many applications model their data in a general-purpose storage format such as JSON. This data structure is modified by the application as a result of user input. Such modifications are well understood if performed sequentially on a single copy of the data, but if the data is replicated and modified concurrently on multiple devices, it is unclear what the semantics should be. In this paper we present an algorithm and formal semantics for a JSON data structure that automatically resolves concurrent modifications such that no updates are lost, and such that all replicas converge towards the same state (a conflict-free replicated datatype or CRDT). It supports arbitrarily nested list and map types, which can be modified by insertion, deletion and assignment. The algorithm performs all merging client-side and does not depend on ordering guarantees from the network, making it suitable for deployment on mobile devices with poor network connectivity, in peer-to-peer networks, and in messaging systems with end-to-end encryption.}, + archiveprefix = {arxiv}, + langid = {english}, + keywords = {Computer Science - Databases,{Computer Science - Distributed, Parallel, and Cluster Computing}}, + file = {/home/amaury/Zotero/storage/BQVG57MU/Kleppmann et Beresford - 2017 - A Conflict-Free Replicated JSON Datatype.pdf} +} + +@phdthesis{KumarFaultTolerant2019, + title = {Fault-{{Tolerant Distributed Services}} in {{Message-Passing Systems}}}, + author = {Kumar, Saptaparni}, + year = {2019}, + school = {Texas A\&M University}, + file = {/home/amaury/Zotero/storage/Q9XK77W9/Kumar - 2019 - Fault-Tolerant Distributed Services in Message-Pas.pdf;/home/amaury/Zotero/storage/7JB26RAJ/1.html} +} + +@article{LamportHow1979, + title = {How to {{Make}} a {{Multiprocessor Computer That Correctly Executes Multiprocess Programs}}}, + author = {{Lamport}}, + year = {1979}, + month = sep, + journal = {IEEE Transactions on Computers}, + volume = {C-28}, + number = {9}, + pages = {690--691}, + issn = {1557-9956}, + doi = {10.1109/TC.1979.1675439}, + abstract = {Many large sequential computers execute operations in a different order than is specified by the program. A correct execution is achieved if the results produced are the same as would be produced by executing the program steps in order. For a multiprocessor computer, such a correct execution by each processor does not guarantee the correct execution of the entire program. Additional conditions are given which do guarantee that a computer correctly executes multiprocess programs.}, + keywords = {Computer design,concurrent computing,hardware correctness,multiprocessing,parallel processing}, + file = {/home/amaury/Zotero/storage/GY8CWGUV/Lamport - 1979 - How to Make a Multiprocessor Computer That Correct.pdf;/home/amaury/Zotero/storage/IVGSSPNE/1675439.html} +} + +@article{LamportInterprocess1986, + title = {On Interprocess Communication}, + author = {Lamport, Leslie}, + year = {1986}, + month = jun, + journal = {Distributed Computing}, + volume = {1}, + number = {2}, + pages = {86--101}, + issn = {1432-0452}, + doi = {10.1007/BF01786228}, + urldate = {2023-06-08}, + abstract = {Interprocess communication is studied without assuming any lower-level communication primitives. Three classes of communication registers are considered, and several constructions are given for implementing one class of register with a weaker class. The formalism developed in Part I is used in proving the correctness of these constructions.}, + langid = {english}, + keywords = {Communication Network,Computer Hardware,Computer System,Operating System,System Organization}, + file = {/home/amaury/Zotero/storage/XV7AEARN/Lamport - 1986 - On interprocess communication.pdf} +} + + + +@TechReport{LiptonPRAM1988, + author = {Lipton, Richard J. and Sandberg, Jonathan S.}, + title = {{{PRAM}}: {{A Scalable Shared Memory}}}, + institution = {Princeton University, Department of Computer Science}, + year = 1988, + key = {TR-180-88 }} + + +@article{MisraAxioms1986, + title = {Axioms for Memory Access in Asynchronous Hardware Systems}, + author = {Misra, J.}, + year = {1986}, + month = jan, + journal = {ACM Transactions on Programming Languages and Systems}, + volume = {8}, + number = {1}, + pages = {142--153}, + issn = {0164-0925, 1558-4593}, + doi = {10.1145/5001.5007}, + urldate = {2023-06-08}, + abstract = {The problem of concurrent accesses to registers by asynchronous components is considered. A set of axioms about the values in a register during concurrent accesses is proposed. It is shown that if these axioms are met by a register, then concurrent accesses to it may be viewed as nonconcurrent, thus making it possible to analyze asynchronous algorithms without elaborate timing analysis of operations. These axioms are shown, in a certain sense, to be the weakest. Motivation for this work came from analyzing low-level hardware components in a VLSI chip which concurrently accesses a flip-flop.}, + langid = {english}, + file = {/home/amaury/Zotero/storage/KZP2774N/Misra - 1986 - Axioms for memory access in asynchronous hardware .pdf} +} + + +@inproceedings{MisraByzantine2021, + author = {Anshuman Misra and + Ajay D. Kshemkalyani}, + title = {Byzantine Fault-Tolerant Causal Ordering}, + booktitle = {24th International Conference on Distributed Computing and Networking, + ({ICDCN})}, + pages = {100--109}, + publisher = {{ACM}}, + year = {2023}, + url = {https://doi.org/10.1145/3571306.3571395}, + doi = {10.1145/3571306.3571395}, + timestamp = {Sun, 15 Jan 2023 18:32:09 +0100}, + biburl = {https://dblp.org/rec/conf/icdcn/MisraK23.bib}, + bibsource = {dblp computer science bibliography, https://dblp.org} +} + +@article{MosbergerMemory1993, + title = {Memory Consistency Models}, + author = {Mosberger, David}, + year = {1993}, + month = jan, + journal = {ACM SIGOPS Operating Systems Review}, + volume = {27}, + number = {1}, + pages = {18--26}, + issn = {0163-5980}, + doi = {10.1145/160551.160553}, + urldate = {2023-06-06}, + abstract = {This paper discusses memory consistency models and their influence on software in the context of parallel machines. In the first part we review previous work on memory consistency models. The second part discusses the issues that arise due to weakening memory consistency. We are especially interested in the influence that weakened consistency models have on language, compiler, and runtime system design. We conclude that tighter interaction between those parts and the memory system might improve performance considerably.}, + langid = {english}, + file = {/home/amaury/Zotero/storage/VF2ZNK6A/Mosberger - 1993 - Memory consistency models.pdf} +} + +@book{MPBook, + title = {{Concurrence et coh{\'e}rence dans les syst{\`e}mes r{\'e}partis}}, + author = {Perrin, Matthieu}, + year = {2017}, + month = sep, + publisher = {{ISTE Group}}, + abstract = {La soci{\'e}t{\'e} moderne est de plus en plus domin{\'e}e par la soci{\'e}t{\'e} virtuelle, le nombre d'internautes dans le monde ayant d{\'e}pass{\'e} les trois milliards en 2015. A la diff{\'e}rence de leurs homologues s{\'e}quentiels, les syst{\`e}mes r{\'e}partis sont beaucoup plus difficiles {\`a} concevoir, et sont donc sujets {\`a} de nombreux probl{\`e}mes.La coh{\'e}rence s{\'e}quentielle fournit la m{\^e}me vue globale {\`a} tous les utilisateurs, mais le confort d\&\#39;utilisation qu\&\#39;elle apporte est trop co{\^u}teux, voire impossible, {\`a} mettre en oeuvre {\`a} grande {\'e}chelle.~Concurrence et coh{\'e}rence dans les syst{\`e}mes r{\'e}partis~examine les meilleures fa{\c c}ons de sp{\'e}cifier les objets que l'on peut tout de m{\^e}me impl{\'e}menter dans ces syst{\`e}mes.Cet ouvrage explore la zone grise des syst{\`e}mes r{\'e}partis et dresse une carte des crit{\`e}res de coh{\'e}rence faible, identifiant plusieurs familles et d{\'e}montrant comment elles peuvent s'int{\'e}grer dans un langage de programmation.}, + googlebooks = {6DRlDwAAQBAJ}, + isbn = {978-1-78405-295-9}, + langid = {french}, + file = {/home/amaury/Téléchargements/Perrin - 2017 - Concurrence et cohérence dans les systèmes réparti.pdf} +} + +@incollection{MullerDistributed2009, + title = {Distributed {{Attribute-Based Encryption}}}, + booktitle = {Information {{Security}} and {{Cryptology}} {\textendash} {{ICISC}} 2008}, + author = {M{\"u}ller, Sascha and Katzenbeisser, Stefan and Eckert, Claudia}, + editor = {Lee, Pil Joong and Cheon, Jung Hee}, + year = {2009}, + volume = {5461}, + pages = {20--36}, + publisher = {{Springer Berlin Heidelberg}}, + address = {{Berlin, Heidelberg}}, + doi = {10.1007/978-3-642-00730-9_2}, + urldate = {2023-12-08}, + abstract = {Ciphertext-Policy Attribute-Based Encryption (CP-ABE) allows to encrypt data under an access policy, specified as a logical combination of attributes. Such ciphertexts can be decrypted by anyone with a set of attributes that fits the policy. In this paper, we introduce the concept of Distributed Attribute-Based Encryption (DABE), where an arbitrary number of parties can be present to maintain attributes and their corresponding secret keys. This is in stark contrast to the classic CP-ABE schemes, where all secret keys are distributed by one central trusted party. We provide the first construction of a DABE scheme; the construction is very efficient, as it requires only a constant number of pairing operations during encryption and decryption.}, + isbn = {978-3-642-00729-3 978-3-642-00730-9}, + langid = {english}, + file = {/home/amaury/Zotero/storage/CWKWPE9S/Müller et al. - 2009 - Distributed Attribute-Based Encryption.pdf} +} + +@inproceedings{NicolaescuRealTime2016, + title = {Near {{Real-Time Peer-to-Peer Shared Editing}} on {{Extensible Data Types}}}, + booktitle = {Proceedings of the 19th {{International Conference}} on {{Supporting Group Work}}}, + author = {Nicolaescu, Petru and Jahns, Kevin and Derntl, Michael and Klamma, Ralf}, + year = {2016}, + month = nov, + pages = {39--49}, + publisher = {{ACM}}, + doi = {10.1145/2957276.2957310}, + urldate = {2023-12-01}, + isbn = {978-1-4503-4276-6}, + langid = {english}, + file = {/home/amaury/Zotero/storage/SV3MSLKD/Nicolaescu et al. - 2016 - Near Real-Time Peer-to-Peer Shared Editing on Exte.pdf} +} + +@book{Raynal18, + title = {Fault-{{Tolerant Message-Passing Distributed Systems}}: {{An Algorithmic Approach}}}, + shorttitle = {Fault-{{Tolerant Message-Passing Distributed Systems}}}, + author = {Raynal, Michel}, + year = {2018}, + month = sep, + publisher = {{Springer}}, + abstract = {This book presents the most important fault-tolerant distributed programming abstractions and their associated distributed algorithms, in particular in terms of reliable communication and agreement, which lie at the heart of nearly all distributed applications. These programming abstractions, distributed objects or services, allow software designers and programmers to cope with asynchrony and the most important types of failures such as process crashes, message losses, and malicious behaviors of computing entities, widely known under the term "Byzantine fault-tolerance". The author introduces these notions in an incremental manner, starting from a clear specification, followed by algorithms which are first described intuitively and then proved correct. The book also presents impossibility results in classic distributed computing models, along with strategies, mainly failure detectors and randomization, that allow us to enrich these models. In this sense, the book constitutes an introduction to the science of distributed computing, with applications in all domains of distributed systems, such as cloud computing and blockchains. Each chapter comes with exercises and bibliographic notes to help the reader approach, understand, and master the fascinating field of fault-tolerant distributed computing.}, + googlebooks = {J6BtDwAAQBAJ}, + isbn = {978-3-319-94141-7}, + langid = {english}, + keywords = {Computers / Computer Science,Computers / Information Technology,Computers / Networking / General,Technology \& Engineering / Telecommunications} +} + +@incollection{RaynalCausal1995, + title = {From Causal Consistency to Sequential Consistency in Shared Memory Systems}, + booktitle = {Foundations of {{Software Technology}} and {{Theoretical Computer Science}}}, + author = {Raynal, Michel and Schiper, Andr{\'e}}, + editor = {Goos, Gerhard and Hartmanis, Juris and Leeuwen, Jan and Thiagarajan, P. S.}, + year = {1995}, + volume = {1026}, + pages = {180--194}, + publisher = {{Springer Berlin Heidelberg}}, + address = {{Berlin, Heidelberg}}, + doi = {10.1007/3-540-60692-0_48}, + urldate = {2023-06-06}, + isbn = {978-3-540-60692-5 978-3-540-49263-4}, + langid = {english}, + file = {/home/amaury/Zotero/storage/B8UNWUSA/Raynal et Schiper - 1995 - From causal consistency to sequential consistency .pdf} +} + +@techreport{RoseZero2020, + title = {Zero {{Trust Architecture}}}, + author = {Rose, Scott and Borchert, Oliver and Mitchell, Stu and Connelly, Sean}, + year = {2020}, + month = aug, + institution = {{National Institute of Standards and Technology}}, + doi = {10.6028/NIST.SP.800-207}, + urldate = {2023-12-08}, + abstract = {Zero trust (ZT) is the term for an evolving set of cybersecurity paradigms that move defenses from static, network-based perimeters to focus on users, assets, and resources. A zero trust architecture (ZTA) uses zero trust principles to plan industrial and enterprise infrastructure and workflows. Zero trust assumes there is no implicit trust granted to assets or user accounts based solely on their physical or network location (i.e., local area networks versus the internet) or based on asset ownership (enterprise or personally owned). Authentication and authorization (both subject and device) are discrete functions performed before a session to an enterprise resource is established. Zero trust is a response to enterprise network trends that include remote users, bring your own device (BYOD), and cloud-based assets that are not located within an enterpriseowned network boundary. Zero trust focuses on protecting resources (assets, services, workflows, network accounts, etc.), not network segments, as the network location is no longer seen as the prime component to the security posture of the resource. This document contains an abstract definition of zero trust architecture (ZTA) and gives general deployment models and use cases where zero trust could improve an enterprise's overall information technology security posture.}, + langid = {english}, + file = {/home/amaury/Zotero/storage/6PRUAJZ3/Rose et al. - 2020 - Zero Trust Architecture.pdf} +} + +@article{SaitoOptimistic2005, + title = {Optimistic {{Replication}}}, + author = {Saito, Yasushi and Shapiro, Marc}, + year = {2005}, + journal = {ACM Computing Surveys}, + volume = {37}, + number = {1}, + pages = {42}, + doi = {10.1145/1057977.1057980}, + urldate = {2023-06-09}, + abstract = {Data replication is a key technology in distributed systems that enables higher availability and performance. This article surveys optimistic replication algorithms. They allow replica contents to diverge in the short term to support concurrent work practices and tolerate failures in low-quality communication links. The importance of such techniques is increasing as collaboration through wide-area and mobile networks becomes popular.Optimistic replication deploys algorithms not seen in traditional ``pessimistic'' systems. Instead of synchronous replica coordination, an optimistic algorithm propagates changes in the background, discovers conflicts after they happen, and reaches agreement on the final contents incrementally.We explore the solution space for optimistic replication algorithms. This article identifies key challenges facing optimistic replication systems---ordering operations, detecting and resolving conflicts, propagating changes efficiently, and bounding replica divergence---and provides a comprehensive survey of techniques developed for addressing these challenges.}, + langid = {english}, + file = {/home/amaury/Zotero/storage/4WJX5IAN/Saito et Shapiro - 2005 - Optimistic Replication.pdf} +} + +@inproceedings{ShakaramiRefresh2019, + title = {Refresh {{Instead}} of {{Revoke Enhances Safety}} and {{Availability}}: {{A Formal Analysis}}}, + shorttitle = {Refresh {{Instead}} of {{Revoke Enhances Safety}} and {{Availability}}}, + booktitle = {33th {{IFIP Annual Conference}} on {{Data}} and {{Applications Security}} and {{Privacy}} ({{DBSec}})}, + author = {Shakarami, Mehrnoosh and Sandhu, Ravi}, + year = {2019}, + month = jul, + volume = {LNCS-11559}, + pages = {301}, + publisher = {{Springer International Publishing}}, + doi = {10.1007/978-3-030-22479-0_16}, + urldate = {2023-06-09}, + abstract = {Due to inherent delays and performance costs, the decision point in a distributed multi-authority Attribute-Based Access Control (ABAC) system is exposed to the risk of relying on outdated attribute values and policy; which is the safety and consistency problem. This paper formally characterizes three increasingly strong levels of consistency to restrict this exposure. Notably, we recognize the concept of refreshing attribute values rather than simply checking the revocation status, as in traditional approaches. Refresh replaces an older value with a newer one, while revoke simply invalidates the old value. Our lowest consistency level starts from the highest level in prior revocation-based work by Lee and Winslett (LW). Our two higher levels utilize the concept of request time which is absent in LW. For each of our levels we formally show that using refresh instead of revocation provides added safety and availability.}, + langid = {english}, + file = {/home/amaury/Zotero/storage/XQNWKF7H/Shakarami et Sandhu - 2019 - Refresh Instead of Revoke Enhances Safety and Avai.pdf} +} + +@incollection{ShapiroConflictFree2011, + title = {Conflict-{{Free Replicated Data Types}}}, + booktitle = {Stabilization, {{Safety}}, and {{Security}} of {{Distributed Systems}}}, + author = {Shapiro, Marc and Pregui{\c c}a, Nuno and Baquero, Carlos and Zawirski, Marek}, + year = {2011}, + volume = {6976}, + pages = {386--400}, + publisher = {{Springer Berlin Heidelberg}}, + address = {{Berlin, Heidelberg}}, + doi = {10.1007/978-3-642-24550-3_29}, + urldate = {2023-12-08}, + abstract = {Replicating data under Eventual Consistency (EC) allows any replica to accept updates without remote synchronisation. This ensures performance and scalability in large-scale distributed systems (e.g., clouds). However, published EC approaches are ad-hoc and error-prone. Under a formal Strong Eventual Consistency (SEC) model, we study sufficient conditions for convergence. A data type that satisfies these conditions is called a Conflict-free Replicated Data Type (CRDT). Replicas of any CRDT are guaranteed to converge in a self-stabilising manner, despite any number of failures. This paper formalises two popular approaches (state- and operation-based) and their relevant sufficient conditions. We study a number of useful CRDTs, such as sets with clean semantics, supporting both add and remove operations, and consider in depth the more complex Graph data type. CRDT types can be composed to develop large-scale distributed applications, and have interesting theoretical properties.}, + isbn = {978-3-642-24549-7 978-3-642-24550-3}, + langid = {english}, + file = {/home/amaury/Zotero/storage/QK99TF5K/Shapiro et al. - 2011 - Conflict-Free Replicated Data Types.pdf} +} + + +@inproceedings{SinghZeno2009, + author = {Atul Singh and + Pedro Fonseca and + Petr Kuznetsov and + Rodrigo Rodrigues and + Petros Maniatis}, + editor = {Jennifer Rexford and + Emin G{\"{u}}n Sirer}, + title = {Zeno: Eventually Consistent Byzantine-Fault Tolerance}, + booktitle = {Proceedings of the 6th {USENIX} Symposium on Networked Systems Design + and Implementation ({NSDI})}, + pages = {169--184}, + publisher = {{USENIX} Association}, + year = {2009}, + url = {http://www.usenix.org/events/nsdi09/tech/full\_papers/singh/singh.pdf}, + timestamp = {Thu, 12 Nov 2020 16:34:18 +0100}, + biburl = {https://dblp.org/rec/conf/nsdi/SinghFKRM09.bib}, + bibsource = {dblp computer science bibliography, https://dblp.org} +} + +@article{SomasekaramHighAvailability2022, + title = {High-{{Availability Clusters}}: {{A Taxonomy}}, {{Survey}}, and {{Future Directions}}}, + shorttitle = {High-{{Availability Clusters}}}, + author = {Somasekaram, Premathas and Calinescu, Radu and Buyya, Rajkumar}, + year = {2022}, + month = may, + journal = {Journal of Systems and Software}, + volume = {187}, + eprint = {2109.15139}, + primaryclass = {cs, eess}, + pages = {111208}, + issn = {01641212}, + doi = {10.1016/j.jss.2021.111208}, + urldate = {2023-06-06}, + abstract = {The delivery of key services in domains ranging from finance and manufacturing to healthcare and transportation is underpinned by a rapidly growing number of mission-critical enterprise applications. Ensuring the continuity of these complex applications requires the use of software-managed infrastructures called high-availability clusters (HACs). HACs employ sophisticated techniques to monitor the health of key enterprise application layers and of the resources they use, and to seamlessly restart or relocate application components after failures. In this paper, we first describe the manifold uses of HACs to protect essential layers of a critical application and present the architecture of high availability clusters. We then propose a taxonomy that covers all key aspects of HACs -- deployment patterns, application areas, types of cluster, topology, cluster management, failure detection and recovery, consistency and integrity, and data synchronisation; and we use this taxonomy to provide a comprehensive survey of the end-to-end software solutions available for the HAC deployment of enterprise applications. Finally, we discuss the limitations and challenges of existing HAC solutions, and we identify opportunities for future research in the area.}, + archiveprefix = {arxiv}, + keywords = {{Computer Science - Distributed, Parallel, and Cluster Computing},Computer Science - Networking and Internet Architecture,Electrical Engineering and Systems Science - Systems and Control}, + file = {/home/amaury/Zotero/storage/K3LQZLC8/Somasekaram et al. - 2022 - High-Availability Clusters A Taxonomy, Survey, an.pdf;/home/amaury/Zotero/storage/B4KCP9BG/2109.html} +} + +@inproceedings{TsengDistributed2019, + title = {Distributed {{Causal Memory}} in the {{Presence}} of {{Byzantine Servers}}}, + booktitle = {{{IEEE}} 18th {{International Symposium}} on {{Network Computing}} and {{Applications}} ({{NCA}})}, + author = {Tseng, Lewis and Wang, Zezhi and Zhao, Yajie and Pan, Haochen}, + year = {2019}, + month = sep, + pages = {1--8}, + issn = {2643-7929}, + doi = {10.1109/NCA.2019.8935059}, + abstract = {We study distributed causal shared memory (or distributed read/write objects) in the client-server model over asynchronous message-passing networks in which some servers may suffer Byzantine failures. Since Ahamad et al. proposed causal memory in 1994, there have been abundant research on causal storage. Lately, there is a renewed interest in enforcing causal consistency in large-scale distributed storage systems (e.g., COPS, Eiger, Bolt-on). However, to the best of our knowledge, the fault-tolerance aspect of causal memory is not well studied, especially on the tight resilience bound. In our prior work, we showed that 2 f+1 servers is the tight bound to emulate crash-tolerant causal shared memory when up to f servers may crash. In this paper, we adopt a typical model considered in many prior works on Byzantine-tolerant storage algorithms and quorum systems. In the system, up to f servers may suffer Byzantine failures and any number of clients may crash. We constructively present an emulation algorithm for Byzantine causal memory using 3 f+1 servers. We also prove that 3 f+1 is necessary for tolerating up to f Byzantine servers. In other words, we show that 3 f+1 is a tight bound. For evaluation, we implement our algorithm in Golang and compare their performance with two state-of-the-art fault-tolerant algorithms that ensure atomicity in the Google Cloud Platform.}, + keywords = {asynchrony,Byzantine faults,causal memory,Computer crashes,Consensus protocol,distributed storage system,Emulation,evaluation,Fault tolerance,Fault tolerant systems,History,Servers,tight condition}, + file = {/home/amaury/Zotero/storage/DDV34ULW/8935059.html} +} + +@article{VanDerLindePractical2020, + title = {Practical Client-Side Replication: Weak Consistency Semantics for Insecure Settings}, + shorttitle = {Practical Client-Side Replication}, + author = {Van Der Linde, Albert and Leit{\~a}o, Jo{\~a}o and Pregui{\c c}a, Nuno}, + year = {2020}, + month = aug, + journal = {Proceedings of the VLDB Endowment}, + volume = {13}, + number = {12}, + pages = {2590--2605}, + issn = {2150-8097}, + doi = {10.14778/3407790.3407847}, + urldate = {2023-06-06}, + abstract = {Client-side replication and direct client-to-client synchronization can be used to create highly available, low-latency interactive applications. Causal consistency, the strongest available consistency model under network partitions, is an attractive consistency model for these applications.}, + langid = {english}, + file = {/home/amaury/Zotero/storage/5TJ3SA56/Van Der Linde et al. - 2020 - Practical client-side replication weak consistenc.pdf} +} + +@article{YanFlexible2017, + title = {Flexible {{Data Access Control Based}} on {{Trust}} and {{Reputation}} in {{Cloud Computing}}}, + author = {Yan, Zheng and Li, Xueyun and Wang, Mingjun and Vasilakos, Athanasios V.}, + year = {2017}, + month = jul, + journal = {IEEE Transactions on Cloud Computing}, + volume = {5}, + number = {3}, + pages = {485--498}, + issn = {2168-7161}, + doi = {10.1109/TCC.2015.2469662}, + urldate = {2023-12-08}, + abstract = {Cloud computing offers a new way of services and has become a popular service platform. Storing user data at a cloud data center greatly releases storage burden of user devices and brings access convenience. Due to distrust in cloud service providers, users generally store their crucial data in an encrypted form. But in many cases, the data need to be accessed by other entities for fulfilling an expected service, e.g., an eHealth service. How to control personal data access at cloud is a critical issue. Various application scenarios request flexible control on cloud data access based on data owner policies and application demands. Either data owners or some trusted third parties or both should flexibly participate in this control. However, existing work hasn't yet investigated an effective and flexible solution to satisfy this demand. On the other hand, trust plays an important role in data sharing. It helps overcoming uncertainty and avoiding potential risks. But literature still lacks a practical solution to control cloud data access based on trust and reputation. In this paper, we propose a scheme to control data access in cloud computing based on trust evaluated by the data owner and/or reputations generated by a number of reputation centers in a flexible manner by applying Attribue-Based Encryption and Proxy Re-Encryption. We integrate the concept of context-aware trust and reputation evaluation into a cryptographic system in order to support various control scenarios and strategies. The security and performance of our scheme are evaluated and justified through extensive analysis, security proof, comparison and implementation. The results show the efficiency, flexibility and effectiveness of our scheme for data access control in cloud computing.}, + langid = {english}, + file = {/home/amaury/Zotero/storage/EGDZNP8U/Yan et al. - 2017 - Flexible Data Access Control Based on Trust and Re.pdf} +} + + +@misc{Yjs2023, + title = {Yjs/yjs: Shared data types for building collaborative software}, + year = {2023}, + month = dec, + urldate = {2023-12-10}, + abstract = {Shared data types for building collaborative software}, + howpublished= {https://github.com/yjs/yjs}, + keywords = {collaboration,collaborative-editing,crdt,decentralized,offline-first,p2p,peer-to-peer,realtime,shared-editing,yjs} +} diff --git a/docs/sujetThese/sujet-cifre.tex b/docs/sujetThese/sujet-cifre.tex new file mode 100644 index 0000000..f767dd2 --- /dev/null +++ b/docs/sujetThese/sujet-cifre.tex @@ -0,0 +1,380 @@ +\documentclass[11pt]{article} +\usepackage{graphicx} +\usepackage{paralist} %% needed for compact lists +\usepackage[normalem]{ulem} %% needed by strike +\usepackage[urlcolor=blue,colorlinks=true,breaklinks]{hyperref} +\usepackage[utf8x]{inputenc} %% char encoding +\usepackage{framed} %% frame multipages +\usepackage{fullpage} +\usepackage{a4wide} +\usepackage{mathpazo} %% math & rm +\linespread{1.05} %% Palatino needs more leading (space between lines) +\usepackage[scaled]{helvet} %% ss +\usepackage{courier} %% tt +\normalfont +\usepackage[T1]{fontenc} +\usepackage[english]{babel} %% en englais +\usepackage{xspace} %% gestion des espaces après une macro +\usepackage{listings} +\lstset{breaklines} +\lstset{language=java} +\lstset{escapechar=§} +\usepackage{xcolor} + + +\usepackage{comment} %%%% comment env + +%%%%%%%%%%%%%% +%% fancy et brouillon +%% Date en haut de page +%% A commenter pour la version finale +\usepackage[margin=2.5cm]{geometry} +\usepackage{fancyhdr} +%% Header and footer +\fancyhf{} %%clear head and footer +\fancyhead[C]{\thepage} %%draft +\renewcommand{\headrulewidth}{0pt} \renewcommand{\footrulewidth}{2pt} +\fancyfoot[C]{\textsc{SUJETCOURT}} +\fancypagestyle{premiere}{%% première page +\fancyhf{} %%clear head and footer +\fancyfoot[L]{\textbf{LIF}} +\renewcommand{\headrulewidth}{0pt} \renewcommand{\footrulewidth}{2pt} +\fancyfoot[C]{\textsc{SUJETCOURT}} +\fancyhead[C]{}%%\includegraphics[scale=0.25]{logo-lif.png}} %%UFR +} +\fancypagestyle{notete}{%% première page +\fancyhf{} %%clear head and footer +\renewcommand{\headrulewidth}{0pt} \renewcommand{\footrulewidth}{2pt} +\fancyfoot[C]{\textsc{Sujet}} +} + +\newcommand{\myversion}{\textit{version du \today{}}} + +\pagestyle{plain} + +\title{Weak Consistency for zero-trust cloud} +\author{Research Subject} +\begin{document} + +\date{Emmanuel Godard (LIS) -- Corentin Travers (LIS)\\emmanuel.godard@lis-lab.fr et corentin.travers@lis-lab.fr} +\maketitle + +\textbf{Keywords:} Cloud, Security by design, Distributed Structures and Algorithms, Weak Consistencies, Byzantine systems + +\section*{Summary} + +Real-time collaborative applications are increasingly utilized in the context +of remote work systems. These applications often rely on centralized client-server +architectures, which pose security and privacy challenges. Data is stored on a +centralized server, requiring users to trust a third party with their data management. +Additionally, these architectures are often vulnerable to denial-of-service attacks +and do not ensure data confidentiality. + +To address these issues, we propose exploring information exchange solutions based +on zero-trust and/or peer-to-peer architectures that eliminate the need for trusted +third parties. These solutions would offer high-level security while ensuring system +resilience. To maintain strong performance, especially in high availability scenarios, +weak consistency models are frequently employed. + +In this context, we propose studying weak consistency properties applied to +cloud-related challenges. Initially, we will conduct a state-of-the-art review of +Byzantine fault-tolerant solutions without cryptographic primitives, along with +existing implementations (WP1). A second step will involve proposing more efficient +solutions using cryptographic primitives (WP2). Finally, a proof-of-concept will be +developed for a key-value storage solution using the algorithms selected in the +previous stages (WP3). + +\pagebreak + +\section*{Problematic} + +Since the pioneering work in the 1980s by Lamport \cite{LamportInterprocess1986} +and Misra \cite{MisraAxioms1986}, replication management has been central to digital +developments in terms of high availability. One of the fundamental challenges is +to provide application developers with an abstraction of replicated memory that is +both easy to use and enables flexible and fault-tolerant utilization of distributed resources. + +This line of research has led to the concept of \textit{data consistency}, with its +various forms tailored to suit the best compromises in usage and specificities of each application. + +The current trend towards cloud-based deployment of software applications entails significant +changes in usage patterns and development approaches for new applications. With the advent +of user-friendly cloud services where infrastructure maintenance is outsourced to a provider, +there's a noticeable centralization of resources. This reintroduces classic security issues, +such as the need for trust/sovereignty or the risk of a \textit{single point of failure} (SPOF). + +In response, new approaches termed \textit{zero-trust} have been proposed to continue using +cloud resources without depending on any specific provider. These approaches require both +multi-provider architectures and advanced cryptographic techniques. + +\medskip + +From a programmer's perspective, it's often advantageous to consider cloud-based applications +as a single centralized system. This requires that the data structures used exhibit a +property known as \textit{strong consistency}. + +In real-world conditions, servers may have to endure very challenging operating conditions. +It is well-known to both theorists and practitioners, through the CAP theorem +(Consistency, Availability, Partition tolerance), that operational compromises are often +necessary. Specifically, if strong consistency is desired, the computation time is proportional +to the latency of \textbf{the entire} network, which in practice reduces availability. + +Referring to the CAP theorem, applying strong consistency makes it impossible to implement +a highly resilient system while providing a highly available application. Yet, both of +these aspects can be essential in building a collaborative application. + +The peer-to-peer approach indeed implies significant system resilience against failures. +Replicas may become disconnected from one another and experience significant and uneven latency +differences. The lack of control over the client's system and execution environment compels +us to envision systems capable of withstanding the worst possible scenarios. + +In the context of real-time collaboration applications, the need for high availability is +intimately tied to the requirement of enabling different replicas to access the same +shared data for real-time work. It would therefore be unacceptable to introduce significant +latencies between two modifications. + +Given the impossibility of fully satisfying both strong consistency and high availability, +we turn to the study of weak consistencies, specifically focusing on convergence. We define +a system as convergent if it adheres to the following property: + +If replicas cease to propose modifications, then these same replicas must eventually +reach a consistent state. + +Convergence (or Eventual Consistency) has been extensively studied, leading to the development +of various distributed data structures that aim to uphold convergence. However, convergence +alone does not resolve our problem. This property does not guarantee behaviors during execution, +where inconsistency within the system is permissible due to convergence. Simply achieving +eventual consistency in a document does not suffice to make it a satisfactory collaborative +editing application. We also need mechanisms to resolve conflicts, which are inevitable in +collaborative approaches. This conflict resolution must be carried out optimally to maximize +the preservation of the meaning intended by each modifying replica. + +These issues have indeed been extensively studied, and the solutions proposed, particularly +suitable in our context, are the \textit{Replicated Data Types} (RDTs). There are two classes of RDTs: + +Commutative Replicated Data Types (CmRDTs): Operations on these types yield the same result +regardless of the order of their local executions. + +Convergent Replicated Data Types (CvRDTs): These types, for example, a system where data aims +to continuously grow, converge towards a maximal structure. + +Both classes fall under the umbrella term of Conflict-free Replicated Data Types (CRDTs) and are +actually equivalent to each other \cite{ShapiroConflictFree2011}. +CRDTs provide a powerful framework for building distributed applications that require high availability +and eventual consistency. By ensuring that operations are commutative and can be merged across +eplicas without conflicts, CRDTs enable efficient conflict resolution and convergence of data +across distributed systems. +The study of CRDTs has significantly advanced our ability to design collaborative and resilient +distributed applications, offering a practical approach to dealing with the challenges posed by real-time +collaboration over unreliable and latency-prone networks. + +\medskip + +Furthermore, to provide truly secure solutions in a zero-trust context, the most challenging operational +conditions to consider are when servers or participating clients have been compromised and do not +strictly adhere to the protocol. In the literature, this is referred to as Byzantine behavior. + +Given these difficult constraints of availability and security, ensuring strong consistency can be +very computationally and time-intensive. Application requirements are sometimes not compatible with +such operational conditions. Therefore, it becomes necessary to consider data with properties of +so-called \textit{weak consistency}. + +Weak consistency models, such as eventual consistency offered by CRDTs, become valuable in such scenarios. +These models prioritize availability and partition tolerance while allowing for some degree of +inconsistency that can be resolved over time. They are designed to cope with the challenges of distributed +systems operating under non-ideal conditions, including the presence of Byzantine faults. + +In zero-trust environments where malicious behaviors are a constant threat, adopting weak consistency models +can strike a balance between functionality, security, and operational feasibility. They provide pragmatic +solutions for building resilient and secure distributed applications that can withstand the challenges posed +by compromised nodes and unreliable network conditions. + +\section*{State of the art} + +The landscape of weak consistency properties is relatively complex, with three major families of weak +consistencies identified \cite{Raynal18}, \cite{MPBook}: + +\begin{itemize} + \item Serializability + \item Causal Consistency + \item Eventual Strong Consistency +\end{itemize} + +While eventual strong consistency is typically desired for collaborative applications, it is particularly +costly to achieve. Serializability, on the other hand, is simpler to implement but may result in transactions +that do not complete, requiring application-level error handling. + +Causal consistency maintains the causal order perceived by each process and generally allows for the efficient +implementation of higher-level data structures. + +For a comprehensive overview of these weak consistency models, readers can refer to M. Perrin's detailed +mapping \cite{MPBook}. Each of these models offers a different trade-off between consistency guarantees, +implementation complexity, and operational efficiency, making them suitable for different use cases and +application requirements. Understanding and selecting the appropriate weak consistency model is crucial for +designing effective and robust distributed systems, especially in the context of collaborative applications +operating in dynamic and unreliable environments. + +\subsection*{Algorithmic Results} + +The earliest work on secure collaborative tools in a high availability context dates back to 2009; however, +more systematic research on weak consistency security is quite recent. In 2009, Sing et al. introduced the +Zeno system, which was the first to propose a Byzantine algorithm favoring availability over strong consistency. +It provides Byzantine fault tolerance with potentially strong consistency \cite{SinghZeno2009}. The algorithm +experimentally demonstrated better availability performance compared to classical Byzantine algorithms. + +Currently, there are primarily partial studies and solutions for causal consistency \cite{TsengDistributed2019} +and \cite{VanDerLindePractical2020}. Tseng et al. present exact computability bounds within a Byzantine +framework on one hand and provide an algorithm whose performance is compared with that of the Google Compute +platform. Van Der Linde et al. introduce a peer-to-peer system resilient to Byzantine attacks that offers causal +consistency guarantees. Their evaluation suggests that despite a peer-to-peer architecture, performance, especially +in terms of latency, is very good compared to a traditional client-server architecture. + +In addition to these algorithms, Misra and Kshemkalyani demonstrated in \cite{MisraByzantine2021} that in an +asynchronous context, it is not possible to achieve causal consistency even with a single Byzantine participant. + +One of the notable features of \cite{VanDerLindePractical2020} is its exploration of Byzantine failures within +the context of weak consistencies. A peer-to-peer system like that in \cite{MisraByzantine2021} prompts new +considerations where a participant leverages information from lower layers of replication to create attacks at +the application level. + +Applying weak consistency criteria alone doesn't fully address the scope of our concerns. The cloud context +raises significant questions regarding data centralization and governance, with a market dominated by a few +major players to whom users must blindly entrust their data, posing substantial challenges to privacy and data +sovereignty. + +In this context, integrating the notion of a zero-trust cloud is essential, anchoring our discussions in a +relevant approach from both industrial and regulatory perspectives. Zero-trust, as defined by NIST in SP 800-207 +\cite{RoseZero2020}, is a security model that trusts no one and makes no assumptions about network security. It +helps guard against malicious behaviors by intermediaries, reducing the attack surface and confining Byzantine +behaviors solely to clients who have access to the data. + +Certainly, the consideration of data-centric security alongside communication security is crucial. Adopting +"Data-Centric" approaches involves treating data itself as a dynamic entity within the system, assigning it +processes for access control and monitoring \cite{BayukDatacentric2009}. These issues represent growing concerns +and are addressed by state and inter-state actors, exemplified by NATO's stance on these matters through +STANAG 4774 and 4778. These topics have been extensively studied since the 2010s with works such as +\cite{GoyalAttributebased2006, MullerDistributed2009} defining solutions for attribute-based encryption, +issuing encryption keys based on rights to establish security policies. Other works like \cite{YanFlexible2017} +propose cloud-adapted solutions based on more flexible architectures with finer granularity in defining rights. + +However, concerning zero-trust and data-centric security aspects, there is currently no academic consensus +on the formalization of these notions. These terms are subject to various interpretations, necessitating a +formal specification to understand which properties need to be satisfied to achieve weak consistency within +a zero-trust context. + +\subsection*{Existing Implementations} + +Currently, there are ongoing projects aimed at implementing weak consistency protocols for real-time collaborative +applications. One notable project is yjs \cite{Yjs2023}, which implements the YATA protocol \cite{NicolaescuRealTime2016}. +This protocol ensures strong convergence (or SEC, according to the Perrin reference) through a CRDT +(Conflict-free Replicated Data Type) system. + +On the other hand, older projects like Etherpad use simpler conflict resolution solutions, also ensuring strong +convergence but employing more complex algorithmic operations in terms of memory and computation time compared +to CRDTs \cite{AppJetEtherpad2011}. + +\section*{Goals} + +The objectives of this thesis encompass studying the three types of weak consistency in a Byzantine setting and +defining efficient Byzantine algorithms for their implementation. Given that causal consistency is already well-studied, +the main focus of this thesis will be on the other two types of weak consistency. + +The first stage (WP1) will involve studying Byzantine solutions without cryptographic primitives or with reasonably +cost-effective primitives, specifically excluding homomorphic computation. An analysis of existing implementations will +be conducted to determine the guarantees provided by these solutions within the vocabulary of weak consistencies. + +The second stage (WP2) will focus on developing more efficient solutions using cryptographic primitives that require +advanced secret-sharing and/or homomorphic computation. + +A final stage (WP3) will involve producing a proof-of-concept key/value storage solution using the algorithms +selected in the preceding stages. + +\section*{Methodology and Planning} + +A detailed review of distributed computing models, particularly focusing on solutions for causal consistency, +will be conducted to establish the set of theoretical and practical assumptions underlying these solutions. +Concurrently, in collaboration with Parsec, a list of attacks on weakly consistent peer-to-peer architectures +will be compiled. The emphasis will be on generating new knowledge, including novel solutions compared to the +current state of the art, as well as identifying new attack vectors. + +The algorithms will undergo formal validation initially, followed by the development of a proof of concept. + +WP1 will take place in 2024, WP2 in 2025, and WP3 in ZO26. + +\section*{Monitoring and Exchange Terms} + +Le doctorant participe aux réunions hebdomadaires de suivi de +l'entreprise Parsec. Les partenaires se rencontreront tous les trois +mois pour un point d'avancée sur les travaux. + +Il participera également aux réunions physiques de +l'entreprise tous les 6 mois. + +\section*{Material resources} + +The Phd student will participate in Parsec's weekly progress meetings. Additionally, partners will convene +every three months for project status updates. + +Furthermore, the student will attend in-person meetings at the company every six months. + +\section*{Expected Benefits} + +On the LIS laboratory side, the expected outcomes include the following scientific publications: + +\begin{compactitem} +\item State-of-the-art review and synthesis concerning Byzantine fault tolerance in weak consistencies. +\item Proposals and proofs of new algorithms within the zero-trust context. +\end{compactitem} + +For Parsec, the expected deliverables comprise a mini-model of cloud synchronization and collaboration, +a proof of concept for the aforementioned algorithms, and consultancy and expertise in the scientific +development of products created by Parsec. + +\section*{Team} + +\subsection*{Distributed Algorithmics Team (DALGO)} + +The Distributed Algorithms team, led by Arnaud Labourel, is part of the Laboratory of Computer +Science and Systems (LIS CNRS UMR 7020). This research team is internationally recognized at the +highest level, comprising 8 permanent members whose interests span from reliable distributed +algorithms and confidentiality in distributed systems to communication networks, graph algorithms, +mobile agents, and IoT (Internet of Things). + +\subsection*{Supervisors} + +\textbf{Emmanuel Godard} is a professor at Aix-Marseille University. His research interests + primarily focus on understanding and maximizing decentralization (in a broad sense) in + distributed systems. He is an expert in distributed algorithms and computability. + +\textbf{Corentin Travers} is an Associate Professor at Aix-Marseille University. His research + interests focus on robust and efficient distributed algorithms for shared-memory systems or + distributed networks. He is an expert in distributed algorithmics and complexity. + +\textbf{Marcos Medrano} is an R\&D engineer at Parsec. He holds a master's degree in research + in computer science and applied mathematics. Marcos is responsible for the development + strategy of the Parsec product and facilitates collaboration between engineers and academic stakeholders. + +\subsection*{Candidate Choice} + +The DALGO team is involved in the "Reliability and Computer Security" Master's program at Aix-Marseille +University. This master's track is certified as \textit{SecNumEdu} by ANSSI +(National Cybersecurity Agency of France). In autumn 2022, a project in collaboration with the company +Parsec was presented to all master's students. Following this call for applications, Mr. Amaury Joly +was selected for a preliminary 6-month research internship on the topic of weak consistency at the +LIS laboratory. + +Mr. Amaury Joly has achieved excellent academic results, earning a good mention in the master's +program. Additionally, he possesses a strong dual theoretical and technical profile, with a keen +motivation for research activities related to cloud security. He is the ideal candidate for such +a research topic. + +{\footnotesize + \nocite{*} + + \bibliography{sujet-cifre.bib} + \bibliographystyle{alpha} +} + +% LaTeX2e code generated by txt2tags 3.4 (http://txt2tags.org) +% cmdline: txt2tags -t tex sujet-cifre.t2t +\end{document} diff --git a/out/docs/rapport/rapport_etat_art/images/local1/local1.latex b/out/docs/rapport/rapport_etat_art/images/local1/local1.latex new file mode 100644 index 0000000..3ce4dac --- /dev/null +++ b/out/docs/rapport/rapport_etat_art/images/local1/local1.latex @@ -0,0 +1,43 @@ +% generated by Plantuml 1.2022.7 +\definecolor{plantucolor0000}{RGB}{24,24,24} +\definecolor{plantucolor0001}{RGB}{0,0,0} +\definecolor{plantucolor0002}{RGB}{226,226,240} +\begin{tikzpicture}[yscale=-1 +,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt} +,pstyle1/.style={color=plantucolor0000,fill=plantucolor0002,line width=0.5pt} +,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt} +,pstyle4/.style={color=plantucolor0000,line width=1.0pt} +] +\draw[pstyle0] (23pt,84.0679pt) -- (23pt,311.01pt); +\draw[pstyle0] (134.7162pt,84.0679pt) -- (134.7162pt,311.01pt); +\draw[pstyle0] (208.3289pt,84.0679pt) -- (208.3289pt,311.01pt); +\draw[pstyle0] (368.0101pt,84.0679pt) -- (368.0101pt,311.01pt); +\node at (5pt,65pt)[below right,color=black]{Bob}; +\draw[pstyle1] (23.3692pt,13.5pt) ellipse (8pt and 8pt); +\draw[color=plantucolor0000,line width=0.5pt] (23.3692pt,21.5pt) -- (23.3692pt,48.5pt)(10.3692pt,29.5pt) -- (36.3692pt,29.5pt)(23.3692pt,48.5pt) -- (10.3692pt,63.5pt)(23.3692pt,48.5pt) -- (36.3692pt,63.5pt); +\draw[pstyle1] (100.7162pt,55pt) arc (180:270:5pt) -- (105.7162pt,50pt) -- (164.3289pt,50pt) arc (270:360:5pt) -- (169.3289pt,55pt) -- (169.3289pt,78.0679pt) arc (0:90:5pt) -- (164.3289pt,83.0679pt) -- (105.7162pt,83.0679pt) arc (90:180:5pt) -- (100.7162pt,78.0679pt) -- cycle; +\node at (107.7162pt,57pt)[below right,color=black]{Clavier}; +\draw[pstyle1] (179.3289pt,55pt) arc (180:270:5pt) -- (184.3289pt,50pt) -- (233.3289pt,50pt) arc (270:360:5pt) -- (238.3289pt,55pt) -- (238.3289pt,78.0679pt) arc (0:90:5pt) -- (233.3289pt,83.0679pt) -- (184.3289pt,83.0679pt) arc (90:180:5pt) -- (179.3289pt,78.0679pt) -- cycle; +\node at (186.3289pt,57pt)[below right,color=black]{Ecran}; +\draw[pstyle1] (330.0101pt,55pt) arc (180:270:5pt) -- (335.0101pt,50pt) -- (402.2546pt,50pt) arc (270:360:5pt) -- (407.2546pt,55pt) -- (407.2546pt,78.0679pt) arc (0:90:5pt) -- (402.2546pt,83.0679pt) -- (335.0101pt,83.0679pt) arc (90:180:5pt) -- (330.0101pt,78.0679pt) -- cycle; +\node at (337.0101pt,57pt)[below right,color=black]{Système}; +\draw[pstyle3] (123.0226pt,113.7739pt) -- (133.0226pt,117.7739pt) -- (123.0226pt,121.7739pt) -- (127.0226pt,117.7739pt) -- cycle; +\draw[pstyle4] (23.3692pt,117.7739pt) -- (129.0226pt,117.7739pt); +\node at (30.3692pt,98.0679pt)[below right,color=black]{Ecrit "Hello"}; +\draw[pstyle3] (356.6323pt,145.4799pt) -- (366.6323pt,149.4799pt) -- (356.6323pt,153.4799pt) -- (360.6323pt,149.4799pt) -- cycle; +\draw[pstyle4] (135.0226pt,149.4799pt) -- (362.6323pt,149.4799pt); +\node at (142.0226pt,129.7739pt)[below right,color=black]{Envoie "Hello"}; +\draw[pstyle4] (368.6323pt,198.892pt) -- (410.6323pt,198.892pt); +\draw[pstyle4] (410.6323pt,198.892pt) -- (410.6323pt,211.892pt); +\draw[pstyle4] (369.6323pt,211.892pt) -- (410.6323pt,211.892pt); +\draw[pstyle3] (379.6323pt,207.892pt) -- (369.6323pt,211.892pt) -- (379.6323pt,215.892pt) -- (375.6323pt,211.892pt) -- cycle; +\node at (375.6323pt,161.4799pt)[below right,color=black]{Accepte la saisie et}; +\node at (375.6323pt,179.186pt)[below right,color=black]{modifie le document}; +\draw[pstyle3] (219.8289pt,257.304pt) -- (209.8289pt,261.304pt) -- (219.8289pt,265.304pt) -- (215.8289pt,261.304pt) -- cycle; +\draw[pstyle4] (213.8289pt,261.304pt) -- (367.6323pt,261.304pt); +\node at (225.8289pt,223.892pt)[below right,color=black]{Afiche le document}; +\node at (225.8289pt,241.598pt)[below right,color=black]{mis à jour}; +\draw[pstyle3] (34.3692pt,289.01pt) -- (24.3692pt,293.01pt) -- (34.3692pt,297.01pt) -- (30.3692pt,293.01pt) -- cycle; +\draw[pstyle4] (28.3692pt,293.01pt) -- (207.8289pt,293.01pt); +\node at (40.3692pt,273.304pt)[below right,color=black]{Regarde}; +\end{tikzpicture} diff --git a/out/docs/rapport/rapport_etat_art/images/local2/local1.latex b/out/docs/rapport/rapport_etat_art/images/local2/local1.latex new file mode 100644 index 0000000..f738aad --- /dev/null +++ b/out/docs/rapport/rapport_etat_art/images/local2/local1.latex @@ -0,0 +1,64 @@ +% generated by Plantuml 1.2022.7 +\definecolor{plantucolor0000}{RGB}{24,24,24} +\definecolor{plantucolor0001}{RGB}{0,0,0} +\definecolor{plantucolor0002}{RGB}{226,226,240} +\begin{tikzpicture}[yscale=-1 +,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt} +,pstyle1/.style={color=plantucolor0000,fill=plantucolor0002,line width=0.5pt} +,pstyle2/.style={color=plantucolor0000,line width=0.5pt} +,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt} +,pstyle4/.style={color=plantucolor0000,line width=1.0pt} +] +\draw[pstyle0] (23pt,84.0679pt) -- (23pt,456.5401pt); +\draw[pstyle0] (72.7385pt,84.0679pt) -- (72.7385pt,456.5401pt); +\draw[pstyle0] (142.6385pt,84.0679pt) -- (142.6385pt,456.5401pt); +\draw[pstyle0] (230.3112pt,84.0679pt) -- (230.3112pt,456.5401pt); +\draw[pstyle0] (308.9839pt,84.0679pt) -- (308.9839pt,456.5401pt); +\draw[pstyle0] (468.6651pt,84.0679pt) -- (468.6651pt,456.5401pt); +\node at (5pt,65pt)[below right,color=black]{Bob}; +\draw[pstyle1] (23.3692pt,13.5pt) ellipse (8pt and 8pt); +\draw[pstyle2] (23.3692pt,21.5pt) -- (23.3692pt,48.5pt)(10.3692pt,29.5pt) -- (36.3692pt,29.5pt)(23.3692pt,48.5pt) -- (10.3692pt,63.5pt)(23.3692pt,48.5pt) -- (36.3692pt,63.5pt); +\node at (51.7385pt,65pt)[below right,color=black]{Alice}; +\draw[pstyle1] (73.1885pt,13.5pt) ellipse (8pt and 8pt); +\draw[pstyle2] (73.1885pt,21.5pt) -- (73.1885pt,48.5pt)(60.1885pt,29.5pt) -- (86.1885pt,29.5pt)(73.1885pt,48.5pt) -- (60.1885pt,63.5pt)(73.1885pt,48.5pt) -- (86.1885pt,63.5pt); +\draw[pstyle1] (104.6385pt,55pt) arc (180:270:5pt) -- (109.6385pt,50pt) -- (177.3112pt,50pt) arc (270:360:5pt) -- (182.3112pt,55pt) -- (182.3112pt,78.0679pt) arc (0:90:5pt) -- (177.3112pt,83.0679pt) -- (109.6385pt,83.0679pt) arc (90:180:5pt) -- (104.6385pt,78.0679pt) -- cycle; +\node at (111.6385pt,57pt)[below right,color=black]{Clavier1}; +\draw[pstyle1] (192.3112pt,55pt) arc (180:270:5pt) -- (197.3112pt,50pt) -- (264.9839pt,50pt) arc (270:360:5pt) -- (269.9839pt,55pt) -- (269.9839pt,78.0679pt) arc (0:90:5pt) -- (264.9839pt,83.0679pt) -- (197.3112pt,83.0679pt) arc (90:180:5pt) -- (192.3112pt,78.0679pt) -- cycle; +\node at (199.3112pt,57pt)[below right,color=black]{Clavier2}; +\draw[pstyle1] (279.9839pt,55pt) arc (180:270:5pt) -- (284.9839pt,50pt) -- (333.9839pt,50pt) arc (270:360:5pt) -- (338.9839pt,55pt) -- (338.9839pt,78.0679pt) arc (0:90:5pt) -- (333.9839pt,83.0679pt) -- (284.9839pt,83.0679pt) arc (90:180:5pt) -- (279.9839pt,78.0679pt) -- cycle; +\node at (286.9839pt,57pt)[below right,color=black]{Ecran}; +\draw[pstyle1] (430.6651pt,55pt) arc (180:270:5pt) -- (435.6651pt,50pt) -- (502.9095pt,50pt) arc (270:360:5pt) -- (507.9095pt,55pt) -- (507.9095pt,78.0679pt) arc (0:90:5pt) -- (502.9095pt,83.0679pt) -- (435.6651pt,83.0679pt) arc (90:180:5pt) -- (430.6651pt,78.0679pt) -- cycle; +\node at (437.6651pt,57pt)[below right,color=black]{Système}; +\draw[pstyle3] (131.4748pt,113.7739pt) -- (141.4748pt,117.7739pt) -- (131.4748pt,121.7739pt) -- (135.4748pt,117.7739pt) -- cycle; +\draw[pstyle4] (23.3692pt,117.7739pt) -- (137.4748pt,117.7739pt); +\node at (30.3692pt,98.0679pt)[below right,color=black]{Ecrit "Hello"}; +\draw[pstyle3] (457.2873pt,145.4799pt) -- (467.2873pt,149.4799pt) -- (457.2873pt,153.4799pt) -- (461.2873pt,149.4799pt) -- cycle; +\draw[pstyle4] (143.4748pt,149.4799pt) -- (463.2873pt,149.4799pt); +\node at (150.4748pt,129.7739pt)[below right,color=black]{Envoie "Hello"}; +\draw[pstyle3] (320.4839pt,194.892pt) -- (310.4839pt,198.892pt) -- (320.4839pt,202.892pt) -- (316.4839pt,198.892pt) -- cycle; +\draw[pstyle4] (314.4839pt,198.892pt) -- (468.2873pt,198.892pt); +\node at (326.4839pt,161.4799pt)[below right,color=black]{Afiche le document}; +\node at (326.4839pt,179.186pt)[below right,color=black]{mis à jour}; +\draw[pstyle3] (34.3692pt,226.598pt) -- (24.3692pt,230.598pt) -- (34.3692pt,234.598pt) -- (30.3692pt,230.598pt) -- cycle; +\draw[pstyle4] (28.3692pt,230.598pt) -- (308.4839pt,230.598pt); +\node at (40.3692pt,210.892pt)[below right,color=black]{Regarde "Hello"}; +\draw[pstyle3] (84.1885pt,258.304pt) -- (74.1885pt,262.304pt) -- (84.1885pt,266.304pt) -- (80.1885pt,262.304pt) -- cycle; +\draw[pstyle4] (78.1885pt,262.304pt) -- (308.4839pt,262.304pt); +\node at (90.1885pt,242.598pt)[below right,color=black]{Regarde "Hello"}; +\draw[pstyle3] (219.1476pt,290.01pt) -- (229.1476pt,294.01pt) -- (219.1476pt,298.01pt) -- (223.1476pt,294.01pt) -- cycle; +\draw[pstyle4] (73.1885pt,294.01pt) -- (225.1476pt,294.01pt); +\node at (80.1885pt,274.304pt)[below right,color=black]{Ecrit "World"}; +\draw[pstyle3] (457.2873pt,321.716pt) -- (467.2873pt,325.716pt) -- (457.2873pt,329.716pt) -- (461.2873pt,325.716pt) -- cycle; +\draw[pstyle4] (231.1476pt,325.716pt) -- (463.2873pt,325.716pt); +\node at (238.1476pt,306.01pt)[below right,color=black]{Envoie "World"}; +\draw[pstyle3] (320.4839pt,371.1281pt) -- (310.4839pt,375.1281pt) -- (320.4839pt,379.1281pt) -- (316.4839pt,375.1281pt) -- cycle; +\draw[pstyle4] (314.4839pt,375.1281pt) -- (468.2873pt,375.1281pt); +\node at (326.4839pt,337.716pt)[below right,color=black]{Afiche le document}; +\node at (326.4839pt,355.4221pt)[below right,color=black]{mis à jour}; +\draw[pstyle3] (34.3692pt,402.8341pt) -- (24.3692pt,406.8341pt) -- (34.3692pt,410.8341pt) -- (30.3692pt,406.8341pt) -- cycle; +\draw[pstyle4] (28.3692pt,406.8341pt) -- (308.4839pt,406.8341pt); +\node at (40.3692pt,387.1281pt)[below right,color=black]{Regarde "HelloWorld"}; +\draw[pstyle3] (84.1885pt,434.5401pt) -- (74.1885pt,438.5401pt) -- (84.1885pt,442.5401pt) -- (80.1885pt,438.5401pt) -- cycle; +\draw[pstyle4] (78.1885pt,438.5401pt) -- (308.4839pt,438.5401pt); +\node at (90.1885pt,418.8341pt)[below right,color=black]{Regarde "HelloWorld"}; +\end{tikzpicture} diff --git a/out/docs/rapport/rapport_etat_art/images/local2/local2.latex b/out/docs/rapport/rapport_etat_art/images/local2/local2.latex new file mode 100644 index 0000000..52fd4e1 --- /dev/null +++ b/out/docs/rapport/rapport_etat_art/images/local2/local2.latex @@ -0,0 +1,41 @@ +% generated by Plantuml 1.2022.7 +\definecolor{plantucolor0000}{RGB}{24,24,24} +\definecolor{plantucolor0001}{RGB}{0,0,0} +\definecolor{plantucolor0002}{RGB}{226,226,240} +\begin{tikzpicture}[yscale=-1 +,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt} +,pstyle1/.style={color=plantucolor0000,fill=plantucolor0002,line width=0.5pt} +,pstyle2/.style={color=plantucolor0000,line width=0.5pt} +,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt} +,pstyle4/.style={color=plantucolor0000,line width=1.0pt} +] +\draw[pstyle0] (26pt,84.0679pt) -- (26pt,294.304pt); +\draw[pstyle0] (75.9pt,84.0679pt) -- (75.9pt,294.304pt); +\draw[pstyle0] (235.9633pt,84.0679pt) -- (235.9633pt,294.304pt); +\node at (5pt,65pt)[below right,color=black]{Alice}; +\draw[pstyle1] (26.45pt,13.5pt) ellipse (8pt and 8pt); +\draw[pstyle2] (26.45pt,21.5pt) -- (26.45pt,48.5pt)(13.45pt,29.5pt) -- (39.45pt,29.5pt)(26.45pt,48.5pt) -- (13.45pt,63.5pt)(26.45pt,48.5pt) -- (39.45pt,63.5pt); +\node at (57.9pt,65pt)[below right,color=black]{Bob}; +\draw[pstyle1] (76.2692pt,13.5pt) ellipse (8pt and 8pt); +\draw[pstyle2] (76.2692pt,21.5pt) -- (76.2692pt,48.5pt)(63.2692pt,29.5pt) -- (89.2692pt,29.5pt)(76.2692pt,48.5pt) -- (63.2692pt,63.5pt)(76.2692pt,48.5pt) -- (89.2692pt,63.5pt); +\draw[pstyle1] (184.9633pt,55pt) arc (180:270:5pt) -- (189.9633pt,50pt) -- (282.623pt,50pt) arc (270:360:5pt) -- (287.623pt,55pt) -- (287.623pt,78.0679pt) arc (0:90:5pt) -- (282.623pt,83.0679pt) -- (189.9633pt,83.0679pt) arc (90:180:5pt) -- (184.9633pt,78.0679pt) -- cycle; +\node at (191.9633pt,57pt)[below right,color=black]{Application}; +\draw[pstyle3] (224.2932pt,113.7739pt) -- (234.2932pt,117.7739pt) -- (224.2932pt,121.7739pt) -- (228.2932pt,117.7739pt) -- cycle; +\draw[pstyle4] (26.45pt,117.7739pt) -- (230.2932pt,117.7739pt); +\node at (33.45pt,98.0679pt)[below right,color=black]{saisir("Hello")}; +\draw[pstyle3] (37.45pt,145.4799pt) -- (27.45pt,149.4799pt) -- (37.45pt,153.4799pt) -- (33.45pt,149.4799pt) -- cycle; +\draw[pstyle4] (31.45pt,149.4799pt) -- (235.2932pt,149.4799pt); +\node at (43.45pt,129.7739pt)[below right,color=black]{lire("Hello")}; +\draw[pstyle3] (87.2692pt,177.186pt) -- (77.2692pt,181.186pt) -- (87.2692pt,185.186pt) -- (83.2692pt,181.186pt) -- cycle; +\draw[pstyle4] (81.2692pt,181.186pt) -- (235.2932pt,181.186pt); +\node at (93.2692pt,161.4799pt)[below right,color=black]{lire("Hello")}; +\draw[pstyle3] (224.2932pt,208.892pt) -- (234.2932pt,212.892pt) -- (224.2932pt,216.892pt) -- (228.2932pt,212.892pt) -- cycle; +\draw[pstyle4] (76.2692pt,212.892pt) -- (230.2932pt,212.892pt); +\node at (83.2692pt,193.186pt)[below right,color=black]{saisir(" World")}; +\draw[pstyle3] (37.45pt,240.598pt) -- (27.45pt,244.598pt) -- (37.45pt,248.598pt) -- (33.45pt,244.598pt) -- cycle; +\draw[pstyle4] (31.45pt,244.598pt) -- (235.2932pt,244.598pt); +\node at (43.45pt,224.892pt)[below right,color=black]{lire("Hello World")}; +\draw[pstyle3] (87.2692pt,272.304pt) -- (77.2692pt,276.304pt) -- (87.2692pt,280.304pt) -- (83.2692pt,276.304pt) -- cycle; +\draw[pstyle4] (81.2692pt,276.304pt) -- (235.2932pt,276.304pt); +\node at (93.2692pt,256.598pt)[below right,color=black]{lire("Hello World")}; +\end{tikzpicture} diff --git a/out/docs/rapport/rapport_etat_art/images/local2/local2fail.latex b/out/docs/rapport/rapport_etat_art/images/local2/local2fail.latex new file mode 100644 index 0000000..40e9848 --- /dev/null +++ b/out/docs/rapport/rapport_etat_art/images/local2/local2fail.latex @@ -0,0 +1,44 @@ +% generated by Plantuml 1.2022.7 +\definecolor{plantucolor0000}{RGB}{24,24,24} +\definecolor{plantucolor0001}{RGB}{0,0,0} +\definecolor{plantucolor0002}{RGB}{226,226,240} +\begin{tikzpicture}[yscale=-1 +,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt} +,pstyle1/.style={color=plantucolor0000,fill=plantucolor0002,line width=0.5pt} +,pstyle2/.style={color=plantucolor0000,line width=0.5pt} +,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt} +,pstyle4/.style={color=plantucolor0000,line width=1.0pt} +] +\draw[pstyle0] (26.45pt,84.0679pt) -- (26.45pt,293.892pt); +\draw[pstyle0] (230.5952pt,84.0679pt) -- (230.5952pt,293.892pt); +\draw[pstyle0] (434.7404pt,84.0679pt) -- (434.7404pt,293.892pt); +\node at (5pt,65pt)[below right,color=black]{Alice}; +\draw[pstyle1] (26.45pt,13.5pt) ellipse (8pt and 8pt); +\draw[pstyle2] (26.45pt,21.5pt) -- (26.45pt,48.5pt)(13.45pt,29.5pt) -- (39.45pt,29.5pt)(26.45pt,48.5pt) -- (13.45pt,63.5pt)(26.45pt,48.5pt) -- (39.45pt,63.5pt); +\draw[pstyle1] (179.2654pt,55pt) arc (180:270:5pt) -- (184.2654pt,50pt) -- (276.9251pt,50pt) arc (270:360:5pt) -- (281.9251pt,55pt) -- (281.9251pt,78.0679pt) arc (0:90:5pt) -- (276.9251pt,83.0679pt) -- (184.2654pt,83.0679pt) arc (90:180:5pt) -- (179.2654pt,78.0679pt) -- cycle; +\node at (186.2654pt,57pt)[below right,color=black]{Application}; +\node at (416.3712pt,65pt)[below right,color=black]{Bob}; +\draw[pstyle1] (434.7404pt,13.5pt) ellipse (8pt and 8pt); +\draw[pstyle2] (434.7404pt,21.5pt) -- (434.7404pt,48.5pt)(421.7404pt,29.5pt) -- (447.7404pt,29.5pt)(434.7404pt,48.5pt) -- (421.7404pt,63.5pt)(434.7404pt,48.5pt) -- (447.7404pt,63.5pt); +\draw[pstyle3] (218.9152pt,126.0519pt) -- (228.5952pt,130.7739pt) -- (218.329pt,134.0304pt) -- (222.6114pt,130.3343pt) -- cycle; +\draw[pstyle4] (26.45pt,115.7739pt) -- (228.5952pt,130.7739pt); +\node at (33.45pt,96.0679pt)[below right,color=black]{saisir("Le chat")}; +\draw[pstyle3] (37.13pt,172.7579pt) -- (27.45pt,177.4799pt) -- (37.7162pt,180.7364pt) -- (33.4339pt,177.0403pt) -- cycle; +\draw[pstyle4] (229.5952pt,162.4799pt) -- (26.45pt,177.4799pt); +\node at (43.45pt,142.7739pt)[below right,color=black]{lire("Le chat")}; +\draw[pstyle3] (423.0604pt,172.7579pt) -- (432.7404pt,177.4799pt) -- (422.4742pt,180.7364pt) -- (426.7566pt,177.0403pt) -- cycle; +\draw[pstyle4] (230.5952pt,162.4799pt) -- (432.7404pt,177.4799pt); +\node at (237.5952pt,142.7739pt)[below right,color=black]{lire("Le chat")}; +\draw[pstyle3] (241.2752pt,219.4639pt) -- (231.5952pt,224.186pt) -- (241.8615pt,227.4424pt) -- (237.5791pt,223.7463pt) -- cycle; +\draw[pstyle4] (433.7404pt,209.186pt) -- (230.5952pt,224.186pt); +\node at (247.5952pt,189.4799pt)[below right,color=black]{saisir(" mange")}; +\draw[pstyle3] (219.0329pt,224.23pt) -- (228.5952pt,229.186pt) -- (218.2529pt,232.1919pt) -- (222.6238pt,228.601pt) -- cycle; +\draw[pstyle4] (26.45pt,209.186pt) -- (228.5952pt,229.186pt); +\node at (33.45pt,189.4799pt)[below right,color=black]{saisir(" boit")}; +\draw[pstyle3] (37.13pt,271.1699pt) -- (27.45pt,275.892pt) -- (37.7162pt,279.1484pt) -- (33.4339pt,275.4523pt) -- cycle; +\draw[pstyle4] (229.5952pt,260.892pt) -- (26.45pt,275.892pt); +\node at (43.45pt,241.186pt)[below right,color=black]{lire("Le chat mange boit")}; +\draw[pstyle3] (423.0604pt,271.1699pt) -- (432.7404pt,275.892pt) -- (422.4742pt,279.1484pt) -- (426.7566pt,275.4523pt) -- cycle; +\draw[pstyle4] (230.5952pt,260.892pt) -- (432.7404pt,275.892pt); +\node at (237.5952pt,241.186pt)[below right,color=black]{lire("Le chat mange boit")}; +\end{tikzpicture} diff --git a/out/docs/rapport/rapport_etat_art/images/localiteEtat/localiteEtatFail.latex b/out/docs/rapport/rapport_etat_art/images/localiteEtat/localiteEtatFail.latex new file mode 100644 index 0000000..6ed96c6 --- /dev/null +++ b/out/docs/rapport/rapport_etat_art/images/localiteEtat/localiteEtatFail.latex @@ -0,0 +1,84 @@ +% generated by Plantuml 1.2022.7 +\definecolor{plantucolor0000}{RGB}{24,24,24} +\definecolor{plantucolor0001}{RGB}{226,226,240} +\definecolor{plantucolor0002}{RGB}{0,0,0} +\begin{tikzpicture}[yscale=-1 +,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt} +,pstyle1/.style={color=plantucolor0000,fill=plantucolor0001,line width=0.5pt} +,pstyle2/.style={color=plantucolor0000,line width=1.0pt} +,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt} +] +\draw[pstyle0] (27.3692pt,39.0679pt) -- (27.3692pt,431.4221pt); +\draw[pstyle0] (295.551pt,39.0679pt) -- (295.551pt,431.4221pt); +\draw[pstyle1] (5pt,10pt) arc (180:270:5pt) -- (10pt,5pt) -- (44.7385pt,5pt) arc (270:360:5pt) -- (49.7385pt,10pt) -- (49.7385pt,33.0679pt) arc (0:90:5pt) -- (44.7385pt,38.0679pt) -- (10pt,38.0679pt) arc (90:180:5pt) -- (5pt,33.0679pt) -- cycle; +\node at (12pt,12pt)[below right,color=black]{Bob}; +\draw[pstyle1] (270.101pt,10pt) arc (180:270:5pt) -- (275.101pt,5pt) -- (316.001pt,5pt) arc (270:360:5pt) -- (321.001pt,10pt) -- (321.001pt,33.0679pt) arc (0:90:5pt) -- (316.001pt,38.0679pt) -- (275.101pt,38.0679pt) arc (90:180:5pt) -- (270.101pt,33.0679pt) -- cycle; +\node at (277.101pt,12pt)[below right,color=black]{Alice}; +\draw[pstyle1] (5pt,436.4221pt) arc (180:270:5pt) -- (10pt,431.4221pt) -- (44.7385pt,431.4221pt) arc (270:360:5pt) -- (49.7385pt,436.4221pt) -- (49.7385pt,459.49pt) arc (0:90:5pt) -- (44.7385pt,464.49pt) -- (10pt,464.49pt) arc (90:180:5pt) -- (5pt,459.49pt) -- cycle; +\node at (12pt,438.4221pt)[below right,color=black]{Bob}; +\draw[pstyle1] (270.101pt,436.4221pt) arc (180:270:5pt) -- (275.101pt,431.4221pt) -- (316.001pt,431.4221pt) arc (270:360:5pt) -- (321.001pt,436.4221pt) -- (321.001pt,459.49pt) arc (0:90:5pt) -- (316.001pt,464.49pt) -- (275.101pt,464.49pt) arc (90:180:5pt) -- (270.101pt,459.49pt) -- cycle; +\node at (277.101pt,438.4221pt)[below right,color=black]{Alice}; +\draw[pstyle2] (27.3692pt,70.7739pt) -- (69.3692pt,70.7739pt); +\draw[pstyle2] (69.3692pt,70.7739pt) -- (69.3692pt,83.7739pt); +\draw[pstyle2] (28.3692pt,83.7739pt) -- (69.3692pt,83.7739pt); +\draw[pstyle3] (38.3692pt,79.7739pt) -- (28.3692pt,83.7739pt) -- (38.3692pt,87.7739pt) -- (34.3692pt,83.7739pt) -- cycle; +\node at (34.3692pt,51.0679pt)[below right,color=black]{inserer("Hello World")}; +\draw[pstyle2] (27.3692pt,115.4799pt) -- (69.3692pt,115.4799pt); +\draw[pstyle2] (69.3692pt,115.4799pt) -- (69.3692pt,128.4799pt); +\draw[pstyle2] (28.3692pt,128.4799pt) -- (69.3692pt,128.4799pt); +\draw[pstyle3] (38.3692pt,124.4799pt) -- (28.3692pt,128.4799pt) -- (38.3692pt,132.4799pt) -- (34.3692pt,128.4799pt) -- cycle; +\node at (34.3692pt,95.7739pt)[below right,color=black]{afficher() -\textgreater "Hello World"}; +\draw[pstyle3] (283.551pt,156.186pt) -- (293.551pt,160.186pt) -- (283.551pt,164.186pt) -- (287.551pt,160.186pt) -- cycle; +\draw[pstyle2] (27.3692pt,160.186pt) -- (289.551pt,160.186pt); +\node at (34.3692pt,140.4799pt)[below right,color=black]{partager("Hello World")}; +\draw[pstyle2] (295.551pt,191.892pt) -- (337.551pt,191.892pt); +\draw[pstyle2] (337.551pt,191.892pt) -- (337.551pt,204.892pt); +\draw[pstyle2] (296.551pt,204.892pt) -- (337.551pt,204.892pt); +\draw[pstyle3] (306.551pt,200.892pt) -- (296.551pt,204.892pt) -- (306.551pt,208.892pt) -- (302.551pt,204.892pt) -- cycle; +\node at (302.551pt,172.186pt)[below right,color=black]{afficher() : "Hello World"}; +\draw[pstyle2] (295.551pt,236.598pt) -- (337.551pt,236.598pt); +\draw[pstyle2] (337.551pt,236.598pt) -- (337.551pt,249.598pt); +\draw[pstyle2] (296.551pt,249.598pt) -- (337.551pt,249.598pt); +\draw[pstyle3] (306.551pt,245.598pt) -- (296.551pt,249.598pt) -- (306.551pt,253.598pt) -- (302.551pt,249.598pt) -- cycle; +\node at (302.551pt,216.892pt)[below right,color=black]{souligner("Hello World")}; +\draw[pstyle2] (27.3692pt,236.598pt) -- (69.3692pt,236.598pt); +\draw[pstyle2] (69.3692pt,236.598pt) -- (69.3692pt,249.598pt); +\draw[pstyle2] (28.3692pt,249.598pt) -- (69.3692pt,249.598pt); +\draw[pstyle3] (38.3692pt,245.598pt) -- (28.3692pt,249.598pt) -- (38.3692pt,253.598pt) -- (34.3692pt,249.598pt) -- cycle; +\node at (34.3692pt,216.892pt)[below right,color=black]{supprimer("Hello World", " World")}; +\draw[pstyle2] (295.551pt,281.304pt) -- (337.551pt,281.304pt); +\draw[pstyle2] (337.551pt,281.304pt) -- (337.551pt,294.304pt); +\draw[pstyle2] (296.551pt,294.304pt) -- (337.551pt,294.304pt); +\draw[pstyle3] (306.551pt,290.304pt) -- (296.551pt,294.304pt) -- (306.551pt,298.304pt) -- (302.551pt,294.304pt) -- cycle; +\node at (302.551pt,261.598pt)[below right,color=black]{afficher() : "}; +\node at (385.8771pt,261.598pt)[below right,color=black]{\underline{Hello World}}; +\node at (474.4455pt,261.598pt)[below right,color=black]{"}; +\draw[pstyle2] (27.3692pt,281.304pt) -- (69.3692pt,281.304pt); +\draw[pstyle2] (69.3692pt,281.304pt) -- (69.3692pt,294.304pt); +\draw[pstyle2] (28.3692pt,294.304pt) -- (69.3692pt,294.304pt); +\draw[pstyle3] (38.3692pt,290.304pt) -- (28.3692pt,294.304pt) -- (38.3692pt,298.304pt) -- (34.3692pt,294.304pt) -- cycle; +\node at (34.3692pt,261.598pt)[below right,color=black]{afficher() : "Hello"}; +\draw[pstyle3] (37.9548pt,363.8051pt) -- (28.3692pt,368.716pt) -- (38.6973pt,371.7706pt) -- (34.3433pt,368.1591pt) -- cycle; +\draw[pstyle2] (294.551pt,343.716pt) -- (27.3692pt,368.716pt); +\node at (44.3692pt,306.304pt)[below right,color=black]{\t \t partager("}; +\node at (177.2298pt,306.304pt)[below right,color=black]{\underline{Hello World}}; +\node at (265.7983pt,306.304pt)[below right,color=black]{")}; +\node at (44.3692pt,324.01pt)[below right,color=black]{ }; +\draw[pstyle3] (283.9655pt,363.8051pt) -- (293.551pt,368.716pt) -- (283.2229pt,371.7706pt) -- (287.577pt,368.1591pt) -- cycle; +\draw[pstyle2] (27.3692pt,343.716pt) -- (293.551pt,368.716pt); +\node at (34.3692pt,324.01pt)[below right,color=black]{partager("Hello")}; +\draw[pstyle2] (27.3692pt,400.4221pt) -- (69.3692pt,400.4221pt); +\draw[pstyle2] (69.3692pt,400.4221pt) -- (69.3692pt,413.4221pt); +\draw[pstyle2] (28.3692pt,413.4221pt) -- (69.3692pt,413.4221pt); +\draw[pstyle3] (38.3692pt,409.4221pt) -- (28.3692pt,413.4221pt) -- (38.3692pt,417.4221pt) -- (34.3692pt,413.4221pt) -- cycle; +\node at (34.3692pt,380.716pt)[below right,color=black]{afficher() -\textgreater "}; +\node at (127.1192pt,380.716pt)[below right,color=black]{\underline{Hello World}}; +\node at (215.6877pt,380.716pt)[below right,color=black]{"}; +\draw[pstyle2] (295.551pt,400.4221pt) -- (337.551pt,400.4221pt); +\draw[pstyle2] (337.551pt,400.4221pt) -- (337.551pt,413.4221pt); +\draw[pstyle2] (296.551pt,413.4221pt) -- (337.551pt,413.4221pt); +\draw[pstyle3] (306.551pt,409.4221pt) -- (296.551pt,413.4221pt) -- (306.551pt,417.4221pt) -- (302.551pt,413.4221pt) -- cycle; +\node at (302.551pt,380.716pt)[below right,color=black]{afficher() -\textgreater "}; +\node at (395.301pt,380.716pt)[below right,color=black]{\underline{Hello}}; +\node at (434.1738pt,380.716pt)[below right,color=black]{"}; +\end{tikzpicture} diff --git a/out/docs/rapport/rapport_etat_art/images/seriaized/serialized.latex b/out/docs/rapport/rapport_etat_art/images/seriaized/serialized.latex new file mode 100644 index 0000000..21b7d98 --- /dev/null +++ b/out/docs/rapport/rapport_etat_art/images/seriaized/serialized.latex @@ -0,0 +1,57 @@ +% generated by Plantuml 1.2022.7 +\definecolor{plantucolor0000}{RGB}{24,24,24} +\definecolor{plantucolor0001}{RGB}{226,226,240} +\definecolor{plantucolor0002}{RGB}{0,0,0} +\begin{tikzpicture}[yscale=-1 +,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt} +,pstyle1/.style={color=plantucolor0000,fill=plantucolor0001,line width=0.5pt} +,pstyle2/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt} +,pstyle3/.style={color=plantucolor0000,line width=1.0pt} +,pstyle4/.style={color=plantucolor0000,line width=1.0pt,dash pattern=on 2.0pt off 2.0pt} +] +\draw[pstyle0] (30.45pt,39.0679pt) -- (30.45pt,434.1281pt); +\draw[pstyle0] (210.5241pt,39.0679pt) -- (210.5241pt,434.1281pt); +\draw[pstyle0] (328.7611pt,39.0679pt) -- (328.7611pt,434.1281pt); +\draw[pstyle1] (5pt,10pt) arc (180:270:5pt) -- (10pt,5pt) -- (50.9pt,5pt) arc (270:360:5pt) -- (55.9pt,10pt) -- (55.9pt,33.0679pt) arc (0:90:5pt) -- (50.9pt,38.0679pt) -- (10pt,38.0679pt) arc (90:180:5pt) -- (5pt,33.0679pt) -- cycle; +\node at (12pt,12pt)[below right,color=black]{Alice}; +\draw[pstyle1] (177.9423pt,10pt) arc (180:270:5pt) -- (182.9423pt,5pt) -- (238.1059pt,5pt) arc (270:360:5pt) -- (243.1059pt,10pt) -- (243.1059pt,33.0679pt) arc (0:90:5pt) -- (238.1059pt,38.0679pt) -- (182.9423pt,38.0679pt) arc (90:180:5pt) -- (177.9423pt,33.0679pt) -- cycle; +\node at (184.9423pt,12pt)[below right,color=black]{Server}; +\draw[pstyle1] (306.3919pt,10pt) arc (180:270:5pt) -- (311.3919pt,5pt) -- (346.1303pt,5pt) arc (270:360:5pt) -- (351.1303pt,10pt) -- (351.1303pt,33.0679pt) arc (0:90:5pt) -- (346.1303pt,38.0679pt) -- (311.3919pt,38.0679pt) arc (90:180:5pt) -- (306.3919pt,33.0679pt) -- cycle; +\node at (313.3919pt,12pt)[below right,color=black]{Bob}; +\draw[pstyle2] (198.7612pt,76.2256pt) -- (208.5241pt,80.7739pt) -- (198.3177pt,84.2133pt) -- (202.5333pt,80.4412pt) -- cycle; +\draw[pstyle3] (30.45pt,70.7739pt) -- (208.5241pt,80.7739pt); +\node at (37.45pt,51.0679pt)[below right,color=black]{lock()}; +\draw[pstyle2] (41.2128pt,117.9316pt) -- (31.45pt,122.4799pt) -- (41.6564pt,125.9193pt) -- (37.4408pt,122.1473pt) -- cycle; +\draw[pstyle4] (209.5241pt,112.4799pt) -- (30.45pt,122.4799pt); +\node at (47.45pt,92.7739pt)[below right,color=black]{true}; +\draw[pstyle2] (221.5241pt,150.186pt) -- (211.5241pt,154.186pt) -- (221.5241pt,158.186pt) -- (217.5241pt,154.186pt) -- cycle; +\draw[pstyle3] (215.5241pt,154.186pt) -- (327.7611pt,154.186pt); +\node at (227.5241pt,134.4799pt)[below right,color=black]{lock()}; +\draw[pstyle2] (198.7612pt,159.6376pt) -- (208.5241pt,164.186pt) -- (198.3177pt,167.6253pt) -- (202.5333pt,163.8533pt) -- cycle; +\draw[pstyle3] (30.45pt,154.186pt) -- (208.5241pt,164.186pt); +\node at (37.45pt,134.4799pt)[below right,color=black]{inserer("hello world")}; +\draw[pstyle2] (317.1338pt,201.0635pt) -- (326.7611pt,205.892pt) -- (316.4596pt,209.035pt) -- (320.7825pt,205.3863pt) -- cycle; +\draw[pstyle4] (210.5241pt,195.892pt) -- (326.7611pt,205.892pt); +\node at (217.5241pt,176.186pt)[below right,color=black]{false}; +\draw[pstyle2] (198.7612pt,201.3437pt) -- (208.5241pt,205.892pt) -- (198.3177pt,209.3314pt) -- (202.5333pt,205.5593pt) -- cycle; +\draw[pstyle3] (30.45pt,195.892pt) -- (208.5241pt,205.892pt); +\node at (37.45pt,176.186pt)[below right,color=black]{lire()}; +\draw[pstyle2] (41.2128pt,243.0497pt) -- (31.45pt,247.598pt) -- (41.6564pt,251.0374pt) -- (37.4408pt,247.2653pt) -- cycle; +\draw[pstyle4] (209.5241pt,237.598pt) -- (30.45pt,247.598pt); +\node at (47.45pt,217.892pt)[below right,color=black]{"hello world"}; +\draw[pstyle2] (198.5241pt,275.304pt) -- (208.5241pt,279.304pt) -- (198.5241pt,283.304pt) -- (202.5241pt,279.304pt) -- cycle; +\draw[pstyle3] (30.45pt,279.304pt) -- (204.5241pt,279.304pt); +\node at (37.45pt,259.598pt)[below right,color=black]{unlock()}; +\draw[pstyle2] (221.5241pt,307.01pt) -- (211.5241pt,311.01pt) -- (221.5241pt,315.01pt) -- (217.5241pt,311.01pt) -- cycle; +\draw[pstyle3] (215.5241pt,311.01pt) -- (327.7611pt,311.01pt); +\node at (227.5241pt,291.304pt)[below right,color=black]{lock()}; +\draw[pstyle2] (221.5241pt,338.716pt) -- (211.5241pt,342.716pt) -- (221.5241pt,346.716pt) -- (217.5241pt,342.716pt) -- cycle; +\draw[pstyle3] (215.5241pt,342.716pt) -- (327.7611pt,342.716pt); +\node at (227.5241pt,323.01pt)[below right,color=black]{lire()}; +\draw[pstyle2] (317.1338pt,379.5935pt) -- (326.7611pt,384.4221pt) -- (316.4596pt,387.5651pt) -- (320.7825pt,383.9164pt) -- cycle; +\draw[pstyle4] (210.5241pt,374.4221pt) -- (326.7611pt,384.4221pt); +\node at (217.5241pt,354.716pt)[below right,color=black]{"hello world"}; +\draw[pstyle2] (221.5241pt,412.1281pt) -- (211.5241pt,416.1281pt) -- (221.5241pt,420.1281pt) -- (217.5241pt,416.1281pt) -- cycle; +\draw[pstyle3] (215.5241pt,416.1281pt) -- (327.7611pt,416.1281pt); +\node at (227.5241pt,396.4221pt)[below right,color=black]{unlock()}; +\end{tikzpicture}