Académique Documents
Professionnel Documents
Culture Documents
&OWVFEFMPCUFOUJPOEV
%0$503"5%&-6/*7&34*5²%&506-064&
%ÏMJWSÏQBS
Institut Supérieur de l’Aéronautique et de l’Espace
1SÏTFOUÏFFUTPVUFOVFQBS
Doriane PERARD
le mercredi 16 décembre 2020
5JUSF
6OJUÏEFSFDIFSDIF
Équipe d'accueil ISAE-ONERA MOIS
%JSFDUFVS T
EFʾÒTF
M. Jérôme LACAN (directeur de thèse)
Jury :
M. Carlos AGUILAR-MELCHOR Professeur ISAE-SUPAERO - Président
M. Daniel AUGOT Directeur de recherche INRIA SACLAY - Rapporteur
M. Jean-Christophe DENEUVILLE Professeur associé ENAC
M. Jérôme LACAN Professeur ISAE-SUPAERO - Directeur de thèse
M. Sylvain KUBLER Professeur associé Université de Lorraine
Mme Thi-Mai-Trang NGUYEN Maître de conférences Sorbonne Université
M. Stefano SECCI Professeur CNAM Paris - Rapporteur
"L’essentiel est invisible pour les yeux. C’est le temps que tu as perdu pour ta rose
qui fait ta rose si importante."
Antoine de Saint-Exupéry
Remerciements
Je profite de cet espace pour remercier toutes les personnes m’ayant soutenue
pendant ces trois dernières années (et plus).
Je tiens tout d’abord à remercier mes directeurs de thèse, Jérôme Lacan pour
m’avoir guidée et encouragée jusqu’au Canada, ainsi que Yann Bachy, sans qui cette
thèse n’aurait pas eu lieu, et qui a également répondu présent chaque fois que je
le demandais. Tout ce travail a pu aboutir grâce à eux. Un grand remerciement
aussi à l’ISAE-SUPAERO et plus particulièrement à tout le personnel du DISC (le
meilleur département) et surtout Odile, pour m’avoir si bien accueillie durant 3 ans
et demi. Laisser mon bureau vide, à la fin, aura été un moment intense en émotions.
Merci également aux membres du jury de ma thèse, pour la relecture et les
commentaires sur mon manuscrit ainsi que leurs participations actives lors de ma
soutenance, malgré les conditions sanitaires.
Dans un premier temps les nouveaux arrivants : cette période de ma vie m’aura
permis de rencontrer beaucoup de personnes géniales. Gabrielle-Kiki, on aura essayé
de faire du sport, de bien manger, et toutes les méthodes d’organisations possibles
et inimaginables, ça n’aura pas forcément abouti, mais au moins on aura bien ri !
Merci pour ces soirées danse et karaoké.
A toute la team pause café du DISC, tout d’abord désolée de vous avoir fait
perdre de l’argent avec le Stellar Lumen, mais ça y est, il a enfin décollé. Je vous
remercie tous, nos pauses infinissables vont me manquer. John, tu as troqué les
cernes du gamer nocturne contre une nouvelle fatigue due à Pavard-second-poteau,
heureusement que les litres de café étaient là chaque matin. Antoine, le seul a
partager ma passion de Pumpkin le raccoon, je n’ai jamais compris comment tu
pouvais prétendre ne pas aimer le fromage tout en faisant fondre du Roquefort.
Eyal, le plus chill de la bande, qui a finalement cédé à la pression en troquant
son téléphone frigo contre un smartphone. Fred, tu as fui pour l’Australie quand
je suis arrivée, mais j’ai ensuite pu découvrir une super personne ouverte d’esprit,
passionné du bon café, et un champion de Pole.
A Xavier, le meilleur stagiaire de France, qui m’a arraché le bras à moult reprises
à l’escrime. Conserve bien ta passion et ton énergie, tu feras de grandes choses avec.
Une grande pensée à Thibault, le seul dans cette liste qui n’est pas (encore)
ii Remerciements
membre du DISC. Merci de m’avoir écoutée râler de longues minutes pendant que
nous faisions des tours de voiturette.
Enfin, une immense merci au Beau Bureau. A toi Henrick, le créateur de cette
expression, qui m’a appris tellement de choses utiles et moins utiles, comme les
particularités d’un Tanuki, comment couper un saucisson avec un couteau dans
un seau sans rien toucher grâce à l’Haskell (j’ai bien compris ?), et qui me faisait
rêver tous les midis avec ses supers bentos. Je t’ai vu réussir tout ce que tu
entreprenais grâce à ton intelligence et ta persévérance, de la thèse au sport, et
j’ai tenté tant bien que mal de suivre tes pas. Big up à Eun-Bee, l’influenceuse
Kimchi, aussi gentille que drôle. A Bastien, le socle de la cohésion entre doctorants,
le seigneur du BDM, l’organisateur des meilleures raclettes et fondues de toute
l’Occitanie (sa patrie), qui réussit l’exploit de me faire venir à Ramonville tous les
samedis matins. Top5 mondial sur un niveau d’Hitman, tu as rendu mes années
toulousaines inoubliables. A tous ceux qui lisent ce texte, abonnez vous à la chaine
"Les Aventures du Ratafia" ! Merci à Guillaume de n’avoir jamais existé mais
d’avoir animé la vie du Disc par sa présence virtuelle pendant une bonne semaine.
Et enfin le dernier membre mais pas des moindres, Lucas, mon frr, mon garde du
corps du Brésil. Qui aurait cru que le grand gaillard sérieux et timide à chemise
arrivant dans le Beau Bureau deviendrait si important dans ma vie ? Courage pour
la fin de ta thèse, et vivement qu’on ouvre notre bar à bières, rhums arrangés et
jeux de société ! Justine, bienvenue à Toulouse, j’espère que tu t’y plairas et que
ton coloc n’est pas trop pénible !
Et pour finir merci à ceux qui étaient déjà là, aux éternels ; vous avez tous
répondu présents, et fait l’effort de vous intéresser quelques heures aux blockchains,
ce qui m’a donné force et courage. Je vous remercie tous. Merci à Mathilde (et
Svarti) pour m’avoir supportée au quotidien et 24h/24 pendant les confinements.
Tu es la meilleure Zouzik et tellement plus. Je l’avoue haut et fort de façon
indélébile ici : "ok, Toulouse est une super ville*". A mes parents, vous qui avez
toujours cru en moi et qui m’avez poussée à donner le meilleur (ou presque).
Après 7 déménagements en presque autant d’années, je suis fière de pouvoir vous
montrer aujourd’hui l’aboutissement de tout cela. Je ne serais jamais arrivée si loin
sans votre amour et votre présence, vous êtes mes modèles de réussite. Rébecca,
ma grande petite sister, tellement intelligente, douée, drôle et gentille derrière ta
petite carapace. Merci pour tous les "TRAVAILLE !" pendant mon sprint final
d’écriture. Térence, le plus gentil de la famille (mouais...), le futur prix Nobel,
Remerciements iii
Enfin, merci aux éventuels lecteurs de cette thèse. Lisez bien le graphique 2.5,
et si cette thèse et son contexte vous intéressent toujours, alors soyez les bienvenus !
Table des matières
1 Introduction 5
1.1 Contexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Plan du manuscrit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2 État de l’art 7
2.1 Cryptographie et sécurité informatique . . . . . . . . . . . . . . . . . 8
2.1.1 Propriétés de la sécurité informatique . . . . . . . . . . . . . 8
2.1.2 Fonctions de hachage classiques . . . . . . . . . . . . . . . . . 9
2.1.3 Fonctions de hachage homomorphes . . . . . . . . . . . . . . 10
2.1.4 Signatures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.5 Arbre de Merkle . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2 Blockchain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2.1 Généralité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2.2 Blockchain publique, blockchain privée . . . . . . . . . . . . . 21
2.2.3 Consensus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.2.4 Ethereum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.2.5 Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.3 Théorie des codes correcteurs . . . . . . . . . . . . . . . . . . . . . . 30
2.3.1 Théorie de l’information . . . . . . . . . . . . . . . . . . . . . 31
2.3.2 Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.3.3 Construction de codes à effacement . . . . . . . . . . . . . . . 33
2.4 Preuve de récupérabilité . . . . . . . . . . . . . . . . . . . . . . . . 36
2.4.1 Contexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.4.2 Principaux travaux . . . . . . . . . . . . . . . . . . . . . . . . 37
Bibliographie 115
Table des figures
3.1 Choix de k . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.2 Choix de r . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.3 Valeurs de c pour différents k et r, avec sB = 1M B . . . . . . . . . . 71
3.4 Analyse de paramètres pour un bloc de taille 1MB (avec tailles en
octets et temps en secondes) . . . . . . . . . . . . . . . . . . . . . . . 72
Résumé en français
La blockchain est un registre distribué et décentralisé, permettant de stocker et
d’échanger des informations de façon sécurisée, sans tiers de confiance. Pour cela,
les informations, appelées transactions, sont regroupées au sein de blocs, qui sont
ensuite liés entre eux de façon immuable grâce à des procédés cryptographiques. Le
registre sert d’historique de toutes les actions menées par les participants du réseau
depuis sa création.
C’est une technologie en plein essor, de plus en plus utilisée au quotidien. Cet
engouement croissant entraîne une explosion du nombre de transactions, ayant pour
conséquence directe une forte augmentation de la taille des principales blockchains.
Celles-ci deviennent donc plus compliquées à stocker dans leur intégralité, ce qui
peut décourager certains noeuds de stocker toute la blockchain et ainsi réduire le
niveau de décentralisation.
Dans cette thèse, nous proposons un nouveau type de noeud, appelé low storage
(LS) node, qui ne stocke plus les blocs en entier, mais des fragments de ceux-ci codés
avec un code à effacement. Pour retrouver le bloc initial, un noeud LS commence par
télécharger suffisamment de fragments codés depuis d’autres noeuds LS du réseau,
puis procède au décodage.
L’intérêt de cette approche est qu’elle permet à certains noeuds de stocker une
version codée moins volumineuse de la blockchain tout en contribuant à la décen-
tralisation de la blockchain. Elle facilite ainsi le passage à l’échelle des blockchains
qui pose actuellement problème.
Ce manuscrit présente également BlockHouse, un système complet permettant
la location d’espace de stockage libre entre particuliers. La principale innovation
est l’utilisation de contrats intelligents (smart contracts) déployés sur la blockchain
qui permettent des paiements automatiques et sécurisés basés sur des preuves de
récupérabilité des données régulièrement fournies par les serveurs de stockage.
Mots clés : Blockchain, passage à l’échelle, stockage, code à effacement, preuve
de récupérabilité
English summary
A blockchain is a distributed and decentralized registry, allowing to store and
exchange information in a secure way, without trusted third party. To do this,
the information, called transactions, is grouped into blocks, which are then linked
together in an immutable way thanks to cryptographic mechanisms. The registry
serves as an history of all the actions carried out by the network participants since
its creation.
It is a fast-growing technology, more and more used every day. This growing
popularity is leading to an explosion in the number of transactions, and the direct
consequence is an important increase of the size of the main blockchains. They
become more difficult to store in their entirety, which may discourage some nodes
from storing the entire blockchain and thus reduce their decentralization.
In this thesis, we propose a new type of node, called low storage (LS) node, which
no longer stores entire blocks, but fragments of them, coded with an erasure code.
To retrieve the initial block, a LS node first downloads enough coded fragments
from other LS nodes in the network and then decodes them.
The interest of this approach is that it allows some nodes to store a smaller
coded version of the blockchain while contributing to the decentralization of the
blockchain. It thus facilitates the scaling of blockchains, which is one of the major
issue of this technology.
This manuscript also presents BlockHouse, a complete system allowing
nodes to rent their free storage spaces to others. The main innovation is the
use of smart contracts deployed on the blockchain that allow regular, automatic
and secure payments based on proof of retrievability provided by the storage servers.
Introduction
1.1 Contexte
Une blockchain est un registre distribué et décentralisé, qui permet de stocker et
de transmettre des informations de façon sécurisée, sans utiliser d’autorité centrale.
Pour cela, le registre servant d’historique de toutes les actions menées au sein du
réseau est stocké indépendamment par chaque participant.
Une de ses propriétés principales est donc la décentralisation. Ces multiples
points de stockage empêchent en effet les noeuds malveillants de modifier les données
pour changer l’historique de la blockchain. Cependant, depuis quelques années, les
blockchains deviennent de plus en plus populaires. Les nombres d’utilisateurs et de
transactions augmentent fortement, et il devient difficile de participer activement
au système pour un utilisateur quelconque avec des capacités limitées.
Nous proposons dans un premier temps un nouveau type de client appelé low sto-
rage. Le principe est de ne plus stocker la chaîne dans sa totalité, mais uniquement
des fragments codés. Pour cela, les blocs originaux sont découpés en fragments de
taille fixe, et sont ensuite codés en réalisant des combinaisons linéaires de fragments.
Ce procédé permet de résoudre partiellement deux points sur les trois problèmes
actuels du passage à l’échelle, à savoir la trop grandes place requise pour stocker la
blockchain entière, et l’engorgement du réseau lié au nombre insuffisant de noeuds.
Suite à ces premiers travaux, nous nous sommes intéressés aux blockchains de
stockage existantes. Après une étude approfondie de leurs caractéristiques et dif-
férences, nous avons noté plusieurs points pouvant être améliorés, et avons donc
décidé de proposer notre propre système.
Dans un second temps, nous présentons BlockHouse, une solution de location
d’espace de stockage entre noeuds de la blockchain utilisant des contrats intelligents.
La particularité est que toutes les actions sont enregistrées dans la chaîne, et des
audits réguliers et automatiques sont menés par l’ensemble du réseau, grâce à des
preuves de récupérabilité.
Le contexte précis de chaque partie est expliqué plus en détails au début du
chapitre associé.
6 Chapitre 1. Introduction
État de l’art
Sommaire
2.1 Cryptographie et sécurité informatique . . . . . . . . . . . . 8
2.1.1 Propriétés de la sécurité informatique . . . . . . . . . . . . . 8
2.1.2 Fonctions de hachage classiques . . . . . . . . . . . . . . . . . 9
2.1.3 Fonctions de hachage homomorphes . . . . . . . . . . . . . . 10
2.1.4 Signatures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.5 Arbre de Merkle . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2 Blockchain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2.1 Généralité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2.2 Blockchain publique, blockchain privée . . . . . . . . . . . . . 21
2.2.3 Consensus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.2.4 Ethereum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.2.5 Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.3 Théorie des codes correcteurs . . . . . . . . . . . . . . . . . . 30
2.3.1 Théorie de l’information . . . . . . . . . . . . . . . . . . . . . 31
2.3.2 Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.3.3 Construction de codes à effacement . . . . . . . . . . . . . . . 33
2.4 Preuve de récupérabilité . . . . . . . . . . . . . . . . . . . . . 36
2.4.1 Contexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.4.2 Principaux travaux . . . . . . . . . . . . . . . . . . . . . . . . 37
8 Chapitre 2. État de l’art
Dans cette thèse, nous proposons des contributions prenant place sur les blo-
ckchains. Le fonctionnement de celles-ci repose sur des procédés cryptographiques,
c’est pourquoi cet état de l’art commencera en 2.1 par rappeler certaines notions
de ce domaine, essentielles pour la compréhension de la suite.
Une fois ces notions abordées, nous présenterons les caractéristiques et le fonc-
tionnement des blockchains dans la partie 2.2.
Le chapitre 3 présente un nouveau type de noeud de blockchain, dont le principe
est de stocker des fragments codés à la place des blocs entiers. Pour la compréhension
de cette partie, nous introduisons en 2.3 les concepts de base de la théorie de
l’information et plus particulièrement les codes correcteurs d’erreur.
Le chapitre 4 propose un nouveau système se plaçant au sein de la blockchain,
et permettant de déporter le stockage de données sur un serveur externe, avec
vérifications et paiements automatiques. Ce système repose entre autres sur un
outil appelé preuve de récupérabilité, qui sera abordé en détail dans la partie 2.4.
La sécurité informatique est la discipline ayant pour but de protéger les sys-
tèmes d’information contre la malveillance. Pour cela, des protections sont mises en
place à différents niveaux : techniques, organisationnels, humains, etc. Une des ma-
nières d’évaluer la sécurité, comme spécifié dans la norme ISO 27001, est de définir
plusieurs propriétés que le système d’information doit respecter :
— Confidentialité : seules les personnes autorisées ont accès à l’information.
Celle-ci peut éventuellement être lue par une personne non autorisée, mais
doit rester inintelligible.
— Intégrité : les données n’ont pas été altérées, elles sont exactes et complètes.
Un adversaire ne doit pas pouvoir les modifier ou les forger.
— Authenticité : l’émetteur est bien celui qu’il prétend être.
— Disponibilité : les données sont accessibles lorsqu’un utilisateur en a besoin.
— Non répudiation : garantir qu’un message a bien été envoyé par son émetteur,
et/ou que le destinataire l’a bien reçu.
Selon les référentiels ou les domaines d’application, ces propriétés peuvent être
plus ou moins nombreuses. Dans le cadre de ce manuscrit, seules celles-ci seront
utilisées.
2.1. Cryptographie et sécurité informatique 9
Une fonction de hachage est une fonction à sens unique qui, à partir d’un en-
semble de taille variable et diversifié, va retourner une empreinte unique. Cette
empreinte est un ensemble de taille fixe, dont la valeur dépendra de la fonction
utilisée.
La plus récente est SHA-3 [2], validée en 2012 par le National Institute of Stan-
dards and Technology. Elle propose une alternative à la famille des fonctions SHA-2,
qui ne sont toujours pas compromises pour le moment.
Chaque fonction de hachage possède ses propres algorithmes, nous expliquerons
donc le principe générale, et non pas un exemple précis.
Plus formellement, notons notre fonction de hachage h, notre texte initial t
(d’une taille quelconque), sur l’ensemble binaire {0, 1}, et l’empreinte obtenue h(t),
d’une taille m sur l’ensemble binaire {0, 1}. On a alors :
h : {0, 1}∗ →
− {0, 1}m
(2.1)
t→
− h(t)
Sens unique signifie ici que la fonction est facilement réalisable, mais que son in-
verse est très complexe à calculer. Ainsi, on ne peut pas retrouver la donnée d’origine
à partir de son empreinte. Pour cela, la fonction de hachage doit vérifier certaines
propriétés (nous reviendrons plus tard sur la notion d’impossibilité présente dans
ces propriétés) :
— Résistance au calcul d’une préimage : il est impossible calculatoirement de
retrouver un texte x, en connaissant seulement son empreinte. L’équation 2.2
donne une explication plus formelle :
Une fonction de hachage homomorphe possède les mêmes propriétés qu’une fonc-
tion classique, avec la propriété supplémentaire que l’empreinte d’une combinaison
linéaire de certains blocs d’entrée peut être construite efficacement par une combi-
naison des empreintes des blocs d’entrée. Le but est d’avoir deux opérations, notées
et ◦, telles que h(ca .acb .b) = hca (a) ◦ hcb (b), avec a et b des vecteurs, et ca et cb
des scalaires.
Dans cette thèse, nous avons utilisé les résultats de l’article "On-the-fly verifi-
cation of rateless erasure codes for efficient content distribution" [3], ainsi que ceux
de "Cooperative Security for Network Coding File Distribution" [4], permettant
l’homomorphie avec l’addition sur Zq et ◦ la multiplication sur Zp .
Soit F le fichier dont on souhaite l’empreinte. Ce fichier est séparé en n blocs,
notés bi avec i ∈ {1, n}, et chaque bloc est lui-même séparé en m sous-blocs notés
bi,j avec i ∈ {1, n} et j ∈ {1, m}. Le fichier peut donc être représenté par une
2.1. Cryptographie et sécurité informatique 11
matrice :
b1,1 b1,2 ... b1,n
b b2,2 ... b2,n
2,1
(2.6)
...
bm,1 bm,2 ... bm,n
2.1.4 Signatures
destinataire du message reçoit un texte en clair, que l’on notera m0 et une signature
sm . En appliquant la fonction de vérification de la signature avec la clé publique
du destinataire e, V (e, sm , m0 ), on vérifie à la fois que l’empreinte du message reçu
correspond à celle de la signature (intégrité), et que la signature a bien été faite
par la bonne personne (authenticité). Tout le monde connaît e, donc peut s’assurer
que c’est le bon émetteur, car lui seul connaît le d associé. Combiné au fait que
l’on respecte les propriétés d’intégrité et d’authenticité, on obtient également la
propriété de non répudiation.
Voici quelques exemples d’algorithmes asymétriques pouvant être utilisés pour
la signature :
— RSA [5] : Repose sur le petit théorème de Fermat et l’exponentiation mo-
dulaire. Les calculs se font modulo n, le produit des deux nombres premiers
distincts. Pour chiffrer et déchiffrer, le message est élevé à la puissance d’un
nombre, qui est la clé publique ou la clé privée selon la situation. A sa
conception, RSA était sous brevet MIT.
— ElGamal [6] : Se base sur l’exponentiation modulaire ainsi que sur le pro-
blème du logarithme discret. Les calculs se font modulo p, un nombre pre-
mier. La clé publique est un nombre élevé à la puissance de la clé privée
kp = αks mod p. La clé privée permet donc de déchiffrer, en mettant le
message chiffré à la puissance de son opposé m = m−k
c
s mod p. L’utilisation
d’un nombre aléatoire pour chaque nouvelle signature rend la fonction non
deterministe.
— DSA : Se base sur le problème du logarithme discret. C’est une amélioration
de l’algorithme de ElGamal, qui permet d’avoir une signature de taille infé-
rieure, en prenant des élément d’un sous groupe, tout en assurant la même
sécurité.
— ECDSA ("Elliptic Curve Digital Signature Algorithm") [7] : utilisée par
exemple sur les blockchains Bitcoin et Ethereum, le principe est similaire
à DSA, mais le groupe est une groupe de points sur une courbe elliptique
sur un corps fini. La sécurité est renforcé sur un tel groupe, car il n’existe
pour le moment pas d’algorithme permettant de réduire la complexité de la
résolution du problème du logarithme discret.
— Schnorr [8] est une preuve à divulgation nulle de connaissance, reposant
encore sur le problème du logarithme discret. Le protocole est intéractif entre
plusieurs entités et se déroule en trois étapes : engagement, défi, réponse.
Il n’est possible de répondre correctement au défi qu’en connaissant la clé
privée. Son utilisation est fortement envisagé pour une évolution future de
2.1. Cryptographie et sécurité informatique 13
Bitcoin.
Dans notre exemple, pour vérifier l’intégrité de d3, nous avons besoin de h(d4),
h(h(d1) + h(d2)) et de la racine. Il n’est donc pas nécessaire de télécharger toutes
les données.
14 Chapitre 2. État de l’art
2.2 Blockchain
2.2.1 Généralité
2.2.1.1 Historique
Ce concept avait été publié pour la première fois en 1994 par N. Szabo [22],
qui présentait le contrat intelligent comme "un protocole de transaction informatisé
qui exécute automatiquement les termes d’un contrat." Un accord entre plusieurs
entités, écrit sous la forme d’un code informatique, et décentralisé. La décentralisa-
tion est possible car le contrat est stocké dans la blockchain, donc distribué sur le
réseau, et s’exécute automatiquement sous certaines conditions, sans avoir besoin
d’une tierce personne.
Le but principal de ce système est d’éviter les intermédiaires. Pour cela, chaque
machine participant au réseau stocke sa propre chaîne, sur sa propre mémoire.
Toutes ont en commun le même bloc initial, appelé bloc genèse. Lorsqu’un nouveau
bloc est ajouté, le noeud vérifiera sa validité grâce à ses informations, et le validera
(ou non) en l’ajoutant à la suite de sa chaîne. Il peut ainsi avoir une entière
confiance dans les informations qu’il stocke, puisqu’il a vérifié chacune d’elles.
Chaque nouveau bloc est créé à intervalle régulier par un noeud choisi par le
réseau, selon la méthode de consensus propre au système (voir section 2.2.3). Il est
ensuite envoyé à tous les noeuds du réseau, qui en vérifient indépendamment la
validité. Dans la pratique, le réseau est loin d’être totalement temps réel, il peut
donc arriver que des machines n’aient pas exactement la même version de la chaîne
à un moment donné. Dans ce cas, la règle est de choisir la chaîne valide la plus
longue.
Une blockchain est considérée comme valide lorsqu’il est possible de la recons-
truire entièrement en partant du bloc genèse.
2.2. Blockchain 17
Comme nous venons de le voir, une blockchain est une séquence de blocs. La
structure exacte d’un bloc dépend de la blockchain en question et est spécifiée
dans son protocole, mais un certain nombre d’informations restent obligatoires et
communes :
— Le numéro du bloc, permettant de vérifier l’ordre de la chaîne.
— L’horodatage, indiquant la date et l’heure à laquelle le bloc a été créé. Les
blocs se suivent de façon chronologique.
— La donnée du bloc, contenant par exemple les transactions. La section 2.2.1.5
rentrera dans les détails.
— Le NONCE (number used once) est un nombre aléatoire. Il permet de réaliser
la preuve de travail, comme nous l’expliquerons dans la section 2.2.3.
— L’empreinte du bloc précédent, qui permet de lier les blocs entre eux. En
effet connaissant l’empreinte du bloc précédent, il est possible de s’assurer
de son intégrité, et donc de repérer des éventuelles modifications.
18 Chapitre 2. État de l’art
Un compte utilisateur d’une blockchain est une adresse à laquelle est associé un
couple de clés privée/publique. Transférer des jetons vers un autre compte revient
à émettre un message signé avec sa clé privée vers l’adresse du destinataire, en
précisant le nombre de jetons concernés. Comme nous l’avons vu dans la partie 2.1,
2.2. Blockchain 19
Une des particularités de la blockchain, est de chaîner les blocs entre eux, grâce
à la cryptographie. Pour cela, on ajoute dans chaque nouveau bloc l’empreinte du
bloc précédent, qui lui même contiendra l’empreinte du bloc le précédant. Ainsi, les
blocs vont être liés entre eux de façon immuable, permettant de garantir l’intégrité
des données. Si une personne malveillante tente d’altérer un bloc au milieu de la
chaîne, cette modification aura une impact directe sur son empreinte, et le bloc
suivant ne le reconnaîtrait plus.
Pour illustrer cela, dans la figure 2.4, on tente de modifier le contenu du bloc
94.
Dans ce schéma, la blockchain originale est représentée en noir. Pour des
raisons de lisibilité, seules les empreintes des blocs précédents sont représentés.
Un attaquant décide de modifier le bloc 51, afin d’y insérer une transaction en sa
faveur (par exemple un transfert de fond important vers son compte). Le nouveau
bloc, que nous appellerons 94’, est représenté en rouge. Comme son contenu est
différent du bloc 51, son empreinte sera également différent. Ainsi, le bloc 95 ne
reconnaîtra pas le bloc 94’ comme son bloc précédent. Comme il est d’usage de
choisir la chaîne la plus longue, les autres noeuds du réseau continueront avec la
blockchain d’origine, en noir. Il faudrait reconstruire toute la suite de la chaîne
pour obtenir une chaîne valide.
1. Tout d’abord la méthode de consensus est justement choisie pour être suf-
fisamment compliquée à réaliser pour ne pas pouvoir rattraper la chaîne
courante. Cela impliquerait des coûts très élevés. Or le noeud accomplissant
le consensus et créant le nouveau bloc reçoit une récompense. Il est donc
plus rentable pour le noeud de jouer le jeu de façon honnête.
Les blockchains privées possèdent une principe similaire aux blockchains pu-
bliques, mais l’accès est restreint, et les noeuds ne possèdent pas tous des droits
identiques. Le nombre de noeuds étant plus restreint, elles sont moins décentra-
lisées, mais l’information circule plus rapidement. Le choix de consensus est plus
varié, et il peut même d’ailleurs être inexistant dans le cas d’une blockchain privée
avec autorité centrale. De plus, certains méthodes de consensus ne demandent pas
d’effort, les frais de transaction n’ont donc plus de raisons d’être. Ces blockchains
peuvent être regroupées en deux catégories : consortium et privée. Hyperledger Fa-
bric, R3 Corda et Quorum sont trois exemples de blockchains pouvant tourner en
privée ou en consortium, selon le contexte où elles sont déployées.
2.2.2.3 Choix
2.2.3 Consensus
Dans le cas des blockchains, il faut également prendre en compte le fait qu’il
n’y a pas de confiance dans le réseau, et que les autres noeuds peuvent se comporter
de façon malhonnête.
Ce problème concernant l’intégrité des différents protagonistes lors d’une trans-
mission d’information, est un problème important en informatique. Il est appelé
"problème des généraux byzantins" [25].
PBFT [26] est un algorithme permettant d’arriver à un consensus en présence
d’au plus f noeuds malveillants, si le réseau est composé d’au moins 3f + 1 ma-
chines. Pour rendre cela possible, le réseau se sépare en deux groupes, les noeuds
primaires, proposant des valeurs, et les noeuds secondaires, validant et relayant les
propositions, jusqu’à arriver à une majorité d’accords, similairement à Paxos. L.
Lamport a d’ailleurs ensuite également adapté Paxos, afin de le rendre tolérant aux
2.2. Blockchain 25
attaques byzantine [25]. Ce type d’algorithme peut être utilisé pour les blockchains
privées.
Cependant les blockchains publiques ont besoin d’arriver à un consensus à des
périodes régulières, et peuvent être constituées d’un très grand nombre de noeuds
(ce nombre étant d’ailleurs généralement inconnu). De plus, n’importe qui peut
rejoindre le réseau sans vérification, et il est donc possible de créer plusieurs comptes
pour une seule et même personne. Le mécanisme de consensus doit être résistant
aux attaques Sybil (basées sur la création de fausses identités). Pour ces raisons,
d’autres méthodes de consensus ont été choisies.
2.2.4 Ethereum
Figure 2.6 – Exemple d’ajout d’un nouveau bloc qui aura un parent et un oncle
est renforcée. Chaque bloc valide peut ainsi être ajouté dans la chaîne, et la somme
totale de la preuve effectuée pour la blockchain augmente, puisque le nombre de
blocs augmente. De plus, réaliser le consensus même dans le cas où le bloc n’est pas
ajouté dans la chaîne principale, donne quand même le droit à une rémunération, et
permet donc à des mineurs avec une capacité de minage modeste de quand même
continuer leur travail, contribuant à la décentralisation.
Grâce à cela, sur Ethereum la fréquence entre deux blocs est de 15 secondes
environ, tandis que sur Bitcoin un bloc est créé en moyenne toutes les 10 minutes.
Les transactions sont ainsi plus rapidement validées sur Ethereum.
Pour écrire ces contrats, plusieurs langages de programmation haut niveau ont
été développés. Ces langages sont Turing complet, comme la plupart des langages de
programmation usuels, ce qui amène un problème important, le problème de l’arrêt.
En effet, dans le cas d’un tel langage, en ayant uniquement le code source et l’entrée
du programme, il est impossible de s’assurer qu’un programme s’arrêtera. Or les
contrats s’exécutant sur toutes les machines du réseau, qui n’ont par définition pas
forcément confiance dans le réseau, il est nécessaire de s’assurer que le programme
s’arrêtera. De plus, il semble assez logique de limiter le nombre de calculs à effectuer
dans les contrats, pour éviter de saturer tous les noeuds avec des calculs trop lourds.
Pour cela, dès le white paper, il a été convenu d’ajouter le concept de gaz,
une somme de jeton à dépenser pour déployer son contrat dans la blockchain, qui
correspond à l’effort nécessaire pour exécuter le code. L’environnement d’exécution
de ces contrat s’appelle l’Ethereum Virtual Machine et est présent dans tous les
clients Ethereum, pour permettre à chaque noeud de faire tourner les contrats et
de les vérifier par eux-mêmes.
2.2.5 Applications
inscrire dans la blockchain son vote, chiffré ou non, selon la confidentialité voulue,
et un contrat intelligent comptabiliserait les votes pour annoncer automatiquement
les résultats. Plusieurs essais concluants ont été réalisés ces dernières années, comme
par exemple lors d’un vote interne pour le parti "Nous citoyens", sur la blockchain
Ethereum.
2.3.1.2 Canal
maximale pouvant transiter sans erreur sur celui-ci dans un temps donné. La loi de
transition, notée P (Y |X), est la probabilité d’obtenir un certain symbole en sortie
de canal, connaissant le symbole d’entrée. Le taux d’erreur est la probabilité qu’un
symbole décodé, en sortie du canal, soit différent du symbole initial, en entrée du
canal.
Plusieurs modélisations de canal existent, selon les caractéristiques qu’il pré-
sente. Un des modèles les plus simples est le canal binaire symétrique, présenté
sur la figure 2.7, dans lequel un bit peut soit être transformé, soit être transmis
correctement.
Un autre modèle courant est le canal binaire symétrique à effacement, présenté à
la figure 2.8, dans lequel un bit peut soit être perdu, soit être transmis correctement.
Dans le contexte de cette thèse, il peut y avoir des effacements, mais également
des erreurs (dues entre autres à de la malveillance). Le canal pourra donc être
représenté par un canal binaire symétrique à erreur et à effacement. Sur le schéma
de la figure 2.9, la probabilité de transmettre correctement l’information est 1−p−q,
la probabilité d’avoir une erreur est p, et la probabilité d’avoir une perte est q.
Dans certains systèmes, les symboles des mots de code sont souvent des octets
et non pas simplement des bits. Dans le cas d’un codage par blocs de taille k, on
découpe le message m en blocs contenant k symboles et on traite les blocs les uns à
la suite des autres. Le schéma du canal reste le même, avec 256 possibilités à gauche
(de 00000000 à 11111111), et 257 à droite (les mêmes octets et en plus la possibilité
2.3. Théorie des codes correcteurs 33
2.3.2 Applications
Ce code a été proposé par I. S. Reed et G. Solomon en 1960 [36, 37]. C’est un
code linéaire, noté RS(n, k), avec k symboles originaux et n symboles en sortie,
soit n − k symboles de redondance. Il corrige jusqu’à t symboles et e erreurs avec
2t + e = n − k. Le code est optimal sur le canal à effacement car il décode jusqu’à
la capacité du canal.
Pour construire un code RS(n, k) sur le corps fini Fq , on prend tout d’abord
Qq−1
n = q − 1. Soit α une racine primitive. On a X n − 1 = i=1 (X − αi )
Pour construire un code Reed-Solomon(n,k) avec r = n − k symboles de redon-
dance, on choisit un polynôme générateur de degré r avec des racines consécutives :
Qs+r−1
g(X) = i=s (X − αi )
On peut aussi le caractériser par sa matrice génératrice k × n :
G = αi.j (2.7)
i=0,...,k−1; j=0,...,n−1
Les codes fontaines sont une catégorie de codes quasi optimaux, c’est-à-dire
qu’ils nécessitent au moins (1 + ε)k blocs codés pour restaurer un message initial
composé de k blocs (avec ε > 0). L’avantage est que les temps de codage et décodage
sont quasi-linéaires (de l’ordre de k.ln( 1ε ) avec k(1 + ε) blocs codés).
Nous détaillons ici le cas des LT codes et des online codes. Ils permettent d’ex-
pliquer comment fonctionnent des codes fontaines avec et sans précodage, et seront
utilisés plus tard dans le manuscrit.
Codes LT Présenté par M. Luby en 1998 [38, 39], les codes LT sont des codes
fontaines sans précodage.On décrira ces codes dans le contexte pour lequel ils ont
2.3. Théorie des codes correcteurs 35
Codes Raptor et Online Les codes Raptor [40] et les codes Online [41], présen-
tés respectivement par A. Shokrollahi et P. Maymounkov quelques années plus tard,
sont une famille de codes dérivée des codes LT, avec une opération supplémentaire
de précodage.
36 Chapitre 2. État de l’art
2.4.1 Contexte
Une solution naïve à ce problème serait de télécharger le fichier dans son inté-
gralité, afin d’en vérifier l’intégrité. Cependant ce processus est long, et doit en plus
être réalisé régulièrement.
Une deuxième solution pourrait être de demander fréquemment au serveur des
morceaux plus ou moins longs de fichier. Le problème dans ce cas est double : tout
d’abord, pour pouvoir vérifier que le morceau de fichier est correct, le système doit
2.4. Preuve de récupérabilité 37
en posséder une copie, et donc en réalité continuer à stocker lui même le fichier en
entier ; de plus, la probabilité de détecter une erreur est directement proportionnelle
à la taille du morceau téléchargé.
Les preuves de récupérabilité (POR) sont des protocoles permettant au client de
s’assurer que le serveur externe stocke bien son fichier, et que celui ci est récupérable.
En d’autres termes, le fichier doit non seulement être toujours stocké par le serveur,
mais ne pas avoir été altéré (pas de modification ni de suppression). Pour cela,
le client va régulièrement envoyer des challenges au serveur, qui aura besoin du
fichier pour les résoudre. La réponse à ces challenges doit induire un coût en bande
passante et en calcul inférieur à celui du téléchargement du fichier entier, et doit
permettre de s’assurer avec une très grande probabilité que le serveur possède bien
le fichier.
Les travaux réalisés sur ces preuves sont assez récents et concentrés, car cette
problématique est devenue importante avec l’avènement du cloud computing et du
stockage à distance, vers les années 2007.
2.4.2.1 Shah
2.4.2.2 Ateniese
L’article reprend l’idée de base de [42]. Ses auteurs sont les premiers à proposer
une POR publique grâce à des authentificateurs, des tags homomorphes et à RSA.
Deux schémas différents sont présentés, un privé et un public.
Le fichier F est séparé en blocs auxquels on associe des tags homomorphe, qui
seront stockés sur le serveur. Ils sont générés à partir du message, de la clé privée
et de la clé publique. Ils permettent de vérifier les blocs, même sans les posséder
entièrement, car ils les caractérisent et sont inforgeables.
Le client émet un challenge, en choisissant un nombre unique et différent à
chaque fois. Le serveur envoie une réponse à partir de la clé publique, le fichier, le
challenge, et les tags, que le client peut vérifier avec la clé privée, la clé publique,
le challenge et la réponse.
Les tags de chaque bloc permettent de s’assurer qu’une combinaison linéaire
de blocs est correctement réalisée. Avec ce procédé, la réponse au challenge est
rendue plus légère, mais le temps d’exécution est allongé à cause de la complexité
de l’exponentiation modulaire. A noter que le nombre d’exponentielles modulaires
est constant, donc la complexité des entrées/sorties l’est également : cette méthode
est ainsi applicable pour des gros fichiers.
L’article [43] est l’un des plus anciens à proposer une réelle solution à la preuve
de récupérabilité, en introduisant le vocabulaire correspondant et en définissant
clairement le concept. Leur solution apporte entre autre le fait de s’assurer non
seulement que le fichier est toujours stocké, mais également qu’il sera récupérable
par l’utilisateur.
Le client ajoute des données supplémentaires, appelées sentinelles, dans le fichier
préalablement chiffré qu’il souhaite faire stocker. Les sentinelles sont placées à des
positions stratégiques dans le fichier. De cette façon, modifier une partie du fichier
entraîne une modification d’une sentinelle avec une probabilité très élevée. Comme
le fichier est illisible car chiffré, les sentinelles seront indétectables pour le serveur.
Le client envoie ce fichier modifié et stocke uniquement la clé de déchiffrement
du fichier, ainsi que les fameuses sentinelles. Lorsqu’il souhaite une preuve de récu-
pérabilité, il envoie une demande de donnée à une position précise, correspondant
à une sentinel. Il est possible pour le client de vérifier si la sentinelle demandée est
correcte, puisqu’il les a gardées dans sa mémoire.
Le nombre de sentinelles étant fixe, le nombre de demandes de preuves est limité.
2.4. Preuve de récupérabilité 39
De plus, la donnée est statique, c’est-à-dire que si l’on souhaite la modifier, il faudra
recommencer tout le processus.
Dans leur article "Proofs of retrievability : Theory and implementation" [44], ils
reprennent les travaux "Compact Proofs of Retrievability" [45] de Shacham, expliqué
dans la prochaîne sous-section. Leur proposition permet de réduire les besoins en
stockage tout en augmentant le niveau de sécurité, au détriment d’une légère hausse
en terme de calculs.
Sommaire
3.1 Introduction et contexte . . . . . . . . . . . . . . . . . . . . . 42
3.1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.1.2 Contexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.1.3 Différents types de clients . . . . . . . . . . . . . . . . . . . . 45
3.1.4 Nouvelles solutions émergeantes . . . . . . . . . . . . . . . . . 46
3.2 Description globale du système . . . . . . . . . . . . . . . . . 47
3.2.1 Noeud LS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.2.2 Accès aux soldes des comptes . . . . . . . . . . . . . . . . . . 48
3.2.3 Interaction avec la blockchain . . . . . . . . . . . . . . . . . . 48
3.3 Protocole des noeuds LS . . . . . . . . . . . . . . . . . . . . . 49
3.3.1 Fragmentation des blocs . . . . . . . . . . . . . . . . . . . . . 50
3.3.2 Coder les blocs . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.3.3 Décoder les blocs . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.4 Analyse des paramètres . . . . . . . . . . . . . . . . . . . . . . 54
3.4.1 Taille du corps fini . . . . . . . . . . . . . . . . . . . . . . . . 54
3.4.2 Complexité de codage . . . . . . . . . . . . . . . . . . . . . . 54
3.4.3 Complexité du décodage . . . . . . . . . . . . . . . . . . . . . 58
3.4.4 Paramètre de fragmentation k . . . . . . . . . . . . . . . . . . 59
3.4.5 Facteur de compression . . . . . . . . . . . . . . . . . . . . . 59
3.5 Décodage en cas de fragments codés erronés malveillants . 61
3.5.1 Code correcteur d’erreurs . . . . . . . . . . . . . . . . . . . . 61
3.5.2 Fonctions de hachage homomorphes . . . . . . . . . . . . . . 63
3.6 Avantage des noeuds LS . . . . . . . . . . . . . . . . . . . . . 72
3.6.1 Effort de stockage réduit . . . . . . . . . . . . . . . . . . . . . 72
3.6.2 Disponibilité . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3.6.3 Intégrité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
3.6.4 Équilibrage de la charge réseau . . . . . . . . . . . . . . . . . 77
3.7 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
42 Chapitre 3. Client blockchain basé sur les codes à effacement
3.1.2 Contexte
300
Taille (Go)
200
100
0
2009-01
2015-09
2020-01
Figure 3.1 – Evolution de la taille de la blockchain Bitcoin
3,000
2,000
1,000
500
2019-01
2019-06
2020-01
2020-06
Finder. Leurs résultats indiquent que le nombre de noeuds complets sur le réseau
Ethereum est de 15454 en avril 2018, soit quasiment le double de Bitcoin. Mais l’ar-
ticle soulève d’autres problèmes propres à ce réseau, comme le fait que les noeuds
soient en majorité très récents (50% et 75% des noeuds Parity et Geth ont moins de
100 jours), et que l’information est surtout concentrée dans quelques pays, puisqu’à
eux seuls les USA et la Chine comportent 56.1% des noeuds complets.
Nous présentons dans cette partie les deux types de clients classiques, ainsi que
leurs points positifs et négatifs.
Un client complet est le type de client que nous avons vu dans la partie état de
l’art, sans le citer explicitement. En effet, c’est le client classique des blockchains, qui
se synchronise au réseau en téléchargeant chaque bloc depuis le bloc genèse, et en
vérifiant toutes les transactions qu’ils contiennent. Ce type de noeud est primordial
car il permet une vraie décentralisation de la blockchain, qui sera donc distribuée
sur plusieurs noeuds. Il permet aussi d’assurer sa disponibilité et sa sécurité.
Dans le cas d’Ethereum, le noeud doit en plus stocker, exécuter et vérifier les
contrats intelligents. Cette blockchain stocke l’état des comptes ainsi que des struc-
tures particulières mises à jour à chaque nouveau bloc traité (par exemple les reçus
de transactions donnant le résumé et le résultat d’exécution d’un contrat). Il existe
à ce jour plusieurs types de noeuds complets [48] :
1. Noeud archive Ethereum : il garde tous les blocs et tous leurs états, c’est
à dire qu’il est possible à tout moment de revenir à un point donné de la
blockchain, sans rien avoir à calculer.
2. Noeud élagué : il stocke tous les blocs mais ne garde que les états les plus
récents.
3. Noeud à synchronisation rapide : en partant du bloc genèse, il télécharge
les blocs, les en-têtes, et vérifie les preuves. Mais concernant les contrats, il
ne les exécute pas mais télécharge simplement les reçus de transactions et
l’état courant le plus récent. Lorsqu’il arrive à un point pivot (bloc courant -
1024 par défaut), il traite les derniers blocs "normalement" (c’est à dire qu’il
repasse en mode noeud complet).
Ces trois types de noeuds complets sont les plus utilisés, mais d’autres similaires
peuvent exister, reprenant en partie ces concepts.
46 Chapitre 3. Client blockchain basé sur les codes à effacement
Comme son nom l’indique, un noeud faisant tourner un client léger aura une
version allégée de la blockchain. Ce noeud ne participera donc pas réellement à la
décentralisation, la distribution et la sécurité de la blockchain. Cependant, il pourra
quand même vérifier certaines transactions, en émettre, ou bien encore consulter les
états des comptes.
Dans le papier initial présentant Bitcoin [20], une description d’un client léger
était déjà présente. Appelé SPV pour Simplified Payment Verification, il prévoyait
de ne stocker que les en-têtes des blocs. Pour vérifier une transaction, le noeud
demande le contenu des blocs correspondants au réseau, et vérifie leur intégrité
grâce aux arbres de Merkle contenus dans l’en-tête. Il ne vérifie donc en général
que les transactions qui le concerne directement. Ce système permet de résoudre
partiellement les problèmes 1) et 2) abordés dans la section 3.1.1.
Sur Ethereum, il existe différents clients légers reprenant le principe consistant
à ne stocker que les en-têtes. Certaines options permettent de ne télécharger que
les dernières en-têtes depuis un point de contrôle (donc un point de confiance),
ou depuis le bloc genèse. Là encore, les données sont vérifiées grâce aux arbres
de Merkle. Il est également possible de garder en plus les derniers blocs dans leur
totalité.
Les noeuds légers sont plus accessibles et plus faciles à mettre en place sur une
machine, car ils sont beaucoup moins coûteux en termes de stockage, de traitement
et de connexion. Cependant, nous y voyons deux gros problèmes :
— Comme ils ne stockent pas les blocs, la disponibilité des blocs diminue. Ils
n’apportent pas d’amélioration de la distribution de la blockchain, ce qui
entraîne un danger pour la blockchain qui repose sur la disponibilité de tous
les blocs (en effet il est primordial de pouvoir remonter jusqu’au bloc de
genèse pour considérer la chaine comme valide).
— Ils ne reconstruisent pas la blockchain entièrement, et demandent ainsi une
certaine confiance dans le réseau et les noeuds complets.
Le sharding : est une technique directement tirée du big data, où les bases
de données sont divisées en éclats (shards) répartis sur différents serveurs, afin
de distribuer les charges de stockage, de traitement et de réseau. Dans le cas des
blockchains, les noeuds ne traiteront donc plus la chaîne entière, mais uniquement
des portions de celle-ci.
Nous proposons dans cette thèse un nouveau type de client de blockchain, appelé
low storage et abrégé en "noeud LS" dans ce manuscrit. Nous présentons ici une vue
haut niveau ainsi que la manière dont ils s’intègrent dans le système actuel.
3.2.1 Noeud LS
Le noeud low storage, est un nouveau type de noeud. Son but est de se placer
entre le noeud complet et le noeud léger, en proposant une alternative pour les
personnes souhaitant participer activement à la décentralisation de la blockchain,
mais sans forcément la stocker dans son intégralité et sans accorder sa confiance à
des tiers.
Les noeuds LS n’ont pas pour ambition de remplacer les noeuds existants. Ils
peuvent au contraire co-exister avec.
Le principe de base est de proposer le stockage de fragments codés uniquement,
au lieu de stocker les blocs dans leur totalité. Pour cela, les blocs initiaux sont
découpés en fragments de taille fixe, qui sont ensuite codés en réalisant des com-
binaisons linéaires de fragments. Ces combinaisons linéaires dépendent du type de
code utilisé, et il est possible d’utiliser au choix l’un des codes présentés dans la
section 2.3.
48 Chapitre 3. Client blockchain basé sur les codes à effacement
Les fragments codés stockés ne sont pas directement exploitables, mais peuvent
être décodés si besoin grâce aux autres noeuds LS, possédant eux-mêmes d’autres
fragments codés. L’économie en terme de stockage se fait ainsi au détriment de
l’accès immédiat à l’information. Il est donc nécessaire de pouvoir consulter les
montants associés à chaque compte d’une autre façon qu’en parcourant les anciens
blocs, pour éviter d’avoir à décoder trop fréquemment.
Dans le cas d’Ethereum, les soldes des comptes sont stockés dans une base de
données mise à jour à chaque nouveau bloc traité. En construisant soi-même cette
base de données depuis le bloc genèse, le noeud n’a pas de confiance particulière à
fournir au réseau. Lorsque le noeud veut valider une nouvelle transaction, il lui suffit
de vérifier que l’émetteur est bien en possession des jetons qu’il souhaite dépenser,
puis de les soustraire au montant du compte et de les ajouter à celui du destinataire
de cette transaction, dans la base de données.
Dans le cas de Bitcoin, le système actuel ne permet pas d’accéder directement
aux soldes des comptes. Cependant il nous semble facile de mettre en places une
base de données des comptes comme dans Ethereum, en traitant chaque nouvelle
transaction afin d’ajouter ou soustraire des jetons aux soldes des comptes concernés.
Ce nouveau type de noeud n’a pas pour ambition de remplacer les noeuds exis-
tants, mais plutôt de les compléter, en proposant une nouvelle alternative. Ce noeud
peut s’implémenter aussi bien dans une blockchain publique qu’une blockchain pri-
vée.
Bien que nous considérions que cet évènement reste relativement rare, il peut
arriver qu’un noeud LS ait besoin de restaurer un bloc, par exemple pour vérifier
son contenu. Mais ce décodage peut également avoir lieu lors du téléchargement
initial de la blockchain, quand le noeud se synchronise au réseau pour la première
fois. En effet il peut tout simplement utiliser des noeuds complets, sans besoin de
décoder, ou bien s’appuyer sur des noeuds LS, ou encore associer les deux.
Dans le cas de l’utilisation de noeuds LS, le noeud doit télécharger suffisamment
de fragments codés. Lorsque le nombre de fragments nécessaire est atteint, il procède
à l’opération de décodage. Il se retrouve alors en possession des fragments initiaux,
et n’a plus qu’à les assembler pour obtenir le bloc dans sa totalité.
Le nombre de fragments nécessaires dépend du type de code choisi, ainsi que du
nombre de fragments initiaux.
Lorsqu’un nouveau bloc est créé, le noeud l’ayant produit le transfère à tous ses
voisins, qui vont ensuite eux aussi le transférer, jusqu’à ce que le bloc soit accepté
par tous les membres du réseau, qui vont le vérifier, et l’ajouter à leur copie de la
blockchain.
Pour un noeud LS, ce protocole ne change pas. Le noeud va recevoir le bloc,
rejouer son contenu et le vérifier, puis éventuellement le coder selon sa politique
mise en place.
La seule différence est le fait que le noeud peut télécharger le nouveau bloc
entier, dans le cas où il est directement connecté à un noeud complet, ou bien
de télécharger des fragments codés qui seront ensuite décodés, si il est connecté à
suffisamment de noeuds LS.
(j)
F1
(j)
F2
.. k fragments
..
(j)
Fk
B (j)
Figure 3.3 – Fragmentation d’un bloc
La première étape consiste à fragmenter les blocs. Chaque bloc va être traité
indépendamment des autres. Nous posons l’hypothèse que la taille maximale d’un
bloc est connue, et vaut SB . Le bloc sera découpé en k fragments de même taille,
avec k un paramètre commun à tous les noeuds du réseau. Le uieme fragment du
(j)
bloc B (j) sera noté Fu .
Si le bloc est de taille inférieure à SB , celui-ci va être complété par des 0, afin
d’atteindre la taille SB . Ce procédé permet à la fin d’obtenir k fragments de taille
identique et fixe : SF = SB /k.
La figure 3.3 montre la découpe d’un bloc B (j) en k fragments de même taille.
3.3. Protocole des noeuds LS 51
Le principe du codage d’un bloc repose sur le fait d’effectuer des combinaisons
linéaires de ses fragments. Pour cela, le noeud dispose d’une suite de k.r coefficients
(i,j) (i,j)
appartenant au corps fini F2m , notée {α1 , . . . , αk.r }. Le choix de ce corps fini
sera expliqué dans la partie 3.4.1.
(i,j)
Pour construire le fragment codé Fu avec u ∈ [1, r], le noeud va prendre les k
(i,j) (i,j)
coefficients {α(k+1).u , . . . , α(k+1).u } et effectuer la combinaison linéaire suivante :
L’article [49] présente de façon plus précise comment sont réalisées les combi-
naisons linéaires de paquets de données.
(j)
F1
(i,j) (i,j) (i,j)
α α2 .. .. αk
1(i,j) (i,j) (i,j) (j) (i,j)
α
k+1 αk+2 .. .. α2k × F2 F1
.. .. .. .. .. .. ..
= r fragments codés
(i,j)
.. .. .. .. αr.k .. (i,j)
Fr
(j)
Fk
B (j)
La façon dont sont déterminés les coefficients dépend du type de code choisi.
Dans notre proposition initiale, nous utilisons des coefficients aléatoires : le noeud
N (i) initialise un générateur pseudo-aléatoire avec une graine, qui est composée de
la concaténation de son identifiant unique i et du numéro du bloc j. Le générateur
52 Chapitre 3. Client blockchain basé sur les codes à effacement
(i,j) (i,j)
lui donne la séquence des k.r coefficients {α1 , . . . , αk.r }. L’avantage de cette
solution est qu’il n’est pas nécessaire de stocker les coefficients, puisqu’ils peuvent
être recalculés à tout moment. De plus, le noeud est obligé de re-coder lui même la
blockchain, avec ses propres coefficients, et donc de la vérifier. Cependant, comme
nous le verrons dans la section 3.5, cette solution rencontre des problèmes dans le cas
où des fragments codés erronés circulent sur le réseau. Il est alors possible d’utiliser
des codes correcteurs pour résoudre ce problème. La section 2.3 de l’état de l’art de
la thèse reprend les concepts de base de différents codes pouvant s’appliquer à ce
système. Voici quelques unes des solutions envisageables :
— Code de Reed Solomon : les fragments codés sont des combinaisons linéaires
des fragments originaux, avec des coefficients spécifiques permettant de re-
construire le bloc en présence d’un nombre limité d’erreurs.
— Code LT : chaque fragment codé généré sera une addition de d ≤ k fragments
d’origine sélectionnés aléatoirement. Ce nombre d est appelé degré du bloc
et est choisi selon une fonction de distribution particulière [39], choisie au
niveau du système.
— Code online : le principe est similaire à celui du code Luby transformation,
avec une étape de précodage en plus.
Afin de décoder le bloc B (j) , le noeud N (i) commence par télécharger u fragments
(i ,j) (i ,j)
codés F1 1 , . . . , Fu u depuis différents noeuds du réseau N (i1 ) , . . . , N (iu ) . Il est
possible de télécharger plusieurs fragments codés depuis le même noeud.
Le nombre u de fragments codés à télécharger dépend tout d’abord de r, le
nombre de fragments codés que possède déjà N (i) . Il dépend également du type de
code choisi, selon si il est optimal ou non. En effet, si les fragments codés sont sans
erreurs, avec un code de Reed Solomon, le bloc pourra être décodé dès lors que le
noeud sera en possession de k fragments codés. Dans le cas d’utilisation d’un code
aléatoire ou en utilisant un code fontaine (LT ou online), k + ε fragments codés
seront nécessaires.
Une fois le nombre de fragments codés nécessaires atteint, le noeud doit
connaître les coefficients associés. Avec la solution du générateur pseudo-aléatoire,
le noeud N (i) va lui-même les recalculer. En effet, il connaît les identifiants uniques
de chacun des noeuds, i1 , . . . , iu , ainsi que le numéro du bloc j. Il peut donc initia-
liser correctement le générateur pseudo-aléatoire avec les couples i1 , . . . , iu et j et
ainsi régénérer tous les coefficients α utilisés par les noeuds N (i1 ) , . . . , N (iu ) pour
3.3. Protocole des noeuds LS 53
Avec les autres solutions, des informations supplémentaires doivent être trans-
mises, comme la matrice génératrice ou encore les degrés et la manière dont les
blocs ont été créés.
N (1)
(1,j)
F1
(1,j)
F2
(1,j)
F3
(1,j)
F4
N (2) (1,j)
(2,j) F5
F1
(2,j)
F2
(2,j) N (4)
F3
(4,j)
(4,j)
α1
(4,j)
α2
(4,j)
α3
(4,j)
α4
(4,j)
α5 −1 F1
(2,j) (2,j) (2,j) (2,j) (2,j) (2,j)
α1 α2 α3 α4 α5 F1
× (1,j) = B (j)
(1,j) (1,j) (1,j) (1,j) (1,j)
α1 α2 α3 α4 α5 F1
N (3) (2,j) (2,j) (2,j) (2,j) (2,j) (2,j)
(3,j)
F1
α6 α7 α8 α9 α10 F2
(3,j)
α1
(3,j)
α2
(3,j)
α3
(3,j)
α4
(3,j)
α5 (3,j)
(3,j)
F2 F1
Dans la partie 2.3, nous avons expliqué qu’il était nécessaire d’avoir recours à
des structures algébriques particulières lors de l’utilisation de code, afin de s’assurer
entre autre que le décodage est possible. La taille du corps fini utilisé pour effectuer
les combinaisons linéaires doit aussi être attentivement étudiée. Lorsque sa taille est
grande, la probabilité de pouvoir inverser la matrice de codage et donc de pouvoir
décoder augmente, au détriment des complexités de codage et décodage.
L’article [50] nous montre qu’en choisissant des coefficients aléatoires pour la
combinaison linéaire dans F2m , la probabilité de pouvoir récupérer le bloc initial
avec k + ε fragments codés téléchargés est d’environ 1 − 2−m.(ε+1) .
Comme les données sont représentées sous forme binaire, il est classique de
i
prendre des tailles de corps fini q tel que q = 22 , c’est à dire 2, 4, 16, 256, 65536,...
En effet, il est plus évident de représenter les données sur un demi-octet, un octet,
ou deux octets,... Une implémentation efficace et rapide [51] a été développée avec
2m = 256, nous proposons donc de choisir cette valeur par défaut pour l’évaluation
de la complexité et l’implémentation de test.
Selon le type de code choisi, il n’est pas nécessaire d’impliquer tous les fragments
originaux dans la construction d’un fragment codé. Nous notons d le degré d’un
fragment codé, c’est à dire le nombre de fragments ayant servis à le créer parmi les
k initiaux. r représente le nombre de fragments codés créés et stockés par un noeud.
Le codage consiste à multiplier une matrice décrivant la composition du fragment
codé (de taille d × r, avec d le degré du bloc, c’est à dire le nombre de fragments le
composant) par les fragments de taille sB /k. Cela fait donc d × r × sB /k opérations.
Dans le cas où les fragments codés sont de degrés k, c’est à dire la combinaison
linéaire de tous les fragments d’origine, la complexité vaut donc r × sB et ne dépend
donc pas de k, mais uniquement de r.
Les figure 3.6 et 3.7 présentent les vitesses de codage et de décodage, pour des
blocs respectivement de taille 1MB et 25kB, pour différentes valeurs de k et de r.
Ces vitesses sont données en bloc par seconde. Pour réaliser ces tests, nous avons
utilisé l’implémentation des codes à effacement ISA-L [51] avec un jeu d’instructions
avx2 sur un processeur Intel i5-6500@3.20GHz, dans le corps fini F28 .
ISA-L propose des fonctions bas niveau (en assembleur) optimisées pour les
3.4. Analyse des paramètres 55
102
100
20 40 60 80 100 120 140 160 180 200
k
Figure 3.6 – Vitesse de codage et de décodage, sur un PC, avec des blocs de
taille = 1MB
Dans le réseau Ethereum, un nouveau bloc est ajouté toutes les 15 secondes
environ. La figure 3.7 nous apprend que la vitesse de codage est d’environ 240000
blocs par seconde pour générer r = 1 fragments codés et de 8000 blocs par seconde
pour r = 50.
Pour le Raspberry, d’après la figure 3.9 la vitesse de codage est d’environ 110000
blocs par seconde pour r = 1, et de 14000 blocs par seconde pour r = 10.
Le dernier bloc comporte le numéro 10546750 (le 28 juillet 2020) sans compter
les blocs "oncles". Pour coder entièrement la blockchain avec par exemple un facteur
de compression c = k/r = 30/1 = 30, pour un ordinateur il faudrait donc environ
nb_bloc/vitesse_de_codage = 10546750/240000 = 44 secondes. Pour garder le
même facteur de compression mais avoir plus de redondance, il est possible de fixer
un k plus élevé, par exemple k = 150, et stocker r = 5 fragments codés. Le temps
nécessaire sera alors de 10546750/75000 = 140 secondes.
105
103
101
Figure 3.7 – Vitesse de codage et de décodage, sur un PC, avec des blocs de
taille = 25kB
Vitesse (Blocs par seconde)
103
102
101
10 20 30 40 50 60 70 80 90 100
k
Figure 3.8 – Vitesse de codage et de décodage, sur un raspberry 4, avec des blocs
de taille = 1MB
Vitesse (Blocs par seconde)
104
102
10 20 30 40 50 60 70 80 90 100
k
Figure 3.9 – Vitesse de codage et de décodage, sur un raspberry 4, avec des blocs
de taille = 25kB
58 Chapitre 3. Client blockchain basé sur les codes à effacement
Ces temps additionnels sont plus élevés que ceux de codage, et doivent être
pris en compte, car peuvent ne pas être négligeables. En comparaison du temps
total nécessaire pour se synchroniser à la blockchain Bitcoin, mais surtout à celle
d’Ethereum, qui se comptent en jours, ces temps peuvent tout à fait être acceptés.
Dans la partie 3.3.1, nous avons vu en détails la façon dont la blockchain est co-
dée. Chacun de ses blocs est initialement divisé en k fragments, puis ces fragments
sont ensuite codés de façon à obtenir r fragments codés. Le choix du nombre k est
très important, car fixé au niveau du système et donc commun à tous les noeud du
réseau. Comme présenté dans le tableau 3.1, le choix est à faire selon un compromis.
En augmentant la taille de k, le facteur de compression maximal augmente, et per-
met donc d’être plus paramétrable et personnalisable pour chacun des noeuds. Mais
cet avantage se fait au détriment d’une complexité de décodage qui augmente alors,
ce qui entraîne une difficulté à récupérer un bloc et donc également à télécharger
la blockchain dans sa totalité lorsqu’un nouveau noeud rejoint le réseau pour la
première fois.
Paramètres k
Complexité de décodage Décroissante
Flexibilité du facteur de compression Croissante
Compression maximale Croissante
x blocs
..
(j,..,j+x)
f1
(j,..,j+x)
f2
.. k fragments
..
(j,..,j+x)
fk
B (j) B (j+x)
Figure 3.10 – Regroupement de plusieurs blocs avant la fragmentation
Paramètres r
Disponibilité de la blockchain %
Probabilité de récupérer le bloc %
Complexité de codage &
Meilleure compression &
Équilibre de la charge réseau %
relation avec l’âge du bloc. En effet, un bloc ancien aura plus de chances de contenir
des transactions dont les montants auront déjà été re-dépensées, ou des contrats
intelligents dépréciés. Dans ce cas, le bloc aura certainement moins de raisons d’être
accédés dans sa totalité pour des raisons autres que la synchronisation au système.
Un tel bloc est appelé froid, en opposition à un bloc récent avec un contenu plus
d’actualité et plus demandé, qui sera lui appelé bloc chaud. Ces notions de chaud
et froid sont déterminées en fonction de l’utilisateur et/ou du système.
Un noeud pour également décider de ne garder que des fragments codés de blocs
froids, et les blocs chauds dans leur totalité, pour y accéder plus rapidement.
detecter et corriger les éventuelles erreurs présentes. Nous considérons tout d’abord
le cas d’un code Reed Solomon, puis celui d’un code LT.
Le code Reed Solomon est un code optimal pour les canaux que nous considé-
rons (effacements et erreurs), ce qui signifie qu’il n’a besoin que d’une redondance
minimal pour une capacité de correction choisie.
En utilisant un tel code, le protocole des noeuds LS ne change pas : le bloc initial
est découpé en k fragments, qui vont être combinés pour obtenir r fragments codés.
Pour décoder il faut toujours être en possession d’au moins k fragments codés.
Soit λ le nombre de fragments codés supplémentaires possédés par le noeud (il
a donc k + λ fragments codés). D’une manière générale, un code Reed Solomon
RS(n,k) peut corriger jusqu’à t erreurs et e effacements si 2t + e ≤ n − k. Dans
k+λ
notre cas, il est ainsi possible de corriger au maximum t erreurs avec t = 2 . Dans
le cas où le décodage n’est pas possible car il y a trop de fragments codés erronés en
comparaison des fragments codés corrects, le noeud contacte d’autres noeuds LS,
pour télécharger plus de fragments codés.
3.5.1.2 Code LT
(j) (i,j)
F1 F1
(j)
F2
.. .. ..
r fragments codés
..
(j) (i,j)
Fk Fr
B (j)
Figure 3.11 – Codage d’un bloc avec un code fontaine
Une autre solution est d’utiliser un code fontaine (LT ou online), qui a l’avan-
tage d’être plus rapide que les codes Reed Solomon. En contrepartie, le nombre
de fragments codés nécessaires pour décoder sera supérieur. Nous expliquons ici le
protocole général avec un code fontaine sans précodage. Le type de code choisi aura
une influence sur le choix du degré d et la façon dont sont sélectionnés les fragments,
et pourra donner place à un précodage dans le cas dun code Raptor.
3.5. Décodage en cas de fragments codés erronés malveillants 63
Décodage : Comme nous utilisons ici des codes Fontaine, il est possible de retrou-
ver les fragments initiaux avec une forte probabilité lorsque l’on est en possession de
k + ε fragments codés. Le noeud N (i) contacte d’autres noeuds LS jusqu’à obtenir
suffisamment de fragments codés, puis va procéder à l’opération de décodage. Une
description des algorithmes de décodage de certains codes en présence d’erreurs et
d’effacements est présentée dans la section 2.3.3.2.
Si il n’est pas possible de décoder car le nombre de fragments codés erronés est
trop élevé par rapport aux fragments codés corrects, il convient alors de contacter
plus de noeuds, pour augmenter le ratio précédent et pouvoir décoder.
Dans l’article [54], les auteurs proposent de reprendre le principe des noeuds LS,
présentés dans notre article [55], en utilisant des codes Luby Transform à la place
de combinaisons linéaires aléatoires. La principale différence est qu’ils suggèrent de
travailler sur des groupements de k blocs, plutôt que sur des blocs séparés, et fixent
un r pour l’ensemble du réseau.
3.5.2.1 Principe
ces données sont correctes, avant de télécharger les données entières pour pouvoir
les décoder. Ce système est présenté dans notre article [56].
Le bloc B est divisé en k fragments. Chacun de ces fragments est un vecteur
Vi = t × 1 avec i ∈ {1; k}). Les fragments sont eux-même composés de t sous-
fragments, que l’on note fi,j (avec i ∈ {1; t} et j ∈ {1; k}). Il est possible de
le représenter comme dans la figure 3.12. Chaque fragment stocke exactement β
octets d’information du bloc initial B. Le dernier fragment peut-être complété si
besoin, dans le cas où il serait de taille inférieur. Les sous-fragments sont de taille
β/t octets. Chaque sous-fragment correspond à un élément du corps fini. Il faut
noter que l’utilisation de fonctions de hachage homomorphes implique le choix d’un
corps fini de type Zp et non plus polynomial comme dans les sections précédentes.
De façon mathématique, le bloc B est représenté par une matrice t × k.
f1,1 f1,2 ... f1,k
f f2,2 ... f2,k
2,1
(3.1)
...
ft,1 ft,2 ... ft,k
..
f(1,1) f(1,k)
.. .. ..
.. .. ..
.. .. ..
..
f(m,1) f(m,k)
seront sur Zp .
Les paramètres sont à définir au niveau du système donc communs à tous
les noeuds. Ce choix est très important, car il aura une influence direct sur le
niveau de sécurité mais également sur la complexité à effectuer les opérations. Le
tableau 3.13 récapitule ces différents paramètres.
3.5.2.3 Codage
Comme présenté dans les parties précédentes, le codage des blocs peut se faire
de différentes façons : en utilisant des combinaisons linéaires générées pseudo-
aléatoirement, ou en utilisant des codes correcteurs. L’unique différence dans notre
protocole sera le degré des blocs codés, et la nécessité de télécharger ε fragments
codés en plus lors du décodage.
Voici ici le processus détaillé du codage d’un bloc B (j) par un noeud N i , dans
le cas de l’utilisation des fonctions de hachage homomorphes :
des empreintes homomorphes des fragments qui composent le bloc : h(B (j) ) =
(j) (j) (j)
(h(F1 ), h(F2 ), ..., h(Fk )) avec :
t (j)
Y fu,v
h(Fu(j) ) = gv mod p (3.2)
v=1
k (i,j)
h(Fv(j) )αk.u+v−1
Y
h(F(i,j)
u )= (3.3)
v=1
3.5.2.4 Décodage
(i,j)
homomorphes, notées hz , qui correspondent aux k(1 + ε) fragments codés identi-
fiés sur les autres noeuds LS.
4) Vérification des fragments codés : Afin de vérifier que les fragments codés
reçus correspondent bien aux empreintes préalablement vérifiées, le noeud va réaliser
leurs empreintes homomorphes, soit le calcul présenté dans l’équation 3.2. Comme
présenté dans [3], cette vérification se fait à la volée, c’est à dire au fur et à mesure
du téléchargement, afin de rendre le processus plus rapide.
5) Décodage du bloc : Une fois les étapes précédentes réalisées, il est possible
de retrouver le bloc initial en décodant les fragments codés. Avec k(1 + ε) fragments
codés corrects, le noeud est en possession de suffisamment d’équations pour pouvoir
procéder à l’opération de décodage, et obtenir les k fragments initiaux composant le
bloc B (j) . Le bloc sera vérifié une dernière fois en utilisant son empreinte d’origine,
conservée lors du codage.
N (1) N (2)
(1,j) (1,j) (2,j) (2,j)
F1 h1 F1 h1
N (3) N (4)
(3,j) (3,j) (4,j) (4,j)
F1 h1 F1 h1
(3,j) (3,j)
F2 h2
taille de 1024 bits et q de 257. Les tests ont été réalisés 10 fois, et une moyenne a
été ensuite effectuée pour chacun d’entre eux, afin de limiter les aléas.
·10−3
Fichier de taille 1MB, degré k
3 Fichier de taille 32KB, degré k
Fichier de taille 1MB, degré 4
Temps (s)
0
0 20 40 60 80 100 120 140 160 180 200 220 240 260
k
Figure 3.15 – Temps de génération d’un fragment codé, pour des fichiers de tailles
différentes, et différentes valeurs de k.
Taille du corps fini Les opérations servant à calculer les empreintes homo-
morphes sont réalisées dans un corps fini. Avec les fonctions de hachage que nous
avons choisies, le corps fini est de type Zp avec p un grand nombre premier.
Les conséquences du choix de ce corps sont importantes, tout d’abord d’un
point de vue sécurité. Comme les calculs sont fait modulo p, la taille de l’empreinte
dépend directement de p. Comme nous l’avons vu dans la sous-section 2.1.2, la
probabilité de trouver une collision est liée entre autre de la taille de l’empreinte.
Un p élevé permet donc de réduire la probabilité de collision, et ainsi d’augmenter la
3.5. Décodage en cas de fragments codés erronés malveillants 69
sécurité du système. De plus, les combinaisons linéaires réalisées pour coder les blocs
seront également faites dans le même corps fini. Un grand corps permet d’avoir une
probabilité plus élevée de récupérer le bloc d’origine à partir de fragments codés.
Cependant, un grand corps fini implique automatiquement des calculs plus com-
plexes. La complexité de codage et décodage augmente dans ce cas. La figure 3.15
présente les temps de codage et de décodage de bloc de différentes tailles, pour des
k différents, avec un p de taille 1024 bits, comme suggéré dans [3]. Contrairement à
l’implémentation dans Fm
2 , celle-ci n’est pas optimisée. A titre d’exemple, la vitesse
de codage d’un bloc de taille 1Mb, avec k = 64 pour un degré k est de l’ordre de
527 blocs par secondes pour cette implémentation, contre 9833 blocs par seconde
dans la figures 3.6.
Il s’agit là surtout de montrer que bien que les temps augmentent fortement par
rapport aux courbes présentées dans la section 3.4, ils restent cependant acceptables.
Complexité des fonctions de hachage Comme indiqué dans les articles [3]
et [4], la complexité d’une fonction de hachage (équation 3.2) d’un fragment à t
éléments est de l’ordre de O(t). La figure 3.16 présente le temps de calcul pour
effectuer l’empreinte homomorphe d’un fichier de 1MB et d’un fichier de 32KB,
selon différentes valeurs de k. Elle nous confirme la complexité précédente, car pour
une taille de fichier donnée, quand la valeur de k augmente, le nombre t d’éléments
par fragment diminue, et donc le temps diminue également.
Nous avons vu précédemment que calculer l’empreinte homomorphe du bloc
entier revenait à calculer l’empreinte homomorphe de ses k fragments. La complexité
est de l’ordre de O(k.t) opérations. Il est donc linéaire en fonction de k × t qui est le
nombre d’éléments du corps finis qui le composent. Le temps de calcul de l’empreinte
homomorphe est donc indépendant de k. Il peut être obtenue grâce à la figure 3.16,
en multipliant un temps par la valeur k associée.
Pour vérifier la validité de l’empreinte d’un fragment codé à partir des d em-
preintes de fragments ayant servis à le construire (équation 3.3), la complexité est de
O(t) + O(d). La figure 3.17 présente le temps de calcul de l’empreinte homomorphe
d’un fragment codé, à partir des empreintes homomorphes des fragments initiaux,
pour différentes tailles de fichiers (1 MB et 32 KB), ainsi que pour différents degrés
(d = 4 et d = k). La figure indique que le paramètre t, dépendant directement de la
taille du fichier, n’a pas un gros impact en comparaison du degré du bloc d. En effet,
lorsque le degré est égal à 4, les fragments codés étant composés par 4 combinaisons
linéaires de fragments, le temps de vérification est constant aux alentours de 0.0004
secondes pour les deux tailles de fichiers. Lorsque le degré vaut d = k, c’est-à-dire
70 Chapitre 3. Client blockchain basé sur les codes à effacement
que les fragments codés sont des combinaisons linéaires de tous les fragments ini-
tiaux, le temps nécessaire augmente en fonction de k, car le degré augmente. Mais
pour deux tailles de fichiers différentes, il reste du même ordre de grandeur pour un
k donné (pour k = 128 la vérification pour un fragment codé d’un fichier de 1MB
se fait en 0.0145386 seconde, et elle se fait en 0.0143762 seconde pour un fichier de
32KB).
10−2
10−3
·10−2
3 Fichier de taille 1MB, degré k
Fichier de taille 32kB, degré k
Fichier de taille 1MB, degré 4
Temps (s)
0
0 20 40 60 80 100 120 140 160 180 200 220 240 260
k
Figure 3.17 – Temps de calcul d’une empreinte homomorphe d’un fragment codé
à partir des empreintes homomorphes des fragments originaux
k 4 32 64 128 256
r=1 0.251 0.0355 0.0239 0.0243 0.0369
r=5 - 0.161 0.0870 0.0561 0.0529
(k + r) × SH r
c= + (3.4)
SB k
Afin de trouver l’optimum de cette équation, nous pouvons calculer le k per-
mettant d’avoir le meilleur facteur de compression :
s
r × SB
kopt = (3.5)
SH
Le paramètre k, ainsi que les différents paramètres présentés dans le tableau 3.13
sont à définir au niveau du système, pour tous les utilisateurs, et doivent donc
être mûrement réfléchis. Ils ont une influence directe sur la sécurité du système, la
compression maximale, mais également sur la complexité des opérations. Il s’agit
donc de trouver un compromis au cas par cas, en fonction de la blockchain et de
son utilisation.
Le tableau 3.4 présente le temps nécessaire pour mettre en place le système
homomorphe et l’utiliser pour la vérification, ainsi que les stockages associés, pour
différentes valeurs de k et r. On remarque que le temps de mise en place diminue
quand k augmente, mais augmente quand r augmente. Le temps de vérification
augmente quand k augmente, mais diminue avec r car il y a moins de fragments à
vérifier (puisque l’on considère les r fragments stockés comme valides).
Concernant le facteur de compression, il oscille autour d’un facteur optimal
calculé grâce aux équations 3.4 et 3.5. Mais pour un k fixé, il diminue lorsque r
augmente. Trouver quel k fixer pour le système demande donc une réflexion, et une
72 Chapitre 3. Client blockchain basé sur les codes à effacement
Tableau 3.4 – Analyse de paramètres pour un bloc de taille 1MB (avec tailles en
octets et temps en secondes)
bonne analyse. Il est possible de le choisir pour obtenir un bon équilibre entre temps
de mise en place et temps de vérification, ou bien privilégier l’une des deux étapes
(par exemple si on a une idée du taux moyen de malveillance du système, ou de la
fréquence de décodage de bloc).
Rappelons que c, le facteur de compression des données, est défini par c = k/r.
On rappelle aussi qu’un noeud stockant r fragments codés et souhaitant décoder un
bloc doit télécharger au moins k −r fragments codés supplémentaires. Ainsi, lorsque
le facteur de compression augmente, le nombre de fragments codés à télécharger
pour décoder le bloc concerné augmente également de façon proportionnelle. Le
choix de ces paramètres et les conséquences associées seront discutés plus en détails
dans la partie 3.4.
Lorsque r = k, le facteur de compression vaut c = 1, ce qui signifie que l’effort de
stockage n’est pas réduit, et que la blockchain nécessite toujours autant de place en
mémoire. Dans ce cas, les données peuvent être reconstruites sans téléchargement
supplémentaire, puisque le nombre de fragments codés à télécharger vaut k − r = 0.
Au contraire, lorsque r = 1, le facteur de compression atteint sa valeur maximale c =
k, car notre solution implique que chaque noeud stocke au minimum un fragment
codé.
Un avantage de cette solution est sa flexibilité, permettant à chaque noeud
3.6. Avantage des noeuds LS 73
d’adapter son nombre de fragments codés stockés r, selon sa capacité ou son besoin.
Seul le nombre k est fixé par le réseau. Chaque noeud choisit son r, pour ajuster
son facteur de compression à ses moyens disponibles, et cela indépendamment des
autres noeuds.
Le r peut-être fixé par le noeud de manière globale, pour tous les blocs, mais
peut également être paramétrable plus finement. Une possibilité est d’adapter le
r de chaque bloc en fonction de son importance, en supprimant des fragments
codés lorsque l’importance diminue. Cette notion d’importance est définie par le
noeud, et peut par exemple être liée à l’âge du bloc (un bloc ancien sera considéré
comme moins souvent demandé et consulté), ou selon son lien avec le noeud (un
bloc contenant des transactions liées au noeud sera plus important pour ce dernier).
Le fait de n’avoir qu’à supprimer des fragments codés ne nécessite aucun calcul
supplémentaire.
3.6.2 Disponibilité
Comme présenté dans la partie 3.1.1, un des objectifs de ces travaux est d’amé-
liorer la disponibilité de la blockchain. Pour cela, nous misons sur la plus grande
réplication possible, qu’elle soit totale ou partielle. En proposant de réduire l’effort
de stockage nécessaire à un noeud pour maintenir la blockchain en codant celle-ci,
nous espérons une augmentation importante du nombre de noeuds dans le réseau.
En effet, il nous parait acceptable de partir du principe que n’importe quel noeud
est en capacité de stocker au moins un fragment codé de chaque bloc, pour un
paramètre k bien choisi.
La donnée est stockée de façon codée et partielle, puisque elle est tout d’abord
divisée en plusieurs fragments qui vont ensuite être codés, et que le noeud n’en
gardera que certains. A l’échelle du noeud, notre solution n’apporte donc aucune
amélioration de la disponibilité, au contraire. Cependant à l’échelle du système glo-
bal, tous les blocs sont stockés et répliqués de nombreuses fois. N’importe quel bloc
peut-être reconstruit en combinant n’importe quels k fragments codés. L’impact
d’un noeud injoignable ou quittant le réseau est réduit, car il peut facilement être
compensé en téléchargeant depuis un autre noeud.
De plus, privilégier le nombre total de noeuds plutôt que la capacité de stockage
de chacun de ces noeuds favorise la décentralisation, ce qui va dans le sens de la
philosophie première de la blockchain. L’information étant plus largement répartie,
le risque de prise de contrôle du réseau par une même entité devient moins élevé.
Pour évaluer la disponibilité, nous proposons l’exemple simplifié suivant, en
74 Chapitre 3. Client blockchain basé sur les codes à effacement
posant l’hypothèse qu’il n’y a pas d’erreur ou de malveillance dans les données :
Soit n le nombre de noeuds dans le réseau. Chaque noeud peut stocker un nombre
variable de fragments codés pour un bloc donné, nous noterons ri ce nombre pour le
ième noeud. Nous prenons l’hypothèse que ce ri peut être modélisé comme une réali-
sation de variables discrètes indépendantes, suivant une probabilité de distribution
f . Un bloc peut être décodé donc récupéré quand au moins k différents fragments
codés de ce bloc sont disponibles. Nous pouvons définir la probabilité Pc que le bloc
ne soit pas récupérable par :
n−1
! k−1 n−1
! k−1
X X X X n
Pc = p ri < k = p ri = u = f ∗ (u) (3.6)
i=0 u=0 i=0 u=0
n fois
n
z }| {
où f∗ = f ∗ f ∗ · · · ∗ f et ∗ la convolution entre deux distributions de probabi-
lité.
On souhaite comparer avec le système actuel où, de façon simplifiée, il n’existe
que deux types de noeuds : les noeuds complets, stockant la donnée telle quelle
dans sa totalité, et les noeuds légers, ne stockant pas la donnée. Pour comparer
facilement ces deux systèmes, nous supposons qu’ils possèdent la même capacité
totale de stockage global. On suppose donc dans ce cas là que chaque noeud stocke
la blockchain avec une probabilité de 1/c. La probabilité qu’un bloc choisi ne soit
pas stocké par un noeud est donc de 1 − 1/c. Nous sommes dans le cas de variables
indépendantes, car chaque noeud choisi indépendemment des autres si il stocke ou
non le bloc. La probabilité Pr qu’un bloc ne soit stocké par aucun noeud du réseau
est de :
1
Pr = (1 − )n (3.7)
c
Comparons maintenant nos deux systèmes avec un exemple numérique. Prenons
l’hypothèse que dans le cas du système avec fragments codés, le nombre de fragments
codés stockés par chaque noeud suit une distribution géométrique fp (r) = p.(1 −
p)r−1 . Nous avons donc :
n (u − 1)!
fp∗ (u) = .pn .(1 − p)u−n (3.8)
(n − 1)!(u − n)!
Dans notre exemple, nous supposons que k = 100 et que le facteur de compres-
sion moyen du bloc dont nous allons étudier la disponibilité est c = 20, ce qui donne
un stockage moyen de r = 5 fragments codés par noeud. Comme la moyenne d’une
3.6. Avantage des noeuds LS 75
Distribution géométrique
0.2
Probability
0.1
0
0 5 10 15 20 25
Nombre de fragments stockés r
Figure 3.18 – Probabilité pour un noeud de stocker r fragments codés, avec une
distribution géométrique de paramètre p = 0.2
10−1
10−2
10−3
10−4
10−5
0 10 20 30 40 50 60 70 80 90 100
Nombre de noeuds n
distribution géométrique de paramètre p est 1/p, nous avons p = 0.2 comme illustré
à la figure 3.18.
En prenant tous ces paramètres, la figure 3.19 représente la probabilité de ne pas
pouvoir récupérer le bloc car il n’y a pas suffisamment de fragments codés dans le
réseau. Pour le système actuel avec réplication, la courbe est construite à partir de
l’équation 3.7, et pour le système codé avec les équations 3.6 et 3.8. Avec le système
où la blockchain est codée (courbe bleue), la probabilité de pouvoir récupérer le bloc
vaut 1 (avec une précision à 5 chiffres) du moment où il y a au moins 37 noeuds
dans le réseau. Avec le système de réplication, il faut atteindre les 238 noeuds dans
le réseau pour avoir une probabilité équivalente de récupérer le bloc.
3.6.3 Intégrité
Dans cette partie nous allons présenter les arguments montrant que non seule-
ment il n’y a pas de perte d’intégrité avec notre système, mais qu’au contraire
76 Chapitre 3. Client blockchain basé sur les codes à effacement
.
Maintenant considérons un réseau comportant la même capacité de stockage
dans le réseau, mais en utilisant des noeuds LS. Nous considérons les paramètres
(k = 100, c = 20), c’est à dire que chaque noeud LS va stocker 5 fragments codés.
78 Chapitre 3. Client blockchain basé sur les codes à effacement
Cet exemple simple illustre clairement comment les noeuds LS, avec pourtant
une capacité de stockage relativement faible (20 fois moins), peuvent décongestion-
ner le réseau, en ne nécessitant qu’un débit là encore relativement faible. Naturel-
lement, le temps d’établissement de la connexion et d’autres paramètres devraient
être pris en compte pour obtenir une estimation de charge du réseau complète et
plus précise.
3.7 Conclusion
Dans ce chapitre, nous avons présenté les noeuds LS, un nouveau type de noeud
permettant de participer activement à la blockchain et sa décentralisation, en ré-
duisant l’espace nécessaire à son stockage. Pour cela, nous proposons de stocker la
blockchain sous forme codée. Ce procédé permet d’améliorer deux points sur les
trois problèmes actuels du passage à l’échelle, à savoir la trop grande place requise
pour stocker la chaine dans sa totalité, et l’engorgement du réseau dû au nombre
insuffisant de noeuds.
Un avantage de cette solution est qu’il ne nécessite pas de réels changements
sur les blockchains existantes, puisque que le client LS n’a pas pour vocation de
remplacer les clients existants (les clients légers et les clients complets), mais à
simplement les compléter en proposant une alternative.
Nous avons également présenté deux moyens différents de mettre en place un
système pour rendre possible (ou améliorer) le décodage dans le cas où des frag-
ments codés sont erronés ou malveillants. Le premier, utilisant des codes correcteurs,
permet de quand même pouvoir décoder en téléchargeant plus de fragments codés.
Le deuxième utilise des empreintes homomorphes, afin de vérifier la cohérences des
fragments codés avant de les télécharger et de lancer l’opération de décodage.
Notre idée de noeuds LS stockant des fragments codés de blocs semble avoir été
3.7. Conclusion 79
bien reçue par la communauté, puisque plusieurs articles ont cité et repris le travail
réalisé dans cette thèse. Nous présentons ici les principaux :
— SeF : A Secure Fountain Architecture for Slashing Storage Costs in Block-
chains [54] : dans cet article, les auteurs proposent de reprendre le principe
des noeuds LS, en utilisant des codes LT à la place de combinaisons linéaires
aléatoires. Ils suggèrent également de travailler sur des groupements de k
blocs, plutôt que sur des blocs séparés, et fixent un r pour l’ensemble du
réseau.
— Bitcoin Blockchain Compression Algorithm for Blank Node Synchroniza-
tion [58] : les auteurs proposent de remplacer le système permettant de suivre
les transactions d’un bloc à l’autre par une autre structure plus légère, ce
qui entraine une réduction de l’espace de stockage nécessaire pour Bitcoin
de 12.71%.
— Transparent Coded Blockchain [59] : cette proposition consiste à distribuer
l’historique de la blockchain en utilisant une distribution soliton, entraînant
une réduction de l’effort de stockage. Comme les blocs ne sont pas codés,
l’information contenu est directement accessible.
— Patterned Erasure Correcting Codes for Low Storage-Overhead Blockchain
Systems [60] : cet article part du postulat qu’un noeud peut se retrouver
en erreur régulièrement. Ces auteurs présentent un système de codage pre-
nant en compte certains modèles précis d’erreurs, ce qui permet un gain de
stockage plus efficace qu’avec les codes.
— Superlight – A Permissionless, Light-client Only Blockchain with Self-
Contained Proofs and BLS Signatures [61] : les auteurs de ce papier pré-
sentent un nouveau type de noeud, appelé Superlight. Un des systèmes ac-
tuels pour valider une dépense consiste à aller vérifier dans les anciens blocs
qu’il y a bien eu des transactions vers le compte que l’on souhaite débiter,
pour s’assurer que le noeud possède suffisamment de jetons. Afin d’alléger ce
mécanisme, et la proposition est d’utiliser des signatures multiples BLS afin
d’inclure les transactions entrantes dans les transactions sortantes, prouvant
ainsi que les jetons sont réellement possédés.
Chapitre 4
BlockHouse : Blockchain-based
Distributed Storehouse System
Sommaire
4.1 Introduction et contexte . . . . . . . . . . . . . . . . . . . . . 82
4.1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
4.1.2 Contexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
4.1.3 Clouds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.1.4 Blockchains et systèmes de stockage existants . . . . . . . . . 85
4.2 BlockHouse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
4.2.1 Général . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
4.2.2 Type de blockchain nécessaire . . . . . . . . . . . . . . . . . . 89
4.2.3 Acteurs du système . . . . . . . . . . . . . . . . . . . . . . . . 89
4.2.4 Disponibilité et confidentialité . . . . . . . . . . . . . . . . . . 90
4.2.5 Réputation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
4.2.6 Intervalle de temps . . . . . . . . . . . . . . . . . . . . . . . . 91
4.3 Description détaillée du système . . . . . . . . . . . . . . . . 92
4.3.1 Phase d’initialisation . . . . . . . . . . . . . . . . . . . . . . . 92
4.3.2 Phase de stockage et d’audit . . . . . . . . . . . . . . . . . . 95
4.3.3 Fin du contrat . . . . . . . . . . . . . . . . . . . . . . . . . . 96
4.4 Auditeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
4.4.1 Fonctionnement général . . . . . . . . . . . . . . . . . . . . . 98
4.4.2 Probabilité d’avoir une majorité d’auditeurs honnêtes . . . . 99
4.5 Preuve de récupérabilité . . . . . . . . . . . . . . . . . . . . . 102
4.5.1 Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
4.5.2 Critères de sélection d’une PoR dans notre cas . . . . . . . . 103
4.6 L’aléatoire dans les blockchains . . . . . . . . . . . . . . . . . 104
4.6.1 Besoin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
4.6.2 Solutions existantes . . . . . . . . . . . . . . . . . . . . . . . 105
4.6.3 Intégration dans BlockHouse . . . . . . . . . . . . . . . . . . 106
4.7 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Chapitre 4. BlockHouse : Blockchain-based Distributed Storehouse
82 System
4.1.2 Contexte
Figure 4.1 – EMEA, répartition par Figure 4.2 – APJxC, répartition par
origine origine
4.1. Introduction et contexte 83
Figure 4.3 – EMEA, répartition par Figure 4.4 – APJxC, répartition par
type de stockage type de stockage
de petites tailles, le nombre total d’objets connectés est si important qu’il entraîne
une quantité de données générées finalement significative. Enfin, l’usage de la vidéo
en ligne pour les particuliers est l’un des 5 segments de données qui augmentent
le plus, avec notamment la création de vidéos de divertissement, hébergées sur des
plate-formes telles que YouTube ou Twitch.
4.1.3 Clouds
de données est compliquée en raison de la pluralité des canaux juridiques des pays.
En effet, il est nécessaire de contacter le service clientèle pour espérer obtenir une
compensation, ou de se tourner vers la justice. Là encore, en fonction du pays où
les données sont hébergées et du type de contrat, cette voie peut être compliquée.
Certains systèmes de stockage dans le cloud utilisent une preuve de récupérabi-
lité, expliquée dans l’état de l’art à la section 2.4, pour permettre de vérifier que le
cloud stocke réellement l’ensemble des données à tout moment.
Une solution pour améliorer le stockage et la fiabilité des données consiste à
utiliser un code d’effacement, comme dans un contexte multi-cloud. L’idée principale
est d’encoder les données en morceaux codés qui sont répartis sur plusieurs clouds
de stockage [62], afin de permettre la reconstruction du message original même en
cas de perte du serveur.
Plutôt que de compter uniquement sur quelques gros acteurs centraux, une idée
est d’ouvrir le marché, et de diversifier les offres. Afin de résoudre le problème
de confiance dans l’entité possédant le cloud, et d’avoir un véritable système de
recours en cas de désaccord, plusieurs groupes de travail ont eu l’idée de proposer
des solutions se basant sur la blockchain. Nous présentons ici les projets les plus
aboutis.
Sia coin est une crypto-monnaie et un ensemble d’outils, basés sur la blockchain
Bitcoin et présentés en 2014 dans l’article [63]. Son but est de permettre à des
particuliers de stocker ou faire stocker des données, en échange de jetons. Seul le
contrat de location est stocké sur la blockchain, le reste est en dehors de la chaîne
(offchain). Il n’y a donc pas de réel procédé de vérification de l’honnêteté des ser-
veurs, et le système se base principalement sur un système de réputation, reposant
entre autres sur une somme d’argent bloquée par chaque noeud pour témoigner
de son engagement dans le bon fonctionnement du système. Les données sont sto-
ckées sur différents serveurs, en utilisant les codes à effacement, pour augmenter la
probabilité de pouvoir les récupérer entièrement et correctement à la fin du contrat.
4.1.4.2 Storj
Storj [29] est un système de cloud décentralisé présenté en 2014 qui repose
sur la blockchain Ethereum. Le fichier à stocker est séparé en 20 fragments qui sont
Chapitre 4. BlockHouse : Blockchain-based Distributed Storehouse
86 System
chiffrés, puis codés avant d’être envoyés sur 40 serveurs différents (choix par défaut).
Des noeuds de confiance, appelés satellites, vont stocker les méta-données associées,
assigner les données à des serveurs, et vérifier que les serveurs stockent toujours les
données en réalisant des audits réguliers. Si certains serveurs ne le font plus, alors
la donnée est répliquée ailleurs pour assurer toujours la même redondance.
4.1.4.3 BlockStore
BlockStore [64] est l’un des premiers à détailler le schéma global du processus
de stockage des fichiers. Il utilise des Space Wallet, une structure spéciale qui suit
l’espace de stockage disponible sur tous les noeuds. Leur choix technique est de
réduire l’impact sur la taille de la chaîne en ne stockant dessus que les échecs de
preuves. Les autres fonctionnalités (audits, transfert, ...) sont effectuées hors de la
chaîne. Cependant, ce système ne résout pas automatiquement les éventuels litiges
lors de la récupération des fichiers à la fin du stockage.
4.1.4.4 FileCoin
FileCoin [65] est un système de fichiers décentralisé pour stocker des fichiers
considérés comme importants sur une blockchain dédiée. Le stockage est divisé en
secteurs de taille fixe et chaque secteur contient une donnée qui sera répliquée sur le
réseau. Les données sont codées d’une façon particulière, permettant de réaliser des
preuves de réplication. Le consensus est fait sur ce stockage. Les mineurs doivent
donc régulièrement envoyer des preuves, appelées "proof of spacetime", certifiant
qu’ils stockent bien leur donnée. La racine de l’arbre de Merkle de la donnée répli-
quée est stockée sur la blockchain. Le mineur doit envoyer une preuve correcte pour
un emplacement aléatoire, le challenge, qui pourra être vérifiée grâce à l’arbre.
Lorsque le client veut récupérer sa donnée, stockée par plusieurs autres noeuds, il
sélectionne un serveur la possédant, le paye, et récupère le fichier. Plus un fichier est
demandé, plus d’autres serveurs le stockeront et plus il sera distribué et décentralisé.
Ce projet sert entre autre à stocker certaines pages de Wikipedia, openstreet-
map, ainsi que le projet Gutenberg (60 000 livres électroniques classiques).
4.1.4.5 Spacemint
section 2.2.3. Le défaut est que la donnée utilisée pour faire la preuve est statique,
donc la mémoire qui lui est attribuée peut être considérée comme gaspillée.
4.1.4.6 IPFS
4.2 BlockHouse
4.2.1 Général
Comme nous venons de le voir, les utilisateurs ont de plus en plus tendance
à déporter leurs données sur des serveurs externes, comme des clouds. Cependant
le choix est assez limité, et le système repose essentiellement sur la confiance que
l’on porte aux grandes entreprises qui les gèrent. Depuis quelques années, plusieurs
groupes de recherche et entreprises ont commencé à imaginer des blockchains per-
mettant la location d’espaces de stockage libres entre particuliers. Après analyses
de ces dernières, nous avons remarqué plusieurs points problématiques récurrents,
notamment dus aux actions se passant en dehors de la chaîne (et donc non véri-
fiables par tous les noeuds). Nous proposons donc BlockHouse [67], notre solution,
dont la particularité est d’intégrer le maximum d’opérations de gestion du système
dans la chaîne.
BlockHouse est un système basé sur la blockchain, permettant de stocker ou faire
stocker sa donnée de façon sécurisée. La sécurité repose sur le fait que le serveur en
charge du stockage doit régulièrement envoyer une preuve qu’il stocke en effet tou-
jours la donnée, afin d’être payé pour ce service. Cette preuve est effectuée à partir
d’un challenge automatiquement généré, permettant de s’assurer avec une haute
probabilité que la donnée est stockée entièrement sans altération. Ainsi le paiement
Chapitre 4. BlockHouse : Blockchain-based Distributed Storehouse
88 System
est automatique, sous réserve que le serveur stocke bien toujours la donnée. Pour
cela, nous utilisons les preuves de récupérabilité, présentées dans la section 2.4. Pour
que celles-ci fonctionnent correctement, le système a besoin de pouvoir générer des
nombres aléatoires. L’aléatoire est un problème loin d’être trivial dans un contexte
décentralisé comme les blockchains, c’est pourquoi nous étudierons les possibilités
dans la partie 4.6.
Comme sur n’importe quelle blockchain, tous les noeuds du réseau vérifient tous
les contrats et transactions, donc toutes les preuves. En cas de litige, la blockchain
sert de juge, afin de déterminer si le client a subit un préjudice, et si il doit être
dédommagé ou non.
Le protocole détaillé de BlockHouse est présenté dans la figure 4.5.
Notre solution s’adapte à n’importe quelle blockchain sur laquelle peuvent fonc-
tionner des contrats intelligents. Dans cette première version de BlockHouse, avec
l’utilisation d’auditeurs, la blockchain privée est privilégiée car elle permet d’avoir
un certain contrôle sur les acteurs du réseau. La vérification avec les auditeurs est
coûteuse en temps, et il peut être intéressant de l’éviter au maximum. Pour cela,
un moyen rapide est de bannir les utilisateurs fréquemment sources de problèmes.
Dans la blockchain publique ce ban est compliqué, puisque par définition toute per-
sonne disposant d’un ordinateur peut y participer et se créer un nombre illimité
de comptes. Cependant l’utilisation d’un outil de réputation peut palier à ce pro-
blème, car un utilisateur malhonnête aura soit une mauvaise réputation, soit une
réputation nulle due à la création d’un nouveau compte, et sera dans ces deux cas
non prioritaire par rapport à d’autres noeuds avec un meilleur score.
Le noeud client : C’est un noeud qui souhaite stocker des données sur un serveur
ayant de la place, contre une somme d’argent.
Le noeud serveur : Son rôle est de stocker la donnée et envoyer des preuves pour
le prouver, puis retourner la donnée à la fin du contrat. C’est un noeud participant
Chapitre 4. BlockHouse : Blockchain-based Distributed Storehouse
90 System
4.2.5 Réputation
de justifier d’un tarif plus élevé, puisque cela signifie que le noeud est honnête et
qualifié.
La réputation d’un noeud augmentera lorsque ses contrats se termineront sans
problème de sa part, et diminuera dans la situation inverse. Un serveur avec une
mauvaise réputation peut donc signifier qu’il a envoyé un nombre important de
réponses invalides à des challenges, ou encore qu’il lui est arrivé de ne pas retourner
le fichier correctement. Un client avec une mauvaise réputation a quant à lui indiqué
qu’il n’avait pas pu télécharger sa donnée correctement à la fin d’un contrat, alors
que les auditeurs ont en majorité indiqué qu’elle était disponible et intègre. Notons
que toutes ces actions sont stockées sur la blockchain, et donc facilement vérifiables.
Dans le cas où le client souhaite faire stocker sa donnée sur plusieurs serveurs,
il peut être intéressant pour lui de choisir des serveurs avec une bonne réputation
et d’autres avec une réputation plus faible, afin d’obtenir un bon équilibre entre
disponibilité et prix.
Cette réputation peut se faire sur la base d’avis, où le participant d’un contrat
de location d’espace de stockage note le second acteur à l’issue du contrat. Dans ce
cas, le noeud serveur émet un avis sur le noeud client et inversement, en fonction
de si tout s’est bien déroulé ou non.
Il est également possible de mettre en place un système de réputation automa-
tique, utilisant toutes les actions stockées dans la blockchain, et donc consultables
et vérifiables par tous, pour attribuer une note à chaque noeud.
l’horloge de son système et le timestamp du bloc. Une solution pourrait donc être
d’utiliser l’horloge de chaque noeud, si on demande une précision inférieure à 15
minutes, donc une preuve dont la fréquence est supérieure à 15 minutes.
Dans cette section nous présentons notre solution, appelée BlockHouse, pour
blockchain-based distributed storehouse system. Elle peut être décomposée en trois
phases : la phase d’initialisation qui met en place le contrat entre un noeud client et
un noeud serveur de stockage, la phase d’audit et de stockage où des vérifications
régulières vont avoir lieu pour s’assurer que tout se déroule comme prévu, puis la
phase de fin de contrat, pendant laquelle aura lieu le paiement final et la remise du
fichier au client.
Le noeud client souhaite faire stocker son fichier par un ou plusieurs noeuds
serveurs de stockage. N’importe quel noeud du système peut être client, ou serveur
de stockage, ou bien encore les deux.
Le noeud client créé une transaction spéciale avec un certain nombre d’infor-
mations à propos du stockage qu’il souhaite. Cette transaction est représentée à
l’étape À de la figure 4.6, et comporte entre autre la taille de la donnée à stocker,
la durée de location souhaitée, la fréquence des preuves de récupérabilité, le prix de
la location, ainsi que le séquestre du fichier et le séquestre auditeurs requis. Cette
transaction est envoyée sur le réseau, inclue dans un bloc, et tous les participants
de la blockchain peuvent la consulter et éventuellement y répondre.
Comme indiqué dans la section 4.2.5, nous considérons qu’un système de ré-
putation est mis en place, où chaque noeud est noté selon différents critères. Le
noeud peut avoir une note en tant que client, qui dépendra par exemple du nombre
de contrats s’étant déroulés correctement et au contraire de ceux où il y a eu des
litiges, et une note en tant que serveur, qui pourra dépendre de la proportion de
preuves de récupérabilité correctes par rapport aux incorrectes. On peut imaginer
qu’un serveur avec une bonne réputation aura tendance à demander des prix plus
élevés qu’un serveur avec une réputation plus faible. Le client peut avoir un moyen
efficace de choisir un serveur, en fonction de l’importance de sa donnée et de son
budget.
Quand un ou plusieurs noeuds sont intéressés par la demande du client, et
possèdent tous les critères demandés, ils peuvent faire une transaction en retour
pour solliciter un accord. Lorsque cette requête est envoyée, dans l’étape Á de la
figure 4.6, le serveur bloque une somme de monnaie correspondant aux séquestres
demandés dans À. La nature et le but de ces séquestres seront expliqués en dé-
tails dans la partie 4.3.1.2. Ce blocage de fond permet entre autre d’éviter que les
serveurs ne répondent à toutes les demandes qui transitent sur le réseau, et soient
éventuellement acceptés par plusieurs clients sans qu’ils ne possèdent suffisamment
de monnaie et d’espace de stockage pour réaliser les différents contrats.
Dans l’étape suivante Â, le client choisit un ou plusieurs serveurs, selon ses
propres critères comme par exemple leur réputation. Pour chaque serveur choisi,
le client effectue une transaction indiquant l’identifiant du serveur, et bloquant sur
un contrat intelligent la somme correspondant au paiement total de la location et
au séquestre auditeur. Les serveurs candidats pourront ainsi découvrir si ils ont été
choisis ou non en consultant ces transactions.
Chapitre 4. BlockHouse : Blockchain-based Distributed Storehouse
94 System
4.3.1.2 Séquestre
Nous venons de voir que les deux parties devaient mettre en caution un cer-
tain nombre de jetons dans des contrats intelligents, lors des étapes Á et Â. Ces
séquestres ont pour but de s’assurer que les deux protagonistes vont être honnêtes
durant toute la durée du contrat qui les lie. Il y a deux types de séquestre, avec
chacun un intérêt propre. Le noeud serveur doit bloquer les deux séquestres, tandis
que le noeud client ne bloque que le second.
que la preuve est correcte, mais également qu’elle a bien été demandée, en calculant
le temps écoulé depuis la dernière preuve et en le comparant à la fréquence des
preuves définie dans le contrat.
En cas de preuve incorrecte, le contrat se termine de façon anticipée, par la
faute du serveur. Les conséquences sont expliquées dans la partie suivante 4.3.3.
Lorsque le contrat se termine, avec la validation des dernières preuves, le système
passe à l’étape 3.
ici.
Nous venons ici d’expliquer le cas le plus simple, où aucun problème n’a été
rencontré. Nous allons maintenant développer différents autres cas de terminaison :
4.4 Auditeurs
Dans le cas d’un désaccord, un des deux protagonistes est forcément malhonnête.
Afin de déterminer si c’est le client qui ment (et donc que le fichier est disponible et
correct) ou si c’est le serveur (et donc que le fichier est indisponible ou incorrect),
un certain nombre de noeuds vont être choisis pour jouer le rôle d’auditeur.
L’auditeur est chargé de télécharger la donnée, et de vérifier son intégrité, en
utilisant pour cela l’empreinte initialement stockée dans la blockchain lors de la
phase Ä de l’étape d’initialisation. Il doit ensuite rendre une réponse sous la forme
d’une transaction, pour annoncer qui est en tort. Cette transaction indique soit que
le fichier n’est pas disponible, soit au contraire qu’il l’est. Dans ce cas, l’auditeur
réalise une preuve de récupérabilité pour le prouver.
Lorsque suffisamment d’auditeurs ont rendu leurs réponses, un contrat intelli-
gent analyse les réponses et détermine la marche à suivre en fonction de la majorité
4.4. Auditeurs 99
des réponses.
Le travail d’auditeur demande de mettre à disposition du système des ressources,
puisqu’il faudra potentiellement télécharger un volume de données important, et
ainsi avoir l’espace libre disponible et une connexion internet suffisants. De plus,
cela peut prendre un certain temps. Les auditeurs sont donc des noeuds volontaires,
s’inscrivant sur une liste. Il peuvent être choisis de façon totalement aléatoire, ou
alors choisi avec un aléa pondéré par la réputation de l’auditeur à répondre correc-
tement ou non.
Pour encourager des noeuds à faire parti des auditeurs, et à agir de façon hon-
nête, un système de rémunération est mis en place pour les auditeurs répondant
correctement. Répondre correctement signifie ici que la réponse choisie est la même
que la majorité des noeuds. Cette récompense est une partie du séquestre auditeur
de l’entité en tort.
Les figures 4.9 et 4.10 présentent les deux situations possibles en cas de désac-
cord. Dans la première étape À, le serveur fournit sa dernière preuve, mais le client
n’envoie pas l’acquittement du bon téléchargement du fichier. Après un certain
temps, en Á, le réseau élit plusieurs auditeurs, qui tentent de télécharger le fichier
afin de le vérifier, dans l’étape suivante Â. Ils rendent ensuite une réponse, qui varie
en fonction de la situation.
La figure 4.9 présente le cas où le serveur est honnête, et dispose du fichier dans
sa totalité. Lorsque tous les auditeurs ont été choisis et ont vérifié si le fichier était
disponible ou non, ils vont rendre leur réponse dans une transaction. Dans ce cas
là, dans l’étape à la majorité des auditeurs, les 1 et 3, répondent que le fichier est
toujours accessible et correct. Le serveur est donc honnête, et le client malhonnête.
Le serveur récupère ses deux séquestres en Ä, et les auditeurs 1 et 3 ayant répondu
de façon valide vont être récompensés avec le séquestre auditeur du client.
La figure 4.10 présente la deuxième situation, quand le client est honnête et
que le fichier n’est plus disponible, ou bien est incorrect. Cette fois, la majorité des
auditeurs répondent en à que le fichier n’est plus disponible ou qu’il a été altéré.
Le serveur est ainsi en tort, et son séquestre fichier est donné au client, qui récupère
également son séquestre auditeur, dans l’étape Ä. Les auditeurs sont payés avec le
séquestre auditeur du serveur.
être auditeurs. Nous notons p la probabilité que le noeud réponde correctement, c’est
à dire qu’il soit honnête, et Xn le nombre total de bonnes réponses.
Nous supposons que les Xn peuvent être modélisés comme des réalisations de
variables aléatoires discrètes indépendantes suivant une distribution de probabilité
binomiale avec une probabilité p.
La blockchain a besoin d’un nombre minimum de noeuds dans le réseau pour
fonctionner correctement et pour que le consensus soit valable. Nous supposons
donc que ce nombre est suffisant pour pouvoir approximer la distribution binomiale
par une distribution normale (n ≥ 30, np ≥ 5 et n(1 − p) ≥ 5) :
1 x−µ 2 − 1 ( √ x−np )2
e− 2 ( σ ) e 2 np(1−p)
f (x) = √ =p √ (4.1)
σ 2π np(1 − p) 2π
La probabilité d’avoir une majorité malhonnête est ainsi :
1 x−np 2
Z n2 Z n2 − 2 ( √np(1−p) )
n e
Pm = p 0 ≤ Xn ≤ = f (x)dx = p √ (4.2)
2 0 0 np(1 − p) 2π
Dans la figure 4.11, nous représentons la probabilité d’avoir une majorité d’au-
diteurs malhonnêtes en fonction du nombre de noeuds d’auditeurs. Nous partons du
principe qu’au moins la moitié des noeuds sont honnêtes, hypothèse de base pour
le bon fonctionnement d’une blockchain.
Avec p = 4/5, la probabilité est inférieure à 10−6 à partir du moment où il y
a un minimum de 41 noeuds dans le réseau. Pour p = 5/7, il faut au moins 101
noeuds, et 181 avec p = 2/3.
Nous avons vu dans la sous-section 3.1.2 que les nombres de noeuds complets
dépassaient les 8000 et 15000 pour les blockchains Bitcoin et Ethereum. Ces nombres
d’auditeurs requis semblent donc tout à fait acceptables.
4.5.1 Généralités
Comme expliqué dans la section 2.4, les preuves de récupérabilité (PoR) per-
mettent à un client de s’assurer qu’un serveur stocke bien une donnée comme il
le prétend, et que celle-ci est récupérable. Le fonctionnement se base sur des chal-
lenges, posés régulièrement par la blockchain, auxquels le serveur doit répondre
correctement. Tous les noeuds du réseau vont ensuite vérifier chacune des preuves,
4.5. Preuve de récupérabilité 103
Propriétés Caractéristiques
Audit Public
Nombre de challenges Illimité
Type de données Statique ou dynamique
Confidentialité de la donnée Oui, chiffrée
Propriétés Caractéristiques
Complexité de génération de méta-données (client) Temps acceptable (quelques minutes)
Taille des données stockées pour vérification Petite
Taille des données stockées par le serveur Pas d’importance
Taille des preuves Petite
Complexité de la génération d’une preuve (serveur) Temps acceptable (quelques minutes)
Complexité de vérification d’une preuve Faible
Drand est un protocole [71] utilisé par filecoin pour le consensus, afin de déter-
miner qui construit le bloc, ainsi que pour la preuve de spacetime et pour la preuve
de réplication.
La génération d’un nombre aléatoire se fait en deux étapes, grâce à la partici-
pation de N noeuds différents.
La première étape est l’initialisation. Chaque noeud génère une clé privée et une
clé publique associée. Toutes les clés publiques sont envoyées sur la blockchain, et
regroupées afin de créer une clé publique collective et une clé privée partielle par
serveur. Les participants n’ont pas accès à la totalité de cette clé privée.
La deuxième étape est la génération du nombre aléatoire. Elle se fait sur la
Chapitre 4. BlockHouse : Blockchain-based Distributed Storehouse
106 System
demande d’un noeud, qui envoie un message à l’ensemble des participants. Les
autres noeuds vont lui répondre en signant ce message avec une signature partielle
(t,n) BLS, à partir de leurs clés privées partielles. Lorsqu’au moins t signatures
partielles sont recueillies, il est possible de construire la signature BLS complète.
Pour accentuer l’aléatoire, cette signature est hachée, et c’est son empreinte qui sert
de nombre pseudo-aléatoire. Ce nombre peut être facilement vérifié grâce à la clé
publique collective.
Les VDF pour verifiable delay functions [72], sont des fonctions nécessitant des
calculs séquentiels pour être évaluées, mais dont la solution est rapide et facile à
vérifier. Elles permettent de rajouter un délai à la sortie du générateur aléatoire,
afin d’empêcher des acteurs de modifier certaines entrées pour que la valeur pseudo-
aléatoire leur convienne. Avec ce délai, les entrées seront fixées avant de pouvoir
obtenir le nombre généré et il est donc impossible de tester plusieurs entrées pour
influer sur le résultat.
Un exemple simple est d’effectuer plusieurs fonctions de hachage imbriquées,
h(h(h(...h(x)))). Le principal défaut ici est que l’unique façon de vérifier est de
re-effectuer le calcul, qui est par définition coûteux en temps. D’autres articles ont
proposé diverses solutions, comme des équations prenant un temps assez précis à
résoudre, et faciles à vérifier.
Dans cette proposition, nous reprenons l’idée générale présentée dans Drand et
Randao, à savoir que pour obtenir un nombre aléatoire, il est nécessaire que N
noeuds du réseau participent à son élaboration grâce à un contrat intelligent. Le
principal problème ici est que cette génération n’est pas instantanée mais se fait
en plusieurs étapes, et donc en plusieurs blocs. En fonction du système dans lequel
nous nous trouvons, deux solutions peuvent être envisagées :
4.6. L’aléatoire dans les blockchains 107
Avec cette solution, nous proposons d’utiliser une VDF, c’est-à-dire une fonction
séquentielle, en lui donnant en entrée des paramètres directement issus de l’état de la
blockchain à un instant t. La fonction VDF permet de sécuriser ce processus, puisque
par définition le temps de calculer son résultat, le bloc contenant les paramètres
sera déjà validé et sécurisé. Le nombre aléatoire issu de ce calcul ne sera donc plus
modifiable, et les noeuds du réseau ne pourront pas tricher.
Ce calcul étant relativement long, il peut être laissé à la charge du noeud serveur
qui inclura son résultat, donc le challenge, dans la transaction contenant la preuve
Chapitre 4. BlockHouse : Blockchain-based Distributed Storehouse
108 System
4.7 Conclusion
Dans ce chapitre, nous avons présenté notre solution de location d’espace de
stockage, appelée BlockHouse, reposant sur une blockchain. La particularité de
BlockHouse par rapport aux blockchains de stockage existantes est le fait que toutes
les étapes se déroulent sur la chaîne, à l’exception du stockage même de la donnée.
En utilisant des contrats intelligents associés à des preuves de récupérabilité, la
vérification de la donnée et le paiement associé sont automatiques et sécurisés, car
tous les noeuds du réseau vont pouvoir les vérifier.
Le point critique de cette solution est atteint lorsque le noeud client, qui loue
l’espace de stockage, souhaite récupérer sa donnée, présente sur le noeud serveur.
Cette action se déroulant en dehors de la blockchain, il est impossible pour le réseau
de vérifier que tout s’est correctement déroulé. En effet, en cas de désaccord, les
autres noeuds ignorent si le problème se trouve du coté du client ou du coté du
serveur. Pour résoudre cela, nous avons proposé une solution utilisant un ensemble
d’autres noeuds, appelés auditeurs, dont le but est de vérifier que le fichier est
réellement disponible ou non, afin de connaître l’origine du problème. Ces noeuds
sont récompensés pour leur travail, grâce à un séquestre spécial mis de coté par les
deux noeuds.
Une autre thèse est actuellement en cours, avec pour objectifs d’effectuer une
évaluation complète de BlockHouse, en étudiant notamment les tailles des preuves
de récupérabilité et des méta-données associées, ainsi que leurs complexités et leurs
temps d’exécution.
Chapitre 5
Conclusion et perspectives
Dans ce chapitre, nous résumons tout d’abord les principales contributions pré-
sentées dans ce manuscrit, puis nous donnons quelques perspectives futures avant
de conclure sur ces travaux.
Dans un second temps, nous nous sommes intéressés au cas où l’utilisateur dis-
pose d’un espace de stockage non utilisé. Nous avons présenté dans le chapitre 4 une
solution de location d’espace de stockage basée sur la blockchain, appelée Block-
House. Celle-ci met en relation un client, souhaitant faire stocker une donnée, et un
ou plusieurs serveurs, disposant d’espaces de stockage non utilisés. Les deux entités
se mettent d’accord sur différents paramètres, comme le prix et la durée de location,
et inscrivent le tout de façon infalsifiable dans un contrat intelligent. Pour être payé
de façon régulière pour son service, le serveur va devoir prouver à l’ensemble de la
blockchain qu’il dispose toujours de la donnée. Pour cela, BlockHouse utilise des
preuves de récupérabilité (PoR). Les PoR fonctionnent sous la forme de challenges-
réponses, et permettent de s’assurer avec une forte probabilité de la disponibilité et
de l’intégrité de la donnée. Le challenge de chaque preuve sera issue directement de
l’état de la blockchain, donc accessible à tous les acteurs du réseau, et la réponse
fournie par le serveur sera inscrite dans la blockchain. Chaque noeud pourra ainsi
vérifier sa validité, et le serveur sera récompensé.
noeuds LS, et pouvoir réaliser des tests plus poussés. Un point à comparer serait
par exemple les débits minimum requis dans le cas où on aurait un réseau composé
de peu de noeuds complets, et dans le cas d’un réseau comprenant un nombre plus
élevé de noeuds LS.
Les travaux effectués dans le chapitre 4 s’inscrivent dans un cadre plus global
sur lequel un autre doctorant continue à travailler. Pour le moment, peu de tests ont
été réalisés, et il n’existe pas de réelles études permettant d’estimer le temps ajouté
par la vérification des différentes preuves de récupérabilité. De même, il est difficile
d’évaluer les tailles des différents types de données d’un PoR : méta-données,
challenges, preuves, ainsi que leurs complexités et temps d’exécution. Il serait
intéressant là encore de réaliser une implémentation du système, afin de mesurer
l’impact de la génération et la vérification des preuves, pour s’assurer qu’elles ne
sont pas bloquantes pour le système.
Conférences internationales
— Perard, D., Lacan, J., Bachy, Y., and Detchart, J. (2018). Erasure code-based
low storage blockchain node. Publiée à Blockchain 2018 (Halifax, Canada),
Juillet 2018.
— Perard D. , Gicquel L., and Lacan J. , "BLOCKHOUSE : Blockchain-based
distributed storehouse system". Publiée à 9th Latin-American Symposium
on Dependable Computing (LADC), Novembre 2019.
— Perard D. , Goffin X., and Lacan J. , "Using Homomorphic hashes in coded
blockchains". Accepté pour présentation à SERIAL20, 4th Workshop on
Scalable and Resilient Infrastructures for Distributed Ledgers, August 2020.
En cours de rédaction
— Gicquel L., Perard D., and Lacan J. , "Implementation and evaluation of
BlockHouse". À soumettre à une revue.
[39] M. Luby, “Lt codes,” in The 43rd Annual IEEE Symposium on Foundations
of Computer Science, 2002. Proceedings. IEEE, 2002, pp. 271–280. (Cited in
pages 34 et 52.)
[40] A. Shokrollahi, “Raptor codes,” IEEE transactions on information theory,
vol. 52, no. 6, pp. 2551–2567, 2006. (Cited in page 35.)
[41] P. Maymounkov, “Online codes,” Technical report, New York University, Tech.
Rep., 2002. (Cited in page 35.)
[42] M. A. Shah, M. Baker, J. C. Mogul, R. Swaminathan et al., “Auditing to keep
online storage services honest.” in HotOS, 2007. (Cited in pages 37 et 38.)
[43] A. Juels and B. S. Kaliski Jr, “Pors : Proofs of retrievability for large files,”
in Proceedings of the 14th ACM conference on Computer and communications
security. Acm, 2007, pp. 584–597. (Cited in pages 38 et 39.)
[44] K. D. Bowers, A. Juels, and A. Oprea, “Proofs of retrievability : Theory and
implementation,” in Proceedings of the 2009 ACM workshop on Cloud compu-
ting security, 2009, pp. 43–54. (Cited in page 39.)
[45] H. Shacham and B. Waters, “Compact proofs of retrievability,” in Internatio-
nal Conference on the Theory and Application of Cryptology and Information
Security. Springer, 2008, pp. 90–107. (Cited in page 39.)
[46] S. Park, S. Im, Y. Seol, and J. Paek, “Nodes in the bitcoin network : Compa-
rative measurement study and survey,” IEEE Access, vol. 7, pp. 57 009–57 022,
2019. (Cited in page 44.)
[47] S. K. Kim, Z. Ma, S. Murali, J. Mason, A. Miller, and M. Bailey,
“Measuring ethereum network peers,” in Proceedings of the Internet
Measurement Conference 2018, ser. IMC ’18. New York, NY, USA :
Association for Computing Machinery, 2018, p. 91–104. [Online]. Available :
https://doi.org/10.1145/3278532.3278542 (Cited in page 44.)
[48] EthHub, “Running an ethereum node.” [Online]. Available : https://docs.
ethhub.io/using-ethereum/running-an-ethereum-node/ (Cited in page 45.)
[49] L. Rizzo, “Effective Erasure Codes For Reliable Computer Communication
Protocols,” ACM Computer Communication Review, vol. 27, no. 2, pp. 24–36,
April 1997. (Cited in page 51.)
[50] C. Studholme and I. F. Blake, “Random matrices and codes for the era-
sure channel,” Algorithmica, vol. 56, no. 4, pp. 605–620, Apr 2010. (Cited
in page 54.)
Bibliographie 119
[51] T. Le, J. S., and S. B., “Code sample : Intel isa-l erasure code and reco-
very,” software.intel.com/en-us/articles/intel-isa-l-erasure-code-and-recovery,
2017. (Cited in page 54.)
[52] J. Detchart, “Dépot github les programmes tests d’isa-l.” [Online]. Available :
github.com/jdetchart/isa-l (Cited in page 55.)
[53] M. Al-Bassam, A. Sonnino, and V. Buterin, “Fraud proofs : Maximising light
client security and scaling blockchains with dishonest majorities,” arXiv pre-
print arXiv :1809.09044, 2018. (Cited in page 61.)
[54] S. Kadhe, J. Chung, and K. Ramchandran, “Sef : A secure fountain architecture
for slashing storage costs in blockchains,” arXiv preprint arXiv :1906.12140,
2019. (Cited in pages 61, 63 et 79.)
[55] D. Perard, J. Lacan, Y. Bachy, and J. Detchart, “Erasure code-based low
storage blockchain node,” in IEEE International Conference on Blockchain.
IEEE, 2018. (Cited in pages 61 et 63.)
[56] D. Perard, X. Goffin, and J. Lacan, “Using homomorphic hashes
in coded blockchains,” in SERIAL20 4th Workshop on Scalable and
Resilient Infrastructures for Distributed Ledgers, 2020. [Online]. Available :
https://arxiv.org/pdf/2010.04607.pdf (Cited in page 64.)
[57] V. Buterin, “A note on data availability and erasure coding,” November
2017. [Online]. Available : github.com/ethereum/research/wiki/A-note-on-
data-availability-and-erasure-coding (Cited in page 77.)
[58] X. Chen, S. Lin, and N. Yu, “Bitcoin blockchain compression algorithm for
blank node synchronization,” in 2019 11th International Conference on Wire-
less Communications and Signal Processing (WCSP). IEEE, 2019, pp. 1–6.
(Cited in page 79.)
[59] L. Quan and Q. Huang, “Transparent coded blockchain,” in Proceedings of
the 15th International Conference on emerging Networking EXperiments and
Technologies, 2019, pp. 12–13. (Cited in page 79.)
[60] D. Mitra and L. Dolecek, “Patterned erasure correcting codes for low storage-
overhead blockchain systems,” in 2019 53rd Asilomar Conference on Signals,
Systems, and Computers. IEEE, 2019, pp. 1734–1738. (Cited in page 79.)
[61] R. Blum and T. Bocek, “Superlight–a permissionless, light-client only block-
chain with self-contained proofs and bls signatures,” in 2019 IFIP/IEEE Sym-
posium on Integrated Network and Service Management (IM). IEEE, 2019,
pp. 36–41. (Cited in page 79.)
120 Bibliographie
[62] J. Li and B. Li, “Erasure coding for cloud storage systems : A survey,” Tsinghua
Science and Technology, vol. 18, no. 3, pp. 259–272, June 2013. (Cited in
page 85.)
[63] D. Vorick and L. Champine, “Sia : Simple decentralized storage,” Nebulous
Inc, 2014. (Cited in page 85.)
[64] S. Ruj, M. S. Rahman, A. Basu, and S. Kiyomoto, “Blockstore : A secure decen-
tralized storage framework on blockchain,” in 2018 IEEE 32nd International
Conference on Advanced Information Networking and Applications (AINA).
IEEE, 2018, pp. 1096–1103. (Cited in page 86.)
[65] P. Labs, “Filecoin website.” [Online]. Available : https://filecoin.io/ (Cited in
page 86.)
[66] S. Park, A. Kwon, G. Fuchsbauer, P. Gaži, J. Alwen, and K. Pietrzak, “Space-
mint : A cryptocurrency based on proofs of space,” in International Conference
on Financial Cryptography and Data Security. Springer, 2018, pp. 480–499.
(Cited in page 86.)
[67] D. Perard, L. Gicquel, and J. Lacan, “Blockhouse : Blockchain-based distribu-
ted storehouse system,” in 2019 9th Latin-American Symposium on Dependable
Computing (LADC). IEEE, 2019, pp. 1–4. (Cited in page 87.)
[68] E. Ruchevits, “Block protocole 2.0,” 2015. [On-
line]. Available : https://github.com/ethereum/wiki/blob/
c02254611f218f43cbb07517ca8e5d00fd6d6d75/Block-Protocol-2.0.md (Cited
in page 91.)
[69] C. B. Tan, M. H. A. Hijazi, Y. Lim, and A. Gani, “A survey on proof of
retrievability for cloud data integrity and availability : Cloud storage state-of-
the-art, issues, solutions and future trends,” Journal of Network and Computer
Applications, vol. 110, pp. 75–86, 2018. (Cited in page 104.)
[70] randao, “Randao : Verifiable random number generation.” Randao, 2017.
(Cited in page 105.)
[71] D. organization, “Drand - a distributed randomness beacon daemon.” [Online].
Available : github.com/drand/drand (Cited in page 105.)
[72] D. Boneh, J. Bonneau, B. Bünz, and B. Fisch, “Verifiable delay functions,”
in Annual international cryptology conference. Springer, 2018, pp. 757–788.
(Cited in page 106.)
"Mais moi, malheureusement, je ne sais pas voir les moutons à travers les caisses.
Je suis peut-être un peu comme les grandes personnes. J’ai dû vieillir."
Antoine de Saint-Exupéry