-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
for_use_ethereumbook_13evmtxt_fr_CA.html
1443 lines (1428 loc) · 90.2 KB
/
for_use_ethereumbook_13evmtxt_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>La machine virtuelle Ethereum</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="evm_chapter">La machine virtuelle Ethereum</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Au cœur du protocole et du fonctionnement Ethereum se trouve la machine virtuelle Ethereum, ou EVM en abrégé. Comme vous pouvez le deviner d’après son nom, il s’agit d’un moteur de calcul, pas très différent des machines virtuelles du cadre de développement .NET de Microsoft, ou des interprètes d’autres langages de programmation compilés par code intermédiaire tels que Java. Dans ce chapitre, nous examinons en détail l’EVM, y compris son jeu d’instructions, sa structure et son fonctionnement, dans le contexte des mises à jour d’état d’Ethereum.</p>
</div>
<div class="sect2">
<h3 id="evm_description">Qu’est-ce que l’EVM ?</h3>
<div class="paragraph">
<p>L’EVM est la partie d’Ethereum qui gère le déploiement et l’exécution des contrats intelligents. Les transactions simples de transfert de valeur d’un EOA à un autre n’ont pas besoin de l’impliquer, pratiquement, mais tout le reste impliquera une mise à jour d’état calculée par l’EVM. À un niveau élevé, l’EVM fonctionnant sur la chaîne de blocs Ethereum peut être considéré comme un ordinateur mondial décentralisé contenant des millions d’objets exécutables, chacun avec son propre magasin de données permanent.</p>
</div>
<div class="paragraph">
<p>L’EVM est une machine d’état quasi–Turing-complète ; "quasi" car tous les processus d’exécution sont limités à un nombre fini d’étapes de calcul par la quantité de gaz disponible pour toute exécution de contrat intelligent donnée. En tant que tel, le problème d’arrêt est "résolu" (toutes les exécutions de programme s’arrêteront) et la situation où l’exécution pourrait (accidentellement ou par malveillance) s’exécuter indéfiniment, amenant ainsi la plate-forme Ethereum à s’arrêter dans son intégralité, est évitée.</p>
</div>
<div class="paragraph">
<p>L’EVM a une architecture basée sur la pile, stockant toutes les valeurs en mémoire sur une pile. Il fonctionne avec une taille de mot de 256 bits (principalement pour faciliter les opérations de hachage natif et de courbe elliptique) et possède plusieurs composants de données adressables :</p>
</div>
<div class="ulist pagebreak-before">
<ul>
<li>
<p>Un <em>code de programme ROM</em> immuable, chargé avec le code intermédiaire du smart contract à exécuter</p>
</li>
<li>
<p>Une <em>mémoire</em> volatile, avec chaque emplacement explicitement initialisé à zéro</p>
</li>
<li>
<p>Un <em>stockage</em> permanent qui fait partie de l’état Ethereum, également initialisé à zéro</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Il existe également un ensemble de variables d’environnement et de données disponibles pendant l’exécution. Nous les détaillerons plus loin dans ce chapitre.</p>
</div>
<div class="paragraph">
<p><a href="#evm_architecture">L’architecture et le contexte d’exécution de la machine virtuelle Ethereum (EVM)</a> montre l’architecture EVM et le contexte d’exécution.</p>
</div>
<div id="evm_architecture" class="imageblock">
<div class="content">
<img src="images/evm-architecture.png" alt="L’architecture de la machine virtuelle Ethereum (EVM) et son contexte d’exécution">
</div>
<div class="title">Figure 1. L’architecture et le contexte d’exécution de la machine virtuelle Ethereum (EVM)</div>
</div>
<div class="sect3">
<h4 id="evm_comparison">Comparaison avec la technologie existante</h4>
<div class="paragraph">
<p>Le terme "machine virtuelle" est souvent appliqué à la virtualisation d’un ordinateur réel, typiquement par un "hyperviseur" tel que VirtualBox ou QEMU, ou d’une instance entière du système d’exploitation, comme le KVM de Linux. Ceux-ci doivent fournir une abstraction logicielle, respectivement, du matériel réel, des appels système et des autres fonctionnalités du noyau.</p>
</div>
<div class="paragraph">
<p>L’EVM fonctionne dans un domaine beaucoup plus limité : c’est juste un moteur de calcul, et en tant que tel fournit une abstraction du calcul et du stockage, similaire à la spécification Java Virtual Machine (JVM), par exemple. D’un point de vue de haut niveau, la JVM est conçue pour fournir un environnement d’exécution indépendant du système d’exploitation ou du matériel hôte sous-jacent, permettant la compatibilité entre une grande variété de systèmes. Les langages de programmation de haut niveau tels que Java ou Scala (qui utilisent la JVM) ou C# (qui utilise .NET) sont compilés dans le jeu d’instructions code intermédiaire de leur machine virtuelle respective. De la même manière, l’EVM exécute son propre jeu d’instructions de code intermédiaire (décrit dans la section suivante), dans lequel sont compilés des langages de programmation de contrats intelligents de niveau supérieur tels que LLL, Serpent, Mutan ou Solidity.</p>
</div>
<div class="paragraph">
<p>L’EVM n’a donc aucune capacité de planification, car l’ordre d’exécution est organisé en externe - les clients Ethereum exécutent des transactions de bloc vérifiées pour déterminer quels contrats intelligents doivent être exécutés et dans quel ordre. En ce sens, l’ordinateur mondial Ethereum est mono-fil (d’exécution), comme JavaScript. L’EVM n’a pas non plus de gestion "d’interface système" ou de "support matériel" - il n’y a pas de machine physique avec laquelle s’interfacer. L’ordinateur mondial Ethereum est entièrement virtuel.</p>
</div>
</div>
<div class="sect3">
<h4 id="evm_bytecode_overview">Le jeu d’instructions EVM (opérations de code intermédiaire)</h4>
<div class="paragraph">
<p>Le jeu d’instructions EVM offre la plupart des opérations que l’on peut s’attendre, y compris :</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Opérations arithmétiques et logiques au niveau du bit</p>
</li>
<li>
<p>Enquêtes sur le contexte d’exécution</p>
</li>
<li>
<p>Accès à la pile, à la mémoire et au stockage</p>
</li>
<li>
<p>Contrôler les opérations de flux</p>
</li>
<li>
<p>Journalisation, appels et autres opérateurs</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>En plus des opérations de code intermédiaire typiques, l’EVM a également accès aux informations de compte (par exemple, l’adresse et le solde) et aux informations de bloc (par exemple, le numéro de bloc et le prix actuel du gaz).</p>
</div>
<div class="paragraph">
<p>Commençons notre exploration de l’EVM plus en détail en examinant les opcodes disponibles et ce qu’ils font. Comme vous pouvez vous y attendre, tous les opérandes sont extraits de la pile et le résultat (le cas échéant) est souvent
remis sur le dessus de la pile.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
<div class="paragraph">
<p>Une liste complète des opcodes et leur coût de gaz correspondant peut être trouvée dans <a href="#evm_opcodes">[evm_opcodes]</a>.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Les opcodes disponibles peuvent être divisés dans les catégories suivantes :</p>
</div>
<div id="arithmetic_opcodes" class="dlist">
<dl>
<dt class="hdlist1">Opérations arithmétiques</dt>
<dd>
<p>Instructions d’opcode arithmétique :</p>
<div class="listingblock">
<div class="content">
<pre>ADD // Ajouter les deux premiers éléments de la pile
MUL // Multiplier les deux premiers éléments de la pile
SUB // Soustraire les deux premiers éléments de la pile
DIV // Division entière
SDIV // Division d'entier signé
MOD // Opération modulo (reste)
SMOD // Opération modulo signée
ADDMOD // Addition modulo n'importe quel nombre
MULMOD // Multiplication modulo n'importe quel nombre
EXP // Opération exponentielle
SIGNEXTEND // Étend la longueur d'un entier signé complément à deux
SHA3 // Calcule le hachage Keccak-256 d'un bloc de mémoire</pre>
</div>
</div>
<div class="paragraph">
<p>Notez que toute l’arithmétique est effectuée modulo 2<sup>256</sup> (sauf indication contraire) et que la puissance zéro de zéro, 0<sup>0</sup>, est considérée comme égale à 1.</p>
</div>
</dd>
</dl>
</div>
<div id="stack_opcodes" class="dlist">
<dl>
<dt class="hdlist1">Opérations de pile</dt>
<dd>
<p>Instructions de gestion de la pile, de la mémoire et du stockage :</p>
<div class="listingblock">
<div class="content">
<pre>POP // Supprime l'élément du haut de la pile
MLOAD // Charger un mot machine de la mémoire
MSTORE // Enregistre un mot machine en mémoire
MSTORE8 // Enregistre un octet en mémoire
SLOAD // Charger un mot machine depuis le stockage
SSTORE // Enregistrer un mot machine dans le stockage
MSIZE // Récupère la taille de la mémoire active en octets
PUSHx // Place l'élément x octet sur la pile, où x peut être n'importe quel entier de
// 1 à 32 (mot machine complet) inclus
DUPx // Dupliquer le x-ième élément de la pile, où x peut être n'importe quel entier de
// 1 à 16 inclus
SWAPx // Échangez les 1er et (x+1)-ème éléments de la pile, où x peut être n'importe quel
// entier de 1 à 16 inclus</pre>
</div>
</div>
</dd>
</dl>
</div>
<div id="flow_opcodes" class="dlist">
<dl>
<dt class="hdlist1">Opérations de flux de processus</dt>
<dd>
<p>Instructions pour le flux de contrôle :</p>
<div class="listingblock">
<div class="content">
<pre>STOP // Arrête l'exécution
JUMP // Mettre le compteur de programme à n'importe quelle valeur
JUMPI // Modifier conditionnellement le compteur de programme
PC // Récupérer la valeur du compteur de programme (avant l'incrément
// correspondant à cette instruction)
JUMPDEST // Marquer une destination valide pour les sauts</pre>
</div>
</div>
</dd>
</dl>
</div>
<div id="system_opcodes" class="dlist">
<dl>
<dt class="hdlist1">Opérations système</dt>
<dd>
<p>Opcodes pour le système exécutant le programme :</p>
<div class="listingblock">
<div class="content">
<pre>LOGx // Ajouter un enregistrement de journal avec x sujets, où x est n'importe quel entier
// de 0 à 4 inclus
CREATE // Créer un nouveau compte avec le code associé
CALL // Message-appel dans un autre compte, c'est-à-dire exécuter un autre
// code du compte
CALLCODE // Message-appel dans ce compte avec un autre
// code du compte
RETURN // Arrête l'exécution et renvoie les données de sortie
DELEGATECALL // Message-appel dans ce compte avec une alternative
// code du compte, mais en conservant les valeurs actuelles pour
// sender et value
STATICCALL // Message-appel statique dans un compte
REVERT // Arrête l'exécution, annule les changements d'état mais retourne
// des données et le gaz restant
INVALID // L'instruction invalide désignée
SELFDESTRUCT // Arrête l'exécution et enregistre le compte pour suppression</pre>
</div>
</div>
</dd>
</dl>
</div>
<div id="logic_opcides" class="dlist">
<dl>
<dt class="hdlist1">Opérations logiques</dt>
<dd>
<p>Opcodes pour les comparaisons et la logique au niveau du bit :</p>
<div class="listingblock">
<div class="content">
<pre>LT // Comparaison inférieure à
GT // Comparaison supérieure à
SLT // Comparaison inférieure signée
SGT // Comparaison supérieure signée
EQ // Comparaison d'égalité
ISZERO // Opérateur NOT simple
AND // Opération AND au niveau du bit
OR // Opération OR au niveau du bit
XOR // Opération XOR au niveau du bit
NOT // Opération NOT au niveau du bit
BYTE // Récupérer un seul octet d'un mot pleine largeur de 256 bits</pre>
</div>
</div>
</dd>
</dl>
</div>
<div id="environment_opcodes" class="dlist">
<dl>
<dt class="hdlist1">Opérations environnementales</dt>
<dd>
<p>Opcodes traitant des informations sur l’environnement d’exécution :</p>
<div class="listingblock">
<div class="content">
<pre>GAZ // Obtenir la quantité de gaz disponible (après la réduction pour
// cette instruction)
ADRESSE // Obtenir l'adresse du compte en cours d'exécution
SOLDE // Obtenir le solde du compte d'un compte donné
ORIGIN // Obtenir l'adresse de l'EOA qui a lancé cette
// éxecution EVM
APPELANT // Obtenir l'adresse de l'appelant immédiatement responsable
// pour cette exécution
CALLVALUE // Obtenir le montant en ether déposé par l'appelant responsable
// pour cette exécution
CALLDATALOAD // Récupère les données d'entrée envoyées par l'appelant responsable de
// cette exécution
CALLDATASIZE // Récupère la taille des données d'entrée
CALLDATACOPY // Copie les données d'entrée dans la mémoire
CODESIZE // Récupère la taille du code en cours d'exécution dans l'environnement actuel
CODECOPY // Copiez le code en cours d'exécution dans l'environnement actuel vers
// la mémoire
GASPRICE // Obtenir le prix du gaz spécifié par la
// transaction d'origine
EXTCODESIZE // Récupère la taille du code de n'importe quel compte
EXTCODECOPY // Copie le code de n'importe quel compte en mémoire
RETURNDATASIZE // Récupère la taille des données de sortie de l'appel précédent
// dans l'environnement actuel
RETURNDATACOPY // Copie la sortie des données de l'appel précédent dans la mémoire</pre>
</div>
</div>
</dd>
</dl>
</div>
<div id="block_opcodes" class="dlist">
<dl>
<dt class="hdlist1">Opérations sur les blocs</dt>
<dd>
<p>Opcodes pour accéder aux informations sur le bloc actuel :</p>
<div class="listingblock">
<div class="content">
<pre>BLOCKHASH // Obtenir le hachage de l'un des 256 derniers
// blocs complétés
COINBASE // Obtenir l'adresse du bénéficiaire du bloc pour la récompense du bloc
TIMESTAMP // Récupère l'horodatage du bloc
NUMBER // Récupère le numéro du bloc
DIFFICULTY // Obtenir la difficulté du bloc
GASLIMIT // Récupère la limite de gaz du bloc</pre>
</div>
</div>
</dd>
</dl>
</div>
</div>
<div class="sect3">
<h4 id="evm_state_descriptions">État Ethereum</h4>
<div class="paragraph">
<p>Le travail de l’EVM consiste à mettre à jour l’état Ethereum en calculant des transitions d’état valides à la suite de l’exécution du code de contrat intelligent, tel que défini par le protocole Ethereum. Cet aspect conduit à la description d’Ethereum comme une <em>machine à états basée sur les transactions</em>, qui reflète le fait que des acteurs externes (c’est-à-dire les titulaires de compte et les mineurs) initient des transitions d’état en créant, acceptant et ordonnant des transactions. Il est utile à ce stade de considérer ce qui constitue l’état Ethereum.</p>
</div>
<div class="paragraph">
<p>Au niveau supérieur, nous avons l’état <em>mondial</em> d’Ethereum. L’état mondial est un mappage des adresses Ethereum (valeurs 160 bits) vers des <em>comptes</em>. Au niveau inférieur, chaque adresse Ethereum représente un compte comprenant un <em>solde</em> d’ether (stocké comme le nombre de wei détenu par le compte), un <em>nonce</em> (représentant le nombre de transactions envoyées avec succès depuis ce compte s’il s’agit d’un EOA, ou le nombre de contrats créés par celui-ci s’il s’agit d’un compte contractuel), le <em>stockage</em> du compte (qui est une donnée permanente store, utilisé uniquement par les contrats intelligents) et le <em>code programme</em> du compte (encore une fois, uniquement si le compte est un compte de contrat intelligent). Un EOA n’aura toujours aucun code et un stockage vide.</p>
</div>
<div class="paragraph">
<p>Lorsqu’une transaction entraîne l’exécution d’un code de contrat intelligent, une EVM est instanciée avec toutes les informations requises par rapport au bloc en cours de création et à la transaction spécifique en cours de traitement. En particulier, la ROM de code de programme de l’EVM est chargée avec le code du compte de contrat appelé, le compteur de programme est mis à zéro, la mémoire est chargée à partir de la mémoire du compte de contrat, la mémoire est mise à zéro, et tout le bloc et les variables d’environnement sont définies. Une variable clé est l’approvisionnement en gaz pour cette exécution, qui est fixé à la quantité de gaz payée par l’expéditeur au début de la transaction (voir <a href="#gas">Gaz</a> pour plus de détails). Au fur et à mesure de l’exécution du code, l’alimentation en gaz est réduite en fonction du coût en gaz des opérations exécutées. Si, à un moment quelconque, l’alimentation en gaz est réduite à zéro, nous obtenons une exception "Out of Gas" (OOG) ; l’exécution s’arrête immédiatement et la transaction est abandonnée. Aucune modification de l’état d’Ethereum n’est appliquée, à l’exception du nonce de l’expéditeur qui est incrémenté et de son solde d’ether qui diminue pour payer le bénéficiaire du bloc pour les ressources utilisées pour exécuter le code jusqu’au point d’arrêt. À ce stade, vous pouvez penser à l’EVM s’exécutant sur une copie en bac à sable de l’état mondial d’Ethereum, cette version en bac à sable étant complètement supprimée si l’exécution ne peut pas se terminer pour une raison quelconque. Cependant, si l’exécution réussit, l’état réel est mis à jour pour correspondre à la version en bac à sable, y compris toute modification des données de stockage du contrat appelé, tout nouveau contrat créé et tout transfert de solde d’ether initié.</p>
</div>
<div class="paragraph">
<p>Notez que, comme un contrat intelligent peut lui-même initier efficacement des transactions, l’exécution de code est un processus récursif. Un contrat peut appeler d’autres contrats, chaque appel entraînant l’instanciation d’un autre EVM autour de la nouvelle cible de l’appel. Chaque instanciation a son état mondial de bac à sable initialisé à partir du bac à sable de l’EVM au niveau supérieur. Chaque instanciation reçoit également une quantité spécifiée de gaz pour son alimentation en gaz (n’excédant pas la quantité de gaz restant dans le niveau supérieur, bien sûr), et peut donc elle-même s’arrêter à une exception près en raison du manque de gaz pour terminer son exécution . Encore une fois, dans de tels cas, l’état du bac à sable est ignoré et l’exécution revient à l’EVM au niveau supérieur.</p>
</div>
</div>
<div class="sect3">
<h4 id="compiling_solidity_to_evm">Compilation de Solidity en code intermédiaire EVM</h4>
<div id="solc_help" class="paragraph">
<p>La compilation un fichier source Solidity en code intermédiaire EVM peut être réalisé via plusieurs méthodes. Dans <a href="#intro_chapter">[intro_chapter]</a> nous avons utilisé le compilateur Remix en ligne. Dans ce chapitre, nous utiliserons l’exécutable solc en ligne de commande. Pour une liste d’options, exécutez la <span class="keep-together">commande</span> suivante :</p>
</div>
<pre data-type="programlisting">
$ <strong>solc --help</strong>
</pre>
<div id="solc_opcodes_option" class="paragraph">
<p>La génération du flux d’opcode brut d’un fichier source Solidity est facilement réalisée avec l’option de ligne de commande <code>--opcodes</code>. Ce flux d’opcode laisse de côté certaines informations (l’option --asm produit les informations complètes), mais c’est suffisant pour cette discussion. Par exemple, la compilation d’un exemple de fichier Solidity, <em>Example.sol</em>, et l’envoi de la sortie de l’opcode dans un répertoire nommé <em>BytecodeDir</em> s’effectuent avec la commande suivante :</p>
</div>
<pre data-type="programlisting">
$ <strong>solc -o BytecodeDir --opcodes Example.sol</strong>
</pre>
<div class="paragraph">
<p>ou alors:</p>
</div>
<pre data-type="programlisting">
$ <strong>solc -o BytecodeDir --asm Example.sol</strong>
</pre>
<div id="solc_bin_option" class="paragraph">
<p>La commande suivante produira le code intermédiaire binaire pour notre exemple de programme :</p>
</div>
<pre data-type="programlisting">
$ <strong>solc -o BytecodeDir --bin Example.sol</strong>
</pre>
<div class="paragraph">
<p>Les fichiers d’opcode de sortie générés dépendront des contrats spécifiques contenus dans le fichier source Solidity. Notre fichier Solidity simple <em>Example.sol</em> n’a qu’un seul contrat, nommé example :</p>
</div>
<div id="simple_solidity_example" class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-solidity" data-lang="solidity">pragma solidity ^0.4.19;
contract example {
address contractOwner;
function example() {
contractOwner = msg.sender;
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Comme vous pouvez le voir, ce contrat ne contient qu’une seule variable d’état persistante, qui est définie comme l’adresse du dernier compte pour exécuter ce contrat.</p>
</div>
<div class="paragraph">
<p>Si vous regardez dans le répertoire <em>BytecodeDir</em>, vous verrez le fichier d’opcode <em>example.opcode</em>, qui contient les instructions d’opcode EVM du contrat <code>example</code>. L’ouverture du fichier <em>example.opcode</em> dans un éditeur de texte affichera ce qui suit :</p>
</div>
<div id="opcode_output" class="listingblock">
<div class="content">
<pre>PUSH1 0x60 PUSH1 0x40 MSTORE CALLVALUE ISZERO PUSH1 0xE JUMPI PUSH1 0x0 DUP1
REVERT JUMPDEST CALLER PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1
0x35 DUP1 PUSH1 0x5B PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x60 PUSH1
0x40 MSTORE PUSH1 0x0 DUP1 REVERT STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 JUMP
0xb9 SWAP14 0xcb 0x1e 0xdd RETURNDATACOPY 0xec 0xe0 0x1f 0x27 0xc9 PUSH5
0x9C5ABCC14A NUMBER 0x5e INVALID EXTCODESIZE 0xdb 0xcf EXTCODESIZE 0x27
EXTCODESIZE 0xe2 0xb8 SWAP10 0xed 0x</pre>
</div>
</div>
<div class="paragraph">
<p>Compiler l’exemple avec l’option --asm produit un fichier nommé <em>example.evm</em> dans notre répertoire <em>BytecodeDir</em>. Celui-ci contient une description de niveau légèrement supérieur des instructions du code intermédiaire EVM, ainsi que quelques annotations utiles :</p>
</div>
<div id="asm_output" class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-solidity" data-lang="solidity">/* "Example.sol":26:132 contract example {... */
mstore(0x40, 0x60)
/* "Example.sol":74:130 function example() {... */
jumpi(tag_1, iszero(callvalue))
0x0
dup1
revert
tag_1:
/* "Example.sol":115:125 msg.sender */
caller
/* "Example.sol":99:112 contractOwner */
0x0
dup1
/* "Example.sol":99:125 contractOwner = msg.sender */
0x100
exp
dup2
sload
dup2
0xffffffffffffffffffffffffffffffffffffffff
mul
not
and
swap1
dup4
0xffffffffffffffffffffffffffffffffffffffff
and
mul
or
swap1
sstore
pop
/* "Example.sol":26:132 contract example {... */
dataSize(sub_0)
dup1
dataOffset(sub_0)
0x0
codecopy
0x0
return
stop
sub_0: assembly {
/* "Example.sol":26:132 contract example {... */
mstore(0x40, 0x60)
0x0
dup1
revert
auxdata: 0xa165627a7a7230582056b99dcb1edd3eece01f27c9649c5abcc14a435efe3b...
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>The --bin-runtime option produces the machine-readable hexadecimal bytecode:</p>
</div>
<div id="bin_output" class="listingblock">
<div class="content">
<pre>60606040523415600e57600080fd5b336000806101000a81548173
ffffffffffffffffffffffffffffffffffffffff
021916908373
ffffffffffffffffffffffffffffffffffffffff
160217905550603580605b6000396000f3006060604052600080fd00a165627a7a7230582056b...</pre>
</div>
</div>
<div class="paragraph">
<p>Vous pouvez enquêter sur ce qui se passe ici en détail en utilisant la liste des opcodes donnée dans <a href="#evm_bytecode_overview">Le jeu d’instructions EVM (opérations de code intermédiaire)</a>. Cependant, c’est toute une tâche, alors commençons par examiner les quatre premières instructions :</p>
</div>
<div id="opcode_analysis_1" class="listingblock">
<div class="content">
<pre>PUSH1 0x60 PUSH1 0x40 MSTORE CALLVALUE</pre>
</div>
</div>
<div class="paragraph">
<p>Ici, nous avons PUSH1 suivi d’un octet brut de valeur <code>0x60</code>. Cette instruction EVM prend l’octet unique suivant l’opcode dans le code du programme (en tant que valeur littérale) et le pousse sur la pile. Il est possible de pousser des valeurs de taille jusqu’à 32 octets sur la pile, comme dans :</p>
</div>
<div class="listingblock">
<div class="content">
<pre>PUSH32 0x436f6e67726174756c6174696f6e732120536f6f6e20746f206d617374657221</pre>
</div>
</div>
<div class="paragraph">
<p>Le deuxième opcode PUSH1 de <em>example.opcode</em> stocke 0x40 en haut de la pile (en poussant le 0x60 déjà présent d’un emplacement vers le bas).</p>
</div>
<div class="paragraph">
<p>Vient ensuite <code>MSTORE</code>, qui est une opération de stockage en mémoire qui enregistre une valeur dans la mémoire de l’EVM. Il prend deux arguments et, comme la plupart des opérations EVM, les obtient de la pile. Pour chaque argument, la pile est “poppée” (popped) c’est-à-dire que la valeur supérieure de la pile est retirée et toutes les autres valeurs de la pile sont décalées d’une position. Le premier argument de MSTORE est l’adresse du mot en mémoire où sera mise la valeur à sauvegarder. Pour ce programme, nous avons 0x40 en haut de la pile, de sorte qu’il est retiré de la pile et utilisé comme adresse mémoire. Le deuxième argument est la valeur à sauvegarder, qui est 0x60 ici. Après l’exécution de l’opération <code>MSTORE</code>, notre pile est à nouveau vide, mais nous avons la valeur 0x60 (96 en décimal) à l’emplacement mémoire 0x40.</p>
</div>
<div class="paragraph">
<p>L’opcode suivant est <code>CALLVALUE</code>, qui est un opcode environnemental qui pousse vers le haut de la pile la quantité d’ether (mesurée en wei) envoyée avec l’appel de message qui a initié cette exécution.</p>
</div>
<div class="paragraph">
<p>Nous pourrions continuer à parcourir ce programme de cette manière jusqu’à ce que nous ayons une compréhension complète des changements d’état de bas niveau que ce code effectue, mais cela ne nous aiderait pas à ce stade. Nous y reviendrons plus tard dans le chapitre. </p>
</div>
</div>
<div class="sect3">
<h4 id="contract_deployment_code">Code de déploiement du contrat</h4>
<div class="paragraph">
<p>Il existe une différence importante mais subtile entre le code utilisé lors de la création et du déploiement d’un nouveau contrat sur la plateforme Ethereum et le code du contrat lui-même. Afin de créer un nouveau contrat, une transaction spéciale est nécessaire dont le champ to est défini sur l’adresse spéciale 0x0 et son champ data défini sur le <em>code d’initiation</em> du contrat. Lorsqu’une telle transaction de création de contrat est traitée, le code du nouveau compte de contrat n’est <em>pas</em> le code du champ données de la transaction. Au lieu de cela, un EVM est instancié avec le code dans le champ data de la transaction chargée dans sa ROM de code de programme, puis la sortie de l’exécution de ce code de déploiement est prise comme code pour le nouveau compte de contrat. C’est ainsi que de nouveaux contrats peuvent être initialisés par programme en utilisant l’état mondial Ethereum au moment du déploiement, en définissant des valeurs dans le stockage du contrat et même en envoyant de l’ether ou en créant de nouveaux contrats.</p>
</div>
<div class="paragraph">
<p>Lors de la compilation d’un contrat hors ligne, par exemple, en utilisant solc sur la ligne de commande, vous pouvez soit obtenir le <em>code intermédiaire de déploiement</em> ou le <em>code intermédiaire d’exécution</em>.</p>
</div>
<div class="paragraph">
<p>Le code intermédiaire de déploiement est utilisé pour chaque aspect de l’initialisation d’un nouveau compte de contrat, y compris le code intermédiaire qui finira par être exécuté lorsque les transactions appelleront ce nouveau contrat (c’est-à-dire le code intermédiaire d’exécution) et le code pour tout initialiser en fonction du constructeur du contrat.</p>
</div>
<div class="paragraph">
<p>Le code intermédiaire d’exécution, en revanche, est exactement le code intermédiaire qui finit par être exécuté lorsque le nouveau contrat est appelé, et rien de plus ; il n’inclut pas le code intermédiaire nécessaire pour initialiser le contrat lors du déploiement.</p>
</div>
<div class="paragraph">
<p>Prenons comme exemple le simple contrat <em>Faucet.sol</em> que nous avons créé précédemment :</p>
</div>
<div id="faucet_example" class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-solidity" data-lang="solidity">// Version du compilateur Solidity pour lequel ce programme a été écrit
pragma solidity ^0.4.19;
// Notre premier contrat est un robinet !
contract Faucet {
// Donnez de l'ether à 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);
}
// Accepte tout montant entrant
function () external payable {}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Pour obtenir le code intermédiaire de déploiement, nous exécuterions <code>solc --bin Faucet.sol</code>. Si nous voulions plutôt uniquement le code intermédiaire d’exécution, nous exécuterions <code>solc --bin-runtime <span class="keep-together">Faucet.sol</span></code>.</p>
</div>
<div class="paragraph">
<p>Si vous comparez la sortie de ces commandes, vous verrez que le code intermédiaire d’exécution est un sous-ensemble du code intermédiaire de déploiement. En d’autres termes, le code intermédiaire d’exécution est entièrement contenu dans le code intermédiaire de déploiement.</p>
</div>
</div>
<div class="sect3">
<h4 id="disassembling_the_bytecode">Désassemblage du code intermédiaire</h4>
<div class="paragraph">
<p>Le désassemblage du code intermédiaire EVM est un excellent moyen de comprendre comment le haut niveau de Solidity agit dans l’EVM. Il existe quelques désassembleurs que vous pouvez utiliser pour cela :</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="https://github.com/comaeio/porosity"><em>Porosity</em></a> est un décompilateur à source libre populaire.</p>
</li>
<li>
<p><a href="https://github.com/trailofbits/ethersplay"><em>Ethersplay</em></a> est un plug-in EVM pour Binary Ninja, un désassembleur.</p>
</li>
<li>
<p><a href="https://github.com/trailofbits/ida-evm"><em>IDA-Evm</em></a> est un plugin EVM pour IDA, un autre désassembleur.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Dans cette section, nous utiliserons le plug-in Ethersplay pour Binary Ninja et pour commencer <a href="#Faucet_disassembled">Démontage du code intermédiaire d’exécution du robinet</a>. Après avoir obtenu le code intermédiaire d’exécution de <em>Faucet.sol</em>, nous pouvons l’introduire dans Binary Ninja (après avoir chargé le plug-in Ethersplay) pour voir à quoi ressemblent les instructions EVM.</p>
</div>
<div id="Faucet_disassembled" class="imageblock">
<div class="content">
<img src="images/Faucet_disassembled.png" alt="Le code intermédiaire d’exécution de Faucet.sol a été désassemblé">
</div>
<div class="title">Figure 2. Démontage du code intermédiaire d’exécution du robinet</div>
</div>
<div class="paragraph">
<p>Lorsque vous envoyez une transaction à un contrat intelligent compatible ABI (ce que vous pouvez supposer que tous les contrats le sont), la transaction interagit d’abord avec le <em>répartiteur</em> de ce contrat intelligent. Le répartiteur lit le champ data de la transaction et envoie la partie pertinente à la fonction appropriée. Nous pouvons voir un exemple de répartiteur au début de notre code intermédiaire d’exécution <em>Faucet.sol</em> désassemblé. Après l’instruction familière <code>MSTORE</code>, nous voyons les instructions suivantes :</p>
</div>
<div id="faucet_instructions" class="listingblock">
<div class="content">
<pre>PUSH1 0x4
CALLDATASIZE
LT
PUSH1 0x3f
JUMPI</pre>
</div>
</div>
<div class="paragraph">
<p>Comme nous l’avons vu, PUSH1 0x4 place 0x4 en haut de la pile, qui est autrement vide. CALLDATASIZE obtient la taille en octets des données envoyées avec la transaction (appelée <em>calldata</em>) et pousse ce nombre sur la pile. Une fois ces opérations exécutées, la pile ressemble à ceci :</p>
</div>
<table class="tableblock frame-ends grid-all" style="width: 40%;">
<colgroup>
<col style="width: 100%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Pile</th>
</tr>
</thead>