You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: bitcoin/bitcoin.tex
+2-2Lines changed: 2 additions & 2 deletions
Original file line number
Diff line number
Diff line change
@@ -401,14 +401,14 @@
401
401
402
402
\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"}.
403
403
404
-
Programme une fonction \ci{ajout_transaction(transaction)} qui ajoute la chaine de caractère \ci{transaction} à la liste \ci{Livre}.
404
+
Programme une fonction \ci{ajout_transaction(transaction)} qui ajoute la chaîne de caractère \ci{transaction} à la liste \ci{Livre}.
405
405
Par exemple après l'initialisation \ci{ajout_transaction("Camille +100")},
Attention, pour pouvoir modifier \ci{Livre} il faut commencer la fonction par : \ci{global Livre}.
408
408
409
409
\end{enumerate}
410
410
411
-
\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.
411
+
\item Dès qu'une transaction est ajoutée, il faut calculer et ajouter au livre de compte une preuve de travail. Programme une fonction \ci{minage()}, sans paramètre, qui ajoute une preuve de travail au livre.
\objectifs{Objectifs : construire un mécanisme de preuve de travail à l'aide de notre fonction de hachage.}
194
-
195
-
\index{minage}
196
192
197
193
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
194
195
+
\bigskip
196
+
199
197
\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
198
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
199
\centerline{\ci{hachage(liste + preuve)} \ plus petit que \ \ci{Max}}
202
200
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
201
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 ?
202
+
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$.
203
+
204
+
\newpage
205
+
206
+
\textbf{Exemple.}
207
+
208
+
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
209
\begin{itemize}
207
210
\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
211
\ci{[0, 0, 5, 47, 44, 71]} qui commence par \ci{[0,0,5]} plus petit que l'objectif.
@@ -213,15 +216,20 @@ \section*{Hachage d'une liste}
213
216
\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
217
\end{itemize}
215
218
216
-
\begin{enumerate}
217
-
\item\textbf{Vérification (facile).}
219
+
220
+
\newpage
221
+
222
+
\textbf{Vérification (facile).}
218
223
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.
224
+
Programme une fonction \ci{verification_preuve_de_travail(liste,preuve)} qui renvoie vrai si la solution \ci{preuve} proposée convient pour \ci{liste}.
225
+
226
+
\bigskip
220
227
221
-
\item\textbf{Recherche de solution (difficile).}
228
+
\textbf{Recherche de solution (difficile).}
222
229
223
230
Programme une fonction \ci{preuve_de_travail(liste)} qui cherche un bloc \ci{preuve} solution à notre problème pour la liste donnée.
224
231
232
+
\bigskip
225
233
226
234
\emph{Indications.}
227
235
@@ -236,51 +244,61 @@ \section*{Hachage d'une liste}
236
244
237
245
\end{itemize}
238
246
239
-
\item\textbf{Temps de calcul.}
247
+
\newpage
248
+
249
+
\textbf{Temps de calcul.}
250
+
251
+
\begin{itemize}
252
+
\item Compare le temps de calcul d'une simple vérification par rapport au temps de recherche d'une solution.
240
253
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.
254
+
\item 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
255
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
256
+
\item Pour le \emph{bitcoin}, ceux qui calculent des preuves de travail sont appelés les \emph{mineurs}.
257
+
258
+
\item Le premier qui trouve une preuve gagne une récompense.
259
+
260
+
\item La difficulté du problème est ajustée de sorte
246
261
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.
\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
-
271
+
\section*{Tes \emph{bitcoins}}
259
272
260
273
\myfigure{0.5}{
261
274
\tikzinput{fig-bitcoin-3}
262
275
}
263
276
264
-
\begin{enumerate}
265
-
\item\textbf{Initialisation et ajout d'une transaction.}
277
+
\newpage
278
+
279
+
\textbf{Initialisation et ajout d'une transaction.}
266
280
267
281
\begin{enumerate}
268
-
\itemInitialise 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] ]} .
\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
285
272
-
Programme une fonction \ci{ajout_transaction(transaction)} qui ajoute la chaine de caractère \ci{transaction} à la liste \ci{Livre}.
286
+
Programme une fonction \ci{ajout_transaction(transaction)} qui ajoute la chaîne de caractère \ci{transaction} à la liste \ci{Livre}.
273
287
Par exemple après l'initialisation \ci{ajout_transaction("Camille +100")},
Attention, pour pouvoir modifier \ci{Livre} il faut commencer la fonction par : \ci{global Livre}.
276
289
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.
290
+
291
+
Attention, pour pouvoir modifier \ci{Livre} il faut commencer la fonction par : \ci{global Livre}.
292
+
293
+
\newpage
294
+
295
+
\textbf{Calcul et ajout d'une preuve de travail.}
296
+
297
+
Dès qu'une transaction est ajoutée, il faut calculer et ajouter au livre de compte une preuve de travail. Programme une fonction \ci{minage()}, sans paramètre, qui ajoute une preuve de travail au livre.
280
298
281
299
Voici comment faire :
282
300
\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.
301
+
\item On prend la dernière transaction \ci{transaction}, on la transforme en une liste d'entiers par une fonction \ci{phrase_vers_liste()} (on associe à un caractère sur ordre ASCII/unicode modulo $100$).
284
302
\item On prend la preuve de travail \ci{prec_preuve} située juste avant cette transaction.
285
303
\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
304
\item On calcule une preuve de travail de cette liste.
@@ -293,10 +311,22 @@ \section*{Hachage d'une liste}
293
311
On rappelle que la preuve de travail n'est pas unique et qu'en plus elle dépend
294
312
de l'objectif \ci{Max}.
295
313
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).
314
+
\newpage
315
+
316
+
\textbf{Vérification du livre de compte.}
317
+
318
+
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).
319
+
320
+
297
321
É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
322
299
-
\item Écris un livre de compte qui correspond aux données suivantes :
323
+
324
+
\bigskip
325
+
326
+
327
+
\textbf{Exemple.}
328
+
329
+
Écris un livre de compte qui correspond aux données suivantes :
300
330
\begin{itemize}
301
331
\item On prend \ci{Max = [0,0,5]} et au départ \ci{Livre = [ [0,0,0,0,0,0] ]}.
302
332
\item\ci{"Alfred -100"} (Alfred doit 100 \emph{bitcoins}).
@@ -306,13 +336,6 @@ \section*{Hachage d'une liste}
306
336
307
337
\end{enumerate}
308
338
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
339
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}.
Copy file name to clipboardExpand all lines: chercher/chercher.tex
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -29,7 +29,7 @@
29
29
30
30
La façon la plus simple de savoir si une sous-chaîne est présente dans une chaîne de caractères est d'utiliser l'opérateur \og{}\ci{in}\fg{}. Par exemple, l'expression :\\
31
31
\centerline{\ci{"PAS" in "ETRE OU NE PAS ETRE"}}
32
-
vaut \og{}vrai\fg{} car la sous-chaine\mot{PAS} est bien présente dans la phrase
32
+
vaut \og{}vrai\fg{} car la sous-chaîne\mot{PAS} est bien présente dans la phrase
33
33
\mot{ETRE OU NE PAS ETRE}.
34
34
35
35
Déduis-en une fonction \ci{chercher_in(chaine,sous_chaine)} qui renvoie \og{}vrai\fg{} ou \og{}faux\fg{}, selon que la sous-chaîne est (ou non) présente dans la chaîne.
0 commit comments