-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
for_use_ethereumbook_10tokenstxt_fr_CA.html
1825 lines (1778 loc) · 127 KB
/
for_use_ethereumbook_10tokenstxt_fr_CA.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.17">
<title>Jetons</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
<style>
/*! Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment the following line when using as a custom stylesheet */
/* @import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"; */
html{font-family:sans-serif;-webkit-text-size-adjust:100%}
a{background:none}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
b,strong{font-weight:bold}
abbr{font-size:.9em}
abbr[title]{cursor:help;border-bottom:1px dotted #dddddf;text-decoration:none}
dfn{font-style:italic}
hr{height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
audio,video{display:inline-block}
audio:not([controls]){display:none;height:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type=checkbox],input[type=radio]{padding:0}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,::before,::after{box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;line-height:1;position:relative;cursor:auto;-moz-tab-size:4;-o-tab-size:4;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:0}
p{line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0}
ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
ul.square{list-style-type:square}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:1px solid #dedede;word-wrap:normal}
table thead,table tfoot{background:#f7f8f7}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt{background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
:not(pre).nobreak{word-wrap:normal}
:not(pre).nowrap{white-space:nowrap}
:not(pre).pre-wrap{white-space:pre-wrap}
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
pre>code{display:block}
pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 .1em #fff;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menuref{color:#000}
.menuseq b:not(.caret),.menuref{font-weight:inherit}
.menuseq{word-spacing:-.02em}
.menuseq b.caret{font-size:1.25em;line-height:.8}
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
b.button::before{content:"[";padding:0 3px 0 2px}
b.button::after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin:0 auto;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
#content{margin-top:1.25em}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:flex;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span::before{content:"\00a0\2013\00a0"}
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark::before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber::after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border:1px solid #e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:hsla(0,0%,100%,.8);line-height:1.44}
#content{margin-bottom:.625em}
.sect1{padding-bottom:.625em}
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
.sect1{padding-bottom:1.25em}}
.sect1:last-child{padding-bottom:0}
.sect1+.sect1{border-top:1px solid #e7e7e9}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
details{margin-left:1.25rem}
details>summary{cursor:pointer;display:block;position:relative;line-height:1.6;margin-bottom:.625rem;outline:none;-webkit-tap-highlight-color:transparent}
details>summary::-webkit-details-marker{display:none}
details>summary::before{content:"";border:solid transparent;border-left:solid;border-width:.3em 0 .3em .5em;position:absolute;top:.5em;left:-1.25rem;transform:translateX(15%)}
details[open]>summary::before{border:solid transparent;border-top:solid;border-width:.5em .3em 0;transform:translateY(15%)}
details>summary::after{content:"";width:1.25rem;height:1em;position:absolute;top:.3em;left:-1.25rem}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class=paragraph]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border:1px solid #e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;border-radius:4px}
.exampleblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child{margin-bottom:0}
.sidebarblock{border:1px solid #dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;border-radius:4px}
.sidebarblock>:first-child{margin-top:0}
.sidebarblock>:last-child{margin-bottom:0}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock>.content>pre{border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class=highlight],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
.listingblock>.content{position:relative}
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
.listingblock:hover code[data-lang]::before{display:block}
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.prettyprint{background:#f7f7f8}
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
pre.prettyprint li code[data-lang]::before{opacity:1}
pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
table.linenotable td.code{padding-left:.75em}
table.linenotable td.linenos,pre.pygments .linenos{border-right:1px solid;opacity:.35;padding-right:.5em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
pre.pygments span.linenos{display:inline-block;margin-right:.75em}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
.verseblock{margin:0 1em 1.25em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans-serif;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;font-size:.85rem;text-align:left;margin-right:0}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>*>tr>*{border-width:1px}
table.grid-cols>*>tr>*{border-width:0 1px}
table.grid-rows>*>tr>*{border-width:1px 0}
table.frame-all{border-width:1px}
table.frame-ends{border-width:1px 0}
table.frame-sides{border-width:0 1px}
table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}
table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
table.stripes-all>*>tr,table.stripes-odd>*>tr:nth-of-type(odd),table.stripes-even>*>tr:nth-of-type(even),table.stripes-hover>*>tr:hover{background:#f8f8f7}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
ul.unstyled,ol.unstyled{margin-left:0}
li>p:empty:only-child::before{content:"";display:inline-block}
ul.checklist>li>p:first-child{margin-left:-1em}
ul.checklist>li>p:first-child>.fa-square-o:first-child,ul.checklist>li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
ul.checklist>li>p:first-child>input[type=checkbox]:first-child{margin-right:.25em}
ul.inline{display:flex;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
ul.inline>li{margin-left:1.25em}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
td.hdlist2{word-wrap:anywhere}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
.colist td:not([class]):first-child img{max-width:none}
.colist td:not([class]):last-child{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:4px solid #fff;box-shadow:0 0 0 1px #ddd}
.imageblock.left{margin:.25em .625em 1.25em 0}
.imageblock.right{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background:#00fafa}
.black{color:#000}
.black-background{background:#000}
.blue{color:#0000bf}
.blue-background{background:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background:#fa00fa}
.gray{color:#606060}
.gray-background{background:#7d7d7d}
.green{color:#006000}
.green-background{background:#007d00}
.lime{color:#00bf00}
.lime-background{background:#00fa00}
.maroon{color:#600000}
.maroon-background{background:#7d0000}
.navy{color:#000060}
.navy-background{background:#00007d}
.olive{color:#606000}
.olive-background{background:#7d7d00}
.purple{color:#600060}
.purple-background{background:#7d007d}
.red{color:#bf0000}
.red-background{background:#fa0000}
.silver{color:#909090}
.silver-background{background:#bcbcbc}
.teal{color:#006060}
.teal-background{background:#007d7d}
.white{color:#bfbfbf}
.white-background{background:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background:#fafa00}
span.icon>.fa{cursor:default}
a span.icon>.fa{cursor:inherit}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]::after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt,summary{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,span.alt,summary{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{box-shadow:none!important;text-shadow:none!important}
html{font-size:80%}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]{border-bottom:1px dotted}
abbr[title]::after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#header,#content,#footnotes,#footer{max-width:none}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span::before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]::before{display:block}
#footer{padding:0 .9375em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
@media amzn-kf8,print{#header>h1:first-child{margin-top:1.25rem}
.sect1{padding:0!important}
.sect1+.sect1{border:0}
#footer{background:none}
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
</style>
</head>
<body class="article">
<div id="header">
</div>
<div id="content">
<div class="sect1">
<h2 id="tokens_chapter">Jetons</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Le mot "token" (jeton) dérive du vieil anglais "tācen", signifiant un signe ou un symbole. Il est couramment utilisé pour désigner des objets de type pièce de monnaie à usage spécial émis par des particuliers et ayant une valeur intrinsèque insignifiante, tels que des token ou jetons de transport, des jetons de blanchisserie et des jetons de jeux d’arcade.</p>
</div>
<div class="paragraph">
<p>De nos jours, les "tokens" ou "jetons" (nous utiliserons le terme français "jeton" pour le restant du chapitre) administrés sur les chaînes de blocs redéfinissent le mot pour désigner des abstractions basées sur la chaîne de blocs qui peuvent être possédées et qui représentent des actifs, des devises ou des droits d’accès.</p>
</div>
<div class="paragraph">
<p>L’association entre le mot "jeton" et la valeur insignifiante a beaucoup à voir avec l’utilisation limitée des versions physiques des jetons. Souvent limités à des entreprises, des organisations ou des emplacements spécifiques, les jetons physiques ne sont pas facilement échangeables et n’ont généralement qu’une seule fonction. Avec les jetons de chaîne de blocs, ces restrictions sont levées ou, plus précisément, complètement redéfinissables. De nombreux jetons de chaîne de blocs ont plusieurs objectifs à l’échelle mondiale et peuvent être échangés les uns contre les autres ou contre d’autres devises sur les marchés liquides mondiaux. Avec la disparition des restrictions d’utilisation et de propriété, l’attente d’une "valeur insignifiante" appartient également au passé.</p>
</div>
<div class="paragraph">
<p>Dans ce chapitre, nous examinons les différentes utilisations des jetons et comment ils sont créés. Nous discutons également des attributs des jetons tels que la fongibilité et l’intrinsèque. Enfin, nous examinons les normes et les technologies sur lesquelles ils sont basés et expérimentons en créant nos propres jetons.</p>
</div>
<div class="sect2">
<h3 id="tokens_use">Comment les jetons sont utilisés</h3>
<div class="paragraph">
<p>L’utilisation la plus évidente des jetons est celle des monnaies privées numériques. Cependant, ce n’est qu’une utilisation possible. Les jetons peuvent être programmés pour remplir de nombreuses fonctions différentes, qui se chevauchent souvent. Par exemple, un jeton peut simultanément transmettre un droit de vote, un droit d’accès et la propriété d’une ressource. Comme le montre la liste suivante, la devise n’est que la première "application" :</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Monnaie</dt>
<dd>
<p>Un jeton peut servir de forme de monnaie, avec une valeur déterminée par le commerce privé.</p>
</dd>
<dt class="hdlist1">Ressource</dt>
<dd>
<p>Un jeton peut représenter une ressource gagnée ou produite dans une économie de partage ou un environnement de partage de ressources ; par exemple, un jeton de stockage ou de processeur représentant des ressources qui peuvent être partagées sur un réseau.</p>
</dd>
<dt class="hdlist1">Actif</dt>
<dd>
<p>un jeton peut représenter la propriété d’un actif intrinsèque ou extrinsèque, tangible ou intangible ; par exemple, de l’or, de l’immobilier, une voiture, du pétrole, de l’énergie, des objets MMOG, etc.</p>
</dd>
<dt class="hdlist1">Accès</dt>
<dd>
<p>un jeton peut représenter des droits d’accès et accorder l’accès à une propriété numérique ou physique, telle qu’un forum de discussion, un site Web exclusif, une chambre d’hôtel ou une voiture de location.</p>
</dd>
<dt class="hdlist1">Équité</dt>
<dd>
<p>Un jeton peut représenter l’équité des actionnaires dans une organisation numérique (par exemple, un DAO) ou une entité juridique (par exemple, une société).</p>
</dd>
<dt class="hdlist1">Vote</dt>
<dd>
<p>Un jeton peut représenter des droits de vote dans un système numérique ou juridique.</p>
</dd>
<dt class="hdlist1">Objet de collection</dt>
<dd>
<p>Un jeton peut représenter un objet de collection numérique (par exemple, CryptoPunks) ou un objet de collection physique (par exemple, une peinture).</p>
</dd>
<dt class="hdlist1">Identité</dt>
<dd>
<p>Un jeton peut représenter une identité numérique (par exemple, un avatar) ou une identité légale (par exemple, une carte d’identité nationale).</p>
</dd>
<dt class="hdlist1">Attestation</dt>
<dd>
<p>Un jeton peut représenter une certification ou une attestation de fait par une autorité ou par un système de réputation décentralisé (par exemple, acte de mariage, certificat de naissance, diplôme universitaire).</p>
</dd>
<dt class="hdlist1">Utilitaire</dt>
<dd>
<p>Un jeton peut être utilisé pour accéder ou payer un service.</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>Souvent, un seul jeton englobe plusieurs de ces fonctions. Parfois, il est difficile de les distinguer, car les équivalents physiques ont toujours été inextricablement liés. Par exemple, dans le monde physique, un permis de conduire (attestation) est aussi un document d’identité (identité) et les deux ne peuvent pas être séparés. Dans le domaine numérique, les fonctions précédemment mélangées peuvent être séparées et développées indépendamment (par exemple, une attestation anonyme).</p>
</div>
</div>
<div class="sect2">
<h3 id="tokens_fungibility">Jetons et fongibilité</h3>
<div class="paragraph">
<p><a href="https://en.wikipedia.org/wiki/Fungibility">Wikipedia</a> dit : " En économie, la fongibilité est la propriété d’un bien ou d’une marchandise dont les unités individuelles sont essentiellement interchangeables."</p>
</div>
<div class="paragraph">
<p>Les jetons sont fongibles lorsque nous pouvons remplacer n’importe quelle unité du jeton par une autre sans aucune différence dans sa valeur ou sa fonction.</p>
</div>
<div class="paragraph">
<p>À proprement parler, si la provenance historique d’un jeton peut être suivie, il n’est pas entièrement fongible. La possibilité de suivre la provenance peut conduire à la mise sur liste noire et à la liste blanche, réduisant ou éliminant la fongibilité.</p>
</div>
<div class="paragraph">
<p>Les jetons non fongibles sont des jetons qui représentent chacun un élément tangible ou intangible unique et ne sont donc pas interchangeables. Par exemple, un jeton qui représente la propriété d’un tableau <em>spécifique</em> de Van Gogh n’est pas équivalent à un autre jeton qui représente un Picasso, même s’ils peuvent faire partie du même système de "jeton de propriété d’art". De même, un jeton représentant un objet de collection numérique <em>spécifique</em> tel qu’un CryptoKitty spécifique n’est pas interchangeable avec un autre CryptoKitty. Chaque jeton non fongible est associé à un identifiant unique, tel qu’un numéro de série.</p>
</div>
<div class="paragraph">
<p>Nous verrons des exemples de jetons fongibles et non fongibles plus loin dans ce chapitre.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
<div class="paragraph">
<p>Notez que "fongible" est souvent utilisé pour signifier "directement échangeable contre de l’argent" (par exemple, un jeton de casino peut être "encaissé", contrairement aux jetons de blanchisserie). Ce n’est <em>pas</em> le sens dans lequel nous utilisons le mot ici.</p>
</div>
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="counterparty_risk">Risque de contrepartie</h3>
<div class="paragraph">
<p>Le risque de contrepartie est le risque que l'<em>autre</em> partie à une transaction ne respecte pas ses obligations. Certains types de transactions présentent un risque de contrepartie supplémentaire car il y a plus de deux parties impliquées. Par exemple, si vous détenez un certificat de dépôt pour un métal précieux et que vous le vendez à quelqu’un, il y a au moins trois parties dans cette transaction : le vendeur, l’acheteur et le dépositaire du métal précieux. Quelqu’un détient l’actif physique ; par nécessité, ils deviennent partie à l’exécution de la transaction et ajoutent un risque de contrepartie à toute transaction impliquant cet actif. En général, lorsqu’un actif est négocié indirectement via l’échange d’un jeton de propriété, il existe un risque de contrepartie supplémentaire de la part du dépositaire de l’actif. En ont-ils l’atout ? Reconnaîtront-ils (ou autoriseront-ils) le transfert de propriété basé sur le transfert d’un jeton (tel qu’un certificat, un acte, un titre ou un jeton numérique) ? Dans le monde des jetons numériques représentant des actifs, comme dans le monde non numérique, il est important de comprendre qui détient l’actif représenté par le jeton et quelles règles s’appliquent à cet actif sous-jacent.</p>
</div>
</div>
<div class="sect2">
<h3 id="tokens_intrinsicality">Tokens et Intrinsicité</h3>
<div class="paragraph">
<p>Le mot "intrinsèque" dérive du latin "intra", qui signifie "de l’intérieur".</p>
</div>
<div class="paragraph">
<p>Certains jetons représentent des éléments numériques intrinsèques à la chaîne de blocs. Ces actifs numériques sont régis par des règles consensuelles, tout comme les jetons eux-mêmes. Cela a une implication importante : les jetons qui représentent des actifs intrinsèques ne comportent pas de risque de contrepartie supplémentaire. Si vous détenez les clés d’un CryptoKitty, aucune autre partie ne détient ce CryptoKitty pour vous - vous le possédez directement. Les règles de consensus de la chaîne de blocs s’appliquent et votre propriété (c’est-à-dire votre contrôle) des clés privées équivaut à la propriété de l’actif, sans aucun intermédiaire.</p>
</div>
<div class="paragraph">
<p>À l’inverse, de nombreux jetons sont utilisés pour représenter des choses <em>extrinsèques</em>, telles que l’immobilier, les actions avec droit de vote des entreprises, les marques et les lingots d’or. La propriété de ces éléments, qui ne sont pas "dans" la chaîne de blocs, est régie par la loi, la coutume et la politique, distinctes des règles consensuelles qui régissent le jeton. En d’autres termes, les émetteurs et propriétaires de jetons peuvent toujours dépendre de contrats réels non intelligents. En conséquence, ces actifs extrinsèques comportent un risque de contrepartie supplémentaire car ils sont détenus par des dépositaires, enregistrés dans des registres externes ou contrôlés par des lois et des politiques en dehors de l’environnement de la chaîne de blocs.</p>
</div>
<div class="paragraph">
<p>L’une des ramifications les plus importantes des jetons basés sur la chaîne de blocs est la capacité de convertir des actifs extrinsèques en actifs intrinsèques et ainsi de supprimer le risque de contrepartie. Un bon exemple est le passage de l’équité dans une société (extrinsèque) à une équité ou à un jeton de vote dans un <em>DAO</em> ou une organisation similaire (intrinsèque).</p>
</div>
</div>
<div class="sect2">
<h3 id="using_tokens">Utilisation de jetons : utilité ou équité</h3>
<div class="paragraph">
<p>Presque tous les projets d’Ethereum sont lancés aujourd’hui avec une sorte de jeton. Mais est-ce que tous ces projets ont vraiment besoin de jetons ? Y a-t-il des inconvénients à utiliser un jeton, ou verrons-nous le slogan "tokéniser toutes les choses" se concrétiser ? En principe, l’utilisation de jetons peut être considérée comme l’ultime outil de gestion ou d’organisation. Dans la pratique, l’intégration des plateformes de chaîne de blocs, y compris Ethereum, dans les structures existantes de la société signifie que, jusqu’à présent, il existe de nombreuses limites à leur applicabilité.</p>
</div>
<div class="paragraph">
<p>Commençons par clarifier le rôle d’un jeton dans un nouveau projet. La majorité des projets utilisent des jetons de deux manières : soit en tant que « jetons utilitaires », soit en tant que « jetons d’équité ». Très souvent, ces deux rôles sont confondus.</p>
</div>
<div class="paragraph">
<p>Les jetons utilitaires sont ceux où l’utilisation du jeton est nécessaire pour accéder à un service, une application ou une ressource. Des exemples de jetons utilitaires incluent des jetons qui représentent des ressources telles que le stockage partagé ou l’accès à des services tels que les réseaux de médias sociaux.</p>
</div>
<div class="paragraph">
<p>Les jetons d’équité sont ceux qui représentent des parts dans le contrôle ou la propriété de quelque chose, comme une startup. Les jetons d’équité peuvent être aussi limités que les actions sans droit de vote pour la distribution des dividendes et des bénéfices, ou aussi expansifs que les actions avec droit de vote dans une organisation autonome décentralisée, où la gestion de la plate-forme se fait par un système de gouvernance complexe basé sur les votes des détenteurs de jetons.</p>
</div>
<div class="sect3">
<h4 id="its_not_duck">C’est un canard !</h4>
<div class="paragraph">
<p>De nombreuses startups sont confrontées à un problème difficile : les jetons sont un excellent mécanisme de collecte de fonds, mais offrir des titres (actions) au public est une activité réglementée dans la plupart des juridictions. En déguisant les jetons d’équité en jetons utilitaires, de nombreuses startups espèrent contourner ces restrictions réglementaires et lever des fonds à partir d’une offre publique tout en la présentant comme une prévente de "bons d’accès au service" ou, comme nous les appelons, de jetons utilitaires. Reste à savoir si ces offres d’actions à peine déguisées pourront contourner les régulateurs.</p>
</div>
<div class="paragraph">
<p>Comme le dit le dicton populaire : "Si ça marche comme un canard et cancane comme un canard, c’est un canard." Les régulateurs ne risquent pas d’être distraits par ces contorsions sémantiques ; bien au contraire, ils sont plus susceptibles de considérer ce sophisme juridique comme une tentative de tromper le public.</p>
</div>
</div>
<div class="sect3">
<h4 id="who_needs_utility_tokens">Jetons utilitaires : qui en a besoin ?</h4>
<div class="paragraph">
<p>Le vrai problème est que les jetons utilitaires introduisent des risques importants et des obstacles à l’adoption pour les startups. Peut-être que dans un avenir lointain, "tokéniser toutes les choses" deviendra réalité, mais à l’heure actuelle, l’ensemble des personnes qui comprennent et souhaitent utiliser un jeton est un sous-ensemble du marché déjà petit de la crypto-monnaie.</p>
</div>
<div class="paragraph">
<p>Pour une startup, chaque innovation représente un risque et un filtre de marché. L’innovation, c’est emprunter le chemin le moins fréquenté, s’éloigner du chemin de la tradition. C’est déjà une promenade solitaire. Si une startup essaie d’innover dans un nouveau domaine technologique, tel que le partage de stockage sur des réseaux P2P, c’est une voie assez solitaire. L’ajout d’un jeton utilitaire à cette innovation et l’obligation pour les utilisateurs d’adopter des jetons afin d’utiliser le service aggravent le risque et augmentent les obstacles à l’adoption. C’est sortir de la piste déjà solitaire de l’innovation de stockage P2P et dans le désert.</p>
</div>
<div class="paragraph">
<p>Considérez chaque innovation comme un filtre. Cela limite l’adoption au sous-ensemble du marché qui peut devenir les premiers à adopter cette innovation. L’ajout d’un deuxième filtre aggrave cet effet, limitant davantage le marché adressable. Vous demandez à vos premiers utilisateurs d’adopter non pas une mais deux technologies entièrement nouvelles : la nouvelle application/plate-forme/service que vous avez créée et l’économie des jetons.</p>
</div>
<div class="paragraph">
<p>Pour une startup, chaque innovation introduit des risques qui augmentent les chances d’échec de la startup. Si vous prenez votre idée de démarrage déjà risquée et ajoutez un jeton utilitaire, vous ajoutez tous les risques de la plate-forme sous-jacente (Ethereum), de l’économie plus large (échanges, liquidité), de l’environnement réglementaire (régulateurs des actions/matières premières) et de la technologie (contrats intelligents , normes symboliques). C’est beaucoup de risques pour une startup.</p>
</div>
<div class="paragraph">
<p>Les partisans de la "tokénisation de toutes les choses" rétorqueront probablement qu’en adoptant des jetons, ils héritent également de l’enthousiasme du marché, des premiers utilisateurs, de la technologie, de l’innovation et de la liquidité de l’ensemble de l’économie des jetons. C’est vrai aussi. La question est de savoir si les avantages et l’enthousiasme l’emportent sur les risques et les incertitudes.</p>
</div>
<div class="paragraph">
<p>Néanmoins, certaines des idées commerciales les plus innovantes se déroulent effectivement dans le domaine de la cryptographie. Si les régulateurs ne sont pas assez rapides pour adopter des lois et soutenir de nouveaux modèles commerciaux, les entrepreneurs et les talents associés chercheront à opérer dans d’autres juridictions plus favorables à la cryptographie. Cela se produit déjà.</p>
</div>
<div class="paragraph">
<p>Enfin, au début de ce chapitre, lors de l’introduction des jetons, nous avons discuté de la signification familière du « jeton » comme « quelque chose de valeur insignifiante ». La raison sous-jacente de la valeur insignifiante de la plupart des jetons est qu’ils ne peuvent être utilisés que dans un contexte très étroit : une compagnie d’autobus, une buanderie automatique, une arcade, un hôtel ou un magasin d’entreprise. Une liquidité limitée, une applicabilité limitée et des coûts de conversion élevés réduisent la valeur des jetons jusqu’à ce qu’ils n’aient plus qu’une valeur « symbolique ». Ainsi, lorsque vous ajoutez un jeton utilitaire à votre plateforme, mais que le jeton ne peut être utilisé que sur votre seule plateforme avec un petit marché, vous recréez les conditions qui ont rendu les jetons physiques sans valeur. Cela peut en effet être la bonne façon d’intégrer la tokenisation dans votre projet. Cependant, si pour utiliser votre plate-forme, un utilisateur doit convertir quelque chose en votre jeton utilitaire, l’utiliser, puis reconvertir le reste en quelque chose de plus généralement utile, vous avez créé un certificat d’entreprise. Les coûts de commutation d’un jeton numérique sont des ordres de grandeur inférieurs à ceux d’un jeton physique sans marché, mais ils ne sont pas nuls. Les jetons utilitaires qui fonctionnent dans tout un secteur industriel seront très intéressants et probablement très précieux. Mais si vous configurez votre startup pour qu’elle doive amorcer une norme industrielle entière pour réussir, vous avez peut-être déjà échoué.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
<div class="paragraph">
<p>L’un des avantages du déploiement de services sur des plates-formes à usage général comme Ethereum est de pouvoir connecter des contrats intelligents (et donc l’utilité des jetons) à travers les projets, augmentant ainsi le potentiel de liquidité et l’utilité des jetons.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Prenez cette décision pour les bonnes raisons. Adoptez un jeton car votre application <em>ne peut pas fonctionner sans jeton</em>. Adoptez-le car le jeton lève une barrière fondamentale du marché ou résout un problème d’accès. N’introduisez pas de jeton utilitaire car c’est le seul moyen de collecter des fonds rapidement et vous devez prétendre qu’il ne s’agit pas d’une offre publique de titres .</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="token_std">Jetons sur Ethereum</h3>
<div class="paragraph">
<p>Les jetons de chaîne de blocs existaient avant Ethereum. D’une certaine manière, la première monnaie chaîne de blocs, Bitcoin, est un jeton lui-même. De nombreuses plateformes de jetons ont également été développées sur Bitcoin et d’autres crypto-monnaies avant Ethereum. Cependant, l’introduction de la première norme de jeton sur Ethereum a conduit à une explosion de jetons.</p>
</div>
<div class="paragraph">
<p>Vitalik Buterin a suggéré les jetons comme l’une des applications les plus évidentes et les plus utiles d’une chaîne de blocs programmable généralisée telle qu’Ethereum. En fait, au cours de la première année d’Ethereum, il était courant de voir Vitalik et d’autres porter des T-shirts arborant le logo Ethereum et un échantillon de contrat intelligent au dos. Il y avait plusieurs variantes de ce T-shirt, mais la plus courante montrait une implémentation d’un jeton.</p>
</div>
<div class="paragraph">
<p>Avant de nous plonger dans les détails de la création de jetons sur Ethereum, il est important d’avoir un aperçu du fonctionnement des jetons sur Ethereum. Les jetons sont différents de l’ether car le protocole Ethereum ne sait rien d’eux. L’envoi d’ether est une action intrinsèque de la plateforme Ethereum, mais l’envoi ou même la possession de jetons ne l’est pas. Le solde d’ether des comptes Ethereum est géré au niveau du protocole, tandis que le solde de jetons des comptes Ethereum est géré au niveau du contrat intelligent. Afin de créer un nouveau jeton sur Ethereum, vous devez créer un nouveau contrat intelligent. Une fois déployé, le contrat intelligent gère tout, y compris la propriété, les transferts et les droits d’accès. Vous pouvez rédiger votre contrat intelligent pour effectuer toutes les actions nécessaires comme vous le souhaitez, mais il est probablement plus sage de suivre une norme existante. Nous examinerons ensuite ces normes. Nous discutons des avantages et des inconvénients des normes suivantes à la fin du chapitre.</p>
</div>
<div class="sect3">
<h4 id="ERC20_std">La norme de jeton ERC20</h4>
<div class="paragraph">
<p>La première norme a été introduite en novembre 2015 par Fabian Vogelsteller en tant que demande de commentaires Ethereum (ERC). Il s’est automatiquement vu attribuer le numéro de problème GitHub 20, donnant lieu au nom de "jeton ERC20". La grande majorité des jetons sont actuellement basés sur la norme ERC20. La demande de commentaires ERC20 est finalement devenue la proposition d’amélioration Ethereum 20 (EIP-20), mais elle est encore principalement désignée par le nom d’origine, ERC20.</p>
</div>
<div class="paragraph">
<p>ERC20 est une norme pour les <em>jetons fongibles</em>, ce qui signifie que différentes unités d’un token ERC20 sont interchangeables et n’ont pas de propriétés uniques.</p>
</div>
<div class="paragraph">
<p><a href="http://bit.ly/2CUf7WG">La norme ERC20</a> définit une interface commune pour les contrats mettant en œuvre un jeton, de sorte que tout jeton compatible est accessible et utilisable de la même manière. L’interface se compose d’un certain nombre de fonctions qui doivent être présentes dans chaque implémentation de la norme, ainsi que de certaines fonctions et attributs facultatifs qui peuvent être ajoutés par les développeurs.</p>
</div>
<div class="sect4">
<h5 id="ERC20_reqd_func">Fonctions et événements requis par ERC20</h5>
<div class="paragraph">
<p>Un contrat de jeton conforme à ERC20 doit fournir au moins les fonctions et événements suivants :</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">totalSupply</dt>
<dd>
<p>Renvoie le nombre total d’unités de ce jeton qui existent actuellement. Les jetons ERC20 peuvent avoir une offre fixe ou variable.</p>
</dd>
<dt class="hdlist1">balanceOf</dt>
<dd>
<p>Étant donné une adresse, renvoie le solde du jeton de cette adresse.</p>
</dd>
<dt class="hdlist1">transfer</dt>
<dd>
<p>Étant donné une adresse et un montant, transfère ce montant de jetons à cette adresse, à partir du solde de l’adresse qui a exécuté le transfert.</p>
</dd>
<dt class="hdlist1">transferFrom</dt>
<dd>
<p>Étant donné un expéditeur, un destinataire et un montant, transfère des jetons d’un compte à un autre. Utilisé en combinaison avec approve.</p>
</dd>
<dt class="hdlist1">approve</dt>
<dd>
<p>Étant donné une adresse et un montant de destinataire, autorise cette adresse à exécuter plusieurs virements jusqu’à ce montant, à partir du compte qui a émis l’approbation.</p>
</dd>
<dt class="hdlist1">allowance</dt>
<dd>
<p>Étant donné une adresse de propriétaire et une adresse de dépensier, renvoie le montant restant que le dépensier est autorisé à retirer au propriétaire.</p>
</dd>
<dt class="hdlist1">Transfer</dt>
<dd>
<p>Evénement déclenché lors d’un transfert réussi (appel à transfer ou <code>transferFrom</code>)(même pour les transferts de valeur nulle).</p>
</dd>
<dt class="hdlist1">Approval</dt>
<dd>
<p>Événement enregistré lors d’un appel réussi à approve.</p>
</dd>
</dl>
</div>
</div>
<div class="sect4">
<h5 id="ERC20_optional_func">Fonctions optionnelles ERC20</h5>
<div class="paragraph">
<p>En plus des fonctions requises listées dans la section précédente, les fonctions optionnelles suivantes sont également définies par la norme :</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">name</dt>
<dd>
<p>Renvoie le nom lisible par l’homme (par exemple, "US Dollars") du jeton.</p>
</dd>
<dt class="hdlist1">symbol</dt>
<dd>
<p>Renvoie un symbole lisible par l’homme (par exemple, "USD") pour le jeton.</p>
</dd>
<dt class="hdlist1">decimals</dt>
<dd>
<p>Renvoie le nombre de décimales utilisées pour diviser les quantités de jetons. Par exemple, si decimals vaut <code>2</code>, alors le montant du jeton est divisé par 100 pour obtenir sa <span class="keep-together">représentation</span> d’usage.</p>
</dd>
</dl>
</div>
</div>
<div class="sect4">
<h5 id="ERC20_interface">L’interface ERC20 définie dans Solidity</h5>
<div class="paragraph">
<p>Voici à quoi ressemble une spécification d’interface ERC20 dans Solidity :</p>
</div>
<div id="ERC20_interface_example" class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-solidity" data-lang="solidity">contract ERC20 {
function totalSupply() constant returns (uint theTotalSupply);
function balanceOf(address _owner) constant returns (uint balance);
function transfer(address _to, uint _value) returns (bool success);
function transferFrom(address _from, address _to, uint _value) returns
(bool success);
function approve(address _spender, uint _value) returns (bool success);
function allowance(address _owner, address _spender) constant returns
(uint remaining);
event Transfer(address indexed _from, address indexed _to, uint _value);
event Approval(address indexed _owner, address indexed _spender, uint _value);
}</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="ERC20_data_struct">Structures de données ERC20</h5>
<div class="paragraph">
<p>Si vous examinez une implémentation ERC20, vous verrez qu’elle contient deux structures de données, une pour suivre les soldes et une pour suivre indemnités. Dans Solidity, ils sont implémentés avec un <em>data mapping</em> ou <em>mappage de données</em>.</p>
</div>
<div class="paragraph">
<p>Le premier mappage de données implémente une table interne des soldes de jetons, par propriétaire. Cela permet au contrat de jeton de garder une trace de qui possède les jetons. Chaque transfert est une déduction d’un solde et un ajout à un autre solde :</p>
</div>
<div id="balance_mapping" class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-solidity" data-lang="solidity">mapping(address => uint256) balances;</code></pre>
</div>
</div>
<div class="paragraph">
<p>La deuxième structure de données est un mappage de données d’allocations. Comme nous le verrons dans la section suivante, avec les jetons ERC20, le propriétaire d’un jeton peut déléguer l’autorité à un dépensier, lui permettant de dépenser un montant spécifique (allocation) à partir du solde du propriétaire. Le contrat ERC20 assure le suivi des allocations avec un mappage bidimensionnel, la clé primaire étant l’adresse du propriétaire du jeton, mappée à une adresse de dépense et un montant d’allocation :</p>
</div>
<div id="allowance_mapping" class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-solidity" data-lang="solidity">mapping (address => mapping (address => uint256)) public allowed;</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="transfer_workflows">Flux de travail ERC20 : "transfer" et "approve et transferFrom"</h5>
<div class="paragraph">
<p>La norme de jeton ERC20 a deux fonctions de transfert. Vous vous demandez peut-être pourquoi.</p>
</div>
<div class="paragraph">
<p>ERC20 permet deux flux de travail différents. Le premier est un flux de travail simple et à transaction unique utilisant la fonction <code>transfer</code>. Ce flux de travail est celui utilisé par les portefeuilles pour envoyer des jetons à d’autres portefeuilles. La grande majorité des transactions de jetons se produisent avec le flux de travail transfer.</p>
</div>
<div class="paragraph">
<p>L’exécution du contrat de transfert est très simple. Si Alice veut envoyer 10 jetons à Bob, son portefeuille envoie une transaction à l’adresse du contrat de jeton, en appelant la fonction <span class="keep-together"><code>transfer</code></span> avec l’adresse de Bob et 10 comme arguments. Le contrat de jeton ajuste le solde d’Alice (–10) et le solde de Bob (+10) et émet un événement Transfer.</p>
</div>
<div class="paragraph">
<p>Le deuxième flux de travail est un processus à deux transactions qui utilise approve suivi de <code>transferFrom</code>. Ce workflow permet à un propriétaire de jeton de déléguer son contrôle à une autre adresse. Il est le plus souvent utilisé pour déléguer le contrôle à un contrat de distribution de jetons, mais il peut également être utilisé par les échanges.</p>
</div>
<div class="paragraph">
<p>Par exemple, si une entreprise vend des tokens pour une ICO (Initial Coin Offerings ou "offres initiales de pièces"), elle peut approve (approuver) une adresse de contrat de crowdsale pour distribuer une certaine quantité de jetons. Le contrat de crowdsale peut alors transferFrom le solde du propriétaire du contrat de jeton à chaque acheteur du jeton, comme illustré dans <a href="#approve_transferFrom_workflow">Le flux de travail d’approbation et de transfert en deux étapes des jetons ERC20</a>.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
<div class="paragraph">
<p>("Initial Coin Offerings (ICOs)","défini"Une <em>Initial Coin Offering</em> (ICO) ou <em>Offres initiales de pièces</em> est un mécanisme de financement participatif utilisé par les entreprises et les organisations pour collecter des fonds en vendant des jetons. Le terme est dérivé de l’offre publique initiale (IPO), qui est le processus par lequel une société publique propose des actions à vendre aux investisseurs en bourse. Contrairement aux marchés des introductions en bourse hautement réglementés, les ICO sont ouverts, mondiaux et désordonnés. Les exemples et les explications des ICO dans ce livre ne constituent pas une approbation de ce type de collecte de fonds.</p>
</div>
</td>
</tr>
</table>
</div>
<div id="approve_transferFrom_workflow" class="imageblock">
<div class="content">
<img src="images/approve_transferFrom_workflow.png" alt="Le flux de travail d’approbation et de transfert en deux étapes des jetons ERC20">
</div>
<div class="title">Figure 1. Le flux de travail d’approbation et de transfert en deux étapes des jetons ERC20</div>
</div>
<div class="paragraph">
<p>Pour le flux de travail approve et <code>transferFrom</code>, deux transactions sont nécessaires. Disons qu’Alice veut autoriser le contrat AliceICO à vendre 50 % de tous les jetons AliceCoin à des acheteurs comme Bob et Charlie. Tout d’abord, Alice lance le contrat AliceCoin ERC20, émettant tous les AliceCoin à sa propre adresse. Ensuite, Alice lance le contrat AliceICO qui peut vendre des jetons contre de l’ether. Ensuite, Alice lance le flux de travail approve et <code>transferFrom</code>. Elle envoie une transaction au contrat <code>AliceCoin</code>, en appelant approve avec l’adresse du contrat AliceICO et 50 % du totalSupply comme arguments. Cela déclenchera l’événement <code>Approbation</code>. Désormais, le contrat AliceICO peut vendre AliceCoin.</p>
</div>
<div class="paragraph">
<p>Lorsque le contrat AliceICO reçoit de l’ether de Bob, il doit envoyer des AliceCoin à Bob en retour. Dans le contrat AliceICO se trouve un taux de change entre AliceCoin et de l’Ether. Le taux de change qu’Alice a fixé lors de la création du contrat AliceICO détermine le nombre de jetons que Bob recevra pour la quantité d’ether envoyé au contrat <code>AliceICO</code>. Lorsque le contrat AliceICO appelle la fonction AliceCoin <code>transferFrom</code>, il définit l’adresse d’Alice comme expéditeur et l’adresse de Bob comme destinataire, et utilise le taux de change pour déterminer le nombre de jetons AliceCoin qui seront transférés à Bob dans le champ <code>value</code>. Le contrat AliceCoin transfère le solde de l’adresse d’Alice à l’adresse de Bob et déclenche un événement <code>Transfer</code>. Le contrat AliceICO peut appeler transferFrom un nombre illimité de fois, tant qu’il ne dépasse pas la limite d’approbation définie par Alice. Le contrat AliceICO peut suivre le nombre de jetons AliceCoin qu’il peut vendre en appelant la fonction allowance.</p>
</div>
</div>
<div class="sect4">
<h5 id="ERC20_implémentation">Implémentations ERC20</h5>
<div class="paragraph">
<p>Bien qu’il soit possible d’implémenter un jeton compatible ERC20 dans environ 30 lignes de code Solidity, la plupart des implémentations sont plus complexes. Ceci pour tenir compte des vulnérabilités de sécurité potentielles. Deux implémentations sont mentionnées dans la norme EIP-20 :</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1"><a href="http://bit.ly/2EUYCMR">Consensys EIP20</a></dt>
<dd>
<p>Une implémentation simple et facile à lire d’un jeton compatible ERC20.</p>
</dd>
<dt class="hdlist1"><a href="https://bit.ly/2xPYck6">OpenZeppelin StandardToken</a></dt>
<dd>
<p>Cette implémentation est compatible ERC20, avec des précautions de sécurité supplémentaires. Il constitue la base des bibliothèques OpenZeppelin implémentant des jetons compatibles ERC20 plus complexes avec des plafonds de collecte de fonds, des enchères, des calendriers d’acquisition et d’autres fonctionnalités.</p>
</dd>
</dl>
</div>
</div>
</div>
<div class="sect3">
<h4 id="METoken_example">Lancement de notre propre jeton ERC20</h4>
<div class="paragraph">
<p> Créons et lançons notre propre jeton. Pour cet exemple, nous utiliserons le cadre de développement (framework) Truffle. L’exemple suppose que vous avez déjà installé truffle et que vous l’avez configuré, et que vous êtes familiarisé avec son fonctionnement de base (pour plus de détails, voir <a href="#truffle">[truffle]</a>).</p>
</div>
<div class="paragraph">
<p>Nous appellerons notre jeton "Mastering Ethereum Token", avec le symbole "MET".</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
<div class="paragraph">
<p>Vous pouvez trouver cet exemple <a href="https://github.com/ethereumbook/ethereumbook/blob/develop/code/truffle/METoken">dans le référentiel GitHub du livre</a>.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Commençons par créer et initialiser un répertoire de projet Truffle. Exécutez ces quatre commandes et acceptez les réponses par défaut à toutes les questions :</p>
</div>
<pre data-type="programlist">
$ <strong>mkdir METoken</strong>
$ <strong>cd METoken</strong>
METoken $ <strong>truffle init</strong>
METoken $ <strong>npm init</strong>
</pre>
<div class="paragraph">
<p>Vous devriez maintenant avoir la structure de répertoires suivante :</p>
</div>
<div id="truffle_directory" class="listingblock">
<div class="content">
<pre>METoken/
+---- contracts
| `---- Migrations.sol
+---- migrations
| `---- 1_initial_migration.js
+---- package.json
+---- test
+---- truffle-config.js
`---- truffle.js</pre>
</div>
</div>
<div class="paragraph">
<p>Modifiez le fichier de configuration <em>truffle.js</em> ou <em>truffle-config.js</em> pour configurer votre environnement Truffle, ou copiez ce dernier depuis <a href="http://bit.ly/2DdP2mz">le référentiel</a>.</p>
</div>
<div class="paragraph">
<p>Si vous utilisez l’exemple <em>truffle-config.js</em>, pensez à créer un fichier <em>.env</em> dans le dossier <em>METoken</em> contenant vos clés privées de test pour le test et le déploiement sur les réseaux publics de test Ethereum, tels que Ropsten ou Kovan. Vous pouvez exporter votre clé privée de réseau de test à partir de MetaMask.</p>
</div>
<div class="paragraph">
<p>Après cela, votre répertoire devrait ressembler à :</p>
</div>
<div id="truffle_directory_metoken" class="listingblock">
<div class="content">
<pre>METoken/
+---- contracts
| `---- Migrations.sol
+---- migrations
| `---- 1_initial_migration.js
+---- package.json
+---- test
+---- truffle-config.js
+---- truffle.js
`---- .env *new file*</pre>
</div>
</div>
<div class="admonitionblock warning">
<table>
<tr>
<td class="icon">
<div class="title">Warning</div>
</td>
<td class="content">
<div class="paragraph">
<p>N’utilisez que des clés de test ou des mnémoniques de test qui ne sont <em>pas</em> utilisés pour détenir des fonds sur le réseau Ethereum principal. <em>Ne jamais</em> utiliser des clés contenant de l’argent réel pour les tests.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Pour notre exemple, nous allons importer la bibliothèque OpenZeppelin, qui implémente des contrôles de sécurité importants et est facile à étendre :</p>
</div>
<pre data-type="programlist">
$ <strong>npm install [email protected]</strong>
added 1 package from 1 contributor and audited 2381 packages in 4.074s
</pre>
<div class="paragraph">
<p>Le module de dévelopement openzeppelin-solidity ajoutera environ 250 fichiers sous le répertoire <em>node_modules</em>. La bibliothèque OpenZeppelin comprend bien plus que le jeton ERC20, mais nous n’en utiliserons qu’une petite partie.</p>
</div>
<div class="paragraph">
<p>Ensuite, écrivons notre contrat de jeton. Créez un nouveau fichier, <em>METoken.sol</em>, et copiez l’exemple de code depuis <a href="http://bit.ly/2qfIFH0">GitHub</a>.</p>
</div>
<div class="paragraph">
<p>Notre contrat, illustré en <a href="#solidity_token_example">METoken.sol : Un contrat Solidity implémentant un token ERC20</a>, est très simple, car il hérite toutes ses fonctionnalités de la bibliothèque OpenZeppelin.</p>
</div>
<div id="solidity_token_example" class="exampleblock">
<div class="title">Example 1. METoken.sol : Un contrat Solidity implémentant un token ERC20</div>
<div class="content">
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-solidity" data-lang="solidity">pragma solidity ^0.4.21;
import 'openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol';
contract METoken is StandardToken {
string public constant name = 'Mastering Ethereum Token';
string public constant symbol = 'MET';
uint8 public constant decimals = 2;
uint constant _initial_supply = 2100000000;
function METoken() public {
totalSupply_ = _initial_supply;
balances[msg.sender] = _initial_supply;
emit Transfer(address(0), msg.sender, _initial_supply);
}
}</code></pre>
</div>
</div>
</div>
</div>
<div class="paragraph">
<p>Ici, nous définissons les variables optionnelles <code>name</code>, symbol et <code>decimals</code>. Nous définissons également une variable <code>_initial_supply</code>, définie sur 21 millions de jetons ; avec deux décimales de subdivision qui donne 2,1 milliards d’unités au total. Dans la fonction d’initialisation (constructeur) du contrat, nous définissons le totalSupply égal à _initial_supply et allouons tout le _initial_supply au solde du compte (<code>msg.sender</code>)qui crée le contrat METoken.</p>
</div>
<div class="paragraph">
<p>Nous utilisons maintenant truffle pour compiler le code METoken :</p>
</div>
<pre data-type="programlist">
$ <strong>truffle compile</strong>
Compiling ./contracts/METoken.sol...
Compiling ./contracts/Migrations.sol...
Compiling openzeppelin-solidity/contracts/math/SafeMath.sol...
Compiling openzeppelin-solidity/contracts/token/ERC20/BasicToken.sol...
Compiling openzeppelin-solidity/contracts/token/ERC20/ERC20.sol...
Compiling openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol...
Compiling openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol...
</pre>
<div class="paragraph">
<p>Comme vous pouvez le voir, truffle intègre les dépendances nécessaires des bibliothèques OpenZeppelin et compile également ces contrats.</p>
</div>
<div class="paragraph">
<p>Configurons un script de migration pour déployer le contrat <code>METoken</code>. Créez un nouveau fichier appelé <em>2_deploy_contracts.js</em>, dans le dossier <em>METoken/migrations</em>. Copiez le contenu de l’exemple <a href="http://bit.ly/2P0rHLl">dans le référentiel GitHub</a> :</p>
</div>
<div id="METoken_migration" class="listingblock">
<div class="title">2_deploy_contracts : Migration pour déployer METoken</div>
<div class="content">
<pre class="highlight"><code class="language-javascript" data-lang="javascript">var METoken = artifacts.require("METoken");
module.exports = function(deployer) {
// Déployer le contrat METoken comme seule tâche
deployer.deploy(METoken);
};</code></pre>
</div>
</div>
<div class="paragraph">
<p>Avant de déployer sur l’un des réseaux de test Ethereum, démarrons une chaîne de blocs locale pour tout tester. Démarrez la chaîne de blocs <code>ganache</code>, soit depuis la ligne de commande avec <code>ganache-cli</code>, soit depuis l’interface utilisateur graphique.</p>
</div>
<div class="paragraph">
<p>Une fois ganache lancé, nous pouvons déployer notre contrat METoken et voir si tout fonctionne comme prévu :</p>
</div>
<pre data-type="programlist">
$ <strong>truffle migrate --network ganache</strong>
Using network 'ganache'.
Running migration: 1_initial_migration.js
Deploying Migrations...
... 0xb2e90a056dc6ad8e654683921fc613c796a03b89df6760ec1db1084ea4a084eb
Migrations: 0x8cdaf0cd259887258bc13a92c0a6da92698644c0
Saving successful migration to network...
... 0xd7bc86d31bee32fa3988f1c1eabce403a1b5d570340a3a9cdba53a472ee8c956