-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
for_use_ethereumbook_06transactionstxt_fr_CA.html
1637 lines (1613 loc) · 115 KB
/
for_use_ethereumbook_06transactionstxt_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>Transactions</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="tx_chapter">Transactions</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Les transactions sont des messages signés provenant d’un compte externe, transmis par le réseau Ethereum et enregistrés sur la chaîne de blocs Ethereum. Cette définition de base cache bien des détails surprenants et fascinants. Une autre façon de voir les transactions est qu’elles sont les seules choses qui peuvent déclencher un changement d’état ou provoquer l’exécution d’un contrat dans l’EVM. Ethereum est une machine à états singleton globale, et les transactions sont ce qui fait que cette machine à états "fonctionner", qui change son état. Les contrats ne fonctionnent pas seuls. Ethereum ne fonctionne pas de manière autonome. Tout commence par une transaction.</p>
</div>
<div class="paragraph">
<p>Dans ce chapitre, nous allons disséquer les transactions, montrer leur fonctionnement et examiner les détails. Notez qu’une grande partie de ce chapitre s’adresse à ceux qui souhaitent gérer leurs propres transactions à un niveau inférieur, peut-être parce qu’ils écrivent une application de portefeuille ; vous n’avez pas à vous en soucier si vous êtes satisfait des applications de portefeuille existantes, bien que vous puissiez trouver les détails intéressants !</p>
</div>
<div class="sect2">
<h3 id="tx_struct">La structure d’une transaction</h3>
<div class="paragraph">
<p>Regardons d’abord la structure de base d’une transaction, telle qu’elle est sérialisée et transmise sur le réseau Ethereum. Chaque client et application qui reçoit une transaction sérialisée la stocke en mémoire en utilisant sa propre structure de données interne, éventuellement agrémentée de métadonnées qui n’existent pas dans la transaction sérialisée du réseau elle-même. La sérialisation réseau est la seule forme standard d’une transaction.</p>
</div>
<div class="paragraph">
<p>Une transaction est un message binaire sérialisé qui contient les données suivantes :</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Nonce</dt>
<dd>
<p>Un numéro de séquence, émis par l’EOA d’origine, utilisé pour empêcher la relecture du message</p>
</dd>
<dt class="hdlist1">Prix du gaz</dt>
<dd>
<p>Le prix du gaz (en wei) que le donneur d’ordre est prêt à payer</p>
</dd>
<dt class="hdlist1">Limite de gaz</dt>
<dd>
<p>La quantité maximale de gaz que l’initiateur est prêt à acheter pour cette transaction</p>
</dd>
<dt class="hdlist1">Destinataire</dt>
<dd>
<p>L’adresse Ethereum de destination</p>
</dd>
<dt class="hdlist1">Valeur</dt>
<dd>
<p>La quantité d’ether à envoyer à la destination</p>
</dd>
<dt class="hdlist1">Données</dt>
<dd>
<p>La charge utile de données binaires de longueur variable</p>
</dd>
<dt class="hdlist1">v,r,s</dt>
<dd>
<p>Les trois composants d’une signature numérique ECDSA de l’EOA d’origine</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>La structure du message de transaction est sérialisée à l’aide du schéma de codage Recursive Length Prefix (RLP) (ou Préfixe de longueur récursif), qui a été créé spécifiquement pour sérialisation de données simple et parfaite dans Ethereum. Tous les nombres dans Ethereum sont codés sous forme d’entiers gros-boutiste, de longueurs multiples de 8 bits.</p>
</div>
<div class="paragraph">
<p>Notez que les étiquettes de champ (<code>to</code>, gas limit, etc.) sont affichées ici pour plus de clarté, mais ne font pas partie des données sérialisées de la transaction, qui contiennent les valeurs de champ codées RLP. En général, RLP ne contient aucun délimiteur de champ ou étiquette. Le préfixe de longueur de RLP est utilisé pour identifier la longueur de chaque champ. Tout ce qui dépasse la longueur définie appartient au champ suivant dans la structure.</p>
</div>
<div class="paragraph">
<p>Bien qu’il s’agisse de la structure de transaction réelle transmise, la plupart des représentations internes et des visualisations d’interface utilisateur l’agrémentent d’informations supplémentaires, dérivées de la transaction ou de la chaîne de blocs.</p>
</div>
<div class="paragraph">
<p>Par exemple, vous remarquerez peut-être qu’il n’y a pas de données "from" dans l’adresse identifiant l’EOA d’origine. En effet, la clé publique de l’EOA peut être dérivée des composants v,r,s de la signature ECDSA. L’adresse peut, à son tour, être dérivée de la clé publique. Lorsque vous voyez une transaction affichant un champ "from", qui a été ajouté par le logiciel utilisé pour visualiser la transaction. D’autres métadonnées fréquemment ajoutées à la transaction par le logiciel client incluent le numéro de bloc (une fois extrait et inclus dans la chaîne de blocs) et un ID de transaction (hachage calculé). Encore une fois, ces données sont dérivées de la transaction et ne font pas partie du message de transaction lui-même.</p>
</div>
</div>
<div class="sect2">
<h3 id="tx_nonce">Le Nonce de transaction</h3>
<div class="paragraph">
<p>Le nonce est l’un des composants les plus importants et les moins compris d’une transaction. La définition du Livre jaune (voir <a href="#references">[references]</a>) lit :</p>
</div>
<div class="quoteblock">
<blockquote>
<div class="paragraph">
<p>nonce : Une valeur scalaire égale au nombre de transactions émises depuis cette adresse ou, dans le cas de comptes avec code associé, au nombre de créations de contrats effectuées par ce compte.</p>
</div>
</blockquote>
</div>
<div class="paragraph">
<p>À proprement parler, le nonce est un attribut de l’adresse d’origine ; c’est-à-dire qu’il n’a de sens que dans le contexte de l’adresse d’envoi. Cependant, le nonce n’est pas stocké explicitement dans le cadre de l’état d’un compte sur la chaîne de blocs. Au lieu de cela, il est calculé dynamiquement, en comptant le nombre de transactions confirmées provenant d’une adresse.</p>
</div>
<div class="paragraph">
<p>Il existe deux scénarios dans lesquels l’existence d’un nonce de comptage des transactions est importante : la fonctionnalité d’utilisabilité des transactions incluses dans l’ordre de création et la fonctionnalité vitale de la protection contre la duplication des transactions. Regardons un exemple de scénario pour chacun d’entre eux :</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Imaginez que vous souhaitiez effectuer deux transactions. Vous avez un paiement important à effectuer de 6 ethers, et aussi un autre paiement de 8 ethers. Vous signez et diffusez d’abord la transaction à 6 ethers, car c’est la plus importante, puis vous signez et diffusez la deuxième transaction à 8 ethers. Malheureusement, vous avez oublié le fait que votre compte ne contient que 10 ethers, donc le réseau ne peut pas accepter les deux transactions : l’une d’entre elles échouera. Parce que vous avez envoyé le 6-ether le plus important en premier, vous vous attendez naturellement à ce que celui-ci passe et que le 8-ether soit rejeté. Cependant, dans un système décentralisé comme Ethereum, les nœuds peuvent recevoir les transactions dans n’importe quel ordre ; il n’y a aucune garantie qu’un nœud particulier aura une transaction qui lui sera propagée avant l’autre. En tant que tel, il sera presque certainement le cas que certains nœuds reçoivent la transaction à 6 ethers en premier et que d’autres reçoivent la transaction à 8 ethers en premier. Sans le nonce, il serait aléatoire de savoir lequel est accepté et lequel est rejeté. Cependant, avec le nonce inclus, la première transaction que vous avez envoyée aura un nonce de, disons, 3, tandis que la transaction 8-ether a la valeur de nonce suivante (c’est-à-dire 4). Ainsi, cette transaction sera ignorée jusqu’à ce que les transactions avec des nonces de 0 à 3 aient été traitées, même si elle est reçue en premier. Phew!</p>
</li>
<li>
<p>Imaginez maintenant que vous avez un compte avec 100 ethers. Fantastique ! Vous trouvez quelqu’un en ligne qui acceptera le paiement en ether pour un mcguffin-widget que vous voulez vraiment acheter. Vous leur envoyez 2 ethers et ils vous envoient le widget mcguffin. Beau. Pour effectuer ce paiement à 2 ethers, vous avez signé une transaction en envoyant 2 ethers de votre compte à leur compte, puis vous les avez diffusés sur le réseau Ethereum pour qu’ils soient vérifiés et inclus dans la chaîne de blocs. Maintenant, sans valeur nonce dans la transaction, une seconde transaction envoyant 2 ethers à la même adresse une seconde fois aura exactement la même apparence que la première transaction. Cela signifie que toute personne qui voit votre transaction sur le réseau Ethereum (ce qui signifie que tout le monde, y compris le destinataire ou vos ennemis) peut "rejouer" la transaction encore et encore et encore jusqu’à ce que tout votre ether soit parti simplement en copiant et collant votre transaction d’origine et le renvoyer sur le réseau. Cependant, avec la valeur nonce incluse dans les données de transaction, <em>chaque transaction est unique</em>, même lors de l’envoi de la même quantité d’ether à la même adresse de destinataire plusieurs fois. Ainsi, en ayant le nonce incrémenté dans le cadre de la transaction, il n’est tout simplement pas possible pour quiconque de "dupliquer" un paiement que vous avez effectué.</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>En résumé, il est important de noter que l’utilisation du nonce est en fait vitale pour un protocole <em>basé sur le compte</em>, contrairement au mécanisme "Unspent Transaction Output" (UTXO) du protocole Bitcoin.</p>
</div>
<div class="sect3">
<h4 id="tracking_nonce">Garder une trace des Nonces</h4>
<div class="paragraph">
<p>En termes pratiques, le nonce est un décompte à jour du nombre de transactions <em>confirmées</em> (c’est-à-dire en chaîne) provenant d’un compte. Pour savoir ce qu’est le nonce, vous pouvez interroger la chaîne de blocs, par exemple via l’interface web3. Ouvrez une console JavaScript dans Geth (ou votre interface web3 préférée) sur Ropsten testnet, puis tapez :</p>
</div>
<pre data-type="programlisting">
> <strong>web3.eth.getTransactionCount("0x9e713963a92c02317a681b9bb3065a8249de124f")</strong>
40
</pre>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
<div class="paragraph">
<p>Le nonce est un compteur basé sur zéro, ce qui signifie que la première transaction a le nonce 0. Dans cet exemple, nous avons un nombre de transactions de 40, ce qui signifie que les nonces 0 à 39 ont été vus. Le nonce de la prochaine transaction devra être de 40.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Votre portefeuille gardera une trace des nonces pour chaque adresse qu’il gère. C’est assez simple à faire, tant que vous n’effectuez des transactions qu’à partir d’un seul point. Disons que vous écrivez votre propre logiciel de portefeuille ou une autre application qui génère des transactions. Comment suivre les nonces ?</p>
</div>
<div class="paragraph">
<p>Lorsque vous créez une nouvelle transaction, vous affectez le nonce suivant dans la séquence. Mais jusqu’à ce qu’il soit confirmé, il ne comptera pas dans le total getTransactionCount.</p>
</div>
<div id="get_tx_count_bug" class="admonitionblock warning">
<table>
<tr>
<td class="icon">
<div class="title">Warning</div>
</td>
<td class="content">
<div class="paragraph">
<p>Soyez prudent lorsque vous utilisez la fonction getTransactionCount pour compter les transactions en attente, car vous pourriez rencontrer des problèmes si vous envoyez quelques transactions à la suite.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Regardons un exemple :</p>
</div>
<pre data-type="programlisting">
> <strong>web3.eth.getTransactionCount("0x9e713963a92c02317a681b9bb3065a8249de124f", \
"pending")</strong>
40
> <strong>web3.eth.sendTransaction({from: web3.eth.accounts[0], to: \
"0xB0920c523d582040f2BCB1bD7FB1c7C1ECEbdB34", value: web3.utils.toWei(0.01, "ether")});</strong>
> <strong>web3.eth.getTransactionCount("0x9e713963a92c02317a681b9bb3065a8249de124f", \
"pending")</strong>
41
> <strong>web3.eth.sendTransaction({from: web3.eth.accounts[0], to: \
"0xB0920c523d582040f2BCB1bD7FB1c7C1ECEbdB34", value: web3.utils.toWei(0.01, "ether")});</strong>
> <strong>web3.eth.getTransactionCount("0x9e713963a92c02317a681b9bb3065a8249de124f", \
"pending")</strong>
41
> <strong>web3.eth.sendTransaction({from: web3.eth.accounts[0], to: \
"0xB0920c523d582040f2BCB1bD7FB1c7C1ECEbdB34", value: web3.utils.toWei(0.01, "ether")});</strong>
> <strong>web3.eth.getTransactionCount("0x9e713963a92c02317a681b9bb3065a8249de124f", \
"pending")</strong>
41
</pre>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
<div class="paragraph">
<p>Si vous essayez de recréer vous-même ces exemples de code dans la console javascript de Geth, vous devez utiliser web3.toWei() au lieu de web3.utils.toWei(). En effet, Geth utilise une ancienne version de la bibliothèque web3.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Comme vous pouvez le voir, la première transaction que nous avons envoyée a augmenté le nombre de transactions à 41, indiquant la transaction en attente. Mais lorsque nous avons envoyé trois autres transactions en succession rapide, l’appel getTransactionCount ne les a pas comptées. Il n’en comptait qu’un, même si vous vous attendiez à ce qu’il y en ait trois en attente dans le mempool. Si nous attendons quelques secondes pour permettre aux communications réseau de s’établir, l’appel getTransactionCount renverra le nombre attendu. Mais dans l’intervalle, bien qu’il y ait plus d’une transaction en attente, cela pourrait ne pas nous aider.</p>
</div>
<div class="paragraph">
<p>Lorsque vous construisez une application qui construit des transactions, elle ne peut pas s’appuyer sur <span class="keep-together"><code>getTransactionCount</code></span> pour les transactions en attente. Ce n’est que lorsque les nombres en attente et confirmés sont égaux (toutes les transactions en attente sont confirmées) que vous pouvez faire confiance à la sortie de getTransactionCount pour démarrer votre compteur de nonce. Par la suite, gardez une trace du nonce dans votre application jusqu’à ce que chaque transaction soit confirmée.</p>
</div>
<div class="paragraph">
<p>L’interface JSON RPC de Parity propose la fonction <code>parity_nextNonce</code>, qui renvoie le prochain nonce à utiliser dans une transaction. La fonction parity_nextNonce compte correctement les nonces, même si vous construisez plusieurs transactions en succession rapide sans les confirmer :</p>
</div>
<pre data-type="programlisting">
$ <strong>curl --data '{"method":"parity_nextNonce", \
"params":["0x9e713963a92c02317a681b9bb3065a8249de124f"],\
"id":1,"jsonrpc":"2.0"}' -H "Content-Type: application/json" -X POST \
localhost:8545</strong>
{"jsonrpc":"2.0","result":"0x32","id":1}
</pre>
<div id="parity_curl" class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
<div class="paragraph">
<p>Parity dispose d’une console Web pour accéder à l’interface JSON RPC, mais ici nous utilisons un client HTTP en ligne de commande pour y accéder.</p>
</div>
</td>
</tr>
</table>
</div>
</div>
<div class="sect3">
<h4 id="gaps_nonce">Lacunes dans les nonces, les nonces en double et la confirmation</h4>
<div class="paragraph">
<p>Il est important de garder une trace des nonces si vous créez des transactions par programmation, surtout si vous le faites à partir de plusieurs processus indépendants <span class="keep-together">simultanément</span>.</p>
</div>
<div class="paragraph">
<p>Le réseau Ethereum traite les transactions de manière séquentielle, sur la base du nonce. Cela signifie que si vous transmettez une transaction avec nonce 0, puis transmettez une transaction avec nonce 2, la deuxième transaction ne sera incluse dans aucun bloc. Il sera stocké dans le mempool, pendant que le réseau Ethereum attend que le nonce manquant apparaisse. Tous les nœuds supposeront que le nonce manquant a simplement été retardé et que la transaction avec le nonce 2 a été reçue dans le désordre.</p>
</div>
<div class="paragraph">
<p>Si vous transmettez ensuite une transaction avec le nonce 1 manquant, les deux transactions (nonces 1 et 2) seront traitées et incluses (si elles sont valides, bien sûr). Une fois que vous avez comblé le vide, le réseau peut exploiter la transaction hors séquence qu’il a conservée dans le mempool.</p>
</div>
<div class="paragraph">
<p>Cela signifie que si vous créez plusieurs transactions en séquence et que l’une d’entre elles n’est officiellement incluse dans aucun bloc, toutes les transactions suivantes seront "bloquées", en attendant le nonce manquant. Une transaction peut créer un "écart" par inadvertance dans la séquence nonce car elle n’est pas valide ou n’a pas suffisamment de gaz. Pour que les choses bougent à nouveau, vous devez transmettre une transaction valide avec le nonce manquant. Vous devez également garder à l’esprit qu’une fois qu’une transaction avec le nonce "manquant" est validée par le réseau, toutes les transactions de diffusion avec les nonces suivants deviendront progressivement valides ; il n’est pas possible de "rappeler" une transaction !</p>
</div>
<div class="paragraph">
<p>Si, en revanche, vous dupliquez accidentellement un nonce, par exemple en transmettant deux transactions avec le même nonce mais différents destinataires ou valeurs, l’un d’entre eux sera confirmé et l’autre sera rejeté. Celui qui est confirmé sera déterminé par la séquence dans laquelle ils arrivent au premier nœud de validation qui les reçoit, c’est-à-dire que ce sera assez aléatoire.</p>
</div>
<div class="paragraph">
<p>Comme vous pouvez le constater, le suivi des nonces est nécessaire, et si votre application ne gère pas correctement ce processus, vous rencontrerez des problèmes. Malheureusement, les choses deviennent encore plus difficiles si vous essayez de le faire simultanément, comme nous le verrons dans la section suivante.</p>
</div>
</div>
<div class="sect3">
<h4 id="concurrency">Concurrence, origine des transactions et nonces</h4>
<div class="paragraph">
<p>La concurrence est un aspect complexe de l’informatique, et il apparaît parfois de manière inattendue, en particulier dans les systèmes en temps réel décentralisés et distribués comme <span class="keep-together">Ethereum</span>.</p>
</div>
<div class="paragraph">
<p>En termes simples, la concurrence est lorsque vous avez un calcul simultané par plusieurs systèmes indépendants. Ceux-ci peuvent se trouver dans le même programme (par exemple, multithreading), sur le même processeur (par exemple, multitraitement) ou sur différents ordinateurs (c’est-à-dire, <span class="keep-together">systèmes</span> distribués). Ethereum, par définition, est un système qui permet la simultanéité des opérations (nœuds, clients, DApps) mais applique un état singleton par consensus.</p>
</div>
<div class="paragraph">
<p>Maintenant, imaginez que vous ayez plusieurs applications de portefeuille indépendantes qui génèrent des transactions à partir de la ou des mêmes adresses. Un exemple d’une telle situation serait un échange traitant des retraits du portefeuille chaud de l’échange (un portefeuille dont les clés sont stockées en ligne, contrairement à un portefeuille froid où les clés ne sont jamais en ligne). Idéalement, vous voudriez avoir plus d’un ordinateur traitant les retraits, afin qu’il ne devienne pas un goulot d’étranglement ou un point de défaillance unique. Cependant, cela devient rapidement problématique, car le fait d’avoir plus d’un ordinateur produisant des retraits entraînera des problèmes épineux de concurrence, dont le moindre n’est pas la sélection des nonces. Comment plusieurs ordinateurs générant, signant et diffusant des transactions à partir du même compte du portefeuille chaud (Hot Wallet) se coordonnent-ils ?</p>
</div>
<div class="paragraph">
<p>Vous pouvez utiliser un seul ordinateur pour attribuer des nonces, selon le principe du premier arrivé, premier servi, aux ordinateurs signant des transactions. Cependant, cet ordinateur est maintenant un point de défaillance unique. Pire encore, si plusieurs nonces sont attribués et que l’un d’entre eux n’est jamais utilisé (à cause d’une défaillance de l’ordinateur traitant la transaction avec ce nonce), toutes les transactions suivantes restent bloquées.</p>
</div>
<div class="paragraph">
<p>Une autre approche serait de générer les transactions, mais de ne pas leur attribuer de nonce (et donc de les laisser non signées - rappelez-vous que le nonce fait partie intégrante des données de transaction et doit donc être inclus dans la signature numérique qui authentifie la transaction) . Vous pouvez ensuite les mettre en file d’attente sur un seul nœud qui les signe et garde également une trace des nonces. Encore une fois, cependant, ce serait un point d’étranglement dans le processus : la signature et le suivi des nonces est la partie de votre opération qui est susceptible d’être encombrée sous charge, alors que la génération de la transaction non signée est la partie que vous n’avez pas vraiment besoin de paralléliser. Vous auriez une certaine concurrence, mais il y aurait un manque dans une partie essentielle du processus.</p>
</div>
<div class="paragraph">
<p>En fin de compte, ces problèmes de simultanéité, en plus de la difficulté de suivre les soldes des comptes et les confirmations de transaction dans des processus indépendants, obligent la plupart des implémentations à éviter la simultanéité et à créer des goulots d’étranglement tels qu’un processus unique gérant toutes les transactions de retrait dans un échange, ou la mise en place de plusieurs des portefeuilles chauds qui peuvent fonctionner de manière totalement indépendante pour les retraits et ne doivent être rééquilibrés que par intermittence.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="tx_gas">Gaz de transaction</h3>
<div class="paragraph">
<p>Nous avons un peu parlé du gaz dans les chapitres précédents, et nous en discutons plus en détail dans <a href="#gas">[gas]</a>. Cependant, couvrons quelques notions de base sur le rôle des composants gasPrice et gasLimit d’une transaction.</p>
</div>
<div class="paragraph">
<p>Le gaz est le carburant d’Ethereum. Le gaz n’est pas de l’ether, c’est une monnaie virtuelle distincte avec son propre taux de change par rapport à l’ether. Ethereum utilise du gaz pour contrôler la quantité de ressources qu’une transaction peut utiliser, car elle sera traitée sur des milliers d’ordinateurs à travers le monde. Le modèle de calcul ouvert (Turing-complet) nécessite une certaine forme de mesure afin d’éviter les attaques par déni de service ou les transactions gourmandes en ressources par inadvertance.</p>
</div>
<div class="paragraph">
<p>Le gaz est séparé de l’ether afin de protéger le système de la volatilité qui pourrait survenir avec les changements rapides de la valeur de l’ether, et aussi comme moyen de gérer les rapports importants et sensibles entre les coûts des diverses ressources que le gaz paie. (à savoir, calcul, mémoire et stockage).</p>
</div>
<div class="paragraph">
<p>Le champ gasPrice dans une transaction permet à l’initiateur de la transaction de définir le prix qu’il est prêt à payer en échange de gaz. Le prix est mesuré en wei par unité de gaz. Par exemple, dans l’exemple de transaction dans <a href="#intro_chapter">[intro_chapter]</a> votre portefeuille fixe le gasPrice à 3 gwei (3 gigawei ou 3 milliards de wei).</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
<div class="paragraph">
<p>Le site populaire <a href="https://ethgasstation.info/">ETH Gas Station</a> fournit des informations sur les prix actuels du gaz et d’autres paramètres de gaz pertinents pour le réseau principal Ethereum.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Les portefeuilles peuvent ajuster le gasPrice dans les transactions qu’ils génèrent pour obtenir une confirmation plus rapide des transactions. Plus le gasPrice est élevé, plus la transaction est susceptible d’être confirmée rapidement. À l’inverse, les transactions moins prioritaires peuvent avoir un prix réduit, ce qui entraîne une confirmation plus lente. La valeur minimale à laquelle gasPrice peut être défini est zéro, ce qui signifie une transaction sans frais. Pendant les périodes de faible demande d’espace dans un bloc, de telles transactions pourraient très bien être minées.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
<div class="paragraph">
<p>Le gasPrice minimum acceptable est zéro. Cela signifie que les portefeuilles peuvent générer des transactions totalement gratuites. Selon la capacité, celles-ci peuvent ne jamais être confirmées, mais rien dans le protocole n’interdit les transactions gratuites. Vous pouvez trouver plusieurs exemples de telles transactions incluses avec succès sur la chaîne de blocs Ethereum.</p>
</div>
</td>
</tr>
</table>
</div>
<div id="gas_price_suggestion" class="paragraph">
<p>L’interface web3 propose une suggestion <code>gasPrice</code>, en calculant un prix médian sur plusieurs blocs (nous pouvons utiliser la console truffle ou n’importe quelle console web3 JavaScript pour le faire) :</p>
</div>
<pre data-type="programlisting">
> <strong>web3.eth.getGasPrice(console.log)</strong>
> null BigNumber { s: 1, e: 10, c: [ 10000000000 ] }
</pre>
<div id="calc_gas_price" class="paragraph">
<p>Le deuxième champ important lié au gaz est <code>gasLimit</code>. En termes simples, gasLimit donne le nombre maximum d’unités de gaz que l’initiateur de la transaction est prêt à acheter pour finaliser la transaction. Pour les paiements simples, c’est-à-dire les transactions qui transfèrent de l’ether d’un EOA à un autre EOA, la quantité de gaz nécessaire est fixée à 21 000 unités de gaz. Pour calculer combien d’ether cela coûtera, vous multipliez 21 000 par le gasPrice que vous êtes prêt à payer. Par example:</p>
</div>
<pre data-type="programlisting">
> <strong>web3.eth.getGasPrice(function(err, res) {console.log(res*21000)} )</strong>
> 210000000000000
</pre>
<div class="paragraph">
<p>Si l’adresse de destination de votre transaction est un contrat, la quantité de gaz nécessaire peut être estimée mais ne peut pas être déterminée avec précision. En effet, un contrat peut évaluer différentes conditions qui conduisent à différentes voies d’exécution, avec différents coûts totaux du gaz. Le contrat peut n’exécuter qu’un calcul simple ou un calcul plus complexe, selon des conditions indépendantes de votre volonté et imprévisibles. Pour le démontrer, regardons un exemple : nous pouvons écrire un contrat intelligent qui incrémente un compteur à chaque fois qu’il est appelé et exécute une boucle particulière un nombre de fois égal au nombre d’appels. Peut-être qu’au 100e appel, il distribue un prix spécial, comme une loterie, mais doit faire des calculs supplémentaires pour calculer le prix. Si vous appelez le contrat 99 fois, une chose se produit, mais au 100e appel, quelque chose de très différent se produit. La quantité de gaz que vous paieriez pour cela dépend du nombre d’autres transactions qui ont appelé cette fonction avant que votre transaction ne soit incluse dans un bloc. Peut-être que votre estimation est basée sur la 99e transaction, mais juste avant que votre transaction ne soit confirmée, quelqu’un d’autre appelle le contrat pour la 99e fois. Vous êtes maintenant la 100e transaction à appeler, et l’effort de calcul (et le coût du gaz) est beaucoup plus élevé.</p>
</div>
<div class="paragraph">
<p>Pour emprunter une analogie courante utilisée dans Ethereum, vous pouvez considérer gasLimit comme la capacité du réservoir de carburant de votre voiture (votre voiture est la transaction). Vous remplissez le réservoir avec autant d’essence que vous pensez qu’il en aura besoin pour le trajet (le calcul nécessaire pour valider votre transaction). Vous pouvez estimer le montant dans une certaine mesure, mais il peut y avoir des changements inattendus dans votre trajet, comme une déviation (un chemin d’exécution plus complexe), qui augmentent la consommation de carburant.</p>
</div>
<div class="paragraph">
<p>L’analogie avec un réservoir de carburant est cependant quelque peu trompeuse. Il s’agit en fait plus d’un compte de crédit pour une entreprise de station-service, où vous payez une fois le voyage terminé, en fonction de la quantité d’essence que vous avez réellement utilisée. Lorsque vous transmettez votre transaction, l’une des premières étapes de validation consiste à vérifier que le compte dont elle provient dispose de suffisamment d’ether pour payer la limite <code>gasPrice * gaz</code>. Mais le montant n’est pas réellement déduit de votre compte tant que la transaction n’est pas terminée. Vous n’êtes facturé que pour le gaz réellement consommé par votre transaction, mais vous devez disposer d’un solde suffisant pour le montant maximum que vous êtes prêt à payer avant d’envoyer votre transaction.</p>
</div>
</div>
<div class="sect2">
<h3 id="tx_recipient">Destinataire de la transaction</h3>
<div class="paragraph">
<p>Le destinataire d’une transaction est spécifié dans le champ <code>to</code>. Celui-ci contient une adresse Ethereum de 20 octets. L’adresse peut être une EOA ou une adresse de contrat.</p>
</div>
<div class="paragraph">
<p>Ethereum ne valide plus ce champ. Toute valeur de 20 octets est considérée comme valide. Si la valeur de 20 octets correspond à une adresse sans clé privée correspondante, ou sans contrat correspondant, la transaction est toujours valide. Ethereum n’a aucun moyen de savoir si une adresse a été correctement dérivée d’une clé publique (et donc d’une clé privée) existante.</p>
</div>
<div class="admonitionblock warning">
<table>
<tr>
<td class="icon">
<div class="title">Warning</div>
</td>
<td class="content">
<div class="paragraph">
<p>Le protocole Ethereum ne valide pas les adresses des destinataires dans les transactions. Vous pouvez envoyer à une adresse qui n’a pas de clé privée ou de contrat correspondant, "brûlant" ainsi l’ether, le rendant à jamais inutilisable. La validation doit être effectuée au niveau de l’interface utilisateur.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>L’envoi d’une transaction à la mauvaise adresse va probablement <em>brûler</em> l’ether envoyé, le rendant à jamais inaccessible (inutilisable), puisque la plupart des adresses n’ont pas de clé privée connue et donc aucune signature ne peut être générée pour le dépenser. On suppose que la validation de l’adresse se produit au niveau de l’interface utilisateur (voir <a href="#EIP55">[EIP55]</a>). En fait, il existe un certain nombre de raisons valables pour brûler de l’ether - par exemple, pour dissuader de tricher dans les canaux de paiement et autres contrats intelligents - et puisque la quantité d’ether est finie, brûler de l’ether distribue efficacement la valeur brûlée à tous les détenteurs d’ether. (proportionnellement à la quantité d’ether qu’ils contiennent).</p>
</div>
</div>
<div class="sect2">
<h3 id="tx_value_data">Valeur et données de la transaction</h3>
<div class="paragraph">
<p>La "charge utile" principale d’une transaction est contenue dans deux champs : value et <code>data</code>. Les transactions peuvent avoir à la fois une valeur et des données, uniquement une valeur, uniquement des données ou ni valeur ni données. Les quatre combinaisons sont valides.</p>
</div>
<div class="paragraph">
<p>Une transaction avec seulement une valeur est un <em>paiement</em>. Une transaction avec uniquement des données est une <em>invocation</em>. Une transaction comportant à la fois de la valeur et des données est à la fois un paiement et une invocation. Une transaction sans valeur ni données - eh bien, ce n’est probablement qu’un gaspillage de gaz ! Mais c’est encore possible.</p>
</div>
<div class="paragraph">
<p>Essayons toutes ces combinaisons. Nous allons d’abord définir les adresses source et de destination de notre portefeuille, juste pour rendre la démo plus facile à lire :</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-javascript" data-lang="javascript">src = web3.eth.accounts[0];
dst = web3.eth.accounts[1];</code></pre>
</div>
</div>
<div class="paragraph">
<p>Notre première transaction ne contient qu’une valeur (paiement) et aucune charge de données :</p>
</div>
<div id="tx_value_nodata_src" class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-javascript" data-lang="javascript">web3.eth.sendTransaction({from: src, to: dst, \
value: web3.utils.toWei(0.01, "ether"), data: ""});</code></pre>
</div>
</div>
<div class="paragraph">
<p>Notre portefeuille affiche un écran de confirmation indiquant la valeur à envoyer, comme indiqué dans <a href="#parity_txdemo_value_nodata">Portefeuille de Parity montrant une transaction avec une valeur, mais pas de données</a>.</p>
</div>
<div id="parity_txdemo_value_nodata" class="imageblock">
<div class="content">
<img src="images/parity_txdemo_value_nodata.png" alt="Portefeuille de Parity montrant une transaction avec valeur, mais pas de données">
</div>
<div class="title">Figure 1. Portefeuille de Parity montrant une transaction avec une valeur, mais pas de données</div>
</div>
<div class="paragraph">
<p>L’exemple suivant spécifie à la fois une valeur et une charge utile de données :</p>
</div>
<div id="tx_value_data_src" class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-javascript" data-lang="javascript">web3.eth.sendTransaction({from: src, to: dst, \
value: web3.utils.toWei(0.01, "ether"), data: "0x1234"});</code></pre>
</div>
</div>
<div class="paragraph">
<p>Notre portefeuille affiche un écran de confirmation indiquant la valeur à envoyer ainsi que la charge utile des données, comme indiqué dans <a href="#parity_txdemo_value_data">Portefeuille de Parity montrant une transaction avec valeur et données</a>.</p>
</div>
<div id="parity_txdemo_value_data" class="imageblock">
<div class="content">
<img src="images/parity_txdemo_value_data.png" alt="Portefeuille de Parity montrant une transaction avec valeur et données">
</div>
<div class="title">Figure 2. Portefeuille de Parity montrant une transaction avec valeur et données</div>
</div>
<div class="paragraph">
<p>La transaction suivante inclut une charge utile de données mais spécifie une valeur de zéro :</p>
</div>
<div id="tx_novalue_data_src" class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-javascript" data-lang="javascript">web3.eth.sendTransaction({from: src, to: dst, value: 0, data: "0x1234"});</code></pre>
</div>
</div>
<div class="paragraph">
<p>Notre portefeuille affiche un écran de confirmation indiquant la valeur zéro et la charge utile des données, comme indiqué dans <a href="#parity_txdemo_novalue_data">Portefeuille de Parity montrant une transaction sans valeur, uniquement des données</a>.</p>
</div>
<div id="parity_txdemo_novalue_data" class="imageblock">
<div class="content">
<img src="images/parity_txdemo_novalue_data.png" alt="Portefeuille de Parity montrant une transaction sans valeur, uniquement des données">
</div>
<div class="title">Figure 3. Portefeuille de Parity montrant une transaction sans valeur, uniquement des données</div>
</div>
<div class="paragraph pagebreak-before">
<p>Enfin, la dernière transaction n’inclut ni valeur à envoyer ni données utiles :</p>
</div>
<div id="tx_novalue_nodata_src" class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-javascript" data-lang="javascript">web3.eth.sendTransaction({from: src, to: dst, value: 0, data: ""}));</code></pre>
</div>
</div>
<div class="paragraph">
<p>Notre portefeuille affiche un écran de confirmation indiquant la valeur zéro, comme indiqué dans <a href="#parity_txdemo_novalue_nodata">Portefeuille de Parity montrant une transaction sans valeur et sans données</a>.</p>
</div>
<div id="parity_txdemo_novalue_nodata" class="imageblock">
<div class="content">
<img src="images/parity_txdemo_novalue_nodata.png" alt="Portefeuille de Parity montrant une transaction sans valeur et sans données">
</div>
<div class="title">Figure 4. Portefeuille de Parity montrant une transaction sans valeur et sans données</div>
</div>
<div class="sect3">
<h4 id="value_EOA_contracts">Transmettre de la valeur aux EOA et aux contrats</h4>
<div class="paragraph">
<p>Lorsque vous construisez une transaction Ethereum qui contient une valeur, c’est l’équivalent d’un <em>paiement</em>. Ces transactions se comportent différemment selon que l’adresse de destination est un contrat ou non.</p>
</div>
<div class="paragraph">
<p>Pour les adresses EOA, ou plutôt pour toute adresse qui n’est pas signalée comme un contrat sur la chaîne de blocs, Ethereum enregistrera un changement d’état, ajoutant la valeur que vous avez envoyée au solde de l’adresse. Si l’adresse n’a pas été vue auparavant, elle sera ajoutée à la représentation interne de l’état du client et son solde initialisé à la valeur de votre paiement.</p>
</div>
<div class="paragraph">
<p>Si l’adresse de destination (<code>to</code>)est un contrat, alors l’EVM exécutera le contrat et tentera d’appeler la fonction nommée dans la charge utile de données de votre transaction. S’il n’y a pas de données dans votre transaction, l’EVM appellera une fonction <em>fallback</em> (ou fonction de repli ou par défaut) et, si cette fonction est payante, l’exécutera pour déterminer ce qu’il faut faire ensuite. S’il n’y a pas de code dans la fonction de secours, l’effet de la transaction sera d’augmenter le solde du contrat, exactement comme un paiement sur un portefeuille. S’il n’y a pas de fonction de secours ou de fonction de secours non payante, la transaction sera annulée.</p>
</div>
<div class="paragraph">
<p>Un contrat peut rejeter les paiements entrants en levant une exception immédiatement lorsqu’une fonction est appelée, ou tel que déterminé par des conditions codées dans une fonction. Si la fonction se termine avec succès (sans exception), l’état du contrat est mis à jour pour refléter une augmentation du solde d’ether du contrat.</p>
</div>
</div>
<div class="sect3">
<h4 id="data_EOA">Transmission d’une charge utile de données à un EOA ou à un contrat</h4>
<div class="paragraph">
<p>Lorsque votre transaction contient des données, elle est très probablement adressée à une adresse de contrat. Cela ne signifie pas que vous ne pouvez pas envoyer une charge utile de données à un EOA, ce qui est tout à fait valide dans le protocole Ethereum. Cependant, dans ce cas, l’interprétation des données dépend du portefeuille que vous utilisez pour accéder à l’EOA. Il est ignoré par le protocole Ethereum. La plupart des portefeuilles ignorent également toutes les données reçues lors d’une transaction vers un EOA qu’ils contrôlent. À l’avenir, il est possible que des normes émergent qui permettent aux portefeuilles d’interpréter les données comme le font les contrats, permettant ainsi aux transactions d’invoquer des fonctions exécutées à l’intérieur des portefeuilles des utilisateurs. La différence essentielle est que toute interprétation de la charge utile de données par un EOA n’est pas soumise aux règles de consensus d’Ethereum, contrairement à un contrat <span class="keep-together">exécution</span>.</p>
</div>
<div class="paragraph">
<p>Pour l’instant, supposons que votre transaction envoie des données à une adresse contractuelle. Dans ce cas, les données seront interprétées par l’EVM comme une <em>invocation de contrat</em>. La plupart des contrats utilisent ces données plus spécifiquement comme <em>invocation de fonction</em>, appelant la fonction nommée et transmettant tous les arguments codés à la fonction.</p>
</div>
<div class="paragraph">
<p>La charge utile de données envoyée à un contrat compatible ABI (dont vous pouvez supposer que tous les contrats le sont) est un codage hexadécimal de :</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Un sélecteur de fonction</dt>
<dd>
<p>Les 4 premiers octets du hachage Keccak-256 du prototype de la fonction. Cela permet au contrat d’identifier sans ambiguïté la fonction que vous souhaitez invoquer.</p>
</dd>
<dt class="hdlist1">Les arguments de la fonction</dt>
<dd>
<p>Les arguments de la fonction, encodés selon les règles des différents types élémentaires définies dans la spécification ABI.</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>Dans <a href="#solidity_faucet_example">[solidity_faucet_example]</a>, nous avons défini une fonction pour les retraits :</p>
</div>
<div id="withdraw_function_src" class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-solidity" data-lang="solidity">function withdraw(uint withdraw_amount) public {</code></pre>
</div>
</div>
<div class="paragraph">
<p>Le <em>prototype</em> d’une fonction est défini comme la chaîne contenant le nom de la fonction, suivi des types de données de chacun de ses arguments, entre parenthèses et séparés par des virgules. Le nom de la fonction ici est withdraw et il prend un seul argument qui est un uint (qui est un alias pour uint256), donc le prototype de withdraw serait :</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-solidity" data-lang="solidity">withdraw(uint256)</code></pre>
</div>
</div>
<div class="paragraph">
<p>Calculons le hachage Keccak-256 de cette chaîne :</p>
</div>
<pre data-type="programlisting">
> <strong>web3.utils.sha3("withdraw(uint256)");</strong>
'0x2e1a7d4d13322e7b96f9a57413e1525c250fb7a9021cf91d1540d5b69f16a49f'
</pre>
<div class="paragraph">
<p>Les 4 premiers octets du hachage sont <code>0x2e1a7d4d</code>. C’est notre valeur "sélecteur de fonction", qui indiquera au contrat quelle fonction nous voulons appeler.</p>
</div>
<div class="paragraph">
<p>Ensuite, calculons une valeur à passer comme argument <code>withdraw_amount</code>. Nous voulons retirer 0,01 ether. Encodons cela en un entier 256 bits non signé gros-boutiste hexa-sérialisé, libellé en wei :</p>
</div>
<pre data-type="programlisting">
> <strong>withdraw_amount = web3.utils.toWei(0.01, "ether");</strong>
'10000000000000000'
> <strong>withdraw_amount_hex = web3.utils.toHex(withdraw_amount);</strong>
'0x2386f26fc10000'
</pre>
<div class="paragraph">
<p>Maintenant, nous ajoutons le sélecteur de fonction au montant (rembourré à 32 octets) :</p>
</div>
<div class="listingblock">
<div class="content">
<pre>2e1a7d4d000000000000000000000000000000000000000000000000002386f26fc10000</pre>
</div>
</div>
<div class="paragraph">
<p>C’est la charge utile de données pour notre transaction, appelant la fonction withdraw et demandant 0,01 éther comme withdraw_amount.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="contract_reg">Transaction spéciale : création de contrat</h3>
<div class="paragraph">
<p>Un cas particulier que nous devrions mentionner est une transaction qui <em>crée un nouveau contrat</em> sur la chaîne de blocs, le déployant pour une utilisation future. Les transactions de création de contrat sont envoyées à une adresse de destination spéciale appelée <em>adresse zéro</em> ; le champ to dans une transaction d’enregistrement de contrat contient l’adresse <code>0x0</code>. Cette adresse ne représente ni un EOA (il n’y a pas de paire de clés privée-publique correspondante) ni un contrat. Il ne peut jamais dépenser d’ether ou initier une transaction. Il n’est utilisé que comme destination, avec la signification spéciale "créer ce contrat".</p>
</div>
<div class="paragraph">
<p>Alors que l’adresse zéro est destinée uniquement à la création de contrats, elle reçoit parfois des paiements de différentes adresses. Il y a deux explications à cela : soit c’est par accident, entraînant la perte d’ether, soit c’est une <em>brûlure d’ether</em> intentionnelle (détruisant délibérément l’ether en l’envoyant à une adresse d’où il ne peut jamais être dépensé). Cependant, si vous souhaitez effectuer une brûlure intentionnelle d’ether, vous devez indiquer clairement votre intention au réseau et utiliser à la place l’adresse de brpulure spécialement désignée :</p>
</div>
<div id="burn_address" class="listingblock">
<div class="content">
<pre>0x000000000000000000000000000000000000dEaD</pre>
</div>
</div>
<div class="admonitionblock warning">
<table>
<tr>
<td class="icon">
<div class="title">Warning</div>
</td>
<td class="content">
<div class="paragraph">
<p>Tout ether envoyé à l’adresse de brûlure désignée deviendra inutilisable et sera perdu à jamais.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Une transaction de création de contrat ne doit contenir qu’une charge utile de données contenant le code intermédiaire compilé qui créera le contrat. Le seul effet de cette transaction est de créer le contrat. Vous pouvez inclure un montant en ether dans le champ value si vous souhaitez configurer le nouveau contrat avec un solde de départ, mais cela est entièrement facultatif. Si vous envoyez une valeur (ether) à l’adresse de création de contrat sans charge utile de données (pas de contrat), l’effet est le même que l’envoi à une adresse de brûlure : il n’y a pas de contrat à créditer, donc l’ether est perdu.</p>
</div>
<div class="paragraph">
<p>Par exemple, nous pouvons créer le contrat <em>Faucet.sol</em> utilisé dans <a href="#intro_chapter">[intro_chapter]</a> en créant manuellement une transaction à l’adresse zéro avec le contrat dans la charge utile des données. Le contrat doit être compilé dans une représentation en code intermédiaire. Cela peut être fait avec le compilateur Solidity :</p>
</div>
<pre data-type="programlisting" class="pagebreak-before">
$ <strong>solc --bin Faucet.sol</strong>