From cfe19b56e29a5543f7a93b3de3a883d9fd3580bf Mon Sep 17 00:00:00 2001 From: DE CAMPOU Louis Date: Sun, 2 Apr 2023 19:27:39 +0000 Subject: [PATCH] =?UTF-8?q?ajout=20rapport=20wormhole=20+=20modification?= =?UTF-8?q?=20pr=C3=A9sentation=20wormhole?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../centralisation/wormhole.tex | 13 +- docs/rapportFinal/centralisation/index.tex | 5 +- docs/rapportFinal/centralisation/sources.bib | 50 ++++++- .../centralisation/uml_design_v2.png | Bin 0 -> 28081 bytes docs/rapportFinal/centralisation/wormhole.tex | 126 ++++++++++++++++++ 5 files changed, 183 insertions(+), 11 deletions(-) create mode 100644 docs/rapportFinal/centralisation/uml_design_v2.png create mode 100644 docs/rapportFinal/centralisation/wormhole.tex diff --git a/docs/presentation_17_03_23/centralisation/wormhole.tex b/docs/presentation_17_03_23/centralisation/wormhole.tex index 9af2897..bef38ed 100644 --- a/docs/presentation_17_03_23/centralisation/wormhole.tex +++ b/docs/presentation_17_03_23/centralisation/wormhole.tex @@ -1,6 +1,6 @@ % Auteur : Louis de Campou \begin{frame}{Wormhole} -Protocole de passage de messages qui connecte 13 chaînes dont Ethereum et Solana. +Protocole de passage de messages qui connecte 22 blockchains dont Ethereum et Solana. \newline \begin{itemize} @@ -14,12 +14,13 @@ Protocole de passage de messages qui connecte 13 chaînes dont Ethereum et Solan Un gardien est une autorité de confiance qui a comme rôle d'observer et de signer un message.\newline - \begin{block}{Fonctionnement du réseau de gardiens} + \begin{block}{Caractéristiques du réseau de gardiens} \begin{itemize} - \item Un message est émis depuis une chaîne source - \item Chaque gardien observe individuellement ce message, vérifie sa validité puis le signe - \item Lorsque 2/3 des gardiens ont signé le message, le consensus est atteint - \item Le message signé est transmis à la chaîne cible pour traitement + \item Sans leader + \item 19 gardiens à parts égales + \item Preuve d'autorité (PoA) + \item Multisignature (m/n) + \item Le consensus est atteint lorsque 2/3 des gardiens ont signé le message \end{itemize} \end{block} \end{frame} diff --git a/docs/rapportFinal/centralisation/index.tex b/docs/rapportFinal/centralisation/index.tex index a83d40b..5d9225f 100644 --- a/docs/rapportFinal/centralisation/index.tex +++ b/docs/rapportFinal/centralisation/index.tex @@ -4,8 +4,11 @@ \subsection{Les Blockchain Bridges} \input{centralisation/bridge.tex} +\subsection{Wormhole} +\input{centralisation/wormhole.tex} + \subsection{Analyse d'attaques} \input{centralisation/attaques.tex} \subsection{Les limites du centralisé} -\input{centralisation/limites.tex} +\input{centralisation/limites.tex} \ No newline at end of file diff --git a/docs/rapportFinal/centralisation/sources.bib b/docs/rapportFinal/centralisation/sources.bib index 82a9a48..84ad243 100644 --- a/docs/rapportFinal/centralisation/sources.bib +++ b/docs/rapportFinal/centralisation/sources.bib @@ -50,28 +50,28 @@ @misc{NomadDocsExternal, author = {Nomad Docs}, - url = {https://docs.nomad.xyz/the-nomad-protocol/verification-mechanisms/external-verification}}, + url = {https://docs.nomad.xyz/the-nomad-protocol/verification-mechanisms/external-verification}, title = {External Verification}, year = {2022} } @misc{EthereumBridges, author = {Ethereum}, - url = {https://ethereum.org/en/developers/docs/bridges/#trade-offs}}, + url = {https://ethereum.org/en/developers/docs/bridges/#trade-offs}, title = {BRIDGES}, year = {2022} } @misc{EthereumMechanism, author = {Ethereum}, - url = {{https://ethereum.org/en/developers/docs/bridges/#how-do-bridges-work}}, + url = {https://ethereum.org/en/developers/docs/bridges/#how-do-bridges-work}, title = {BRIDGES}, year = {2022} } @misc{EthereumRisks, author = {Ethereum}, - url = {{https://ethereum.org/en/developers/docs/bridges/#risk-with-bridges}}, + url = {https://ethereum.org/en/developers/docs/bridges/#risk-with-bridges}, title = {BRIDGES}, year = {2022} } @@ -185,4 +185,46 @@ year = {2022}, month = {08}, url = {https://rekt.news/nomad-rekt/}, +} + +@misc{wormholeNetwork, + title={Wormhole : Network}, + howpublished = {\url{https://wormhole.com/network/}}, + author={Wormhole Foundation}, +} + +@misc{wormholeCoreContract, + title={Wormhole : Core contract}, + howpublished = {\url{https://book.wormhole.com/wormhole/3_coreLayerContracts.html}}, + author={Wormhole Foundation}, +} + +@misc{wormholeVAA, + title={Wormhole : VAA}, + howpublished = {\url{https://book.wormhole.com/wormhole/4_vaa.html}}, + author={Wormhole Foundation}, +} + +@misc{wormholeGuardian, + title={Wormhole : Guardian network}, + howpublished = {\url{https://book.wormhole.com/wormhole/5_guardianNetwork.html}}, + author={Wormhole Foundation}, +} + +@misc{wormholeRelayer, + title={Wormhole : Relayer}, + howpublished = {\url{https://book.wormhole.com/wormhole/6_relayers.html}}, + author={Wormhole Foundation}, +} + +@misc{wormholeArch, + title={Wormhole : Architecture}, + howpublished = {\url{https://github.com/wormhole-foundation/example-token-bridge-relayer/blob/main/docs/design.png}}, + author={Wormhole Foundation}, +} + +@misc{wormholeChainswap, + title={Wormhole : Multisignature}, + howpublished = {\url{https://docs.chainswap.com/mechanism/chainswap-solana-initiative}}, + author={Wormhole Foundation}, } \ No newline at end of file diff --git a/docs/rapportFinal/centralisation/uml_design_v2.png b/docs/rapportFinal/centralisation/uml_design_v2.png new file mode 100644 index 0000000000000000000000000000000000000000..d2c2e727beab0889f942005641ecf661eb05f570 GIT binary patch literal 28081 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 literal 0 HcmV?d00001 diff --git a/docs/rapportFinal/centralisation/wormhole.tex b/docs/rapportFinal/centralisation/wormhole.tex new file mode 100644 index 0000000..2a313f9 --- /dev/null +++ b/docs/rapportFinal/centralisation/wormhole.tex @@ -0,0 +1,126 @@ +En 2017, une cryptomonnaie adossée à la \textit{blockchain} Solana a émergée avec des caractéristiques +similaires à Ethereum : \textit{blockchain} publique, \textit{smart contracts}.\\ +Solana est devenue de facto une \textit{blockchain} concurrente à Ethereum et est aujourd'hui +la onzième \textit{blockchain} en terme de capitalisation selon l'aggrégateur de marché Coinmarketcap.\\ +Un besoin d'échanger des actifs entre les \textit{blockchains} Ethereum et Solana est apparu, +d'où l'introduction en 2020 de la première version de Wormhole. +Initialement, Wormhole v1 a été concu comme un \textit{bridge} entre Ethereum et Solana. +Depuis, Wormhole s'est développé au-delà de Solana avec le lancement d'une deuxième version en 2021 +en tant que protocole générique de passage de messages.\\ +À l'écriture de ce rapport, 22 \cite{wormholeNetwork} \textit{blockchains} sont compatibles avec Wormhole +dont : BNBChain, Ethereum, Moonbeam, Polygon, Solana...\\ +Le protocole émet un message à partir d'une \textit{blockchain} source qui est validé par un réseau de +gardiens.\\ +Le message est ensuite envoyé à la \textit{blockchain} cible pour être traité. + +\subsubsection{VAA (\textit{Verified action approval})} + +Lorsqu'un \textit{smart contract} envoie un message \textit{crosschain} comme un verrouillage +de jetons sur une \textit{blockchain} source et une demande de frappe de jetons sur une +\textit{blockchain} cible, celui-ci interargit avec un \textit{core contract} \cite{wormholeCoreContract}. +Un \textit{core contract} est déployé sur toutes les \textit{blockchains} compatibles avec le protocole +Wormhole. Tout \textit{core contract} est observé par le réseau de gardiens. +Un message Wormhole est émis grâce à la fonction \textit{publishMessage()} prenant en entrée le \textit{payload}. +La sortie de cette fonction est un \textit{sequence number}, un numéro d'index unique pour le message. +Combiné à l'adresse du contrat de l'émetteur et à l'identifiant de la chaîne de l'émetteur, le message +correspondant peut être récupéré auprès d'un nœud du réseau de gardiens.\\ +Un message Wormhole est vérifié grâce à la fonction \textit{parseAndVerifyVAA()} prenant en entrée le message. +Selon la validité de l'entrée, la fonction retourne en sortie le \textit{payload} ou une exception. +\newpage + +VAA \cite{wormholeVAA} est la primitive de messagerie de base de Wormhole. Un VAA contient une en-tête +ainsi qu'un \textit{body}. L'en-tête contient l'index des gardiens ayant signés le message et la collection des signatures. +L'en-tête permet au \textit{core contract} de vérifier l'authenticité du VAA. +Quant au \textit{body}, il contient des informations comme le numéro d'identification de la chaîne +Wormhole du contrat émetteur, l'adresse du contrat émetteur, le \textit{sequence number} +et le \textit{payload}.\\ 5 \textit{payloads} peuvent être utilisés dont \textit{Transfer} et +\textit{AssetMeta}, attestant les méta-données du jeton.\\ +Le \textit{payload AssetMeta} est obligatoire avant un premier transfert. +En effet, le \textit{payload Transfer} n'informe pas la chaîne B des meta-données du jeton verrouillé. +En l'absence de connaissance de ces informations, il n'est pas possible pour la \textit{blockchain} B +de frapper la quantité correcte de jetons.\\ +Si l'on souhaite ensuite transférer des jetons depuis une \textit{blockchain} A vers une +\textit{blockchain} B, il faut verrouiller les jetons sur A et les frapper sur B. +D'où l'utilisation du \textit{payload Transfer} contenant des informations comme la +quantité de jetons transférés, l'adresse de la chaîne d'origine et de destination, +le numéro d'identification de la chaîne d'origine et de destination.. +Une preuve doit être fournie que les jetons sur A sont verrouillés avant que la frappe puisse +avoir lieu sur B. La signature des gardiens sur le VAA correspondant est la preuve apportée à +la \textit{blockchain} B que le verrouillage a bien été effectué et que la frappe de jetons sur +B est légitime. + +\subsubsection{Gardiens} + +Un gardien \cite{wormholeGuardian} est une autorité de confiance qui a comme de rôle valider +(par une signature) le \textit{payload} contenu dans un VAA. +Comme évoqué précédemment, le réseau de gardiens observe tous les messages \textit{crosschain} via la +surveillance des \textit{core contracts}. +Le réseau de gardiens est composé de 19 gardiens à parts égales sans chef (\textit{leaderless}). +Il est conçu pour servir d'oracle à Wormhole et est l'élement le plus critique de l'écosystème. +Si une majorité de deux tiers ou plus des gardiens signent le même VAA, alors le consensus est atteint : +le VAA est automatiquement considéré valide par tous les contrats Wormhole sur toutes les +\textit{blockchains} et le \textit{payload} est actionné. +Chaque gardien utilise un algorithme de signature à courbe elliptique : ECSDA pour +\textit{Elliptic Curve Signature Digital Algorithm}. +Plus précisément, chaque gardien se réfère à «secp256k1» comme paramètres de la courbe elliptique, +aussi utilisé par les \textit{blockchains} Bitcoin et Ethereum.\\ +Le modèle de consensus utilisé est une \textit{Proof of Authority} (PoA) avec un système de +\textit{multisignature} M/N \cite{wormholeChainswap}, c'est à dire que M clefs parmi N sont nécessaires +pour signer un VAA. Ce modèle permet un traitement rapide des transactions et une dispense de participation monétaire, par rapport à la preuve de travail (PoW) et la preuve +de participation (PoS). Cependant, il présente également des désavantages : le système est par +\textit{design} centralisé et dépend d'un petit groupe de nœuds pouvant créer un point de +défaillance unique par l'utilisation commune d'une fonction vulnérable. Il est questionnable de restaurer des tiers de confiance dans le cadre d'un système +devenu populaire grâce à l'absence de tels autorités. Wormhole justifie la décentralisation de leur +système \cite{wormholeGuardian} par la présence de plusieurs parties (et non d'un seul) dans le contrôle du réseau. +Selon notre analyse, la décentralisation résulte de l'absence d'un ou plusieurs tier(s) de confiance lorsque deux parties +souhaitent réaliser une transaction. +\newpage + +\subsubsection{Relais} + +Un relai \cite{wormholeRelayer} est un processus qui délivre un ou plusieurs VAA(s) à une destination. +Les relais ne sont ni de confiance, ni privilégiés, ils écoutent directement le réseau de gardiens +via l'intermédiaire d'un processus espion. Ces relais ne peuvent pas compromettre l'intégrité d'un VAA +car une altération serait détectée lors du processus de vérification des signatures. Cependant, il n'est +pas assuré qu'un relai transmette un VAA à destination, d'où une perte de disponibilité. Il est conseillé +d'héberger soi-même ces relais pour supporter son application. + +\begin{figure}[h!] + \centering + \includegraphics[scale=0.5]{centralisation/uml_design_v2.png} + \label{fig:wormholeDesign} + \caption{Architecture Wormhole \cite{wormholeArch}} + \end{figure} + +% @startuml +% rectangle r1 as "Source Token Bridge +% Relayer Contract" +% rectangle r2 as "Source Token +% Bridge" +% rectangle r3 as "Source Core +% Contract" +% storage "Guardians" as r4 +% hexagon r5 as "Off-chain +% Message Relayer" +% rectangle r6 as "Target Token Bridge +% Relayer Contract" +% rectangle r7 as "Target Token +% Bridge" +% rectangle r8 as "Target Core +% Contract" + +% r1 -> r2 : Transfer() +% r2 -> r3 : publishMessage() +% r3 -do-> r4 : Guardien reads message +% r4 -left-> r5 : Signed message + +% r5 -do-> r6 : Signed message +% r6 -> r5 : Relayer fee + +% r6 -> r7 : Signed message +% r7 -> r6 : Wrapped token + +% r7 -> r8 : parseAndVerifyVAA() +% @enduml + +