-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
for_use_ethereumbook_07smart-contracts-soliditytxt_fr_CA.html
1983 lines (1922 loc) · 133 KB
/
for_use_ethereumbook_07smart-contracts-soliditytxt_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>Contrats intelligents et Solidity</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="smart_contracts_chapter">Contrats intelligents et Solidity</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Comme nous en avons discuté dans <a href="#intro_chapter">[intro_chapter]</a>, il existe deux types de comptes différents dans Ethereum : les comptes externes (EOA) et comptes contractuels. Les EOA sont contrôlés par les utilisateurs, souvent via un logiciel tel qu’une application de portefeuille externe à la plate-forme Ethereum. contrats ») qui est exécuté par la machine virtuelle Ethereum. En bref, les EOA sont de simples comptes sans code ni stockage de données associés, tandis que les comptes contractuels ont à la fois un code et un stockage de données associés. Les EOA sont contrôlés par des transactions créées et signées cryptographiquement avec une clé privée dans le "monde réel" externe et indépendant du protocole, alors que les comptes contractuels n’ont pas de clés privées et "se contrôlent" donc de la manière prédéterminée prescrite par leur code de contrat intelligent. Les deux types de comptes sont identifiés par une adresse Ethereum. Dans ce chapitre, nous discuterons des comptes contractuels et du code de programme qui les contrôle.</p>
</div>
<div class="sect2">
<h3 id="smart_contracts_definition">Qu’est-ce qu’un contrat intelligent ?</h3>
<div class="paragraph">
<p>Le terme <em>contrat intelligent</em> a été utilisé au fil des ans pour décrire une grande variété de choses différentes. Dans les années 1990, le cryptographe Nick Szabo a inventé le terme et l’a défini comme "un ensemble de promesses, spécifiées sous forme numérique, y compris des protocoles au sein que les parties exécutent sur les autres promesses. Depuis lors, le concept de contrats intelligents a évolué, notamment après l’introduction de plateformes de chaîne de blocs décentralisées avec l’invention de Bitcoin en 2009. Dans le contexte d’Ethereum, le terme est en fait un peu impropre, étant donné que les contrats intelligents Ethereum ne sont ni des contrats intelligents ni légaux, mais le terme est resté. Dans ce livre, nous utilisons le terme «contrats intelligents» pour désigner des programmes informatiques immuables qui s’exécutent de manière déterministe dans le contexte d’une machine virtuelle Ethereum dans le cadre du protocole réseau Ethereum, c’est-à-dire sur l’ordinateur mondial Ethereum décentralisé.</p>
</div>
<div class="paragraph">
<p>Déballons cette définition :</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Logiciels d’ordinateur</dt>
<dd>
<p>Les contrats intelligents sont simplement des programmes informatiques. Le mot « contrat » n’a aucune signification juridique dans ce contexte.</p>
</dd>
<dt class="hdlist1">Immuable</dt>
<dd>
<p>Une fois déployé, le code d’un contrat intelligent ne peut pas changer. Contrairement aux logiciels traditionnels, la seule façon de modifier un contrat intelligent est de déployer une nouvelle instance.</p>
</dd>
<dt class="hdlist1">Déterministe</dt>
<dd>
<p>Le résultat de l’exécution d’un contrat intelligent est le même pour tous ceux qui l’exécutent, compte tenu du contexte de la transaction qui a initié son exécution et de l’état de la chaîne de blocs Ethereum au moment de l’exécution.</p>
</dd>
<dt class="hdlist1">Contexte EVM</dt>
<dd>
<p>Les contrats intelligents fonctionnent avec un contexte d’exécution très limité. Ils peuvent accéder à leur propre état, au contexte de la transaction qui les a appelés et à certaines informations sur les blocs les plus récents.</p>
</dd>
<dt class="hdlist1">Ordinateur mondial décentralisé</dt>
<dd>
<p>L’EVM fonctionne comme une instance locale sur chaque nœud Ethereum, mais comme toutes les instances de l’EVM fonctionnent sur le même état initial et produisent le même état final, le système dans son ensemble fonctionne comme un seul "ordinateur mondial".</p>
</dd>
</dl>
</div>
</div>
<div class="sect2">
<h3 id="smart_contract_lifecycle">Cycle de vie d’un contrat intelligent</h3>
<div class="paragraph">
<p>Les contrats intelligents sont généralement écrits dans un langage de haut niveau, tel que Solidity. Mais pour fonctionner, ils doivent être compilés dans le code intermédiaire (bytecode) de bas niveau qui s’exécute dans l’EVM. Une fois compilés, ils sont déployés sur la plateforme Ethereum à l’aide d’une transaction spéciale de <em>création de contrat</em>, qui est identifiée comme telle en étant envoyée à l’adresse spéciale de création de contrat, à savoir 0x0 (voir <a href="#contract_reg">[contract_reg]</a>). Chaque contrat est identifié par une adresse Ethereum, qui est dérivée de la transaction de création de contrat en fonction du compte d’origine et du nonce. L’adresse Ethereum d’un contrat peut être utilisée dans une transaction en tant que destinataire, envoyer des fonds au contrat ou appeler l’une des fonctions du contrat. Notez que, contrairement aux EOA, il n’y a pas de clés associées à un compte créé pour un nouveau contrat intelligent. En tant que créateur du contrat, vous n’obtenez aucun privilège spécial au niveau du protocole (bien que vous puissiez les coder explicitement dans le contrat intelligent). Vous ne recevez certainement pas la clé privée du compte de contrat, qui en fait n’existe pas - nous pouvons dire que les comptes de contrat intelligents se possèdent eux-mêmes.</p>
</div>
<div class="paragraph">
<p>Il est important de noter que les contrats <em>ne s’exécutent que s’ils sont appelés par une transaction</em>. Tous les contrats intelligents dans Ethereum sont exécutés, en fin de compte, en raison d’une transaction initiée à partir d’un EOA. Un contrat peut appeler un autre contrat qui peut appeler un autre contrat, et ainsi de suite, mais le premier contrat d’une telle chaîne d’exécution aura toujours été appelé par une transaction d’un EOA. Les contrats ne fonctionnent jamais "seuls" ou "en arrière-plan". Les contrats restent effectivement inactifs jusqu’à ce qu’une transaction déclenche l’exécution, soit directement, soit indirectement dans le cadre d’une chaîne d’appels de contrats. Il convient également de noter que les contrats intelligents ne sont en aucun cas exécutés "en parallèle" - l’ordinateur mondial Ethereum peut être considéré comme une machine à un seul fil d’exécution (thread).</p>
</div>
<div class="paragraph">
<p>Les transactions sont <em>atomique</em>, quel que soit le nombre de contrats qu’elles appellent ou ce que ces contrats font lorsqu’ils sont appelés. Les transactions s’exécutent dans leur intégralité, avec tout changement dans l’état global (contrats, comptes, etc.) enregistré uniquement si toutes les exécutions se terminent avec succès. Une fin réussie signifie que le programme s’est exécuté sans erreur et a atteint la fin de l’exécution. Si l’exécution échoue en raison d’une erreur, tous ses effets (changements d’état) sont "annulés" comme si la transaction n’avait jamais été exécutée. Une transaction échouée est toujours enregistrée comme ayant été tentée, et l’ether dépensé en gaz pour l’exécution est déduit du compte d’origine, mais cela n’a par ailleurs aucun autre effet sur le contrat ou l’état du compte.</p>
</div>
<div class="paragraph">
<p>Comme mentionné précédemment, il est important de se rappeler que le code d’un contrat ne peut pas être modifié. Cependant, un contrat peut être "supprimé", supprimant le code et son état interne (stockage) de son adresse, laissant un compte vide. Toutes les transactions envoyées à cette adresse de compte après la suppression du contrat n’entraînent aucune exécution de code, car il n’y a plus de code à exécuter. Pour supprimer un contrat, vous exécutez un opcode EVM appelé SELFDESTRUCT (précédemment appelé SUICIDE). Cette opération coûte du "gaz négatif", un remboursement de gaz, incitant ainsi à libérer les ressources du client du réseau à partir de la suppression de l’état stocké. La suppression d’un contrat de cette manière ne supprime pas l’historique des transactions (passé) du contrat, car la chaîne de blocs elle-même est immuable. Il est également important de noter que la capacité SELFDESTRUCT ne sera disponible que si l’auteur du contrat a programmé le contrat intelligent pour avoir cette fonctionnalité. Si le code du contrat n’a pas d’opcode <code>SELFDESTRUCT</code>, ou s’il est inaccessible, le contrat intelligent ne peut pas être supprimé.</p>
</div>
</div>
<div class="sect2">
<h3 id="high_level_languages">Introduction aux langages de haut niveau Ethereum</h3>
<div class="paragraph">
<p>L’EVM est une machine virtuelle qui exécute une forme spéciale de code appelé <em>code intermédiaire EVM</em> ou <em>EVM bytecode</em>, analogue au processeur de votre ordinateur, qui exécute un code machine tel que x86_64. Nous examinerons le fonctionnement et le langage de l’EVM de manière beaucoup plus détaillée dans <a href="#evm_chapter">[evm_chapter]</a>. Dans cette section, nous verrons comment les contrats intelligents sont écrits pour s’exécuter sur l’EVM.</p>
</div>
<div class="paragraph">
<p>Bien qu’il soit possible de programmer des contrats intelligents directement en code intermédiaire, le code intermédiaire EVM est plutôt lourd et très difficile à lire et à comprendre pour les programmeurs. Au lieu de cela, la plupart des développeurs Ethereum utilisent un langage de haut niveau pour écrire des programmes et un compilateur pour les convertir en code intermédiaire.</p>
</div>
<div class="paragraph">
<p>Bien que n’importe quel langage de haut niveau puisse être adapté pour écrire des contrats intelligents, adapter un langage arbitraire pour qu’il soit compilable au code intermédiaire EVM est un exercice assez fastidieux et conduirait en général à une certaine confusion. Les contrats intelligents fonctionnent dans un environnement d’exécution très contraint et minimaliste (l’EVM). De plus, un ensemble spécial de variables système et de fonctions spécifiques à EVM doit être disponible. En tant que tel, il est plus facile de créer un langage de contrat intelligent à partir de zéro que de créer un langage à usage général adapté à l’écriture de contrats intelligents. En conséquence, un certain nombre de langages spéciaux ont émergé pour programmer des contrats intelligents. Ethereum possède plusieurs langages de ce type, ainsi que les compilateurs nécessaires pour produire un code intermédiaire exécutable EVM.</p>
</div>
<div class="paragraph">
<p>En général, les langages de programmation peuvent être classés en deux grands paradigmes de programmation : <em>déclaratif</em> et <em>impératif</em>, également appelés respectivement <em>fonctionnel</em> et <em>procédural</em>. En programmation déclarative, nous écrivons des fonctions qui expriment la <em>logique</em> d’un programme, mais pas son <em>flux</em>. La programmation déclarative est utilisée pour créer des programmes sans <em>effets secondaires</em>, ce qui signifie qu’il n’y a pas de changement d’état en dehors d’une fonction. Les langages de programmation déclaratifs incluent Haskell et SQL. La programmation impérative, en revanche, est l’endroit où un programmeur écrit un ensemble de procédures qui combinent la logique et le déroulement d’un programme. Les langages de programmation impératifs incluent C++ et Java. Certains langages sont « hybrides », ce qui signifie qu’ils encouragent la programmation déclarative mais peuvent également être utilisés pour exprimer un paradigme de programmation impérative. Ces hybrides incluent Lisp, JavaScript et Python. En général, n’importe quel langage impératif peut être utilisé pour écrire dans un paradigme déclaratif, mais il en résulte souvent un code inélégant. Par comparaison, les langages déclaratifs purs ne peuvent pas être utilisés pour écrire dans un paradigme impératif. Dans les langages purement déclaratifs, <em>il n’y a pas de "variables".</em></p>
</div>
<div class="paragraph">
<p>Bien que la programmation impérative soit plus couramment utilisée par les programmeurs, il peut être très difficile d’écrire des programmes qui s’exécutent <em>exactement comme prévu</em>. La capacité de n’importe quelle partie du programme à modifier l’état de n’importe quelle autre rend difficile le raisonnement sur l’exécution d’un programme et introduit de nombreuses opportunités de bogues. La programmation déclarative, par comparaison, permet de comprendre plus facilement le comportement d’un programme : puisqu’elle n’a pas d’effets secondaires, n’importe quelle partie d’un programme peut être comprise isolément.</p>
</div>
<div class="paragraph">
<p>Dans les contrats intelligents, les bogues coûtent littéralement de l’argent. Par conséquent, il est extrêmement important de rédiger des contrats intelligents sans effets indésirables. Pour ce faire, vous devez être capable de raisonner clairement sur le comportement attendu du programme. Ainsi, les langages déclaratifs jouent un rôle beaucoup plus important dans les contrats intelligents que dans les logiciels à usage général. Néanmoins, comme vous le verrez, le langage le plus utilisé pour les contrats intelligents (Solidity) est impératif. Les programmeurs, comme la plupart des humains, résistent au changement !</p>
</div>
<div class="paragraph">
<p>Les langages de programmation de haut niveau actuellement pris en charge pour les contrats intelligents incluent (classés par âge approximatif) :</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">LLL</dt>
<dd>
<p>Un langage de programmation fonctionnel (déclaratif), avec une syntaxe de type Lisp. C’était le premier langage de haut niveau pour les contrats intelligents Ethereum, mais il est rarement utilisé aujourd’hui.</p>
</dd>
<dt class="hdlist1">Serpent</dt>
<dd>
<p>Un langage de programmation procédural (impératif) avec une syntaxe similaire à Python. Peut également être utilisé pour écrire du code fonctionnel (déclaratif), bien qu’il ne soit pas entièrement exempt d’effets secondaires.</p>
</dd>
<dt class="hdlist1">Solidity</dt>
<dd>
<p>Un langage de programmation procédural (impératif) avec une syntaxe similaire à JavaScript, C++, ou Java. Le langage le plus populaire et le plus fréquemment utilisé pour les contrats intelligents Ethereum.</p>
</dd>
<dt class="hdlist1">Vyper</dt>
<dd>
<p>Un langage développé plus récemment, similaire à Serpent et encore une fois avec une syntaxe de type Python. Destiné à se rapprocher d’un langage de type Python purement fonctionnel que Serpent, mais pas à remplacer Serpent.</p>
</dd>
<dt class="hdlist1">Bamboo</dt>
<dd>
<p>Un langage nouvellement développé, influencé par Erlang, avec des transitions d’état explicites et sans flux itératifs (boucles). Destiné à réduire les effets secondaires et à augmenter l’auditabilité. Très nouveau et en attente d’être largement adopté.</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>Comme vous pouvez le voir, il existe de nombreux languages parmi lesquelles choisir. Cependant, de tous, Solidity est de loin le plus populaire, au point d’être le langage de haut niveau <em>de facto</em> d’Ethereum et même d’autres chaînes de blocs de type EVM. Nous passerons la plupart de notre temps à utiliser Solidity, mais nous explorerons également certains des exemples dans d’autres langages de haut niveau pour comprendre leurs différentes philosophies.</p>
</div>
</div>
<div class="sect2">
<h3 id="building_a_smart_contract_sec">Construire un contrat intelligent avec Solidity</h3>
<div class="paragraph">
<p>Solidity a été créé par Dr. Gavin Wood (co-auteur de ce livre) en tant que langage explicite pour écrire des contrats intelligents avec des fonctionnalités permettant de prendre directement en charge l’exécution dans l’environnement décentralisé de l’ordinateur mondial Ethereum. Les attributs résultants sont assez généraux et ont donc fini par être utilisés pour coder des contrats intelligents sur plusieurs autres plateformes de chaîne de blocs. Il a été développé par Christian Reitiwessner puis également par Alex Beregszaszi, Liana Husikyan, Yoichi Hirai et plusieurs anciens contributeurs principaux d’Ethereum. Solidity est maintenant développé et maintenu en tant que projet indépendant <a href="https://github.com/ethereum/solidity">sur GitHub</a>.</p>
</div>
<div class="paragraph">
<p>Le "produit" principal du projet Solidity est le compilateur Solidity, <code>solc</code>, qui convertit les programmes écrits dans le langage Solidity en code intermédiaire EVM. Le projet gère également l’importante norme d’interface binaire d’application (ABI) pour les contrats intelligents Ethereum, que nous explorerons en détail dans ce chapitre. Chaque version du compilateur Solidity correspond à et compile une version spécifique de <span class="keep-together">language</span> de Solidity.</p>
</div>
<div class="paragraph">
<p>Pour commencer, nous allons télécharger un exécutable binaire du compilateur Solidity. Ensuite, nous développerons et compilerons un contrat simple, à la suite de l’exemple avec lequel nous avons commencé dans <a href="#intro_chapter">[intro_chapter]</a>.</p>
</div>
<div class="sect3">
<h4 id="_sélection_dune_version_de_solidity">Sélection d’une version de Solidity</h4>
<div class="paragraph">
<p>Solidity suit un modèle de versionnage appelé <a href="https://semver.org/"><em>versionnage de sémantique</em></a> (<em>semantic versioning</em>), qui spécifie les numéros de version structurés comme trois nombres séparés par des points : <em>MAJEUR.MINEUR.CORRECTIF</em>. Le numéro "majeur" est incrémenté pour les modifications majeures et <em>rétro-incompatibles</em>, le numéro "mineur" est incrémenté lorsque des fonctionnalités rétrocompatibles sont ajoutées entre les versions majeures, et le numéro "correctif" est incrémenté pour les corrections de bogues rétrocompatibles.</p>
</div>
<div class="paragraph">
<p>Au moment de la rédaction, Solidity est à la version 0.4.24. Les règles de la version majeure 0, qui concerne le développement initial d’un projet, sont différentes : tout peut changer à tout moment. En pratique, Solidity traite le numéro "mineur" comme s’il s’agissait de la version majeure et le numéro de "correctif" comme s’il s’agissait de la version mineure. Par conséquent, dans la version 0.4.24, 4 est considérée comme la version majeure et 24 comme la version mineure.</p>
</div>
<div class="paragraph">
<p>La sortie de la version majeure 0.5 de Solidity est attendue de manière imminente.</p>
</div>
<div class="paragraph">
<p>Comme vous l’avez vu dans <a href="#intro_chapter">[intro_chapter]</a>, vos programmes Solidity peuvent contenir une directive pragma qui spécifie les versions minimale et maximale de Solidity avec lesquelles il est compatible, et peut être utilisée pour compiler votre contrat.</p>
</div>
<div class="paragraph">
<p>Étant donné que Solidity évolue rapidement, il est souvent préférable d’installer la dernière version.</p>
</div>
</div>
<div class="sect3">
<h4 id="_télécharger_et_installer">Télécharger et installer</h4>
<div class="paragraph">
<p>Il existe un certain nombre de méthodes que vous pouvez utiliser pour télécharger et installer Solidity, soit sous forme de version binaire, soit en compilant à partir du code source. Vous pouvez trouver des instructions détaillées dans <a href="http://bit.ly/2RrZmup" class="bare">http://bit.ly/2RrZmup</a> [la documentation de Solidity].</p>
</div>
<div class="paragraph">
<p>Voici comment installer la dernière version binaire de Solidity sur un système d’exploitation Ubuntu/Debian, en utilisant le gestionnaire de paquets apt :</p>
</div>
<pre data-type="programlisting">
$ <strong>sudo add-apt-repository ppa:ethereum/ethereum</strong>
$ <strong>sudo apt update</strong>
$ <strong>sudo apt install solc</strong>
</pre>
<div class="paragraph">
<p>Une fois que vous avez installé <code>solc</code>, vérifiez la version en exécutant :</p>
</div>
<pre data-type="programlisting">
$ <strong>solc --version</strong>
solc, the solidity compiler commandline interface
Version: 0.4.24+commit.e67f0147.Linux.g++
</pre>
<div class="paragraph">
<p>Il existe plusieurs autres façons d’installer Solidity, en fonction de votre système d’exploitation et de vos exigences, y compris la compilation directe à partir du code source. Pour plus d’informations, consultez <a href="https://github.com/ethereum/solidity" class="bare">https://github.com/ethereum/solidity</a>.</p>
</div>
</div>
<div class="sect3">
<h4 id="_environnement_de_développement">Environnement de développement</h4>
<div class="paragraph">
<p>Pour développer dans Solidity, vous pouvez utiliser n’importe quel éditeur de texte et solc sur la ligne de commande. Cependant, vous constaterez peut-être que certains éditeurs de texte conçus pour le développement, tels que Emacs, Vim et Atom, offrent des fonctionnalités supplémentaires telles que la coloration syntaxique et les macros qui facilitent le développement de Solidity.</p>
</div>
<div class="paragraph">
<p>Il existe également des environnements de développement basés sur le Web, tels que <a href="https://remix.ethereum.org/">Remix IDE</a> et <a href="https://ethfiddle.com/">EthFiddle</a>.</p>
</div>
<div class="paragraph">
<p>Utilisez les outils qui vous rendent productif. En fin de compte, les programmes Solidity ne sont que des fichiers texte. Bien que des éditeurs et des environnements de développement sophistiqués puissent faciliter les choses, vous n’avez besoin de rien de plus qu’un simple éditeur de texte, tel que nano (Linux/Unix), TextEdit (macOS) ou même NotePad (Windows). Enregistrez simplement le code source de votre programme avec une extension <em>.sol</em> et il sera reconnu par le compilateur Solidity comme un programme Solidity.</p>
</div>
</div>
<div class="sect3">
<h4 id="_écrire_un_programme_solidity_simple">Écrire un programme Solidity simple</h4>
<div class="paragraph">
<p>Dans <a href="#intro_chapter">[intro_chapter]</a>, nous avons écrit notre premier programme Solidity. Lorsque nous avons créé le contrat Faucet pour la première fois, nous avons utilisé l’IDE Remix pour compiler et déployer le contrat. Dans cette section, nous allons revisiter, améliorer et embellir Faucet.</p>
</div>
<div class="paragraph">
<p>Notre première tentative ressemblait à <a href="#original_sol_faucet">Faucet.sol : Un contrat Solidity mettant en place un robinet</a>.</p>
</div>
<div id="original_sol_faucet" class="exampleblock">
<div class="title">Example 1. Faucet.sol : Un contrat Solidity mettant en place un robinet</div>
<div class="content">
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-solidity" data-lang="solidity">// Identifiant de licence SPDX : CC-BY-SA-4.0
// Version du compilateur Solidity pour lequel ce programme a été écrit
pragma solidity 0.6.4;
// Notre premier contrat est un faucet !
contract Faucet {
// Accepte tout montant entrant
receive() external payable {}
// Donnez de l'éther à quiconque demande
function withdraw(uint withdraw_amount) public {
// Limiter le montant du retrait
require(withdraw_amount <= 100000000000000000);
// Envoie le montant à l'adresse qui l'a demandé
msg.sender.transfer(withdraw_amount);
}
}</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_compiler_avec_le_compilateur_solidity_solc">Compiler avec le compilateur Solidity (solc)</h4>
<div class="paragraph">
<p>Maintenant, nous allons utilisez le compilateur Solidity en ligne de commande pour compiler directement notre contrat. Le compilateur Solidity solc offre une variété d’options, que vous pouvez voir en passant l’argument --help.</p>
</div>
<div class="paragraph">
<p>Nous utilisons les arguments --bin et --optimize de solc pour produire un binaire optimisé de notre exemple de contrat :</p>
</div>
<pre data-type="programlisting">
$ <strong>solc --optimize --bin Faucet.sol</strong>
======= Faucet.sol:Faucet =======
Binary:
6060604052341561000f57600080fd5b60cf8061001d6000396000f300606060405260043610603e5
763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416
632e1a7d4d81146040575b005b3415604a57600080fd5b603e60043567016345785d8a00008111156
06357600080fd5b73ffffffffffffffffffffffffffffffffffffffff331681156108fc0282604051
600060405180830381858888f19350505050151560a057600080fd5b505600a165627a7a723058203
556d79355f2da19e773a9551e95f1ca7457f2b5fbbf4eacf7748ab59d2532130029
</pre>
<div class="paragraph">
<p>Le résultat que solc produit est un binaire sérialisé hexadécimal qui peut être soumis à la chaîne de blocs Ethereum.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="eth_contract_abi_sec">L’ABI du contrat Ethereum</h3>
<div class="paragraph">
<p>Dans les logiciels informatiques, une <em>interface binaire d’application</em> est une interface entre deux modules de programme ; souvent, entre le système d’exploitation et les programmes utilisateur. Un ABI définit la façon dont les structures de données et les fonctions sont accessibles en <em>code machine</em> ; cela ne doit pas être confondu avec une API, qui définit cet accès dans des formats de haut niveau, souvent lisibles par l’homme, en tant que <em>code source</em>. L’ABI est donc le principal moyen d’encoder et de décoder des données dans et hors du code machine.</p>
</div>
<div class="paragraph">
<p>Dans Ethereum, l’ABI est utilisé pour coder les appels de contrat pour l’EVM et pour lire les données des transactions. Le but d’un ABI est de définir les fonctions du contrat qui peuvent être invoquées et de décrire comment chaque fonction acceptera les arguments et renverra son résultat.</p>
</div>
<div class="paragraph">
<p>L’ABI d’un contrat est spécifié sous la forme d’un tableau JSON de descriptions de fonctions (voir <a href="#solidity_functions">Fonctions</a>) et événements (voir <a href="#solidity_events">Événements</a>). Une description de fonction est un objet JSON avec les champs <code>type</code>, <code>name</code>, <code>inputs</code>, <code>outputs</code>, <code>constant</code> et <code>payable</code>. Un objet de description d’événement a des champs <code>type</code>, <code>name</code>, <code>inputs</code> et <code>anonymous</code>.</p>
</div>
<div class="paragraph">
<p>Nous utilisons le compilateur Solidity en ligne de commande solc pour produire l’ABI pour notre exemple de contrat <span class="keep-together"><em>Faucet.sol</em></span> :</p>
</div>
<pre data-type="programlisting">
$ <strong>solc --abi Faucet.sol</strong>
======= Faucet.sol:Faucet =======
Contract JSON ABI
[{"constant":false,"inputs":[{"name":"withdraw_amount","type":"uint256"}], \
"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable", \
"type":"function"},{"payable":true,"stateMutability":"payable", \
"type":"fallback"}]
</pre>
<div class="paragraph">
<p>Comme vous pouvez le voir, le compilateur produit un tableau JSON décrivant les deux fonctions définies par <em>Faucet.sol</em>. Ce JSON peut être utilisé par toute application qui souhaite accéder au contrat Faucet une fois qu’il est déployé. À l’aide de l’ABI, une application telle qu’un portefeuille ou un navigateur DApp peut construire des transactions qui appellent les fonctions dans + Faucet + avec les arguments et types d’arguments corrects. Par exemple, un portefeuille saura que pour appeler la fonction <code>withdraw</code>, il devra fournir un argument uint256 nommé <code>withdraw_amount</code>. Le portefeuille pourrait inviter l’utilisateur à fournir cette valeur, puis à créer une transaction qui l’encode et exécute la fonction retirer.</p>
</div>
<div class="paragraph">
<p>Tout ce qui est nécessaire pour qu’une application interagisse avec un contrat est un ABI et l’adresse où le contrat a été déployé.</p>
</div>
<div class="sect3">
<h4 id="solidity_pragma">Sélection d’un compilateur Solidity et d’une version linguistique</h4>
<div class="paragraph">
<p>Comme nous l’avons vu dans le code précédent, notre contrat Faucet se compile avec succès avec Solidity version 0.4.21. Et si nous avions utilisé une version différente du compilateur Solidity ? Le langage est toujours en constante évolution et les choses peuvent changer de manière inattendue. Notre contrat est assez simple, mais que se passerait-il si notre programme utilisait une fonctionnalité qui n’a été ajoutée que dans la version 0.4.19 de Solidity et que nous essayions de la compiler avec la version 0.4.18 ?</p>
</div>
<div class="paragraph">
<p>Pour résoudre ces problèmes, Solidity propose une <em>directive du compilateur</em> connue sous le nom de <em>version pragma</em> qui indique au compilateur que le programme attend un compilateur (et un langage) spécifique à une version. Regardons un exemple :</p>
</div>
<div id="compiler_version" class="listingblock">
<div class="content">
<pre>pragma solidity ^0.4.19;</pre>
</div>
</div>
<div class="paragraph">
<p>Le compilateur Solidity lit le pragma de version et génère une erreur si la version du compilateur est incompatible avec le pragma de version. Dans ce cas, notre pragma de version indique que ce programme peut être compilé par un compilateur Solidity avec une version minimale de 0.4.19. Le symbole <code>^</code> indique, cependant, que nous autorisons la compilation avec toute <em>révision mineure</em> au-dessus de 0.4.19 ; par exemple, 0.4.20, mais pas 0.5.0 (qui est une révision majeure, pas une révision mineure). Les directives Pragma ne sont pas compilées dans le code intermédiaire EVM. Ils ne sont utilisés par le compilateur que pour vérifier la compatibilité.</p>
</div>
<div class="paragraph">
<p>Ajoutons une directive pragma à notre contrat <code>Faucet</code>. Nous nommerons le nouveau fichier <span class="keep-together"><em>Faucet2.sol</em></span>, pour garder une trace de nos modifications au fur et à mesure que nous avancerons dans ces exemples en commençant par <a href="#add_pragma_to_faucet">Faucet2.sol : Ajout du pragma de version à Faucet</a>.</p>
</div>
<div id="add_pragma_to_faucet" class="exampleblock">
<div class="title">Example 2. Faucet2.sol : Ajout du pragma de version à Faucet</div>
<div class="content">
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-solidity" data-lang="solidity">// Identifiant de licence SPDX : CC-BY-SA-4.0
// Version du compilateur Solidity pour lequel ce programme a été écrit
pragma solidity ^0.6.4;
// Notre premier contrat est un faucet !
contract Faucet {
// Accepte tout montant entrant
receive() external payable {}
// Donnez de l'éther à quiconque demande
function withdraw(uint withdraw_amount) public {
// Limiter le montant du retrait
require(withdraw_amount <= 100000000000000000);
// Envoie le montant à l'adresse qui l'a demandé
msg.sender.transfer(withdraw_amount);
}
}</code></pre>
</div>
</div>
</div>
</div>
<div class="paragraph">
<p>L’ajout d’un pragma de version est une bonne pratique, car il évite les problèmes liés aux versions incompatibles du compilateur et du langage. Nous explorerons d’autres bonnes pratiques et continuerons d’améliorer le contrat Faucet tout au long de ce chapitre.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_programmation_avec_solidity">Programmation avec Solidity</h3>
<div class="paragraph">
<p>Dans cette section, nous examinerons certaines des fonctionnalités du langage Solidity. Comme nous l’avons mentionné dans <a href="#intro_chapter">[intro_chapter]</a>, notre premier exemple de contrat était très simple et également défectueux à plusieurs égards. Nous allons l’améliorer progressivement ici, tout en explorant comment utiliser Solidity. Cependant, ce ne sera pas un didacticiel complet sur Solidity, car Solidity est assez complexe et évolue rapidement. Nous couvrirons les bases et vous donnerons suffisamment de bases pour pouvoir explorer le reste par vous-même. La documentation de Solidity se trouve
<a href="https://solidity.readthedocs.io/en/latest/">sur le site du projet</a>.</p>
</div>
<div class="sect3">
<h4 id="_types_de_données">Types de données</h4>
<div class="paragraph">
<p>D’abord, examinons certains des types de données de base proposés dans Solidity :</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Boolean (bool)</dt>
<dd>
<p>valeur booléenne, true ou <code>false</code>, avec les opérateurs logiques <code>!</code> (not), &amp;&amp; (and), || (or), == (equal) et != (non égal).</p>
</dd>
<dt class="hdlist1">Integer (<code>int</code>, <code>uint</code>)</dt>
<dd>
<p>Entiers signés (<code>int</code>)et non signés (uint), déclarés par incréments de 8 bits de int8 à <code>uint256</code>. Sans suffixe de taille, des quantités de 256 bits sont utilisées pour correspondre à la taille de mot de l’EVM.</p>
</dd>
<dt class="hdlist1">Fixed point (<code>fixed</code>,<code>ufixed</code>)</dt>
<dd>
<p>Nombres à virgule fixe, déclarés avec ( <code>u</code>) <code>fixed <em>M</em> x <em>N</em></code> où <em>M</em> est la taille en bits (incréments de 8 jusqu’à 256) et <em>N</em> est le nombre de décimales après le point (jusqu’à 18) ; par exemple, ufixed32x2.</p>
</dd>
<dt class="hdlist1">Address</dt>
<dd>
<p>Une adresse Ethereum de 20 octets. L’objet address a de nombreuses fonctions membres utiles, les principales étant balance (renvoie le solde du compte) et <span class="keep-together"><code>transfer</code></span> (transfère l’ether au compte).</p>
</dd>
<dt class="hdlist1">Byte array (fixe)</dt>
<dd>
<p>Tableaux d’octets de taille fixe, déclarés avec bytes1 jusqu’à bytes32.</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>Byte array (dynamique):: tableaux d’octets de taille variable, déclarés avec bytes ou string.</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Enum</dt>
<dd>
<p>Type défini par l’utilisateur pour énumérer des valeurs discrètes : enum NAME {LABEL1, LABEL 2, ...}.</p>
</dd>
<dt class="hdlist1">Arrays</dt>
<dd>
<p>Un tableau de n’importe quel type, fixe ou dynamique : uint32[][5] est un tableau de taille fixe de cinq tableaux dynamiques d’entiers non signés.</p>
</dd>
<dt class="hdlist1">Struct</dt>
<dd>
<p>Conteneurs de données définis par l’utilisateur pour regrouper les variables : <code>struct NAME {TYPE1 <span class="keep-together">VARIABLE1</span>; TYPE2 VARIABLE2; ...}</code>.</p>
</dd>
<dt class="hdlist1">Mapping</dt>
<dd>
<p>Tables de recherche de hachage pour les paires <em>key</em> =&gt; <em>value</em> : mapping(KEY_TYPE =&gt; VALUE_TYPE) NAME.</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>En plus de ces types de données, Solidity propose également une variété de valeurs littérales qui peuvent être utilisées pour calculer différentes unités :</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Unités de temps</dt>
<dd>
<p>Les unités <code>seconds</code>, <code>minutes</code>, <code>hours</code> et <code>days</code> peuvent être utilisées comme suffixes, convertis en multiples de l’unité de base seconds.</p>
</dd>
<dt class="hdlist1">Unités d’ether</dt>
<dd>
<p>Les unités <code>wei</code>, <code>finney</code>, <code>szabo</code> et <code>ether</code> peuvent être utilisées comme suffixes, convertis en multiples de l’unité de base wei.</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>Dans notre exemple de contrat <code>Faucet</code>, nous avons utilisé un uint (qui est un alias pour <code>uint256</code>)pour la variable <code>withdraw_amount</code>. Nous avons également utilisé indirectement une variable <code>address</code>, que nous avons définie avec <code>msg.sender</code>. Nous utiliserons plus de ces types de données dans nos exemples dans le reste de ce chapitre.</p>
</div>
<div class="paragraph">
<p>Utilisons l’un des multiplicateurs d’unités pour améliorer la lisibilité de notre exemple de contrat. Dans la fonction withdraw nous limitons le retrait maximum, en exprimant la limite en wei, l’unité de base de l’ether :</p>
</div>
<div class="listingblock">
<div class="content">
<pre>require(withdraw_amount <= 100000000000000000);</pre>
</div>
</div>
<div class="paragraph">
<p>Ce n’est pas très facile à lire. Nous pouvons améliorer notre code en utilisant le multiplicateur d’unité <code>ether</code>, pour exprimer la valeur en ether au lieu de wei :</p>
</div>
<div class="listingblock">
<div class="content">
<pre>require(withdraw_amount <= 0.1 ether);</pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_variables_et_fonctions_globales_prédéfinies">Variables et fonctions globales prédéfinies</h4>
<div class="paragraph">
<p>Lorsqu’un contrat est exécuté dans l’EVM, il a accès à un petit ensemble d’objets globaux. Ceux-ci incluent les objets <code>block</code>, msg et <code>tx</code>. De plus, Solidity expose un certain nombre d’opcodes EVM en tant que fonctions prédéfinies. Dans cette section, nous examinerons les variables et les fonctions auxquelles vous pouvez accéder à partir d’un contrat intelligent dans Solidity.</p>
</div>
<div class="sect4">
<h5 id="_contexte_dappel_de_transactionmessage">Contexte d’appel de transaction/message</h5>
<div class="paragraph">
<p>L’objet msg est l’appel de transaction (origine EOA) ou l’appel de message (origine contrat) qui lancé l’exécution de ce contrat. Il contient un certain nombre d’attributs utiles :</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">msg.sender</dt>
<dd>
<p>Nous avons déjà utilisé celui-ci. Il représente l’adresse qui a lancé cet appel de contrat, pas nécessairement l’EOA d’origine qui a envoyé la transaction. Si notre contrat a été appelé directement par une transaction EOA, alors c’est l’adresse qui a signé la transaction, mais sinon ce sera une adresse de contrat.</p>
</dd>
<dt class="hdlist1">msg.value</dt>
<dd>
<p>La valeur d’ether envoyée avec cet appel (en wei).</p>
</dd>
<dt class="hdlist1">msg.gas</dt>
<dd>
<p>La quantité de gaz restant dans l’approvisionnement en gaz de cet environnement d’exécution. Cela a été déprécié dans Solidity v0.4.21 et remplacé par la fonction gasleft.</p>
</dd>
<dt class="hdlist1">msg.data</dt>
<dd>
<p>La charge utile de données de cet appel dans notre contrat.</p>
</dd>
<dt class="hdlist1">msg.sig</dt>
<dd>
<p>Les quatre premiers octets de la charge utile de données, qui est le sélecteur de fonction.</p>
</dd>
</dl>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
<div class="paragraph">
<p>Chaque fois qu’un contrat appelle un autre contrat, les valeurs de tous les attributs de msg changent pour refléter les informations du nouvel appelant. La seule exception à cela est la fonction <code>delegatecall</code>, qui exécute le code d’un autre contrat/bibliothèque dans le <span class="keep-together">contexte</span> de msg.</p>
</div>
</td>
</tr>
</table>
</div>
</div>
<div class="sect4">
<h5 id="_contexte_transactionnel">Contexte transactionnel</h5>
<div class="paragraph">
<p>L’objet tx fournit un moyen d’accéder aux informations relatives à la transaction :</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">tx.gasprice</dt>
<dd>
<p>Le prix du gaz dans la transaction d’appel.</p>
</dd>
<dt class="hdlist1">tx.origin</dt>
<dd>
<p>L’adresse de l’EOA d’origine pour cette transaction. ATTENTION : dangereux !</p>
</dd>
</dl>
</div>
</div>
<div class="sect4">
<h5 id="_contexte_de_bloc">Contexte de bloc</h5>
<div class="paragraph">
<p>L’objet block contient des informations sur le bloc courant :</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">block.blockhash(__blockNumber__)</dt>
<dd>
<p>Le hachage de bloc du numéro de bloc spécifié, jusqu’à 256 blocs dans le passé. Obsolète et remplacé par la fonction blockhash dans Solidity v0.4.22.</p>
</dd>
<dt class="hdlist1">block.coinbase</dt>
<dd>
<p>L’adresse du destinataire des frais du bloc actuel et de la récompense du bloc.</p>
</dd>
<dt class="hdlist1">block.difficulty</dt>
<dd>
<p>La difficulté (preuve de travail) du bloc actuel.</p>
</dd>
<dt class="hdlist1">block.gaslimit</dt>
<dd>
<p>La quantité maximale de gaz pouvant être dépensée pour toutes les transactions incluses dans le bloc actuel.</p>
</dd>
<dt class="hdlist1">block.number</dt>
<dd>
<p>Le numéro de bloc actuel (hauteur de la chaîne de blocs).</p>
</dd>
<dt class="hdlist1">block.timestamp</dt>
<dd>
<p>L’horodatage placé dans le bloc actuel par le mineur (nombre de secondes depuis l’époque Unix).</p>
</dd>
</dl>
</div>
</div>
<div class="sect4">
<h5 id="solidity_address_object">objet d’adresse</h5>
<div class="paragraph">
<p>Toute adresse, transmise en tant qu’entrée ou extraite d’un objet de contrat, possède un certain nombre d’attributs et de méthodes :</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">address.balance</dt>
<dd>
<p>Le solde de l’adresse, en wei. Par exemple, le solde actuel du contrat est address(this).balance.</p>
</dd>
<dt class="hdlist1">address.transfer(__amount__)</dt>
<dd>
<p>Transfère le montant (en wei) à cette adresse, en levant une exception en cas d’erreur. Nous avons utilisé cette fonction dans notre exemple Faucet comme méthode sur l’adresse <code>msg.sender</code>, comme msg.sender.transfer.</p>
</dd>
<dt class="hdlist1">address.send(__amount__)</dt>
<dd>
<p>similaire à <code>transfer</code>, mais au lieu de lancer une exception, il renvoie false en cas d’erreur. ATTENTION : vérifiez toujours la valeur de retour de send.</p>
</dd>
<dt class="hdlist1">address.call(__payload__)</dt>
<dd>
<p>fonction CALL de bas niveau — peut construire un appel de message arbitraire avec une charge utile de données. Renvoie faux en cas d’erreur. AVERTISSEMENT : dangereux : le destinataire peut (accidentellement ou par malveillance) utiliser tout votre gaz, provoquant l’arrêt de votre contrat avec une exception OOG ; vérifiez toujours la valeur de retour de call.</p>
</dd>
<dt class="hdlist1">address.callcode(__payload__)</dt>
<dd>
<p>fonction CALLCODE de bas niveau, comme address(this).call(...) mais avec le code de ce contrat remplacé par celui de <code>address</code>. Renvoie faux en cas d’erreur. AVERTISSEMENT : utilisation avancée uniquement !</p>
</dd>
<dt class="hdlist1">address.delegatecall()</dt>
<dd>
<p>Fonction DELEGATECALL de bas niveau, comme callcode(...) mais avec le contexte msg complet vu par le contrat actuel. Renvoie faux en cas d’erreur. AVERTISSEMENT : utilisation avancée uniquement !</p>
</dd>
</dl>
</div>
</div>
<div class="sect4">
<h5 id="_fonctions_intégrées">Fonctions intégrées</h5>
<div class="paragraph">
<p>Les autres fonctions à noter sont :</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">addmod, mulmod</dt>
<dd>
<p>Pour l’addition et la multiplication modulo. Par exemple, addmod(x,y,k) calcule (x + y) % k.</p>
</dd>
<dt class="hdlist1">keccak256, <code>sha256</code>, sha3, ripemd160</dt>
<dd>