|
| 1 | +\documentclass[12pt,class=report,crop=false]{standalone} |
| 2 | +\usepackage[screen]{../python} |
| 3 | + |
| 4 | + |
| 5 | +\pagestyle{empty} |
| 6 | + |
| 7 | +\begin{document} |
| 8 | + |
| 9 | + |
| 10 | +%==================================================================== |
| 11 | +\chapitre{Bitcoin} |
| 12 | +%==================================================================== |
| 13 | + |
| 14 | +\section*{Bitcoin} |
| 15 | + |
| 16 | +\begin{itemize} |
| 17 | + \item La monnaie \emph{bitcoin} est une monnaie dématérialisée. |
| 18 | + |
| 19 | + \item Les transactions sont enregistrées dans un grand livre de compte appelé \emph{blockchain}. |
| 20 | + |
| 21 | + |
| 22 | + \item Imaginons un groupe d'amis qui souhaitent partager les dépenses du groupe de façon la plus simple possible. |
| 23 | + |
| 24 | + \item Au départ tout le monde dispose de 1000 \emph{bitcoins} et on note au fur et à mesure les dépenses et les recettes de chacun. |
| 25 | + |
| 26 | + \item On note sur le livre de compte la liste des dépenses/recettes, par exemple : |
| 27 | +\begin{itemize} |
| 28 | + \item \og{}Amir a dépensé 100 \emph{bitcoins}\fg{} |
| 29 | + \item \og{}Barbara a reçu 45 \emph{bitcoins}\fg{} |
| 30 | + \item etc. |
| 31 | +\end{itemize} |
| 32 | + |
| 33 | + \item Il suffit de parcourir tout le livre pour savoir combien chacun a reçu ou dépensé depuis le début. |
| 34 | +\end{itemize} |
| 35 | + |
| 36 | +\newpage |
| 37 | + |
| 38 | +\section*{Blockchain} |
| 39 | + |
| 40 | +Pour éviter que quelqu'un ne vienne truquer le livre de compte, après chaque transaction on ajoute dans le livre une certification construite à partir d'une preuve de travail. |
| 41 | +\begin{enumerate} |
| 42 | + \item On commence par une preuve de travail quelconque. Pour nous ce sera |
| 43 | + \ci{[0,0,0,0,0,0]}. |
| 44 | + \item On écrit la première transaction (par exemple \ci{"Amir -100"}). |
| 45 | + \item On calcule et on écrit dans le livre une preuve de travail, qui va servir de certificat. C'est une liste |
| 46 | + (par exemple \ci{[56,42,10,98,2,34]}) obtenue après beaucoup de calculs prenant en compte la transaction précédente et la précédente preuve de travail. |
| 47 | + \item À chaque nouvelle transaction (par exemple \ci{"Barbara +45"}), quelqu'un calcule une preuve de travail pour la dernière transaction associée à la précédente preuve. On écrit la transaction, puis la preuve de travail. |
| 48 | +\end{enumerate} |
| 49 | + |
| 50 | +\myfigure{0.5}{ |
| 51 | +\tikzinput{fig-bitcoin-4} |
| 52 | +} |
| 53 | + |
| 54 | +\newpage |
| 55 | + |
| 56 | + |
| 57 | +\section*{Preuve de travail} |
| 58 | + |
| 59 | + |
| 60 | + |
| 61 | +\begin{itemize} |
| 62 | + \item Une preuve de travail est la résolution d'un problème difficile, mais où il est facile de vérifier que la solution obtenue est correcte. |
| 63 | + |
| 64 | + \item Comme les sudokus par exemple : il suffit de dix secondes pour vérifier qu'une grille est remplie correctement, par contre il a fallu plus de dix minutes pour le résoudre. |
| 65 | +\end{itemize} |
| 66 | + |
| 67 | +\myfigure{0.5}{ |
| 68 | +\tikzinput{fig-bitcoin-4} |
| 69 | +} |
| 70 | + |
| 71 | +\newpage |
| 72 | + |
| 73 | +\section*{Fonction de hachage} |
| 74 | + |
| 75 | + |
| 76 | +\begin{itemize} |
| 77 | + \item À partir d'un long message nous calculons une courte empreinte. |
| 78 | + \item Il est difficile de trouver deux messages différents ayant la même empreinte. |
| 79 | + \item Ici notre message est une liste d'entiers (entre $0$ et $99$) de longueur un multiple quelconque de $N=6$. |
| 80 | + \item Son empreinte (ou \emph{hash}) sera une liste de longueur $N=6$. |
| 81 | + |
| 82 | + \item Exemple : \ci{[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]} a pour empreinte :\\ |
| 83 | + \centerline{\ci{[10, 0, 58, 28, 0, 90]}} |
| 84 | + \item Exemple : \ci{[1, 1, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]} a pour empreinte :\\ |
| 85 | + \centerline{\ci{[25, 14, 29, 1, 19, 6]}} |
| 86 | +\end{itemize} |
| 87 | + |
| 88 | + L'idée est de mélanger les nombres par bloc de $N=6$ entiers, puis de combiner ce bloc au suivant et de recommencer, jusqu'à obtenir un seul bloc. |
| 89 | + |
| 90 | +\newpage |
| 91 | + |
| 92 | +\section*{Un tour} |
| 93 | + |
| 94 | + Pour un bloc $[b_0,b_1,b_2,b_3,b_4,b_5]$ de taille $N=6$, \emph{faire un tour} consiste à faire les opérations suivantes : |
| 95 | + \begin{enumerate} |
| 96 | + \item On additionne certains entiers : |
| 97 | + $$[b_0',b_1',b_2',b_3',b_4',b_5'] = [b_0,b_1+b_0,b_2,b_3+b_2,b_4,b_5+b_4]$$ |
| 98 | + |
| 99 | + \item On multiplie ces entiers par des nombres premiers (dans l'ordre $7,11,13,17,19,23$) et on rajoute $1$ : |
| 100 | + $$[b_0'',b_1'',b_2'',b_3'',b_4'',b_5''] = [7 \times b_0'+1,11\times b_1'+1,13\times b_2'+1,17 \times b_3'+1,19 \times b_4'+1,23 \times b_5'+1]$$ |
| 101 | + |
| 102 | + \item On effectue une permutation circulaire (le dernier passe devant) : |
| 103 | + $$[b_0''',b_1''',b_2''',b_3''',b_4''',b_5'''] = [b_5'',b_0'',b_1'',b_2'',b_3'',b_4'']$$ |
| 104 | + |
| 105 | + \item On réduit chaque entier modulo $100$ afin d'obtenir des entiers entre $0$ et $99$. |
| 106 | + \end{enumerate} |
| 107 | + |
| 108 | + |
| 109 | +\myfigure{0.7}{ |
| 110 | +\tikzinput{fig-bitcoin-1} |
| 111 | +} |
| 112 | + |
| 113 | + |
| 114 | +\newpage |
| 115 | +\begin{minipage}{0.6\textwidth} |
| 116 | + Partant du bloc $[0, 1, 2, 3, 4, 5]$, on a donc successivement : |
| 117 | + \begin{enumerate} |
| 118 | + \item additions : $[0, 1, 2, 5, 4, 9]$ |
| 119 | + |
| 120 | + \item multiplications : $[7\times 0 + 1, 11\times 1+1, 13\times 2+1, 17 \times 5+1,19 \times 4+1, 23 \times 9+1] = [1,12,27,86,77,208]$ |
| 121 | + |
| 122 | + \item permutation : $[208,1,12,27,86,77]$ |
| 123 | + |
| 124 | + \item réduction modulo $100$ : $[8,1,12,27,86,77]$ |
| 125 | + \end{enumerate} |
| 126 | + |
| 127 | + Vérifie que le bloc $[1, 1, 2, 3, 4, 5]$ est transformé en $[8, 8, 23, 27, 86, 77]$. |
| 128 | +\end{minipage}\quad |
| 129 | +\begin{minipage}{0.3\textwidth} |
| 130 | + \myfigure{0.7}{ |
| 131 | +\tikzinput{fig-bitcoin-1} |
| 132 | +} |
| 133 | +\end{minipage} |
| 134 | + |
| 135 | + |
| 136 | +\newpage |
| 137 | + |
| 138 | + |
| 139 | +\section*{Dix tours} |
| 140 | + |
| 141 | + Pour bien mélanger chaque bloc, itère dix fois les opérations précédentes. |
| 142 | + Après $10$ tours : |
| 143 | + \begin{itemize} |
| 144 | + \item le bloc $[0, 1, 2, 3, 4, 5]$ devient $[98, 95, 86, 55, 66, 75]$, |
| 145 | + \item le bloc $[1, 1, 2, 3, 4, 5]$ devient $[18, 74, 4, 42, 77, 42]$. |
| 146 | + \end{itemize} |
| 147 | + Deux blocs proches sont transformés en deux blocs très différents ! |
| 148 | + |
| 149 | +\newpage |
| 150 | + |
| 151 | +\section*{Hachage d'une liste} |
| 152 | + |
| 153 | + Partant d'une liste de longueur un multiple de $N=6$, on la découpe en blocs de longueur $6$ et on calcule l'empreinte de cette liste selon l'algorithme suivant : |
| 154 | + \begin{itemize} |
| 155 | + \item On extrait le premier bloc de la liste, on effectue $10$ tours de mélange. |
| 156 | + \item On ajoute terme à terme (et modulo $100$), le résultat de ce mélange au second bloc. |
| 157 | + \item On recommence en partant du nouveau second bloc. |
| 158 | + \item Lorsqu'il ne reste plus qu'un bloc, on effectue $10$ tours de mélange, le résultat est l'empreinte de la liste. |
| 159 | + \end{itemize} |
| 160 | + |
| 161 | + |
| 162 | +Voici le schéma d'une situation avec trois blocs : dans un premier temps il y a trois blocs (A,B,C) ; dans un second temps il ne reste plus que deux bloc (B' et C) ; à la fin il ne reste qu'un bloc (C'') : c'est l'empreinte ! |
| 163 | +\myfigure{0.5}{ |
| 164 | +\tikzinput{fig-bitcoin-2} |
| 165 | +} |
| 166 | + |
| 167 | +\newpage |
| 168 | + |
| 169 | + Exemple avec la liste $[0,1,2,3,4,5,1,1,1,1,1,1,10,10,10,10,10,10]$. |
| 170 | + \begin{itemize} |
| 171 | + \item Le premier bloc est $[0,1,2,3,4,5]$, son mélange à $10$ tours est |
| 172 | + $[98, 95, 86, 55, 66, 75]$. |
| 173 | + \item On ajoute ce mélange au second bloc $[1,1,1,1,1,1]$. |
| 174 | + \item La liste restante est maintenant $[99,96,87,56,67,76,10,10,10,10,10,10]$. |
| 175 | + \item On recommence. Le nouveau premier bloc est $[99,96,87,56,67,76]$, son mélange à $10$ tours vaut $[60, 82, 12, 94, 6, 80]$, on l'ajoute au dernier bloc $[10,10,10,10,10,10$] pour obtenir (modulo $100$) $[70,92,22,4,16,90]$. |
| 176 | + \item On effectue un dernier mélange à $10$ tours pour obtenir l'empreinte : $[77, 91, 5, 91, 89, 99]$. |
| 177 | + \end{itemize} |
| 178 | + |
| 179 | + |
| 180 | +\myfigure{0.4}{ |
| 181 | +\tikzinput{fig-bitcoin-2} |
| 182 | +} |
| 183 | + |
| 184 | +\end{document} |
| 185 | + |
| 186 | + |
| 187 | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 188 | +% Activité 4 |
| 189 | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 190 | + |
| 191 | +\begin{activite}[Preuve de travail - Minage] |
| 192 | + |
| 193 | +\objectifs{Objectifs : construire un mécanisme de preuve de travail à l'aide de notre fonction de hachage.} |
| 194 | + |
| 195 | +\index{minage} |
| 196 | + |
| 197 | +On va construire un problème compliqué à résoudre, pour lequel, si quelqu'un nous donne la solution, alors il est facile de vérifier qu'elle convient. |
| 198 | + |
| 199 | +\textbf{Problème à résoudre.} On nous donne une liste, il s'agit de trouver un bloc tel que, lorsque qu'on le rajoute à la liste, cela produit un hachage commençant par des zéros. |
| 200 | +Plus précisément étant donné une liste \ci{liste} et un objectif maximal \ci{Max}, il s'agit de trouver un bloc \ci{preuve} qui, concaténé à la liste puis haché, est plus petit que la liste \ci{Max}, c'est-à-dire : \\ |
| 201 | +\centerline{\ci{hachage(liste + preuve)} \ plus petit que \ \ci{Max}} |
| 202 | + |
| 203 | +La liste est de longueur quelconque (un multiple de $N=6$), la preuve est un bloc de longueur $N$, l'objectif est de trouver une liste commençant par des $0$ (voir l'activité 2). |
| 204 | + |
| 205 | +Par exemple : soit la \ci{liste = [0,1,2,3,4,5]} et \ci{Max = [0,0,7]}. Quel bloc \ci{preuve} puis-je concaténer à \ci{liste} pour résoudre mon problème ? |
| 206 | +\begin{itemize} |
| 207 | + \item \ci{preuve = [12, 3, 24, 72, 47, 77]} convient car concaténé à notre liste cela donne \ci{[0,1,2,3,4,5,12, 3, 24, 72, 47, 77]} et le hachage de toute cette liste vaut |
| 208 | + \ci{[0, 0, 5, 47, 44, 71]} qui commence par \ci{[0,0,5]} plus petit que l'objectif. |
| 209 | + |
| 210 | + \item \ci{preuve = [0, 0, 2, 0, 61, 2]} convient aussi car après concaténation on a |
| 211 | + \ci{[0,1,2,3,4,5,0, 0, 2, 0, 61, 2]} dont le hachage donne \ci{[0, 0, 3, 12, 58, 92]}. |
| 212 | + |
| 213 | + \item \ci{[97, 49, 93, 87, 89, 47]} ne convient pas, car après concaténation puis hachage on obtient \ci{[0, 0, 8, 28, 6, 60]} qui est plus grand que l'objectif voulu. |
| 214 | +\end{itemize} |
| 215 | + |
| 216 | +\begin{enumerate} |
| 217 | + \item \textbf{Vérification (facile).} |
| 218 | + |
| 219 | + Programme une fonction \ci{verification_preuve_de_travail(liste,preuve)} qui renvoie vrai si la solution \ci{preuve} proposée convient pour \ci{liste}. Utilise la fonction \ci{est_plus_petit()} de l'activité 2. |
| 220 | + |
| 221 | + \item \textbf{Recherche de solution (difficile).} |
| 222 | + |
| 223 | + Programme une fonction \ci{preuve_de_travail(liste)} qui cherche un bloc \ci{preuve} solution à notre problème pour la liste donnée. |
| 224 | + |
| 225 | + |
| 226 | + \emph{Indications.} |
| 227 | + |
| 228 | + \begin{itemize} |
| 229 | + \item La méthode la plus simple est de prendre un bloc \ci{preuve} de nombres au hasard et de recommencer jusqu'à trouver une solution. |
| 230 | + |
| 231 | + \item Tu peux aussi tester systématiquement tous les blocs en commençant avec \ci{[0,0,0,0,0,0]}, puis \ci{[0,0,0,0,0,1]}\ldots{} et t'arrêter au premier qui convient. |
| 232 | + |
| 233 | + \item Tu ajustes la difficulté du problème en changeant l'objectif : facile avec \ci{Max = [0,0,50]}, moyen avec \ci{Max = [0,0,5]}, difficile avec \ci{Max = [0,0,0]}, trop difficile avec \ci{Max = [0,0,0,0]}. |
| 234 | + |
| 235 | + \item Comme il existe plusieurs solutions, tu n'obtiens pas nécessairement la même solution à chaque recherche. |
| 236 | + |
| 237 | + \end{itemize} |
| 238 | + |
| 239 | + \item \textbf{Temps de calcul.} |
| 240 | + |
| 241 | + Compare le temps de calcul d'une simple vérification par rapport au temps de recherche d'une solution. Choisis l'objectif \ci{Max} de sorte que la recherche d'une preuve de travail nécessite environ entre 30 et 60 secondes de calculs. |
| 242 | + |
| 243 | +\end{enumerate} |
| 244 | + |
| 245 | +Pour le \emph{bitcoin}, ceux qui calculent des preuves de travail sont appelés les \emph{mineurs}. Le premier qui trouve une preuve gagne une récompense. La difficulté du problème est ajustée de sorte |
| 246 | +que le temps de calcul mis par le gagnant (parmi l'ensemble de tous les mineurs) pour trouver une solution, soit d'environ $10$ minutes. |
| 247 | + |
| 248 | +\end{activite} |
| 249 | + |
| 250 | + |
| 251 | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 252 | +% Activité 4 |
| 253 | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 254 | + |
| 255 | +\begin{activite}[Tes \emph{bitcoins}] |
| 256 | + |
| 257 | +\objectifs{Objectifs : créer un livre de compte (appelé \emph{blockchain} pour le \emph{bitcoin}) qui enregistre toutes les transactions, ce registre est public et certifié. Il est pratiquement impossible d'y falsifier une transaction déjà inscrite.} |
| 258 | + |
| 259 | + |
| 260 | +\myfigure{0.5}{ |
| 261 | +\tikzinput{fig-bitcoin-3} |
| 262 | +} |
| 263 | + |
| 264 | +\begin{enumerate} |
| 265 | + \item \textbf{Initialisation et ajout d'une transaction.} |
| 266 | + |
| 267 | + \begin{enumerate} |
| 268 | + \item Initialise une variable globale \ci{Livre} qui est une liste et contient au départ une preuve nulle : \ci{Livre = [ [0,0,0,0,0,0] ]} . |
| 269 | + |
| 270 | + \item Une \emph{transaction} est une chaîne de caractères comprenant un nom et la somme à ajouter (ou à retrancher) à son compte. Par exemple \ci{"Abel +25"} ou \ci{"Barbara -45"}. |
| 271 | + |
| 272 | + Programme une fonction \ci{ajout_transaction(transaction)} qui ajoute la chaine de caractère \ci{transaction} à la liste \ci{Livre}. |
| 273 | +Par exemple après l'initialisation \ci{ajout_transaction("Camille +100")}, |
| 274 | + \ci{Livre} vaut \ci{[ [0, 0, 0, 0, 0, 0], "Camille +100" ]}. |
| 275 | + Attention, pour pouvoir modifier \ci{Livre} il faut commencer la fonction par : \ci{global Livre}. |
| 276 | + |
| 277 | + \end{enumerate} |
| 278 | + |
| 279 | + \item Dès qu'une transaction est ajoutée, il faut calculer et ajouter au livre de comptes une preuve de travail. Programme une fonction \ci{minage()}, sans paramètre, qui ajoute une preuve de travail au livre. |
| 280 | + |
| 281 | +Voici comment faire : |
| 282 | + \begin{itemize} |
| 283 | + \item On prend la dernière transaction \ci{transaction}, on la transforme en une liste d'entiers par la fonction \ci{phrase_vers_liste()} de l'activité 2. |
| 284 | + \item On prend la preuve de travail \ci{prec_preuve} située juste avant cette transaction. |
| 285 | + \item On forme la liste \ci{liste} composée d'abord des éléments de \ci{prec_preuve}, puis des éléments de la liste d'entiers obtenue en convertissant la chaîne \ci{transaction}. |
| 286 | + \item On calcule une preuve de travail de cette liste. |
| 287 | + \item On ajoute cette preuve au livre de compte. |
| 288 | + \end{itemize} |
| 289 | + Par exemple si le livre se termine par :\\ |
| 290 | + \centerline{\ci{[3, 1, 4, 1, 5, 9], "Abel +35"}} |
| 291 | + alors après calcul de la preuve de travail le livre se termine par exemple par :\\ |
| 292 | + \centerline{\ci{[3, 1, 4, 1, 5, 9], "Abel +35", [32, 17, 37, 73, 52, 90]}} |
| 293 | + On rappelle que la preuve de travail n'est pas unique et qu'en plus elle dépend |
| 294 | + de l'objectif \ci{Max}. |
| 295 | + |
| 296 | + \item Une seule personne à la fois ajoute une preuve de travail. Par contre tout le monde a la possibilité de vérifier que la preuve proposée est correcte (et devrait le faire). |
| 297 | + Écris une fonction \ci{verification_livre()}, sans paramètre, qui vérifie que la dernière preuve ajoutée au \ci{Livre} est valide. |
| 298 | + |
| 299 | + \item Écris un livre de compte qui correspond aux données suivantes : |
| 300 | + \begin{itemize} |
| 301 | + \item On prend \ci{Max = [0,0,5]} et au départ \ci{Livre = [ [0,0,0,0,0,0] ]}. |
| 302 | + \item \ci{"Alfred -100"} (Alfred doit 100 \emph{bitcoins}). |
| 303 | + \item Barnabé en reçoit 150. |
| 304 | + \item Chloé gagne 35 \emph{bitcoins}. |
| 305 | + \end{itemize} |
| 306 | + |
| 307 | +\end{enumerate} |
| 308 | + |
| 309 | +Conclusion : imaginons que Alfred veuille tricher, il veut changer le livre de compte afin de recevoir 100 \emph{bitcoins} au lieu d'en devoir 100. Il doit donc changer la transaction le concernant en \ci{"Alfred +100"} mais il doit alors recalculer une nouvelle preuve de travail ce qui est compliqué, surtout il doit aussi recalculer la preuve de la transaction de Barnabé et aussi celle de la transaction de Chloé ! |
| 310 | + |
| 311 | +Quelqu'un qui veut modifier une transaction doit modifier toutes les preuves de travail suivantes. Si chaque preuve demande suffisamment de temps de calcul ceci est impossible. Pour le \emph{bitcoin} chaque preuve demande énormément de calculs (trop pour une personne seule) et une nouvelle preuve est à calculer toutes les 10 minutes. Il est donc impossible pour une personne de modifier une transaction passée. |
| 312 | + |
| 313 | +\end{activite} |
| 314 | + |
| 315 | + |
| 316 | +L'autre aspect du \emph{bitcoin} que nous n'avons pas abordé, c'est de s'assurer de l'identité de chaque personne impliquée, afin que personne ne puisse récupérer l'argent d'un autre. Ceci est rendu possible grâce à la cryptographie à clé privée/clé publique (système RSA). Chaque compte est identifié par une clé publique (deux très grands entiers), ce qui garantit l'anonymat. Mais surtout, seul celui qui possède la clé privée du compte (un grand entier) peut accéder à ses \emph{bitcoins}. |
| 317 | + |
| 318 | +\end{document} |
0 commit comments