forked from ethereum/yellowpaper
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathPaper_vn.tex
2941 lines (2455 loc) · 271 KB
/
Paper_vn.tex
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
\documentclass[9pt,oneside]{amsart}
%\usepackage{tweaklist}
\usepackage{vntex}
\usepackage[utf8]{inputenc}
\usepackage{cancel}
\usepackage{xspace}
\usepackage{graphicx}
\usepackage{multicol}
\usepackage{subfig}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage[a4paper,width=170mm,top=18mm,bottom=22mm,includeheadfoot]{geometry}
\usepackage{booktabs}
\usepackage{array}
\usepackage{verbatim}
\usepackage{caption}
\usepackage{natbib}
\usepackage{float}
\usepackage{pdflscape}
\usepackage{mathtools}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{afterpage}
\usepackage{tikz}
\usepackage[bookmarks=true, unicode=true, pdftitle={Ethereum Yellow Paper: a formal specification of Ethereum, a programmable blockchain}, pdfauthor={Dr. Gavin Wood},pdfkeywords={Ethereum, Yellow Paper, blockchain, virtual machine, cryptography, decentralised, singleton, transaction, generalised},pdfborder={0 0 0.5 [1 3]}]{hyperref}
%,pagebackref=true
\usepackage{tabu} %requires array.
%This should be the last package before \input{Version.tex}
\PassOptionsToPackage{hyphens}{url}\usepackage{hyperref}
% "hyperref loads the url package internally. Use \PassOptionsToPackage{hyphens}{url}\usepackage{hyperref} to pass the option to the url package when it is loaded by hyperref. This avoids any package option clashes." Source: <https://tex.stackexchange.com/questions/3033/forcing-linebreaks-in-url/3034#comment44478_3034>.
% Note also this: "If the \PassOptionsToPackage{hyphens}{url} approach does not work, maybe it's "because you're trying to load the url package with a specific option, but it's being loaded by one of your packages before that with a different set of options. Try loading the url package earlier than the package that requires it. If it's loaded by the document class, try using \RequirePackage[hyphens]{url} before the document class." Source: <https://tex.stackexchange.com/questions/3033/forcing-linebreaks-in-url/3034#comment555944_3034>.
% For more information on using the hyperref package, refer to e.g. https://en.wikibooks.org/w/index.php?title=LaTeX/Hyperlinks&stable=0#Hyperlink_and_Hypertarget.
\makeatletter
\newcommand{\linkdest}[1]{\Hy@raisedlink{\hypertarget{#1}{}}}
\makeatother
\usepackage{seqsplit}
% For formatting
%\usepackage{underscore}
%\usepackage{lipsum} % to generate filler text for testing of document rendering
\usepackage[english]{babel}
\usepackage[autostyle]{csquotes}
\MakeOuterQuote{"}
\usepackage[final]{microtype} % https://tex.stackexchange.com/questions/75140/is-it-possible-to-make-latex-mark-overfull-boxes-in-the-output#comment382776_75142
\input{Version.tex}
% Default rendering options
\definecolor{pagecolor}{rgb}{1,0.98,0.9}
\def\YellowPaperVersionNumber{2f36cf0 – 2024-01-12}
\def\cTitle{ETHEREUM: MỘT SỔ CÁI GIAO DỊCH TỔNG QUÁT AN TOÀN PHI TẬP TRUNG}
\IfFileExists{Options.tex}{\input{Options.tex}}
\newcommand{\hcancel}[1]{%
\tikz[baseline=(tocancel.base)]{
\node[inner sep=0pt,outer sep=0pt] (tocancel) {#1};
\draw[black] (tocancel.south west) -- (tocancel.north east);
}%
}%
\DeclarePairedDelimiter{\ceil}{\lceil}{\rceil}
\newcommand*\eg{e.g.\@\xspace}
\newcommand*\Eg{e.g.\@\xspace}
\newcommand*\ie{i.e.\@\xspace}
%\renewcommand{\itemhook}{\setlength{\topsep}{0pt} \setlength{\itemsep}{0pt}\setlength{\leftmargin}{15pt}}
\title[\cTitle \\ \smaller \textbf{{Paris version}}]{
\cTitle \\ \smaller \textbf{{Paris version \YellowPaperVersionNumber}}
}
\author{
Dr. Gavin Wood\\
Founder, Ethereum \& Parity\\
}
\begin{document}
\pagecolor{pagecolor}
\begin{abstract}
Mô hình chuỗi khối khi kết hợp với giao dịch được bảo vệ bằng mật mã đã chứng minh tính hữu ích của nó thông qua nhiều dự án, trong đó Bitcoin là một trong những dự án đáng chú ý nhất. Mỗi dự án như vậy có thể được xem như một ứng dụng đơn giản trên một nguồn tài nguyên tính toán phi tập trung, nhưng là một máy tính đơn lẻ. Chúng ta có thể gọi mô hình này là một máy đơn với trạng thái giao dịch được chia sẽ.
Ethereum thực hiện mô hình này một cách tổng quát. Hơn nữa, nó cung cấp một loạt các nguồn tài nguyên như vậy, mỗi nguồn có một trạng thái và mã (code) hoạt động riêng biệt, nhưng có khả năng tương tác thông qua một khung gửi tin nhắn với (message-passing framework) các nguồn khác. Chúng ta thảo luận về thiết kế của nó, các vấn đề thực hiện, cơ hội mà nó mang lại và những thách thức tương lai mà chúng ta dự tính.
\end{abstract}
\maketitle
\setlength{\columnsep}{20pt}
\begin{multicols}{2}
\section[utf8]{Giới thiệu}\label{sec:introduction}
Với các kết nối internet phổ biến ở hầu hết các nơi trên thế giới, việc truyền thông tin toàn cầu đã trở nên cực kỳ rẻ. Các phong trào dựa trên công nghệ như Bitcoin đã thể hiện thông qua sức mạnh của các cơ chế mặc định, đồng thuận và sự tôn trọng tự nguyện của hợp đồng xã hội, rằng có thể sử dụng Internet để tạo ra một hệ thống chuyển đổi giá trị phi tập trung có thể được chia sẻ trên toàn thế giới và gần như miễn phí để sử dụng. Hệ thống này có thể được cho là một phiên bản rất chuyên dụng của một máy trạng thái dựa trên giao dịch, an toàn bằng mã hóa. Các hệ thống tiếp theo như Namecoin đã điều chỉnh ``Ứng dụng tiền tệ'' của công nghệ thành các ứng dụng khác, mặc dù đôi khi khá đơn giản.
Ethereum là một dự án có nỗ lực xây dựng công nghệ tổng quát; công nghệ mà trên đó có thể xây dựng tất cả các khái niệm máy trạng thái dựa trên giao dịch. Hơn nữa, nó nhằm mục tiêu cung cấp cho nhà phát triển cuối cùng một hệ thống tích hợp chặt chẽ từ đầu đến cuối để xây dựng phần mềm trên một mô hình tính toán chưa được khám phá cho đến nay: một đối tượng khung (framework) tính toán nhắn tin đáng tin cậy.
\subsection{Các Yếu Tố Thúc Đẩy} \label{ch:driving}
Dự án này có nhiều mục tiêu; một mục tiêu quan trọng là tạo điều kiện cho giao dịch giữa các cá nhân đồng ý mà không có phương tiện nào khác để tin tưởng lẫn nhau. Điều này có thể do sự chia cách địa lý, khó khăn trong việc giao tiếp, hoặc có thể do sự không tương thích, không đủ năng lực, không sẵn lòng, chi phí cao, không chắc chắn, bất tiện hoặc tham nhũng của các hệ thống pháp luật hiện tại. Bằng cách xác định một hệ thống thay đổi trạng thái thông qua một ngôn ngữ phong phú và không mơ hồ, và hơn nữa, thiết kế một hệ thống sao cho chúng ta có thể hợp lý kỳ vọng rằng một thỏa thuận sẽ được thực hiện tự động, chúng ta có thể cung cấp một phương tiện để đạt được mục tiêu này.
Các giao dịch trong hệ thống được đề xuất này sẽ có một số thuộc tính không thường xuất hiện trong thế giới thực. Tính liêm khiết của sự phán xử, thường khó tìm thấy, đến một cách tự nhiên từ một trình thông dịch thuật toán công tâm. Sự minh bạch, hoặc khả năng nhìn thấy chính xác cách một trạng thái hoặc quyết định được hình thành thông qua nhật ký giao dịch và các quy tắc hoặc mã chỉ thị, không bao giờ xảy ra hoàn hảo trong các hệ thống dựa trên con người vì ngôn ngữ tự nhiên thường mơ hồ, thông tin thường thiếu và định kiến cũng khó lòng thay đổi.
Nhìn chung, chúng ta muốn cung cấp một hệ thống sao cho người dùng có thể được đảm bảo rằng bất kể các cá nhân, hệ thống hoặc tổ chức khác mà họ tương tác, họ có thể làm như vậy với lòng tin tuyệt đối về kết quả có thể xảy ra và kết quả đó có thể xảy ra như thế nào.
\subsection{Công Trình Trước Đây} \label{ch:previous}
\cite{buterin2013ethereum} lần đầu tiên đã đề xuất ý tưởng cơ bản của công trình này vào cuối tháng 11 năm 2013. Mặc dù đã phát triển theo nhiều cách, nhưng chức năng chính của một chuỗi khối với ngôn ngữ Turing hoàn chỉnh và khả năng lưu trữ giữa các giao dịch hiệu quả vô hạn vẫn không thay đổi.
\cite{dwork92pricingvia} cung cấp công trình đầu tiên về việc ứng dụng của một bằng chứng mật mã của chi phí tính toán ``bằng chứng làm việc'' (``proof-of-work'') như một phương tiện truyền tải một tín hiệu giá trị qua Internet. Tín hiệu giá trị được sử dụng ở đây như một cơ chế ngăn chặn thư rác thay vì một loại tiền tệ nào đó, nhưng quan trọng là đã chứng minh tiềm năng của một kênh dữ liệu cơ bản để truyền tải một \textit{tín hiệu kinh tế mạnh mẽ}, cho phép người nhận đưa ra một khẳng định vật lý mà không cần phải dựa vào \textit{lòng tin}. \cite{back2002hashcash} sau đó tạo ra một hệ thống theo một hướng tương tự.
Ví dụ đầu tiên về việc sử dụng bằng chứng làm việc như một tín hiệu kinh tế mạnh mẽ để bảo vệ một đơn vị tiền tệ đã được thực hiện bởi \cite{vishnumurthy03karma:a}. Trong trường hợp này, token được sử dụng để kiểm soát giao dịch tệp ngang hàng, cung cấp khả năng cho ``người tiêu dùng'' (``consumers'') thực hiện thanh toán nhỏ đối với ``nhà cung cấp'' (``suppliers'') cho dịch vụ của họ. Mô hình bảo mật được cung cấp bởi ``bằng chứng làm việc'' được tăng cường với chữ ký số và một sổ cái để đảm bảo rằng hồ sơ lịch sử không thể bị làm hỏng và các diễn viên ác ý không thể giả mạo thanh toán hoặc phàn nàn một cách bất công về việc cung cấp dịch vụ. Năm năm sau, \cite{nakamoto2008bitcoin} giới thiệu một ``bằng chứng làm việc được bảo vệ'' (``proof-of-work-secured''), có phạm vi rộng hơn một chút. Thành quả của dự án này, Bitcoin, đã trở thành sổ cái giao dịch phi tập trung toàn cầu đầu tiên được áp dụng rộng rãi.
Các dự án khác được xây dựng dựa trên thành công của Bitcoin; Các ``alt-coin'' đã giới thiệu nhiều loại tiền tệ khác thông qua thay đổi giao thức. Một số nổi tiếng nhất là Litecoin và Primecoin, được thảo luận bởi \cite{sprankel2013technical}. Các dự án khác đã tìm cách lấy cơ chế nội dung giá trị cốt lõi của giao thức và tái sử dụng nó; những thảo luận của \cite{aron2012bitcoin} là ví dụ, dự án Namecoin nhằm cung cấp một hệ thống phân giải tên phi tập trung.
Các dự án khác vẫn nhằm mục đích xây dựng trên chính mạng Bitcoin, tận dụng lượng giá trị lớn được đặt trong hệ thống và số lượng lớn tính toán đi vào cơ chế đồng thuận. Dự án Mastercoin, được đề xuất lần đầu tiên bởi \cite{mastercoin2013willett}, nhằm mục đích xây dựng một giao thức phong phú hơn liên quan đến nhiều tính năng cấp cao bổ sung trên đầu giao thức Bitcoin thông qua việc sử dụng một số phần phụ trợ cho giao thức cốt lõi. Dự án Coloured Coins, được đề xuất bởi \cite{colouredcoins2012rosenfeld}, có một chiến lược tương tự nhưng đơn giản hơn, tô điểm cho các quy tắc của một giao dịch để phá vỡ tính thay thế được của loại tiền cơ bản của Bitcoin và cho phép tạo và theo dõi các mã thông báo thông qua một phần mềm đặc biệt ``chroma-wallet'' nhận biết giao thức.
Thêm công việc khác đã được thực hiện trong lĩnh vực này với việc từ bỏ cơ sở phi tập trung; Ripple, được thảo luận bởi \cite{boutellier2014pirates}, đã tìm cách tạo ra một hệ thống ``liên minh'' (``federated'') để trao đổi tiền tệ, tạo ra một hệ thống tài chính sạch mới một cách hiệu quả. Nó đã chứng minh rằng có thể đạt được những cải tiến hiệu suất lớn nếu giả định về phi tập trung được từ bỏ.
Công việc sớm về hợp đồng thông minh đã được thực hiện bởi \cite{szabo1997formalizing} và \cite{miller1997future}. Vào khoảng những năm 1990, rõ ràng rằng việc thực thi thỏa thuận thông qua thuật toán có thể trở thành một sức mạnh có ý nghĩa trong sự hợp tác của con người. Mặc dù chưa có hệ thống cụ thể nào được đề xuất để thực hiện một hệ thống như vậy, nhưng người ta đã đề xuất rằng tương lai của pháp luật sẽ bị ảnh hưởng nặng nề bởi các hệ thống đó. Dưới góc nhìn này, Ethereum có thể được coi là một triển khai tổng quát của một hệ thống \textit{luật mật mã} (\textit{crypto-law}).
%E language?
Để biết danh sách các thuật ngữ được sử dụng trong bài viết này, hãy tham khảo Phụ lục~\ref{ch:Terminology}.
\section{Mô hình chuỗi khối} \label{ch:overview}
Ethereum, nhìn chung, có thể được xem như một máy trạng thái dựa trên giao dịch: chúng ta bắt đầu với một trạng thái khởi điểm (genesis state) và thực hiện các giao dịch một cách tăng dần để biến nó thành một trạng thái hiện tại nào đó. Đây chính là trạng thái hiện tại mà chúng ta chấp nhận là ``phiên bản'' chuẩn của thế giới Ethereum. Trạng thái có thể bao gồm thông tin như số dư tài khoản, uy tín, các thỏa thuận tin tưởng, dữ liệu liên quan đến thông tin của thế giới vật lý; nói một cách ngắn gọn, bất cứ điều gì hiện nay có thể được biểu diễn bởi máy tính đều được chấp nhận. Giao dịch do đó đại diện cho một cung đường hợp lệ giữa hai trạng thái; phần `hợp lệ' là quan trọng—thay đổi trạng thái không hợp lệ tồn tại nhiều hơn nhiều so với những thay đổi trạng thái hợp lệ. Những thay đổi trạng thái không hợp lệ có thể là những điều như giảm số dư một tài khoản mà không có sự gia tăng tương đương và ngược lại ở đâu đó khác. Một chuyển đổi trạng thái hợp lệ là một chuyển đổi mà xuất hiện thông qua một giao dịch. Quy ước:
\begin{equation}
\linkdest{Upsilon_state_transition}\linkdest{Upsilon}\boldsymbol{\sigma}_{t+1} \equiv \Upsilon(\boldsymbol{\sigma}_{t}, T)
\end{equation}
trong đó $\Upsilon$ là hàm chuyển đổi trạng thái Ethereum. Trong Ethereum, $\Upsilon$, cùng với $\boldsymbol{\sigma}$ mạnh hơn đáng kể so với bất kỳ hệ thống so sánh hiện có nào; $\Upsilon$ cho phép các thành phần thực hiện tính toán tùy ý, trong khi $\boldsymbol{\sigma}$ cho phép các thành phần lưu trữ trạng thái tùy ý giữa các giao dịch.
Giao dịch được tổng hợp thành các khối (blocks); các khối được xích lại với nhau (chained together) bằng cách sử dụng hàm băm mật mã như một phương tiện tham chiếu. Các khối hoạt động như một nhật ký, ghi lại một loạt các giao dịch cùng với khối trước và một định danh cho trạng thái cuối cùng (mặc dù không lưu trữ trạng thái cuối cùng là bản thân nó --- điều đó sẽ quá lớn).
Một cách quy ước, chúng ta mở rộng thành:
\begin{eqnarray}
\boldsymbol{\sigma}_{t+1} & \equiv & \hyperlink{Pi}{\Pi}(\boldsymbol{\sigma}_{t}, B) \\
B & \equiv & (..., (T_0, T_1, ...), ...) \\
\Pi(\boldsymbol{\sigma}, B) & \equiv & \hyperlink{Upsilon}{\Upsilon}(\Upsilon(\boldsymbol{\sigma}, T_0), T_1) ...
\end{eqnarray}
Trong đó \hyperlink{block}{$B$} là khối này, bao gồm một loạt các giao dịch bên cạnh một số thành phần khác và $\hyperlink{Pi}{\Pi}$ là hàm chuyển đổi trạng thái cấp khối (block-level).
Đây là cơ sở của mô hình chuỗi khối, một mô hình tạo thành xương sống không chỉ Ethereum, mà tất cả các hệ thống giao dịch dựa trên sự đồng thuận phi tập trung cho đến nay.
\subsection{Giá trị (Value)}
Để khuyến khích việc tính toán trong mạng, cần có một phương pháp thống nhất để truyền giá trị. Để giải quyết vấn đề này, Ethereum có một đơn vị tiền tệ tích hợp, gọi là Ether, còn được biết đến với tên {\small ETH} và đôi khi được đề cập trong tiếng Anh cổ Đ. Đơn vị con nhỏ nhất của Ether, và là đơn vị trong đó tất cả các giá trị tiền tệ được tính trên số nguyên, là Wei. Một Ether được định nghĩa là $10^{18}$ Wei. Còn các đơn vị con khác của Ether:
\par
\begin{center}
\begin{tabular}{rl}
\toprule
Số nhân & Tên \\
\midrule
$10^0$ & Wei \\
$10^{12}$ & Szabo \\
$10^{15}$ & Finney \\
$10^{18}$ & Ether \\
\bottomrule
\end{tabular}
\end{center}
\par
Trong toàn bộ công việc hiện tại, bất kỳ tham chiếu nào đến giá trị, trong ngữ cảnh của Ether, tiền tệ, số dư hoặc thanh toán, đều nên được giả định là được tính bằng Wei.
\subsection{Lịch sử Nào (Which History)?}
Vì hệ thống được phân tán và tất cả các bên đều có cơ hội để tạo ra một khối mới trên một khối cũ tồn tại trước đó, cấu trúc kết quả là một cây khối. Để đạt được sự nhất quán về đường đi nào, từ gốc (\hyperlink{Genesis_Block}{khối khởi điểm (genesis)}) đến lá (khối chứa giao dịch mới nhất) qua cấu trúc cây này, được biết đến như là chuổi khối (blockchain), phải có một kế hoạch được thống nhất. Nếu bao giờ có sự không đồng ý giữa các nút về đường đi từ gốc đến lá xuống cây khối nào là chuỗi khối `tốt nhất', thì một \textit{sự rẻ nhánh} (\textit{fork}) xảy ra.
Điều này có nghĩa là vượt qua một điểm thời gian nhất định (khối), nhiều trạng thái của hệ thống có thể tồn tại song song: một số nút (nodes) tin rằng một khối chứa các giao dịch chính thức, các nút khác tin rằng một khối khác là chính thức, có thể chứa các giao dịch hoàn toàn khác biệt hoặc không tương thích. Điều này cần tránh bằng mọi giá vì sự không chắc chắn sẽ có thể đặt dấu chấm hết vào lòng tin trong toàn bộ hệ thống.
Từ \textit{hard fork} \textit{Paris} trở đi, việc đạt được sự đồng thuận trên các khối mới được quản lý bằng một giao thức được gọi là \textit{Beacon Chain}. Nó được biết đến như là \textit{lớp đồng thuận (consensus layer)} của Ethereum, và nó đặt ra các quy tắc để xác định lịch sử chính thức của các khối Ethereum. Tài liệu này mô tả \textit{lớp thực thi (execution layer)} của Ethereum. Lớp thực thi đặt ra các quy tắc để tương tác và cập nhật trạng thái của máy ảo Ethereum. Lớp đồng thuận được mô tả chi tiết hơn trong \href{https://github.com/ethereum/consensus-specs}{các đặc tả đồng thuận}. Cách lớp nhất quán được sử dụng để xác định trạng thái chính thức của Ethereum được thảo luận trong phần \ref{ch:blocktree_to_blockchain}.
Có nhiều phiên bản của Ethereum, vì giao thức đã trải qua nhiều bản cập nhật. Các bản cập nhật này có thể được chỉ định xảy ra:
\begin{itemize}
\item tại một số khối cụ thể trong trường hợp của các bản cập nhật trước \textit{Paris}.
\item sau khi đạt đến một \textit{tổng độ khó cuối cùng (terminal total difficulty)} trong trường hợp của bản cập nhật \textit{Paris}, hoặc
\item tại một dấu thời gian khối (block timestamp) cụ thể trong trường hợp của các bản cập nhật sau \textit{Paris}.
\end{itemize}
Tài liệu này mô tả phiên bản \textit{Paris}.
Để theo dõi lịch sử của một đường dẫn, người đọc cần tham khảo nhiều phiên bản của tài liệu này. Dưới đây là số khối của các bản cập nhật giao thức trên mạng chính Ethereum:\footnote{Lưu ý rằng trong khi fork Paris được kích hoạt tại khối 15,537,394, nhưng điều kích hoạt không phải là số khối, mà là khi đạt được một \textit{tổng độ khó} cụ thể. Chi tiết về điều kích hoạt của hard fork Paris được thảo luận chi tiết hơn trong phần \ref{ch:pos_transition}.}
\par
\begin{center}
\begin{tabular}{lr}
\toprule
Tên & Số khối đầu tiên \\
\midrule
$F_{\mathrm{Homestead}}$ & 1150000 \\
$F_{\mathrm{Tangerine Whistle}}$ & 2463000 \\
$F_{\mathrm{Spurious Dragon}}$ & 2675000 \\
$F_{\mathrm{Byzantium}}$ & 4370000 \\
$F_{\mathrm{Constantinople}}$ & 7280000 \\
$F_{\mathrm{Petersburg}}$ & 7280000 \\
$F_{\mathrm{Istanbul}}$ & 9069000 \\
$F_{\mathrm{Muir Glacier}}$ & 9200000 \\
$F_{\mathrm{Berlin}}$ & 12244000 \\
$F_{\mathrm{London}}$ & 12965000 \\
$F_{\mathrm{Arrow Glacier}}$ & 13773000 \\
$F_{\mathrm{Gray Glacier}}$ & 15050000 \\
$F_{\mathrm{Paris}}$ & 15537394 \\
\bottomrule
\end{tabular}
\end{center}
\par
Đôi khi các bên không đồng ý với một thay đổi giao thức, và một sự rẽ nhánh (fork) vĩnh viễn xảy ra. Để phân biệt giữa các chuỗi khối rời rạc, EIP-155 được \cite{EIP-155} giới thiệu khái niệm về Chain ID, được ký hiệu là $\beta$.
Đối với mạng chính Ethereum
\begin{equation}
\linkdest{chain_id}
\beta = 1
\end{equation}
\section{Quy ước}\label{ch:conventions}
Chúng ta sử dụng nhiều quy ước chữ viết để biểu diễn hình thức, một số trong số đó khá đặc biệt cho công việc hiện tại:
Hai tập giá trị trạng thái có cấu trúc cao, `top-level', được ký hiệu bằng chữ viết thường viết đậm (bold lowercase) của chữ cái Hy Lạp. Chúng thuộc về trạng thái thế giới, được ký hiệu là $\boldsymbol{\sigma}$ (hoặc biến thể tương tự) và trạng thái máy, được ký hiệu là $\boldsymbol{\mu}$.
Các hàm thi hành trên các giá trị có cấu trúc cao được ký hiệu bằng một chữ cái Hy Lạp viết hoa (uppercase), ví dụ như \hyperlink{Upsilon_state_transition}{$\Upsilon$}, hàm chuyển trạng thái Ethereum.
Đối với hầu hết các hàm, chúng ta sử dụng một chữ cái viết hoa, ví dụ như $C$, hàm chi phí chung. Các biến thể chuyên sâu của chúng có thể được ký hiệu bằng chữ dưới, ví dụ như \hyperlink{C__SSTORE}{$C_\text{SSTORE}$}, hàm chi phí cho việc thi hành \hyperlink{SSTORE}{{\tiny SSTORE}}. Đối với các hàm chuyên sâu và có thể được định nghĩa bên ngoài, chúng ta có thể sử dụng văn bản kiểu máy đánh chữ, ví dụ như hàm băm Keccak-256 (theo phiên bản 3 của đề xuất thắng cuộc trong cuộc thi SHA-3 của \cite{Keccak}, chứ không phải là đặc tả SHA-3 sau cùng), được ký hiệu là $\texttt{KEC}$ (và thường được gọi là Keccak thuần túy). Tương tự, $\texttt{KEC512}$ đề cập đến hàm băm Keccak-512.
Bộ dữ liệu (Tuples) thường được ký hiệu bằng một chữ cái viết hoa, ví dụ như $T$, được sử dụng để biểu thị một giao dịch Ethereum. Ký hiệu này có thể, nếu được định nghĩa một cách phù hợp, được chú thích bằng chữ dưới để chỉ đến một thành phần cụ thể, ví dụ như \hyperlink{transaction_nonce}{$T_{\mathrm{n}}$}, biểu thị nonce của giao dịch đó. Dạng của chỉ số được sử dụng để biểu thị loại; ví dụ, chữ cái viết hoa dưới chân thì tham chiếu đến bộ ba giá trị có các thành phần có thể được đặt chỉ số.
Các giá tị vô hướng (scalars) và các dãy byte có kích thước cố định (hoặc, một cách đồng nghĩa, các mảng) được ký hiệu bằng một chữ cái viết thường, ví dụ như $n$ được sử dụng trong tài liệu để biểu thị một \hyperlink{transaction_nonce}{nonce giao dịch}. Các giá trị có ý nghĩa đặc biệt có thể được viết bằng chữ cái Hy Lạp, ví dụ như $\delta$, số lượng các mục được yêu cầu trên ngăn xếp cho một sự thi hành cụ thể.
Dãy có độ dài tùy ý thường được biểu thị bằng một chữ cái viết thường đậm, ví dụ như $\mathbf{o}$ được sử dụng để biểu thị dãy byte đầu ra của một cuộc gọi tin nhắn. Đối với các giá trị quan trọng, có thể sử dụng một chữ cái viết hoa đậm.
Trong toàn bộ, chúng ta giả định rằng các giá trị cố định là số nguyên không âm và do đó thuộc tập hợp $\mathbb{N}$. Tập hợp tất cả các dãy byte là $\mathbb{B}$, được định nghĩa chi tiết trong Phụ lục \ref{app:rlp}. Nếu một tập hợp các dãy được hạn chế đến những dãy có chiều dài cụ thể, nó được biểu thị bằng một chỉ số dưới, vì vậy tập hợp tất cả các dãy byte có chiều dài $32$ được đặt tên là $\mathbb{B}_{32}$ và tập hợp tất cả các số nguyên không âm nhỏ hơn $2^{256}$ được đặt tên là $\mathbb{N}_{256}$. Điều này được định nghĩa chi tiết trong phần \hyperlink{block}{\ref{subsec:The_Block}}.
Dấu ngoặc vuông được sử dụng để lập chỉ mục và tham chiếu đến các thành phần hoặc các phần con của các dãy, ví dụ như $\boldsymbol{\mu}_{\mathbf{s}}[0]$ biểu thị mục đầu tiên trên ngăn xếp của máy. Đối với các phần con, dấu ba chấm được sử dụng để chỉ định phạm vi dự định, để bao gồm các phần tử ở cả hai đỉnh, ví dụ như $\boldsymbol{\mu}_{\mathbf{m}}[0..31]$ biểu thị 32 mục đầu tiên của bộ nhớ của máy.
Trong trường hợp của trạng thái toàn cầu $\boldsymbol{\sigma}$, một dãy các tài khoản, chúng ta sử dụng dấu ngoặc vuông để tham chiếu đến một tài khoản cụ thể.
Khi xem xét các biến thể của các giá trị hiện tại, chúng ta tuân theo quy tắc rằng trong một phạm vi xác định, nếu chúng ta giả sử rằng giá trị `đầu vào' không được sửa đổi được ký hiệu bằng biểu tượng $\Box$ thì giá trị đã được sửa đổi và có thể sử dụng được ký hiệu là $\Box'$, và giá trị trung gian sẽ là $\Box^*$, $\Box^{**}$, và các giá trị tương tự. Trong những trường hợp cụ thể, đặc biệt là để tối ưu hóa tính đọc và chỉ khi không mơ hồ về ý nghĩa, chúng ta có thể sử dụng chữ số và chữ cái để ký hiệu giá trị trung gian, đặc biệt là những giá trị đặc biệt.
Khi xem xét việc sử dụng các hàm hiện có, với một hàm $f$ nào đó, hàm \hyperlink{general_element_wise_sequence_transformation_f_pow_asterisk}{$f^*$} biểu thị một phiên bản tương tự, thực hiện theo từng phần tử của dãy thay vì giữa các dãy. Định nghĩa chi tiết được thực hiện trong phần \hyperlink{block}{\ref{subsec:The_Block}}.
Chúng ta định nghĩa một số hàm hữu ích trong toàn bộ tài liệu. \linkdest{ell}Một trong những hàm phổ biến là $\ell$, mà có giá trị là phần tử cuối cùng trong dãy đã cho:
\begin{equation}
\ell(\mathbf{x}) \equiv \mathbf{x}[\lVert \mathbf{x} \rVert - 1]
\end{equation}
\section{Các khối, Trạng thái và Các giao dịch} \label{ch:bst}
Sau khi giới thiệu các khái niệm cơ bản của Ethereum, chúng ta sẽ thảo luận chi tiết hơn về ý nghĩa của một giao dịch, một khối và trạng thái.
\subsection{Trạng thái thế giới (World State)} \label{ch:state}
Trạng thái thế giới (\textit{state}) là một ánh xạ giữa địa chỉ (nhận dạng 160-bit) và trạng thái tài khoản (một cấu trúc dữ liệu được chuỗi hóa theo RLP, xem Phụ lục~\ref{app:rlp}). Mặc dù không được lưu trữ trên chuỗi khối, giả định rằng bản triển khai sẽ duy trì ánh xạ này trong một cây Merkle Patricia được sửa đổi (\textit{trie}, xem Phụ lục \ref{app:trie}). Trie yêu cầu một backend cơ sở dữ liệu đơn giản duy trì một ánh xạ từ mảng byte đến mảng byte; chúng ta đặt tên cho cơ sở dữ liệu cơ bản này là cơ sở dữ liệu trạng thái. Điều này mang lại nhiều lợi ích; đầu tiên, nút gốc (root node) của cấu trúc này phụ thuộc về mặt mật mã vào tất cả dữ liệu nội bộ và do đó băm của nó có thể được sử dụng như một danh tính an toàn cho toàn bộ trạng thái hệ thống. Thứ hai, với tính chất là một cấu trúc dữ liệu bất biến, nó cho phép lấy lại bất kỳ trạng thái trước đó (mà băm gốc của nó đã được biết) chỉ bằng cách thay đổi băm gốc một cách tương ứng. Vì chúng ta lưu trữ tất cả các băm gốc như vậy trong chuỗi khối, chúng ta có thể dễ dàng quay lại các trạng thái cũ.
Trạng thái tài khoản, $\boldsymbol{\sigma}[a]$, bao gồm bốn trường sau:
\begin{description}
\item[nonce] \linkdest{account_nonce}Một giá trị vô hướng (scalar) bằng số lần giao dịch được gửi từ địa chỉ này hoặc, trong trường hợp của các tài khoản có mã (code) liên quan, số lần tạo hợp đồng bởi tài khoản này. Đối với tài khoản có địa chỉ $a$ trong trạng thái $\boldsymbol{\sigma}$, điều này sẽ được biểu diễn là $\boldsymbol{\sigma}[a]_{\mathrm{n}}$.
\item[balance] Giá trị vô hướng bằng số Wei được sở hữu bởi địa chỉ này. Được biểu diễn là $\boldsymbol{\sigma}[a]_{\mathrm{b}}$.
\item[storageRoot] Một băm 256-bit của nút gốc của cây Merkle Patricia mã hóa nội dung lưu trữ của tài khoản (một ánh xạ giữa các giá trị số nguyên 256-bit), được mã hóa vào trie như một ánh xạ từ băm Keccak 256-bit của các khóa số nguyên 256-bit đến các giá trị số nguyên 256-bit được mã hóa bằng RLP. Băm được biểu diễn là $\boldsymbol{\sigma}[a]_{\mathrm{s}}$.
\item[codeHash] Băm của mã (code) EVM của tài khoản này—đây là mã được thực thi nếu địa chỉ này nhận một cuộc Gọi tin nhắn (message call). Tất cả các đoạn mã như vậy được chứa trong cơ sở dữ liệu trạng thái dưới các băm tương ứng của chúng để có thể được gọi lại sau này. Băm này được biểu diễn là $\boldsymbol{\sigma}[a]_{\mathrm{c}}$, và mã (code) có thể được biểu diễn là $\mathbf{b}$, do đó $\texttt{KEC}(\mathbf{b}) = \boldsymbol{\sigma}[a]_{\mathrm{c}}$.
\end{description}
Vì chúng ta thường muốn tham chiếu không phải đến băm gốc của trie mà đến bộ cặp khóa/giá trị cơ bản được lưu trữ bên trong, chúng ta định nghĩa một tương đương thuận tiện:
\begin{equation}
\texttt{TRIE}\big(L_{\mathrm{I}}^*(\boldsymbol{\sigma}[a]_{\mathbf{s}})\big) \equiv \boldsymbol{\sigma}[a]_{\mathrm{s}}
\end{equation}
Hàm thu gọn cho tập hợp cặp khóa/giá trị trong trie, $L_{\mathrm{I}}^*$, được định nghĩa như sự biến đổi từng phần của hàm cơ sở $L_{\mathrm{I}}$, như sau:
\begin{equation}
L_{\mathrm{I}}\big( (k, v) \big) \equiv \big(\texttt{KEC}(k), \texttt{RLP}(v)\big)
\end{equation}
trong đó:
\begin{equation}
k \in \mathbb{B}_{32} \quad \wedge \quad v \in \mathbb{N}
\end{equation}
Cần hiểu rằng $\boldsymbol{\sigma}[a]_{\mathbf{s}}$ không phải là một thành phần `vật lý' của tài khoản và không đóng góp vào việc biểu diễn sau này của nó.
Nếu trường \textbf{codeHash} là băm Keccak-256 của chuỗi rỗng, tức là $\boldsymbol{\sigma}[a]_{\mathrm{c}} = \texttt{KEC}\big(()\big)$, thì nút đại diện cho một tài khoản đơn giản, đôi khi được gọi là một tài khoản ``không phải hợp đồng''.
Do đó, chúng ta có thể định nghĩa một hàm thu gọn trạng thái thế giới: $L_{\mathrm{S}}$:
\begin{equation}
L_{\mathrm{S}}(\boldsymbol{\sigma}) \equiv \{ p(a): \boldsymbol{\sigma}[a] \neq \varnothing \}
\end{equation}
trong đó
\begin{equation}
p(a) \equiv \big(\texttt{KEC}(a), \texttt{RLP}\big( (\boldsymbol{\sigma}[a]_{\mathrm{n}}, \boldsymbol{\sigma}[a]_{\mathrm{b}}, \boldsymbol{\sigma}[a]_{\mathrm{s}}, \boldsymbol{\sigma}[a]_{\mathrm{c}}) \big) \big)
\end{equation}
Hàm này, $L_{\mathrm{S}}$, được sử dụng cùng với hàm trie để cung cấp một định danh ngắn (hash) của trạng thái thế giới. Chúng ta giả định:
\begin{equation}
\forall a: \boldsymbol{\sigma}[a] = \varnothing \; \vee \; (a \in \mathbb{B}_{20} \; \wedge \; v(\boldsymbol{\sigma}[a]))
\end{equation}
\linkdest{account_validity_function_v__x}{}trong đó $v$ là hàm kiểm tra tính hợp lệ của tài khoản:
\begin{equation}
\quad v(x) \equiv x_{\mathrm{n}} \in \mathbb{N}_{256} \wedge x_{\mathrm{b}} \in \mathbb{N}_{256} \wedge x_{\mathrm{s}} \in \mathbb{B}_{32} \wedge x_{\mathrm{c}} \in \mathbb{B}_{32}
\end{equation}
Một tài khoản được coi là \textit{rỗng (empty)} khi nó không có mã (code), nonce bằng 0 và số dư (balance) bằng 0:
\begin{equation}
\mathtt{EMPTY}(\boldsymbol{\sigma}, a) \quad\equiv\quad \boldsymbol{\sigma}[a]_{\mathrm{c}} = \texttt{KEC}\big(()\big) \wedge \boldsymbol{\sigma}[a]_{\mathrm{n}} = 0 \wedge \boldsymbol{\sigma}[a]_{\mathrm{b}} = 0
\end{equation}
Ngay cả các hợp đồng được gọi có thể có trạng thái tài khoản rỗng. Điều này là do trạng thái tài khoản của chúng thường không chứa mã mô tả hành vi của chúng.
Một tài khoản được coi là \textit{dead} khi trạng thái tài khoản của nó không tồn tại hoặc rỗng:
\begin{equation}
\mathtt{DEAD}(\boldsymbol{\sigma}, a) \quad\equiv\quad \boldsymbol{\sigma}[a] = \varnothing \vee \mathtt{EMPTY}(\boldsymbol{\sigma}, a)
\end{equation}
\subsection{Giao dịch (The Transaction)} \label{subsec:transaction}
Một giao dịch (ký hiệu $T$) là một chỉ thị đơn được ký điện tử được tạo ra bởi một tác nhân bên ngoài phạm vi của Ethereum.
Người gửi của một giao dịch không thể là một hợp đồng. Mặc dù người ta cho rằng tác nhân bên ngoài cuối cùng về bản chất sẽ là con người, các công cụ phần mềm sẽ được sử dụng trong quá trình xây dựng và phổ biến\footnote{Chú ý rằng,
các `công cụ' như vậy cuối cùng có thể trở nên xa lạ so với sự khởi đầu dựa trên con người của chúng — hoặc con người có thể trở nên trung lập về mặt nguyên nhân đến mức có thể có một điểm nơi chúng có thể được xem xét đúng là các đại lý tự động. Ví dụ, các hợp đồng có thể cung cấp thưởng cho con người về việc gửi giao dịch để khởi động thực thi của chúng.}.
EIP-2718 của \cite{EIP-2718} giới thiệu khái niệm về các loại giao dịch khác nhau.
Kể từ phiên bản giao thức \textit{London}, có ba loại giao dịch: 0 (legacy), 1 (EIP-2930 của \cite{EIP-2930}), và 2 (EIP-1559 của \cite{EIP-1559}).
Hơn nữa, có hai loại con của giao dịch: những giao dịch dẫn đến cuộc gọi tin nhắn và những giao dịch dẫn đến việc tạo ra các tài khoản mới có mã (code) liên quan (gọi một cách không chính thức là `tạo hợp đồng'). Tất cả các loại giao dịch đều chỉ định một số trường chung:
\begin{description}
\item[type] \linkdest{tx_type}{} Loại giao dịch theo EIP-2718; quy ước là $T_{\mathrm{x}}$.
\item[nonce] \linkdest{tx_nonce}{} Giá trị vô hướng bằng số lượng giao dịch được gửi bởi người gửi; quy ước là $T_{\mathrm{n}}$.
\item[gasLimit] \linkdest{tx_gas_limit_T__g}{} Giá trị vô hướng bằng số lượng gas tối đa nên được sử dụng trong việc thực thi giao dịch này. Đây là khoản thanh toán trước, trước khi thực hiện bất kỳ tính toán nào và không thể tăng sau này; quy ước là $T_{\mathrm{g}}$.
\item[to] \linkdest{tx_to_address_T__t}{} Địa chỉ 160-bit của người nhận cuộc gọi tin nhắn hoặc, đối với một giao dịch tạo hợp đồng, $\varnothing$, được sử dụng ở đây để chỉ định phần tử duy nhất của $\mathbb{B}_0$; quy ước là $T_{\mathrm{t}}$.
\item[value] \linkdest{tx_value_T__v}{} Giá trị vô hướng bằng số lượng Wei sẽ được chuyển đến người nhận cuộc gọi tin nhắn hoặc, trong trường hợp tạo hợp đồng, như một phúc lợi cho tài khoản mới được tạo; quy ước là $T_{\mathrm{v}}$.
\item[r, s] \linkdest{T__r_T__s}{} Các giá trị tương ứng với chữ ký của giao dịch và được sử dụng để xác định người gửi của giao dịch; quy ước là {$T_{\mathrm{r}}$ và $T_{\mathrm{s}}$}. Điều này được mở rộng trong Phụ lục \ref{app:signing}.
\end{description}
Các giao dịch EIP-2930 (loại 1) và EIP-1559 (loại 2) cũng có:
\begin{description}
\item[accessList] \linkdest{tx_access_list}{} Danh sách các mục truy cập để tiếp cận "nóng"; quy ước là $T_{\mathbf{A}}$. \linkdest{access_list_entry}{}Mỗi mục danh sách truy cập $E$ là một bộ dữ liệu (tuple) gồm địa chỉ tài khoản và một danh sách các khóa lưu trữ: $E \equiv (E_{\mathrm{a}}, E_{\mathbf{s}})$.
\item[chainId] \linkdest{tx_chain_id}{} Chain ID; quy ước là $T_{\mathrm{c}}$. Phải bằng với Chain ID của mạng \hyperlink{chain_id}{$\beta$}.
\item[yParity] \linkdest{tx_y_parity}{} Chẵn lẻ của chữ ký; quy ước là $T_{\mathrm{y}}$.
\end{description}
Các giao dịch Legacy không có \textbf{accessList} ($T_{\mathbf{A}}=()$), trong khi \textbf{chainId} và \textbf{yParity} cho giao dịch Legacy được kết hợp thành một giá trị duy nhất:
\begin{description}
\item[w]\linkdest{T__w}{} Một giá trị vô hướng mã hóa chẵn lẻ Y và có thể là Chain ID; quy ước là $T_{\mathrm{w}}$.
$T_{\mathrm{w}} = 27 + T_{\mathrm{y}}$ hoặc $T_{\mathrm{w}} = 2\beta + 35 + T_{\mathrm{y}}$ (xem EIP-155 của \cite{EIP-155}).
\end{description}
Có sự khác biệt trong cách giá gas chấp nhận được được chỉ định trong các giao dịch loại 2 so với các giao dịch loại 0 và loại 1. Các giao dịch loại 2 tận dụng tốt hơn các cải tiến thị trường gas được giới thiệu trong EIP-1559 bằng cách giới hạn một cách rõ ràng \textit{phí ưu tiên (priority fee)}\footnote{\textit{Phí ưu tiên} được thảo luận chi tiết hơn trong các phần \ref{ch:payment} và \ref{ch:transactions}.} mà người gửi phải trả. Các giao dịch loại 2 có hai trường sau liên quan đến gas:
\begin{description}
\item[maxFeePerGas]\linkdest{max_fee_per_gas}{} Một giá trị vô hướng bằng số Wei tối đa phải trả cho mỗi đơn vị \textit{gas} cho tất cả các chi phí tính toán phát sinh do thực hiện giao dịch này; quy ước là $T_{\mathrm{m}}$.
\item[maxPriorityFeePerGas]\linkdest{max_priority_fee_per_gas}{} Một giá trị vô hướng bằng số Wei tối đa phải trả cho người nhận phí của khối như một động viên để xử lý giao dịch; quy ước là $T_{\mathrm{f}}$.
\end{description}
Ngược lại, các giao dịch loại 0 và loại 1 chỉ định giá gas dưới dạng một giá trị duy nhất:
\begin{description}
\item[gasPrice]\linkdest{tx_gas_price_T__p}{} Một giá trị vô hướng bằng số Wei phải trả cho mỗi đơn vị \textit{gas} cho tất cả các chi phí tính toán phát sinh do thực hiện giao dịch này; quy ước là $T_{\mathrm{p}}$.\footnote{Các giao dịch loại 0 và loại 1 sẽ có cùng hành vi giá gas như một giao dịch loại 2 với $T_{\mathrm{m}}$ và $T_{\mathrm{f}}$ được đặt thành giá trị của $T_{\mathrm{p}}$.}
\end{description}
Ngoài ra, một giao dịch tạo hợp đồng (bất kể loại giao dịch) chứa:
\begin{description}
\item[init] Một mảng byte không giới hạn, chỉ định mã EVM (EVM-code) cho quy trình khởi tạo tài khoản, quy ước là $T_{\mathbf{i}}$.
\end{description}
\textbf{init} là một đoạn mã EVM; nó trả về \textbf{body}, một đoạn mã thứ hai thực thi mỗi khi tài khoản nhận một cuộc gọi tin nhắn (dù thông qua một giao dịch hoặc do thực thi nội bộ của mã code). \textbf{init} chỉ thực thi một lần duy nhất khi tạo tài khoản và ngay sau đó sẽ bị loại bỏ.
Ngược lại, một giao dịch cuộc gọi tin nhắn chứa:
\begin{description}
\item[data] Một mảng byte không giới hạn kích thước, chỉ định dữ liệu đầu vào của cuộc gọi tin nhắn, quy ước là $T_{\mathbf{d}}$.
\end{description}
Phụ lục \ref{app:signing} chỉ định hàm $S$, có tác dụng ánh xạ giao dịch đến người gửi, và diễn ra thông qua ECDSA của đường cong SECP-256k1, sử dụng hash của giao dịch (trừ ba trường chữ ký cuối cùng) như là dữ liệu để ký. Để đại diện, chúng ta đơn giản khẳng định rằng người gửi của một giao dịch cụ thể $T$ có thể được biểu diễn bằng $S(T)$.
\begin{equation}
\linkdest{L_transaction} L_{\mathrm{T}}(T) \equiv \begin{cases}
(T_{\mathrm{n}}, T_{\mathrm{p}}, T_{\mathrm{g}}, T_{\mathrm{t}}, T_{\mathrm{v}}, \mathbf{p}, T_{\mathrm{w}}, T_{\mathrm{r}}, T_{\mathrm{s}}) & \text{nếu} \; T_{\mathrm{x}} = 0 \\
(T_{\mathrm{c}}, T_{\mathrm{n}}, T_{\mathrm{p}}, T_{\mathrm{g}}, T_{\mathrm{t}}, T_{\mathrm{v}}, \mathbf{p}, T_{\mathbf{A}}, T_{\mathrm{y}}, T_{\mathrm{r}}, T_{\mathrm{s}}) & \text{nếu} \; T_{\mathrm{x}} = 1 \\
(T_{\mathrm{c}}, T_{\mathrm{n}}, T_{\mathrm{f}}, T_{\mathrm{m}}, T_{\mathrm{g}}, T_{\mathrm{t}}, T_{\mathrm{v}}, \mathbf{p}, T_{\mathbf{A}}, T_{\mathrm{y}}, T_{\mathrm{r}}, T_{\mathrm{s}}) & \text{nếu} \; T_{\mathrm{x}} = 2 \\
\end{cases}
\end{equation}
trong đó
\begin{equation}
\mathbf{p} \equiv \begin{cases}
T_{\mathbf{i}} & \text{nếu}\ T_{\mathrm{t}} = \varnothing \\
T_{\mathbf{d}} & \text{ngược lại}
\end{cases}
\end{equation}
Ở đây, chúng ta giả định rằng tất cả các thành phần đều được thông dịch bởi RLP như là các giá trị số nguyên, ngoại trừ danh sách truy cập $T_{\mathbf{A}}$ và các mảng byte có độ dài tùy ý $T_{\mathbf{i}}$ và $T_{\mathbf{d}}$.
\begin{equation}
\begin{array}[t]{lclclc}
T_{\mathrm{x}} \in \{0, 1, 2\} & \wedge & T_{\mathrm{c}} = \beta & \wedge & T_{\mathrm{n}} \in \mathbb{N}_{256} & \wedge \\
T_{\mathrm{p}} \in \mathbb{N}_{256} & \wedge & T_{\mathrm{g}} \in \mathbb{N}_{256} & \wedge & T_{\mathrm{v}} \in \mathbb{N}_{256} & \wedge \\
T_{\mathrm{w}} \in \mathbb{N}_{256} & \wedge & T_{\mathrm{r}} \in \mathbb{N}_{256} & \wedge & T_{\mathrm{s}} \in \mathbb{N}_{256} & \wedge \\
T_{\mathrm{y}} \in \mathbb{N}_{1} & \wedge & T_{\mathbf{d}} \in \mathbb{B} & \wedge & T_{\mathbf{i}} \in \mathbb{B} & \wedge \\
T_{\mathrm{m}} \in \mathbb{N}_{256} & \wedge & T_{\mathrm{f}} \in \mathbb{N}_{256}
\end{array}
\end{equation}
trong đó
\begin{equation}
\mathbb{N}_{\mathrm{n}} = \{ P: P \in \mathbb{N} \wedge P < 2^n \}
\end{equation}
Băm địa chỉ $T_{\mathbf{t}}$ có một chút khác biệt: nó có thể là một băm địa chỉ 20 byte hoặc, trong trường hợp là một giao dịch tạo hợp đồng (và do đó quy ước bằng $\varnothing$), nó là chuỗi byte trống của RLP và là phần tử của $\mathbb{B}_0$:
\begin{equation}
T_{\mathbf{t}} \in \begin{cases} \mathbb{B}_{20} & \text{nếu} \quad T_{\mathrm{t}} \neq \varnothing \\
\mathbb{B}_{0} & \text{ngược lại}\end{cases}
\end{equation}
\subsection{Khối (The Block)}\linkdest{block}\label{subsec:The_Block}
Khối trong Ethereum là tổ hợp các thông tin liên quan (được biết đến là \textit{header} của khối), $H$, cùng với thông tin tương ứng với các giao dịch bao gồm trong khối, $\mathbf{T}$,\hypertarget{ommerheaders}{} và một thuộc tính $\mathbf{U}$ hiện tại đã bị loại bỏ, trước \textit{Paris} hard fork, nó chứa các header của các khối mà cha của chúng bằng với cha của cha của khối hiện tại (các khối này được biết đến với tên gọi \textit{ommers}\footnote{\textit{ommer} là một thuật ngữ giới tính không phân biệt để chỉ ``anh chị em của cha mẹ''; xem \url{https://nonbinary.miraheze.org/wiki/Gender_neutral_language_in_English\#Aunt/Uncle}}). Header của khối chứa một số thông tin:
%\textit{TODO: Introduce logs}
\begin{description}
\item[parentHash]\linkdest{parent_Hash_H__p_def_words}{} Hash Keccak 256-bit của header của khối cha, toàn bộ; quy ước là $H_{\mathrm{p}}$.
\item[ommersHash] Một trường hash 256-bit bây giờ đã bị loại bỏ do sự thay thế của đồng thuận bằng chứng làm việc. Giờ đây nó là một hằng số, $\texttt{KEC}(\texttt{RLP}(()))$; quy ước là $H_{\mathrm{o}}$.
\item[beneficiary]\linkdest{beneficiary_H__c}{}\linkdest{H__c} Địa chỉ 160-bit mà phí ưu tiên từ khối này sẽ được chuyển đến; quy ước là $H_{\mathrm{c}}$.
\item[stateRoot] Hash Keccak 256-bit của nút gốc của cây trạng thái (state trie), sau khi tất cả các giao dịch được thực thi và các sự hoàn thành (finalisations) được áp dụng; quy ước là $H_{\mathrm{r}}$.
\item[transactionsRoot] Hash Keccak 256-bit của nút gốc của cấu trúc cây (trie) với mỗi giao dịch được điền vào trong phần danh sách giao dịch của khối; quy ước là $H_{\mathrm{t}}$.
\item[receiptsRoot]\linkdest{receipts_Root_def_words}{} Hash Keccak 256-bit của nút gốc của cấu trúc cây (trie) với các biên nhận của mỗi giao dịch được điền vào trong phần danh sách giao dịch của khối; quy ước là $H_{\mathrm{e}}$.
\item[logsBloom]\linkdest{logs_Bloom_def_words}{} Bộ lọc Bloom được tạo ra từ thông tin có thể lập chỉ mục (địa chỉ và chủ đề (logger address and log topics)) chứa trong mỗi mục log từ biên nhận của mỗi giao dịch trong phần danh sách giao dịch; quy ước là $H_{\mathrm{b}}$.
\item[difficulty] Một trường vô hướng hiện tại đã bị loại bỏ do sự thay thế của đồng thuận bằng chứng làm việc. Nó được đặt là 0; quy ước là $H_{\mathrm{d}}$.
\item[number]\linkdest{block_number_word_def_H_i}{} Một giá trị vô hướng bằng số lượng khối tổ tiên. Khối khởi đầu có số là 0; quy ước là \hyperlink{block_number_H__i}{$H_{\mathrm{i}}$}.
\item[gasLimit] Một giá trị vô hướng bằng với giới hạn chi tiêu gas hiện tại của mỗi khối; quy ước là $H_{\mathrm{l}}$.
\item[gasUsed]\linkdest{block_gas_used_H__g}{}\linkdest{H__g} Một giá trị vô hướng bằng với tổng lượng gas đã sử dụng trong các giao dịch trong khối này; quy ước là $H_{\mathrm{g}}$.
\item[timestamp]\linkdest{block_timestamp_word_def_H__s}{} Một giá trị vô hướng bằng với đầu ra hợp lý của time() của Unix tại thời điểm bắt đầu của khối này; quy ước là \hyperlink{block_timestamp_H__s}{$H_{\mathrm{s}}$}.
\item[extraData]\linkdest{block_extraData_H__x}{} Một mảng byte tùy ý chứa dữ liệu liên quan đến khối này. Phải có 32 byte hoặc ít hơn; quy ước là $H_{\mathrm{x}}$.
\item[prevRandao]\linkdest{prevRandao_H__a}{}\linkdest{H__a} mix RANDAO mới nhất\footnote{RANDAO là một giá trị giả ngẫu nhiên được tạo ra bởi các nhà xác thực trên lớp đồng thuận Ethereum. Tham khảo các quy tắc của lớp đồng thuận (\url{https://github.com/ethereum/consensus-specs}) để biết thêm chi tiết về RANDAO.} của trạng thái post beacon của khối trước; quy ước là $H_{\mathrm{a}}$.
\item[nonce]\linkdest{block_nonce_H__n}{}\linkdest{block_nonce} Giá trị 64-bit hiện tại đã bị loại bỏ do sự thay thế của đồng thuận bằng chứng làm việc. Nó được đặt là \texttt{0x0000000000000000}; quy ước là \hyperlink{H__n}{$H_{\mathrm{n}}$}.
\item[baseFeePerGas]\linkdest{block_baseFeePerGas_H__f}{} Một giá trị vô hướng bằng với số lượng wei được đốt cháy cho mỗi đơn vị gas tiêu thụ; quy ước là \hyperlink{H__f}{$H_{\mathrm{f}}$}.
\end{description}
\linkdest{ommer_block_headers_B__U}{}\linkdest{block_B}{}Hai thành phần khác trong khối là một loạt các giao dịch, $B_{\mathbf{T}}$, và một mảng trống trước đây dành cho các header khối ommer, $B_{\mathbf{U}}$. Quy ước là, chúng ta có thể tham chiếu đến một khối $B$:
\begin{equation}
B \equiv (B_{\mathrm{H}}, B_{\mathbf{T}}, B_{\mathbf{U}})
\end{equation}
\subsubsection{Biên nhận Giao dịch (Transaction Receipt)}\linkdest{Transaction_Receipt}{}
Để mã hóa thông tin về một giao dịch mà có thể hữu ích để tạo một bằng chứng không tiết lộ (zero-knowledge proof), hoặc lập chỉ mục và tìm kiếm, chúng ta mã hóa một biên nhận của mỗi giao dịch chứa một số thông tin từ quá trình thực thi của nó.
Mỗi biên nhận, được ký hiệu là $B_{\mathbf{R}}[i]$ cho giao dịch thứ $i$, được đặt trong một \hyperlink{trie}{trie} được chỉ định bởi khóa chỉ mục cây (index-keyed trie) và gốc (root) được ghi lại trong header là \hyperlink{Receipts_Root_H__e}{$H_{\mathrm{e}}$}.
\linkdest{transaction_receipt_R}{}\linkdest{tx_receipt_gas_used_R__u}{}\linkdest{R__u}Biên nhận giao dịch, $R$, là một bộ năm mục bao gồm:
loại của giao dịch, $R_{\mathrm{x}}$,
mã tình trạng (status code) của giao dịch, $R_{\mathrm{z}}$,
tổng lượng gas đã sử dụng trong khối chứa biên nhận giao dịch ngay sau khi giao dịch đã diễn ra, $R_{\mathrm{u}}$,
tập hợp các log được tạo ra thông qua thực thi của giao dịch, \hyperlink{RLP_serialisation_of_a_sequence_of_other_items_R__l_math_def}{$R_\mathbf{l}$} và bộ lọc Bloom được tạo ra từ thông tin trong những log đó, \hyperlink{RLP_serialisation_of_a_byte_array_R__b_math_def}{$R_{\mathrm{b}}$}:
\begin{equation}
R \equiv (R_{\mathrm{x}}, R_{\mathrm{z}}, R_{\mathrm{u}}, R_{\mathrm{b}}, R_{\mathbf{l}})
\end{equation}
$R_{\mathrm{x}}$ bằng với \hyperlink{tx_type}{loại} của giao dịch tương ứng.
\linkdest{L__R}Hàm $L_{\mathrm{R}}$ chuẩn bị một biên nhận giao dịch để chuyển đổi thành một mảng byte được tuần tự hóa RLP (RLP-serialised):
\begin{equation}
L_{\mathrm{R}}(R) \equiv (R_{\mathrm{z}}, R_{\mathrm{u}}, R_{\mathrm{b}}, R_{\mathbf{l}})
\end{equation}
\linkdest{R__z_assert}Chúng ta khẳng định rằng mã tình trạng $R_{\mathrm{z}}$ là một số nguyên không âm:
\begin{equation}
R_{\mathrm{z}} \in \mathbb{N}
\end{equation}
\linkdest{R__u_assert}Chúng ta khẳng định rằng $R_{\mathrm{u}}$, tổng lượng gas đã sử dụng, là một số nguyên không âm và rằng log Bloom, $R_{\mathrm{b}}$, là một hash có kích thước là 2048 bit (256 byte):
\begin{equation}
R_{\mathrm{u}} \in \mathbb{N} \quad \wedge \quad R_{\mathrm{b}} \in \mathbb{B}_{256}
\end{equation}
%Đáng chú ý rằng $B_{\mathbf{T}}$ không được RLP-serialised vào khối bởi hàm chuẩn bị khối $L_{\mathrm{B}}$; nó chỉ là một tương đương tiện lợi.
Dãy $R_{\mathbf{l}}$ là một loạt các mục log, $(O_0, O_1, ...)$. Một mục log, $O$, là một bộ (tuple) gồm địa chỉ của logger, $O_{\mathrm{a}}$, một loạt có thể trống các chủ đề log 32 byte, $O_{\mathbf{t}}$, và một số byte dữ liệu, $O_{\mathbf{d}}$:
\begin{equation}
O \equiv (O_{\mathrm{a}}, ({O_{\mathbf{t}}}_0, {O_{\mathbf{t}}}_1, ...), O_{\mathbf{d}})
\end{equation}
\begin{equation}
O_{\mathrm{a}} \in \mathbb{B}_{20} \quad \wedge \quad \forall x \in O_{\mathbf{t}}: x \in \mathbb{B}_{32} \quad \wedge \quad O_{\mathbf{d}} \in \mathbb{B}
\end{equation}
Chúng ta định nghĩa hàm bộ lọc Bloom, $M$, để chuyển đổi một mục log thành một hash đơn 256 byte duy nhất:
\begin{equation}
M(O) \equiv \hyperlink{bigvee}{\bigvee}_{x \in \{O_{\mathrm{a}}\} \cup O_{\mathbf{t}}} \big( M_{3:2048}(x) \big)
\end{equation}
trong đó $M_{3:2048}$ là một bộ lọc Bloom chuyên biệt được thiết lập với ba bit trong tổng số 2048 bit, dựa trên một chuỗi byte tùy ý. Điều này được thực hiện bằng cách lấy 11 bit thấp nhất của mỗi cặp đầu tiên của byte trong hash Keccak-256 của chuỗi byte.\footnote{2048 $= 2^{11}$(11 bits), và 11 bit thấp nhất là phần dư 2048 của toán hạng, trong trường hợp này là "mỗi cặp đầu tiên của byte trong hash Keccak-256 của chuỗi byte."}. Quy ước:
\begin{eqnarray}
M_{3:2048}(\mathbf{x}: \mathbf{x} \in \mathbb{B}) & \equiv & \mathbf{y}: \mathbf{y} \in \mathbb{B}_{256} \quad \text{trong đó:}\\
\mathbf{y} & = & (0, 0, ..., 0) \quad \text{ngoại trừ:}\\
\forall i \in \{0, 2, 4\}&:&\mathcal{B}_{2047 - m(\mathbf{x}, i)}(\mathbf{y}) = 1\\
m(\mathbf{x}, i) &\equiv& \mathtt{KEC}(\mathbf{x})[i, i + 1] \bmod 2048
\end{eqnarray}
trong đó $\mathcal{B}$ là hàm tham chiếu bit sao cho $\mathcal{B}_{\mathrm{j}}(\mathbf{x})$ bằng với bit có chỉ mục $j$ (đánh chỉ mục từ 0) trong mảng byte $\mathbf{x}$.
Đáng chú ý, nó xử lý $\mathbf{x}$ như là big-endian (các bit có ý nghĩa lớn hơn sẽ có chỉ mục nhỏ hơn).
\subsubsection{Tính hợp lý toàn diện (Holistic Validity)}
\linkdest{block_validity}{}Chúng ta có thể khẳng định tính hợp lý của một khối nếu và chỉ nếu nó đáp ứng một số điều kiện: trường ommers ($B_{\mathbf{U}}$) của khối phải là một mảng rỗng và tiêu đề của khối phải nhất quán với các giao dịch được cung cấp ($B_{\mathbf{T}}$). Để header nhất quán với các giao dịch $B_{\mathbf{T}}$, \textbf{stateRoot} ($H_{\mathrm{r}}$) phải khớp với trạng thái kết quả sau khi thực hiện tất cả các giao dịch theo thứ tự trên trạng thái cơ sở $\boldsymbol{\sigma}$ (như được chỉ định trong phần \ref{ch:finalisation}), và \textbf{transactionsRoot} ($H_{\mathrm{t}}$), \textbf{receiptsRoot} ($H_{\mathrm{e}}$), và \textbf{logsBloom} ($H_{\mathrm{b}}$) phải được tạo ra chính xác từ chính các giao dịch, các biên nhận kết quả từ quá trình thực thi và các logs kết quả, tương ứng.
\begin{equation}
\begin{array}[t]{lclc}
B_{\mathbf{U}} &\equiv& () & \wedge \\
\linkdest{new_state_H__r}{}H_{\mathrm{r}} &\equiv& \mathtt{TRIE}(L_S(\Pi(\boldsymbol{\sigma}, B))) & \wedge \\
\linkdest{tx_block_hash_H__t}{}H_{\mathrm{t}} &\equiv& \mathtt{TRIE}(\{\forall i < \lVert B_{\mathbf{T}} \rVert, i \in \mathbb{N}: &\\&& \quad\quad p_{\mathrm{T}}(i, B_{\mathbf{T}}[i])\}) & \wedge \\
\linkdest{Receipts_Root_H__e}{}H_{\mathrm{e}} &\equiv& \mathtt{TRIE}(\{\forall i < \lVert B_{\mathbf{R}} \rVert, i \in \mathbb{N}: &\\&& \quad\quad p_{\mathrm{R}}(i, B_{\mathbf{R}}[i])\}) & \wedge \\
\linkdest{logs_Bloom_filter_H__b}{}H_{\mathrm{b}} &\equiv& \bigvee_{\mathbf{r} \in B_{\mathbf{R}}} \big( \mathbf{r}_{\mathrm{b}} \big)
\end{array}
\end{equation}
trong đó $p_{\mathrm{T}}(k, v)$ và $p_{\mathrm{R}}(k, v)$ là các phép biến đổi RLP theo cặp, nhưng với một phương pháp xử lý đặc biệt cho các giao dịch EIP-2718:
\begin{equation}
p_{\mathrm{T}}(k, T) \equiv \left( \mathtt{RLP}(k), \begin{cases}
\mathtt{RLP}(\hyperlink{L_transaction}{L_{\mathrm{T}}}(T)) & \text{nếu} \quad T_{\mathrm{x}} = 0 \\
(T_{\mathrm{x}}) \cdot \mathtt{RLP}(L_{\mathrm{T}}(T)) & \text{ngược lại}
\end{cases}
\right)
\end{equation}
và
\begin{equation}
p_{\mathrm{R}}(k, R) \equiv \left( \mathtt{RLP}(k), \begin{cases}
\mathtt{RLP}(\hyperlink{L__R}{L_{\mathrm{R}}}(R)) & \text{nếu} \quad R_{\mathrm{x}} = 0 \\
(R_{\mathrm{x}}) \cdot \mathtt{RLP}(L_{\mathrm{R}}(R)) & \text{ngược lại}
\end{cases}
\right)
\end{equation}
($\cdot$ là việc nối chuỗi của các mảng byte).
Hơn nữa:
\begin{equation}
\mathtt{TRIE}(L_{\mathrm{S}}(\boldsymbol{\sigma})) = {P(B_H)_H}_{\mathrm{r}}
\end{equation}
Do đó, $\texttt{TRIE}(L_{\mathrm{S}}(\boldsymbol{\sigma}))$ là giá trị hash của nút gốc của cấu trúc cây Merkle Patricia chứa các cặp khóa-giá trị của trạng thái $\boldsymbol{\sigma}$ với giá trị được mã hóa bằng RLP, và $P(B_{\mathrm{H}})$ là khối cha của $B$, được định nghĩa trực tiếp.
Các giá trị phát sinh từ việc tính toán các giao dịch, cụ thể là \hyperlink{Transaction_Receipt}{biên nhận giao dịch}, $B_{\mathbf{R}}$, và được định nghĩa thông qua \hyperlink{Pi}{hàm tích lũy trạng thái, $\Pi$} của giao dịch, sẽ được hình thành chi tiết hơn trong phần \ref{sec:statenoncevalidation}.
\subsubsection{Tuần tự hóa (Serialisation)}
\hypertarget{block_preparation_function_for_RLP_serialization_L__B}{}\linkdest{L__B}\hypertarget{block_preparation_function_for_RLP_serialization_L__H}{}\linkdest{L__B}Hàm $L_{\mathrm{B}}$ và $L_{\mathrm{H}}$ là các hàm chuẩn bị cho một khối và header khối tương ứng.
Chúng ta khẳng định các kiểu và thứ tự của cấu trúc khi sự chuyển đổi RLP được yêu cầu:
\begin{eqnarray}
\quad L_{\mathrm{H}}(H) & \equiv & (\begin{array}[t]{l}H_{\mathrm{p}}, H_{\mathrm{o}}, H_{\mathrm{c}}, H_{\mathrm{r}}, H_{\mathrm{t}}, H_{\mathrm{e}}, H_{\mathrm{b}}, H_{\mathrm{d}},\\ H_{\mathrm{i}}, H_{\mathrm{l}}, H_{\mathrm{g}}, H_{\mathrm{s}}, H_{\mathrm{x}}, H_{\mathrm{a}}, H_{\mathrm{n}}, H_{\mathrm{f}} \; )\end{array} \\
\quad L_{\mathrm{B}}(B) & \equiv & \big( L_{\mathrm{H}}(B_{\mathrm{H}}), \widetilde{L}_{\mathrm{T}}^*(B_{\mathbf{T}}), L_{\mathrm{H}}^*(\hyperlink{ommer_block_headers_B__U}{B_{\mathbf{U}}}) \big)
\end{eqnarray}
trong đó $\widetilde{L}_{\mathrm{T}}$ quan tâm đặc biệt của các giao dịch EIP-2718:
\begin{equation}
\widetilde{L}_{\mathrm{T}}(T) = \begin{cases}
\hyperlink{L_transaction}{L_{\mathrm{T}}}(T) & \text{nếu} \quad T_{\mathrm{x}} = 0 \\
(T_{\mathrm{x}}) \cdot \mathtt{RLP}(L_{\mathrm{T}}(T)) & \text{ngược lại}
\end{cases}
\end{equation}
\hypertarget{general_element_wise_sequence_transformation_f_pow_asterisk}{}với $\widetilde{L}_{\mathrm{T}}^*$ và $L_{\mathrm{H}}^*$ là các biến đổi chuỗi theo phần tử, do đó:
\begin{equation}
f^*\big( (x_0, x_1, ...) \big) \equiv \big( f(x_0), f(x_1), ... \big) \quad \text{cho bất kỳ hàm} \; f
\end{equation}
Các loại thành phần được định nghĩa như sau:
\begin{equation}
\begin{array}[t]{lclclcl}
\hyperlink{parent_Hash_H__p_def_words}{H_{\mathrm{p}}} \in \mathbb{B}_{32} & \wedge & H_{\mathrm{o}} \in \mathbb{B}_{32} & \wedge & H_{\mathrm{c}} \in \mathbb{B}_{20} & \wedge \\
\hyperlink{new_state_H__r}{H_{\mathrm{r}}} \in \mathbb{B}_{32} & \wedge & H_{\mathrm{t}} \in \mathbb{B}_{32} & \wedge & \hyperlink{Receipts_Root_H__e}{H_{\mathrm{e}}} \in \mathbb{B}_{32} & \wedge \\
\hyperlink{logs_Bloom_filter_H__b}{H_{\mathrm{b}}} \in \mathbb{B}_{256} & \wedge & H_{\mathrm{d}} \in \mathbb{N} & \wedge & \hyperlink{block_number_H__i}{H_{\mathrm{i}}} \in \mathbb{N} & \wedge \\
\hyperlink{block_gas_limit_H__l}{H_{\mathrm{l}}} \in \mathbb{N} & \wedge & H_{\mathrm{g}} \in \mathbb{N} & \wedge & \hyperlink{block_timestamp_H__s}{H_{\mathrm{s}}} \in \mathbb{N}_{256} & \wedge \\
\hyperlink{block_extraData_H__x}{H_{\mathrm{x}}} \in \mathbb{B} & \wedge & H_{\mathrm{a}} \in \mathbb{B}_{32} & \wedge & \hyperlink{block_nonce_H__n}{H_{\mathrm{n}}} \in \mathbb{B}_{8} & \wedge \\
\hyperlink{block_baseFeePerGas_H__f}{H_{\mathrm{f}}} \in \mathbb{N}
\end{array}
\end{equation}
trong đó
\begin{equation}
\mathbb{B}_{\mathrm{n}} = \{ B: B \in \mathbb{B} \wedge \lVert B \rVert = n \}
\end{equation}
Bây giờ chúng ta có một đặc tả chặt chẽ cho việc xây dựng một cấu trúc khối chính thức. Hàm RLP $\texttt{RLP}$ (xem Phụ lục \ref{app:rlp}) cung cấp phương pháp cổ điển để biến đổi cấu trúc này thành một chuỗi byte sẵn sàng được truyền qua mạng hoặc lưu trữ cục bộ.
\subsubsection{Sự Hợp Lệ của Tiêu Đề Khối (Block Header Validity)}
Chúng ta định nghĩa $P(B_{\mathrm{H}})$ là khối cha của $B$, quy ước là:
\begin{equation}
P(H) \equiv B': \mathtt{KEC}(\mathtt{RLP}(B'{\mathrm{H}})) = \hyperlink{parent_Hash_H__p_def_words}{H{\mathrm{p}}}
\end{equation}
\hypertarget{block_number_H__i}{}Số khối là số khối của khối cha tăng lên một:
\begin{equation}
H_{\mathrm{i}} \equiv {{P(H){\mathrm{H}}}{\mathrm{i}}} + 1
\end{equation}
\newcommand{\mindifficulty}{D_\mathrm{min}}
\newcommand{\homesteadmod}{\ensuremath{\varsigma_2}}
\newcommand{\expdiffsymb}{\ensuremath{\epsilon}}
\newcommand{\diffadjustment}{x}
\linkdest{H__f}Bản phát hành \textit{London} giới thiệu thuộc tính khối \textit{phí cơ sở trên mỗi gas} \hyperlink{block_baseFeePerGas_H__f}{$H_{\mathrm{f}}$} (xem EIP-1559 của \cite{EIP-1559}).
Phí cơ sở là lượng wei được đốt cháy cho mỗi đơn vị gas tiêu thụ trong quá trình thực hiện giao dịch trong khối.
Giá trị của phí cơ sở là một hàm của sự khác biệt giữa gas được sử dụng bởi khối cha và \textit{mục tiêu gas} của khối cha.
Phí cơ sở dự kiến trên mỗi gas được định nghĩa như sau $F(H)$:
\begin{equation}
F(H) \equiv \begin{cases}
1000000000 & \text{nếu} \quad H_{\mathrm{i}} = F_{\mathrm{London}} \\
{P(H)_{\mathrm{H}}}_{\mathrm{f}} & \text{nếu} \quad {P(H)_{\mathrm{H}}}_{\mathrm{g}} = \tau \\
{P(H)_{\mathrm{H}}}_{\mathrm{f}} - \nu & \text{nếu} \quad {P(H)_{\mathrm{H}}}_{\mathrm{g}} < \tau \\
{P(H)_{\mathrm{H}}}_{\mathrm{f}} + \nu & \text{nếu} \quad {P(H)_{\mathrm{H}}}_{\mathrm{g}} > \tau
\end{cases}
\end{equation}
trong đó:
\begin{align}
\tau &\equiv \lfloor\frac{{P(H)_{\mathrm{H}}}_{\mathrm{l}}}{\rho} \rfloor \\
\rho &\equiv 2 \\
\nu^* &\equiv \begin{cases}
\lfloor \frac{{P(H)_{\mathrm{H}}}_{\mathrm{f}} \times ({\tau - P(H)_{\mathrm{H}}}_{\mathrm{g}})}{\tau} \rfloor & \text{nếu} \quad {P(H)_{\mathrm{H}}}_{\mathrm{g}} < \tau \\
\lfloor \frac{{P(H)_{\mathrm{H}}}_{\mathrm{f}} \times ({P(H)_{\mathrm{H}}}_{\mathrm{g}} - \tau)}{\tau} \rfloor & \text{nếu} \quad {P(H)_{\mathrm{H}}}_{\mathrm{g}} > \tau \\
\end{cases} \\
\nu &\equiv \begin{cases}
\lfloor \frac{\nu^*}{\xi} \rfloor & \text{nếu} \quad {P(H)_{\mathrm{H}}}_{\mathrm{g}} < \tau \\
max(\lfloor \frac{\nu^*}{\xi} \rfloor, 1) & \text{nếu} \quad {P(H)_{\mathrm{H}}}_{\mathrm{g}} > \tau \\
\end{cases} \\
\xi &\equiv 8
\end{align}
\textit{Mục tiêu gas}, $\tau$, được định nghĩa là giới hạn gas $H_{\mathrm{l}}$ chia cho \textit{hệ số đàn hồi}, $\rho$, một hằng số toàn cục được đặt là 2. Vì vậy, mặc dù các khối có thể tiêu thụ nhiều gas bằng giới hạn gas, nhưng phí cơ sở được điều chỉnh sao cho trung bình các khối tiêu thụ nhiều gas bằng mục tiêu gas. Phí cơ sở tăng trong khối hiện tại khi sử dụng gas của khối cha vượt quá mục tiêu gas, và ngược lại, phí cơ sở giảm trong khối hiện tại khi sử dụng gas của khối cha ít hơn mục tiêu gas.
Cường độ của sự tăng hoặc giảm phí cơ sở, được định nghĩa là $\nu$, tỉ lệ với sự khác biệt giữa lượng gas mà khối cha tiêu thụ và mục tiêu gas của khối cha. Ảnh hưởng đến phí cơ sở được làm dịu bởi một hằng số toàn cục được gọi là \textit{mẫu số tối đa biến đổi phí cơ sở}, quy ước là $\xi$, được đặt là 8. Một giá trị là 8 đồng nghĩa với việc phí cơ sở có thể tăng hoặc giảm tối đa 12.5\% từ một khối sang khối tiếp theo.
\hypertarget{block_gas_limit_H__l}{}Giới hạn gas chuẩn $H_{\mathrm{l}}$ của một khối có header $H$ phải đáp ứng mối quan hệ:
\begin{eqnarray}
& & H_{\mathrm{l}} < {P(H)_{\mathrm{H}}}_{\mathrm{l}'} + \left\lfloor\frac{{P(H)_{\mathrm{H}}}_{\mathrm{l}'}}{1024}\right\rfloor \quad \wedge \\
\nonumber& & H_{\mathrm{l}} > {P(H)_{\mathrm{H}}}_{\mathrm{l}'} - \left\lfloor\frac{{P(H)_{\mathrm{H}}}_{\mathrm{l}'}}{1024}\right\rfloor \quad \wedge \\
\nonumber& & H_{\mathrm{l}} \geqslant 5000
\end{eqnarray}
trong đó:
\begin{align}
{P(H)_{\mathrm{H}}}_{\mathrm{l}'} &\equiv \begin{cases}
{P(H)_{\mathrm{H}}}_{\mathrm{l}} \times \rho & \text{nếu} \quad H_{\mathrm{i}} = F_{\mathrm{London}} \\
{P(H)_{\mathrm{H}}}_{\mathrm{l}} & \text{nếu} \quad H_{\mathrm{i}} > F_{\mathrm{London}} \\
\end{cases}
\end{align}
Để tránh sự gián đoạn trong việc sử dụng gas, giá trị giới hạn gas của khối cha cho mục đích xác nhận giới hạn gas của khối hiện tại được sửa đổi tại khối \textit{fork London} bằng cách nhân nó với \textit{hệ số đàn hồi}, $\rho$. Chúng ta gọi giá trị sửa đổi này là ${P(H)_{\mathrm{H}}}_{\mathrm{l}'}$. Điều này đảm bảo rằng mục tiêu gas cho các khối sau \textit{fork London} có thể được đặt xấp xỉ với giới hạn gas của các khối trước \textit{fork London}.
\hypertarget{block_timestamp_H__s}{}$H_{\mathrm{s}}$ là dấu thời gian (theo thời gian Unix's) của khối $H$ và phải đáp ứng mối quan hệ:
\begin{equation}
H_{\mathrm{s}} > {P(H)_{\mathrm{H}}}_{\mathrm{s}}
\end{equation}
Hard fork \textit{Paris} đã thay đổi cơ chế đồng thuận của Ethereum từ bằng chứng công việc sang bằng chứng cổ phần, và do đó đã không còn sử dụng nhiều thuộc tính trong phần đầu khối (block header) liên quan đến bằng chứng công việc. Những thuộc tính đã không còn sử dụng này bao gồm \textbf{nonce} ($H_{\mathbf{n}}$), \textbf{ommersHash} ($H_{\mathbf{o}}$), \textbf{difficulty} ($H_{\mathbf{d}}$), và \textbf{mixHash} ($H_{\mathbf{m}}$).
\textbf{mixHash} đã được thay thế bằng một trường mới \textbf{prevRandao} ($H_{\mathbf{a}}$). Các trường header khác liên quan đến bằng chứng công việc đã được thay thế bằng các hằng số:
\begin{eqnarray}
H_{\mathrm{o}} & \equiv & \texttt{KEC}(\texttt{RLP}(())) \\
H_{\mathrm{d}} & \equiv & 0 \\
H_{\mathrm{n}} & \equiv & \texttt{0x0000000000000000}
\end{eqnarray}
Giá trị của \textbf{prevRandao} phải được xác định bằng cách sử dụng thông tin từ Beacon Chain. Mặc dù chi tiết về cách tạo giá trị \textit{RANDAO} trên Beacon Chain vượt quá phạm vi của bài báo này, nhưng chúng ta có thể tham chiếu đến giá trị \textit{RANDAO} dự kiến cho khối trước đó là $\mathtt{PREVRANDAO}()$.
\hypertarget{block_header_validity_function}{}Do đó, chúng ta có thể định nghĩa hàm kiểm tra tính hợp lệ của tiêu đề khối (block header) $V(H)$:
\begin{eqnarray}
V(H) & \equiv & H_{\mathrm{g}} \le H_{\mathrm{l}} \quad \wedge \\
\nonumber& & H_{\mathrm{l}} < {P(H)_{\mathrm{H}}}_{\mathrm{l}'} + \left\lfloor\frac{{P(H)_{\mathrm{H}}}_{\mathrm{l}'}}{1024}\right\rfloor \quad \wedge \\
\nonumber& & H_{\mathrm{l}} > {P(H)_{\mathrm{H}}}_{\mathrm{l}'} - \left\lfloor\frac{{P(H)_{\mathrm{H}}}_{\mathrm{l}'}}{1024}\right\rfloor \quad \wedge \\
\nonumber& & H_{\mathrm{l}} \geqslant 5000 \quad \wedge \\
\nonumber& & H_{\mathrm{s}} > {P(H)_{\mathrm{H}}}_{\mathrm{s}} \quad \wedge \\
\nonumber& & H_{\mathrm{i}} = {P(H)_{\mathrm{H}}}_{\mathrm{i}} +1 \quad \wedge \\
\nonumber& & \lVert H_{\mathrm{x}} \rVert \le 32 \quad \wedge \\
\nonumber& & H_{\mathrm{f}} = F(H) \wedge \\
\nonumber& & H_{\mathrm{o}} = \texttt{KEC}(\texttt{RLP}(())) \quad \wedge \\
\nonumber& & H_{\mathrm{d}} = 0 \quad \wedge \\
\nonumber& & H_{\mathrm{n}} = \texttt{0x0000000000000000} \quad \wedge \\
\nonumber& & H_{\mathrm{a}} = \mathtt{PREVRANDAO}()
\end{eqnarray}
Lưu ý thêm rằng \textbf{extraData} phải có tối đa 32 byte.
\section{Gas và Thanh toán} \label{ch:payment}
Để tránh vấn đề lạm dụng mạng và để né tránh các câu hỏi không tránh khỏi xuất phát từ tính hoàn chỉnh của Turing, tất cả các tính toán có thể lập trình trong Ethereum đều phải trả phí. Biểu phí được quy định theo đơn vị \textit{gas} (xem Phụ lục \ref{app:fees} để biết các phí liên quan đến các loại tính toán khác nhau). Do đó, bất kỳ đoạn tính toán có thể lập trình nào (điều này bao gồm việc tạo hợp đồng, thực hiện cuộc gọi tin nhắn, sử dụng và truy cập vào bộ nhớ tài khoản cũng như thực thi các hoạt động trên máy ảo) có một thỏa thuận chung chi phí về gas.
Mỗi giao dịch đều có một lượng gas cụ thể đi kèm: \textbf{gasLimit}. Đây là lượng gas được ngầm mua từ số dư tài khoản của người gửi. Việc mua này diễn ra ở mức \textit{giá gas hiệu quả} được xác định trong phần \ref{ch:transactions}. Giao dịch được coi là không hợp lệ nếu số dư tài khoản không thể hỗ trợ việc mua này. Nó được đặt tên là \textbf{gasLimit} vì bất kỳ gas không sử dụng nào ở cuối giao dịch đều được hoàn trả (với cùng mức giá mua) vào số dư tài khoản của người gửi. Gas không tồn tại ngoài việc thực hiện một giao dịch. Do đó, đối với các tài khoản có mã nguồn đáng tin cậy được liên kết, một giới hạn gas tương đối cao có thể được đặt và giữ nguyên.
Kể từ khi giới thiệu EIP-1559 bở \cite{EIP-1559} trong hard fork \textit{London}, mỗi giao dịch được đưa vào trong một khối phải trả một \textit{phí cơ sở}, được xác định là wei cho mỗi đơn vị gas tiêu thụ và là hằng số cho mỗi giao dịch trong một khối. Ether được trả để đáp ứng phí cơ sở này sẽ được đốt cháy (rút khỏi lưu thông). phí cơ sở điều chỉnh động như là một hàm của lượng gas tiêu thụ trong khối trước đó so với \textit{mục tiêu gas} của nó (một giá trị hiện tại là một nửa giới hạn gas của khối, có thể được điều chỉnh bởi các trình xác nhận (validators)). Nếu tổng mức tiêu thụ gas của khối trước vượt quá mục tiêu gas, điều này cho thấy nhu cầu vượt quá về không gian khối ở mức phí cơ sở hiện tại và phí cơ sở sẽ tăng lên. Ngược lại, nếu lượng gas tiêu thụ trong khối trước đó thấp hơn mục tiêu gas, nhu cầu về không gian khối thấp hơn mục tiêu gas ở giá cơ bản hiện tại, và do đó phí cơ sở sẽ giảm. Quá trình điều chỉnh phí cơ sở này giúp đưa lượng gas tiêu thụ trung bình của các khối vào đúng với mục tiêu gas. Xem phần \ref{subsec:The_Block} để biết chi tiết hơn về cách phí cơ sở được đặt.
Để khuyến khích các trình xác nhận (validators) xử lý các giao dịch, có một khoản phí bổ sung được biết đến là \textit{phí ưu tiên} (\textit{priority fee}), cũng được xác định dưới dạng wei cho mỗi đơn vị gas tiêu thụ. Tổng phí mà người tạo giao dịch (transactor) phải trả là tổng của phí cơ sở trên mỗi đơn vị gas và phí ưu tiên trên mỗi đơn vị gas, nhân với tổng lượng gas tiêu thụ. Ether được sử dụng để thanh toán phí ưu tiên được chuyển đến địa chỉ \textit{người thụ hưởng} (\textit{beneficiary}), địa chỉ của một tài khoản thường nằm dưới sự kiểm soát của trình xác nhận (validator).
Người tạo giao dịch (transactors) sử dụng giao dịch loại 2 có thể chỉ định phí ưu tiên tối đa mà họ sẵn lòng trả (\textbf{maxPriorityFeePerGas}), cũng như tổng phí tối đa mà họ sẵn lòng trả (\textbf{maxFeePerGas}), bao gồm cả phí ưu tiên và phí cơ sở. \textbf{maxFeePerGas} phải ít nhất bằng phí cơ sở để giao dịch được đưa vào trong một khối. Giao dịch loại 0 và loại 1 chỉ có một trường để chỉ định giá gas--\textbf{gasPrice}--cũng phải ít nhất bằng phí cơ sở để được đưa vào một khối. Số lượng bởi \textbf{gasPrice} vượt quá phí cơ sở chính là phí ưu tiên trong trường hợp của một giao dịch loại 0 hoặc loại 1.
Người gửi giao dịch có thể tự do chọn bất kỳ phí ưu tiên nào mà họ mong muốn, tuy nhiên trình xác nhận (validator) cũng có quyền bỏ qua giao dịch theo cách họ chọn. Do đó, một phí ưu tiên cao hơn trên một giao dịch sẽ tốn nhiều hơn về mặt Ether đối với người gửi và mang lại giá trị lớn hơn cho trình xác nhận (validator), và do đó có khả năng được chọn để xử lý. Vì sẽ có một phân phối (có trọng số) của phí ưu tiên tối thiểu chấp nhận được, người gửi giao dịch sẽ phải đưa ra một sự cân nhắc giữa việc giảm phí ưu tiên và tối đa hóa cơ hội giao dịch của họ được đưa vào một khối một cách kịp thời.
%\subsubsection{Determining Computation Costs}
\section{Thực thi giao dịch (Transaction Execution)} \label{ch:transactions}
Quá trình thực thi của một giao dịch là phần phức tạp nhất của giao thức Ethereum: nó định nghĩa hàm chuyển trạng thái \hyperlink{Upsilon_state_transition}{$\Upsilon$}. Giả định rằng mọi giao dịch được thực hiện đều trải qua các kiểm tra ban đầu về tính hợp lệ nội tại. Các kiểm tra này bao gồm:
\begin{enumerate}
\item Giao dịch là định dạng RLP chính xác, không có các byte thừa ở cuối;
\item Chữ ký của giao dịch là hợp lệ;
\item \hyperlink{transaction_nonce}{Nonce của giao dịch} là hợp lệ (tương đương với \hyperlink{account_nonce}{nonce hiện tại của tài khoản người gửi (sender)});
\item Tài khoản người gửi không có mã hợp đồng triển khai (xem EIP-3607 của \cite{EIP-3607});
\item Giới hạn gas không nhỏ hơn gas nội tại, $g_0$, được sử dụng bởi giao dịch;
\item Số dư của tài khoản người gửi chứa ít nhất số chi phí cần thiết, $v_0$, được yêu cầu trong khoản thanh toán trước;
\item \textbf{maxFeePerGas}, $T_m$, trong trường hợp của giao dịch loại 2, hoặc \textbf{gasPrice}, $T_p$, trong trường hợp của giao dịch loại 0 và loại 1, lớn hơn hoặc bằng phí cơ sở của khối, $H_{\mathrm{f}}$; và
\item đối với giao dịch loại 2, \textbf{maxPriorityFeePerGas}, $T_f$, phải không lớn hơn \textbf{maxFeePerGas}, $T_m$.
\end{enumerate}
Một cách chính thức, chúng ta xem xét hàm \hyperlink{Upsilon_state_transition}{$\Upsilon$}, với $T$ là một giao dịch và $\boldsymbol{\sigma}$ là trạng thái:
\begin{equation}
\boldsymbol{\sigma}' = \Upsilon(\boldsymbol{\sigma}, T)
\end{equation}
Như vậy, $\boldsymbol{\sigma}'$ là trạng thái sau giao dịch. Chúng ta cũng định nghĩa \hyperlink{tx_total_gas_used_Upsilon_pow_g}{$\Upsilon^{\mathrm{g}}$} để đánh giá lượng gas được sử dụng trong quá trình thực hiện một giao dịch, \hyperlink{tx_logs_Upsilon_pow_l}{$\Upsilon^{\mathbf{l}}$} để đánh giá các mục log được tích lũy của giao dịch và \hyperlink{tx_status_Upsilon_pow_z}{$\Upsilon^{\mathrm{z}}$} để đánh giá mã tình trạng kết quả từ giao dịch. Những điều này sẽ được định nghĩa chính thức sau này.
\subsection{Trạng thái con (Substate)} \label{ch:substate}
Trong suốt quá trình thực thi giao dịch, chúng ta tích lũy một số thông tin được thực hiện ngay theo giao dịch. Chúng ta gọi đó là \textit{trạng thái con giao dịch đã tích lũy}, hoặc ngắn gọn là \textit{trạng thái con tích lũy}, và biểu diễn nó như là $A$, là một bộ (tuple):
\begin{equation}
A \equiv (A_{\mathbf{s}}, A_{\mathbf{l}}, A_{\mathbf{t}}, A_{\mathrm{r}}, A_{\mathbf{a}}, A_{\mathbf{K}})
\end{equation}
\hypertarget{self_destruct_set_wordy_defn_A__s}{}Phần tử của bộ bao gồm $A_{\mathbf{s}}$, tập hợp tự phá huỷ (self-destruct): một tập hợp các tài khoản sẽ bị loại bỏ sau khi giao dịch hoàn tất.
\hypertarget{tx_log_series_wordy_defn_A__l}{}$A_{\mathbf{l}}$ là dãy log: đây là một dãy các `điểm tham chiếu' (`checkpoints') được lưu trữ và có thể được lập chỉ mục trong việc thực thi mã VM, giúp theo dõi dễ dàng các cuộc gọi hợp đồng bởi những người quan sát bên ngoài thế giới Ethereum (như giao diện người dùng của ứng dụng phi tập trung).
\hypertarget{tx_touched_accounts_wordy_defn_A__t}{}$A_{\mathbf{t}}$ là tập hợp các tài khoản đã chạm vào, trong đó những tài khoản trống sẽ bị xóa vào cuối giao dịch.
\hypertarget{refund_balance_defn_words_A__r}{}$A_{\mathrm{r}}$ là số dư hoàn trả, tăng lên thông qua việc sử dụng chỉ thị \hyperlink{SSTORE}{{\small SSTORE}} để đặt lại bộ nhớ lưu trữ của hợp đồng về không từ giá trị khác không. Mặc dù không được hoàn trả ngay lập tức, nó được phép một phần để làm giảm bớt chi phí thực thi tổng cộng.
Cuối cùng, EIP-2929 của \cite{EIP-2929} giới thiệu \hypertarget{accessed_addresses_defn_words_A__a}{}$A_{\mathbf{a}}$, tập hợp địa chỉ tài khoản đã được truy cập, và \hypertarget{accessed_storage_keys_defn_words_A__k}{}$A_{\mathbf{K}}$, tập hợp các khóa bộ nhớ được truy cập (chính xác hơn, mỗi phần tử của $A_{\mathbf{K}}$ là một bộ (tuple) giữa một địa chỉ tài khoản 20 byte và một khe bộ nhớ 32 byte).
Chúng ta định nghĩa trạng thái con đã tích lũy rỗng $A^0$ thành không có tự phá huỷ (self-destruct), không có log, không có tài khoản đã chạm vào, số dư hoàn trả là không, tất cả hợp đồng đã được biên dịch trước trong địa chỉ đã được truy cập, và không có bộ nhớ nào đã được truy cập:
\begin{equation}
A^0 \equiv (\varnothing, (), \varnothing, 0, \pi, \varnothing)
\end{equation}
trong đó $\hyperlink{precompiled_set}{\pi}$ là tập hợp của tất cả địa chỉ được biên dịch trước.
\subsection{Thực thi (Execution)}
\hypertarget{intrinsic_gas_g_0}{}Chúng ta định nghĩa gas nội tại $g_0$, lượng gas mà giao dịch này yêu cầu phải trả trước khi thực thi, như sau:
\begin{align}
g_0 \equiv {} & \sum_{i \in T_{\mathbf{i}}, T_{\mathbf{d}}} \begin{cases} \hyperlink{G__txdatazero}{G_{\mathrm{txdatazero}}} & \text{nếu} \quad i = 0 \\ \hyperlink{G__txdatanonzero}{G_{\mathrm{txdatanonzero}}} & \text{ngược lại} \end{cases} \\
\nonumber {} & + \begin{cases} \hyperlink{G__txcreate}{G_{\mathrm{txcreate}}} & \text{nếu} \quad T_{\mathrm{t}} = \varnothing \\ 0 & \text{ngược lại} \end{cases} \\
\nonumber {} & + \hyperlink{G__transaction}{G_{\mathrm{transaction}}} \\
\nonumber {} & + \sum_{j = 0}^{\lVert T_{\mathbf{A}} \rVert - 1} \big( G_{\mathrm{accesslistaddress}} + \lVert T_{\mathbf{A}}[j]_{\mathbf{s}} \rVert G_{\mathrm{accessliststorage}} \big)
\end{align}
trong đó $T_{\mathbf{i}},T_{\mathbf{d}}$ là chuỗi byte của dữ liệu và EVM-code khởi tạo liên quan đến giao dịch, tùy thuộc vào việc giao dịch là để tạo hợp đồng hay để gọi tin nhắn.
$G_{\mathrm{txcreate}}$ được thêm vào nếu giao dịch là để tạo hợp đồng, nhưng không được thêm nếu là kết quả của EVM-code.
$\hyperlink{G__accesslistaddress}{G_{\mathrm{accesslistaddress}}}$ và $\hyperlink{G__accessliststorage}{G_{\mathrm{accessliststorage}}}$ là chi phí của quá trình khởi động quyền truy cập tài khoản và bộ nhớ, tương ứng.
$G$ được định nghĩa đầy đủ trong Phụ lục \ref{app:fees}.
\hypertarget{effective_gas_price_p}{}Chúng ta định nghĩa \textit{giá gas hiệu quả}, quy ước là $p$, là số wei mà người ký gửi giao dịch sẽ trả cho mỗi đơn vị gas tiêu thụ trong quá trình thực thi giao dịch. Nó được tính như sau:
\begin{equation}
p \equiv \begin{cases}
T_{\mathrm{p}} & \text{nếu} \; T_{\mathrm{x}} = 0 \lor T_{\mathrm{x}} = 1 \\
f + H_{\mathrm{f}} & \text{nếu} \; T_{\mathrm{x}} = 2 \\
\end{cases}
\end{equation}
\hypertarget{priority_fee_f}{}trong đó $f$ là \textit{phí ưu tiên}---số wei mà địa chỉ người thụ hưởng của khối sẽ nhận được cho mỗi đơn vị gas tiêu thụ trong quá trình thực hiện giao dịch. Nó được tính như sau:
\begin{equation}
f \equiv \begin{cases}
T_{\mathrm{p}} - H_{\mathrm{f}} & \text{nếu} \; T_{\mathrm{x}} = 0 \lor T_{\mathrm{x}} = 1 \\
min(T_{\mathrm{f}}, T_{\mathrm{m}} - H_{\mathrm{f}}) & \text{nếu} \; T_{\mathrm{x}} = 2 \\
\end{cases}
\end{equation}
Chi phí ban đầu $v_0$ được tính như sau:
\begin{equation}
v_0 \equiv \begin{cases}
\hyperlink{tx_gas_limit_T__g}{T_{\mathrm{g}}}T_{\mathrm{p}} + \hyperlink{tx_value_T__v}{T_{\mathrm{v}}} & \text{nếu} \; T_{\mathrm{x}} = 0 \lor T_{\mathrm{x}} = 1 \\
\hyperlink{tx_gas_limit_T__g}{T_{\mathrm{g}}}T_{\mathrm{m}} + \hyperlink{tx_value_T__v}{T_{\mathrm{v}}} & \text{nếu} \; T_{\mathrm{x}} = 2 \\
\end{cases}
\end{equation}
Độ hợp lệ được xác định như sau:
\begin{equation}
\begin{array}[t]{rcl}
S(T) & \neq & \varnothing \quad \wedge \\
\boldsymbol{\sigma}[S(T)]_{\mathrm{c}} & = & \texttt{KEC}\big( () \big) \quad \wedge \\
\linkdest{transaction_nonce}{}T_{\mathrm{n}} & = & \boldsymbol{\sigma}[S(T)]_{\mathrm{n}} \quad \wedge \\
g_0 & \leqslant & T_{\mathrm{g}} \quad \wedge \\
v_0 & \leqslant & \boldsymbol{\sigma}[S(T)]_{\mathrm{b}} \quad \wedge \\
m & \geqslant & H_{\mathrm{f}} \quad \wedge \\
T_{\mathrm{g}} & \leqslant & {B_{\mathrm{H}}}_{\mathrm{l}} - \hyperlink{ell}{\ell}(B_{\mathbf{R}})_{\mathrm{u}}
\end{array}
\end{equation}
trong đó
\begin{equation}
m \equiv \begin{cases}
T_{\mathrm{p}} & \text{nếu} \; T_{\mathrm{x}} = 0 \lor T_{\mathrm{x}} = 1 \\
T_{\mathrm{m}} & \text{nếu} \; T_{\mathrm{x}} = 2 \\
\end{cases}
\end{equation}
Lưu ý điều kiện cuối cùng; tổng của giới hạn gas của giao dịch, $T_{\mathrm{g}}$, và gas đã sử dụng trong khối này trước đó, cho bởi $\hyperlink{ell}{\ell}(B_{\mathbf{R}})_{\mathrm{u}}$, phải không lớn hơn giới hạn gas của khối, ${B_{\mathrm{H}}}_{\mathrm{l}}$.
Ngoài ra, với một cách sử dụng ký hiệu một chút, chúng ta giả định rằng $\boldsymbol{\sigma}[S(T)]_{\mathrm{c}} = \texttt{KEC}\big( () \big)$, $\boldsymbol{\sigma}[S(T)]_{\mathrm{n}} = 0$, và $\boldsymbol{\sigma}[S(T)]_{\mathrm{b}} = 0$ nếu $\boldsymbol{\sigma}[S(T)] = \varnothing$.
Đối với giao dịch loại 2, chúng ta thêm một kiểm tra bổ sung rằng \textbf{maxPriorityFeePerGas} không lớn hơn \textbf{maxFeePerGas}:
\begin{equation}
T_{\mathrm{m}} \geqslant T_{\mathrm{f}}
\end{equation}
Việc thực hiện một giao dịch hợp lệ bắt đầu với một thay đổi không thể hoàn nguyên được thực hiện trên trạng thái: \hyperlink{account_nonce}{nonce của tài khoản của người gửi}, $S(T)$, được tăng lên một và số dư giảm đi một phần của chi phí trả trước, $T_{\mathrm{g}} p$. Gas có sẵn cho quá trình tính toán tiếp theo, $g$, được định nghĩa là $T_{\mathrm{g}} - g_0$. Quá trình tính toán, có thể là tạo hợp đồng hoặc cuộc gọi tin nhắn, dẫn đến một trạng thái cuối cùng (có thể hợp pháp giống với trạng thái hiện tại), sự thay đổi mang tính quyết định và không bao giờ không hợp lệ: không thể có giao dịch không hợp lệ từ điểm này trở đi.
Chúng ta định nghĩa trạng thái điểm tham chiếu (checkpoint state) $\boldsymbol{\sigma}_0$:
\begin{eqnarray}
\linkdest{sigma_0}{}\boldsymbol{\sigma}_0 & \equiv & \boldsymbol{\sigma} \quad \text{ngoại trừ:} \\
\boldsymbol{\sigma}_0[S(T)]_{\mathrm{b}} & \equiv & \boldsymbol{\sigma}[S(T)]_{\mathrm{b}} - T_{\mathrm{g}} p \\
\boldsymbol{\sigma}_0[S(T)]_{\mathrm{n}} & \equiv & \boldsymbol{\sigma}[S(T)]_{\mathrm{n}} + 1
\end{eqnarray}
Việc xác định $\boldsymbol{\sigma}_{\mathrm{P}}$ từ $\boldsymbol{\sigma}_0$ phụ thuộc vào loại giao dịch; có thể là tạo hợp đồng (contract creation) hoặc gọi tin nhắn (message call); chúng ta định nghĩa bộ giá trị của trạng thái dự kiến sau khi thực thi $\boldsymbol{\sigma}_{\mathrm{P}}$, gas còn lại $g'$, trạng thái con tích lũy $A$ và mã tình trạng (status code) $z$:
\begin{equation}
(\boldsymbol{\sigma}_{\mathrm{P}}, g', A, z) \equiv \begin{cases}
\hyperlink{lambda}{\Lambda}_{4}(\boldsymbol{\sigma}_0, A^*, S(T), S(T), g, &\\ \quad\; p, T_{\mathrm{v}}, T_{\mathbf{i}}, 0, \varnothing, \top) & \text{nếu} \quad T_{\mathrm{t}} = \varnothing \\
\hyperlink{theta}{\Theta}_{4}(\boldsymbol{\sigma}_0, A^*, S(T), S(T), T_{\mathrm{t}}, &\\ \quad\; T_{\mathrm{t}}, g, p, T_{\mathrm{v}}, T_{\mathrm{v}}, T_{\mathbf{d}}, 0, \top) & \text{ngược lại}
\end{cases}
\end{equation}
trong đó
\begin{align}
A^* & \equiv A^0 \quad \text{ngoại trừ} \\
A^*_{\mathbf{a}} & \equiv A^0_{\mathbf{a}} \cup \{S(T)\} \cup_{E \in T_{\mathbf{A}}} \{ \hyperlink{access_list_entry}{E}_{\mathrm{a}} \} \\
A^*_{\mathbf{K}} & \equiv \bigcup_{E \in T_{\mathbf{A}}} \big\{ \forall i < \lVert E_{\mathbf{s}} \rVert, i \in \mathbb{N}: \; (E_{\mathrm{a}}, E_{\mathbf{s}}[i]) \big\}
\end{align}
và $g$ là lượng gas còn lại sau khi trừ số gas cơ sở cần phải trả cho sự tồn tại của giao dịch:
\begin{equation}
g \equiv T_{\mathrm{g}} - g_0
\end{equation}
Lưu ý rằng chúng ta sử dụng $\hyperlink{theta}{\Theta}_{4}$ và $\hyperlink{lambda}{\Lambda}_{4}$ để biểu thị thực tế là chỉ có bốn thành phần đầu tiên của các giá trị của hàm là được lấy; giá trị cuối cùng biểu thị giá trị đầu ra của cuộc gọi tin nhắn (một mảng byte) và không được sử dụng trong ngữ cảnh đánh giá giao dịch.
Sau đó, trạng thái được hoàn tất bằng cách xác định số lượng cần hoàn trả, $g^*$ từ gas còn lại, $g'$, cộng với một số lượng cho phép từ bộ đếm hoàn trả, cho người gửi theo tỷ lệ ban đầu (original rate).
\begin{equation}
g^* \equiv g' + \min \left\{ \Big\lfloor \dfrac{T_{\mathrm{g}} - g'}{5} \Big\rfloor, A_{\mathrm{r}} \right\}
\end{equation}
Số lượng hoàn trả tổng cộng là gas hợp lệ còn lại $g'$, cộng thêm \hyperlink{refund_balance_defn_words_A__r}{$A_{\mathrm{r}}$}, với thành phần sau được giữ lại tối đa một phần năm\footnote{Tỷ lệ hoàn trả tối đa của gas đã được giảm từ một nửa xuống một phần năm bởi EIP-3529 bởi \cite{EIP-3529} trong phiên bản \textit{London}} (làm tròn xuống) của tổng số gas đã sử dụng $T_{\mathrm{g}} - g'$. Do đó, $g^*$ là tổng gas còn lại sau khi giao dịch đã được thực hiện.
Trình xác nhận (validator), người mà địa chỉ của họ được chỉ định làm người thụ hưởng của khối hiện tại $B$, nhận được gas đã tiêu thụ nhân với \textit{lệ phí ưu tiên mỗi gas} của giao dịch, được xác định là \hyperlink{priority_fee_f}{$f$} trong phần này. Số ether được người giao dịch thanh toán để tính phí cơ sở sẽ bị ghi nợ từ tài khoản của họ nhưng không được ghi có vào tài khoản nào khác, vì vậy nó sẽ bị đốt cháy.
Chúng ta định nghĩa trước trạng thái cuối (pre-final state) $\boldsymbol{\sigma}^*$ dựa trên trạng thái tạm thời $\boldsymbol{\sigma}_{\mathrm{P}}$:
\begin{eqnarray}
\boldsymbol{\sigma}^* & \equiv & \boldsymbol{\sigma}_{\mathrm{P}} \quad \text{ngoại trừ} \\
\boldsymbol{\sigma}^*[S(T)]_{\mathrm{b}} & \equiv & \boldsymbol{\sigma}_{\mathrm{P}}[S(T)]_{\mathrm{b}} + g^* p \\
\boldsymbol{\sigma}^*[{B_{\mathrm{H}}}_{\mathrm{c}}]_{\mathrm{b}} & \equiv & \boldsymbol{\sigma}_{\mathrm{P}}[{B_{\mathrm{H}}}_{\mathrm{c}}]_{\mathrm{b}} + (T_{\mathrm{g}} - g^*) f
\end{eqnarray}
Trạng thái cuối (final state), $\boldsymbol{\sigma}'$, được đạt được sau khi xóa tất cả các tài khoản xuất hiện trong tập tự hủy (self-destruct) hoặc được chạm vào và trống rỗng:
\begin{eqnarray}
\boldsymbol{\sigma}' & \equiv & \boldsymbol{\sigma}^* \quad \text{ngoại trừ} \\
\linkdest{self_destruct_list_A__s}{}\forall i \in A_{\mathbf{s}}: \boldsymbol{\sigma}'[i] & = & \varnothing \\
\linkdest{touched_A__t}{}\forall i \in A_{\mathbf{t}}: \boldsymbol{\sigma}'[i] & = & \varnothing \quad\text{nếu}\quad \mathtt{DEAD}(\boldsymbol{\sigma}^*\kern -2pt, i)
\end{eqnarray}
\hypertarget{tx_total_gas_used_Upsilon_pow_g}{}\linkdest{Upsilon_pow_g}\hypertarget{tx_logs_Upsilon_pow_l}{}\linkdest{Upsilon_pow_l}\hypertarget{tx_status_Upsilon_pow_z}{}\linkdest{Upsilon_pow_z}Và cuối cùng, chúng ta xác định $\Upsilon^{\mathrm{g}}$, tổng lượng gas sử dụng trong giao dịch này $\Upsilon^\mathbf{l}$, các nhật ký (logs) được tạo ra bởi giao dịch này và $\Upsilon^{\mathrm{z}}$, mã tình trạng (status code) của giao dịch này:
\begin{eqnarray}
\Upsilon^{\mathrm{g}}(\boldsymbol{\sigma}, T) & \equiv & T_{\mathrm{g}} - g^* \\
\Upsilon^{\mathbf{l}}(\boldsymbol{\sigma}, T) & \equiv & \hyperlink{tx_log_series_wordy_defn_A__l}{A_{\mathbf{l}}} \\
\Upsilon^{\mathrm{z}}(\boldsymbol{\sigma}, T) & \equiv & z
\end{eqnarray}
Các giá trị này được sử dụng để giúp định nghĩa \hyperlink{Transaction_Receipt}{biên nhận giao dịch (transaction receipt)} và cũng được sử dụng \hyperlink{sigma_n}{sau này} để xác minh trạng thái.
\section{Tạo hợp đồng (Contract Creation)}\label{ch:create}\hypertarget{endow}{}
Có một số tham số nội tại được sử dụng khi tạo một tài khoản: người gửi ($s$), người giao dịch ban đầu\footnote{có thể khác người gửi trong trường hợp của một cuộc gọi tin nhắn hoặc tạo hợp đồng không phải do một giao dịch kích hoạt trực tiếp mà đến từ việc thực thi mã EVM} ($o$), lượng gas khả dụng ($g$), giá gas hiệu quả ($p$), giá trị tài trợ ($v$) cùng với một mảng byte có độ dài tùy ý, $\mathbf{i}$, mã khởi tạo EVM, độ sâu hiện tại của ngăn xếp cuộc gọi tin nhắn/tạo hợp đồng ($e$), muối (salt) cho địa chỉ tài khoản mới ($\zeta$) và cuối cùng là quyền được phép thực hiện sửa đổi trạng thái ($w$).
Muối (salt) \linkdest{salt}{$\zeta$} có thể thiếu ($\zeta = \varnothing$); theo quy ước,
\begin{equation}
\zeta \in \mathbb{B}_{32} \cup \mathbb{B}_{0}
\end{equation}
Nếu việc tạo được gây ra bởi {\small \hyperlink{create2}{CREATE2}}, thì $\zeta \neq \varnothing$.
Chúng ta định nghĩa hàm tạo, quy ước là hàm \linkdest{lambda}{$\Lambda$}, mà đánh giá từ những giá trị này, cùng với trạng thái $\boldsymbol{\sigma}$ và trạng thái con được tích lũy $A$, đến bộ (tuple) bao gồm trạng thái mới, gas còn lại, trạng thái con mới được tích lũy, mã tình trạng (status code) và đầu ra $(\boldsymbol{\sigma}', g', A', z, \mathbf{o})$:
\begin{equation}
(\boldsymbol{\sigma}', g', A', z, \mathbf{o}) \equiv \Lambda(\boldsymbol{\sigma}, A, s, o, g, p, v, \mathbf{i}, e, \zeta, w)
\end{equation}
Địa chỉ của tài khoản mới được xác định là 160 bit bên phải của hash Keccak-256 của mã hóa \hyperlink{rlp}{RLP} của cấu trúc chỉ chứa người gửi và \hyperlink{account_nonce}{số nonce của tài khoản}.
Đối với {\small \hyperlink{create2}{CREATE2}}, quy tắc là khác và được mô tả trong EIP-1014 của \cite{EIP-1014}.
Kết hợp hai trường hợp, chúng ta định nghĩa địa chỉ kết quả cho tài khoản mới là $a$:
\begin{align}
a & \equiv \mathtt{ADDR}(s, \boldsymbol{\sigma}[s]_{\mathrm{n}} - 1, \zeta, \mathbf{i}) \\
\label{eq:new-address} \mathtt{ADDR}(s, n, \zeta, \mathbf{i}) & \equiv \mathcal{B}_{96..255}\Big(\mathtt{KEC}\big( L_{\mathrm{A}}(s, n, \zeta, \mathbf{i})\big) \Big) \\
L_{\mathrm{A}}(s, n, \zeta, \mathbf{i}) & \equiv \begin{cases}
\mathtt{RLP}\big(\;(s, n)\;\big) & \text{nếu}\ \zeta = \varnothing \\
(255) \cdot s \cdot \zeta \cdot \mathtt{KEC}(\mathbf{i}) & \text{ngược lại}
\end{cases}
\end{align}
Ở đây, $\cdot$ đại diện cho việc nối các mảng byte, $\mathcal{B}_{a..b}(X)$ đánh giá thành một giá trị nhị phân chứa các bit có chỉ số trong khoảng $[a, b]$ của dữ liệu nhị phân $X$, và $\boldsymbol{\sigma}[x]$ là trạng thái địa chỉ của $x$, hoặc $\varnothing$ nếu không tồn tại. Lưu ý rằng chúng ta sử dụng giá trị nonce của người gửi ít hơn một; chúng ta khẳng định rằng chúng ta đã tăng giá trị nonce của tài khoản người gửi trước cuộc gọi này, và vì vậy, giá trị được sử dụng là giá trị nonce của người gửi ở đầu giao dịch hoặc hoạt động VM.
Địa chỉ của tài khoản mới được thêm vào tập hợp các tài khoản được truy cập:
\begin{equation}
A^* \equiv A \quad \text{ngoại trừ} \quad A^*_{\mathbf{a}} \equiv A_{\mathbf{a}} \cup \{a\}
\end{equation}
Nonce của tài khoản được định nghĩa ban đầu bằng một, số dư là giá trị được truyền vào, kho lưu trữ là trống và mã hash là băm Keccak 256-bit của chuỗi rỗng; số dư của người gửi cũng giảm đi giá trị được truyền vào. Do đó, trạng thái biến đổi trở thành $\boldsymbol{\sigma}^*$:
\begin{equation}
\boldsymbol{\sigma}^* \equiv \boldsymbol{\sigma} \quad \text{ngoại trừ:}
\end{equation}
\begin{eqnarray}
\boldsymbol{\sigma}^*[a] &=& \big( 1, v + v', \mathtt{\hyperlink{trie}{TRIE}}(\varnothing), \mathtt{KEC}\big(()\big) \big) \\
\boldsymbol{\sigma}^*[s] &=& \begin{cases}
\varnothing & \text{nếu}\ \boldsymbol{\sigma}[s] = \varnothing \ \wedge\ v = 0 \\
\mathbf{a}^* & \text{ngược lại}
\end{cases} \\
\mathbf{a}^* &\equiv& (\boldsymbol{\sigma}[s]_{\mathrm{n}}, \boldsymbol{\sigma}[s]_{\mathrm{b}} - v, \boldsymbol{\sigma}[s]_{\mathbf{s}}, \boldsymbol{\sigma}[s]_{\mathrm{c}})
\end{eqnarray}
trong đó $v'$ là giá trị tồn tại trước đó của tài khoản, trong trường hợp nó đã tồn tại trước đó:
\begin{equation}
v' \equiv \begin{cases}
0 & \text{nếu} \quad \boldsymbol{\sigma}[a] = \varnothing\\
\boldsymbol{\sigma}[a]_{\mathrm{b}} & \text{ngược lại}
\end{cases}
\end{equation}
%It is asserted that the state database will also change such that it defines the pair $(\mathtt{KEC}(\mathbf{b}), \mathbf{b})$.
Cuối cùng, tài khoản được khởi tạo thông qua việc thực thi mã EVM khởi tạo $\mathbf{i}$ theo mô hình thực thi (xem phần \ref{ch:model}).
Quá trình thực thi mã có thể tác động đến một số sự kiện không nằm trong trạng thái thực thi: kho lưu trữ của tài khoản có thể bị thay đổi, có thể tạo thêm tài khoản và có thể thực hiện thêm cuộc gọi tin nhắn.
Do đó, hàm thực thi mã $\hyperlink{xi_def}{\Xi}$ đánh giá thành một bộ giá trị (tuple) bao gồm trạng thái kết quả $\boldsymbol{\sigma}^{**}$, gas khả dụng còn lại $g^{**}$, trạng thái con tích lũy $A^{**}$ và nội dung mã nguồn (body code) của tài khoản $\mathbf{o}$.
\begin{equation}
(\boldsymbol{\sigma}^{**}, g^{**}, A^{**}, \mathbf{o}) \equiv \Xi(\boldsymbol{\sigma}^*, g, A^*, I) \\
\end{equation}
\pagebreak[1]trong đó $I$ chứa các tham số của \hyperlink{exec_env}{môi trường thực thi}, tức là:\pagebreak[1]
\begin{eqnarray}
I_{\mathrm{a}} & \equiv & a \\
I_{\mathrm{o}} & \equiv & o \\
I_{\mathrm{p}} & \equiv & p \\
I_{\mathbf{d}} & \equiv & () \\
I_{\mathrm{s}} & \equiv & s \\
\hyperlink{I__v}{I_{\mathrm{v}}} & \equiv & v \\
I_{\mathbf{b}} & \equiv & \mathbf{i} \\
I_{\mathrm{e}} & \equiv & e \\
I_{\mathrm{w}} & \equiv & w
\end{eqnarray}
$I_{\mathbf{d}}$ đánh giá thành bộ (tuple) giá trị rỗng vì không có dữ liệu đầu vào cho cuộc gọi này. $I_{\mathrm{H}}$ không có xử lý đặc biệt và được xác định từ chuỗi khối.
Việc thực thi mã sẽ tiêu thụ gas, và gas không nên xuống dưới 0, do đó quá trình thực thi có thể kết thúc trước khi mã đạt đến một trạng thái dừng tự nhiên. Trong trường hợp ngoại lệ này (và một số trường hợp ngoại lệ khác), chúng ta nói rằng một ngoại lệ hết gas out-of-gas (OOG) đã xảy ra: Trạng thái được đánh giá là tập hợp rỗng, $\varnothing$, và toàn bộ quá trình tạo không ảnh hưởng đến trạng thái, một cách hiệu quả để lại nó như nó đã từng ngay trước khi thực hiện quá trình tạo.
Nếu mã khởi tạo hoàn tất thành công, một chi phí sau cùng của việc tạo hợp đồng được thanh toán, chi phí đặt cọc mã, $c$, tỷ lệ thuận với kích thước của mã hợp đồng đã tạo:
\begin{equation}
c \equiv G_{\mathrm{codedeposit}} \times \lVert \mathbf{o} \rVert
\end{equation}
Nếu không có đủ gas còn lại để thanh toán, tức là $g^{**} < c$, chúng ta cũng tuyên bố có một ngoại lệ hết gas.
Gas còn lại sẽ bằng không trong bất kỳ điều kiện ngoại lệ nào như vậy, tức là nếu quá trình tạo ra được thực hiện như là sự tiếp nhận của một giao dịch, thì điều này không ảnh hưởng đến việc thanh toán chi phí nội tại của việc tạo hợp đồng; chi phí này sẽ được thanh toán bất kể. Tuy nhiên, giá trị của giao dịch không được chuyển đến địa chỉ của hợp đồng đã bị hủy khi chúng ta hết gas, do đó mã của hợp đồng không được lưu trữ.
Nếu một ngoại lệ như vậy không xảy ra, thì gas còn lại sẽ được hoàn trả cho người tạo và trạng thái đã biến đổi bây giờ được phép tồn tại. Do đó, theo quy ước, chúng ta có thể xác định trạng thái kết quả, gas, trạng thái con đã tích lũy và mã tình trạng là $(\boldsymbol{\sigma}', g', A', z)$ trong đó:
\begin{align}
\quad g' \equiv & \begin{cases}
0 & \text{nếu} \quad F \\
g^{**} - c & \text{ngược lại} \\
\end{cases} \\
\quad \boldsymbol{\sigma}' \equiv & \begin{cases}
\boldsymbol{\sigma} & \text{nếu} \quad F \ \lor\ \boldsymbol{\sigma}^{**} = \varnothing \\
\boldsymbol{\sigma}^{**} \quad \text{ngoại trừ:} & \\
\quad\boldsymbol{\sigma}'[a] = \varnothing & \text{nếu} \quad \mathtt{DEAD}(\boldsymbol{\sigma}^{**}, a) \\
\boldsymbol{\sigma}^{**} \quad \text{ngoại trừ:} & \\
\quad\boldsymbol{\sigma}'[a]_{\mathrm{c}} = \texttt{KEC}(\mathbf{o}) & \text{ngược lại}
\end{cases} \\
\quad A' \equiv & \begin{cases}
A^* & \text{nếu} \quad F \ \lor\ \boldsymbol{\sigma}^{**} = \varnothing \\
A^{**} & \text{ngược lại} \\
\end{cases} \\
\quad z \equiv & \begin{cases}
0 & \text{nếu} \quad F \ \lor\ \boldsymbol{\sigma}^{**} = \varnothing \\
1 & \text{ngược lại}
\end{cases} \\
\nonumber \text{trong đó} \\
F \equiv & \big( \boldsymbol{\sigma}[a] \neq \varnothing \ \wedge\ \big(\boldsymbol{\sigma}[a]_c \neq \texttt{\small KEC}\big(()\big) \vee \boldsymbol{\sigma}[a]_n \neq 0 \big) \big) \quad \vee \\
\nonumber &(\boldsymbol{\sigma}^{**} = \varnothing \ \wedge\ \mathbf{o} = \varnothing) \quad \vee \\
\nonumber &g^{**} < c \quad \vee \\
\nonumber &\lVert \mathbf{o} \rVert > 24576 \quad \vee \\
\nonumber &\mathbf{o}[0] = \texttt{0xef}
\end{align}
\hypertarget{contract_creation_result}{}
Lưu ý điều kiện cuối cùng của $F$ chỉ ra rằng mã hợp đồng không thể bắt đầu bằng byte \texttt{0xef} (xem EIP-3541 của \cite{EIP-3541}).
Ngoại lệ trong xác định của $\boldsymbol{\sigma}'$ quy định rằng $\mathbf{o}$, dãy byte kết quả từ việc thực thi mã khởi tạo, chỉ định nội dung mã nguồn sau cùng (final body code) cho tài khoản mới được tạo ra.
Lưu ý rằng ý định kết quả sẽ là một hợp đồng mới được tạo thành công với tài sản của nó (its endowment) được chuyển đến, hoặc không có hợp đồng mới và không có chuyển khoản giá trị nào cả. Ngoài ra, quan sát rằng nếu việc thực thi mã khởi tạo \hyperlink{REVERT}{reverts} ($\boldsymbol{\sigma}^{**} = \varnothing \ \wedge\ \mathbf{o} \neq \varnothing$), kết quả gas $g'$ không bị tiêu hao (miễn là không có ngoại lệ khác), nhưng không có tài khoản mới được tạo ra.
\subsection{Sự tinh tế}
Lưu ý rằng trong khi mã khởi tạo đang thực thi, địa chỉ mới được tạo ra nhưng không có nội dung mã nguồn nội tại\footnote{Trong quá trình thực thi mã khởi tạo, \texttt{EXTCODESIZE} trên địa chỉ nên trả về 0, tức là độ dài của mã của tài khoản trong khi \texttt{CODESIZE} sẽ trả về độ dài của mã khởi tạo (như được định nghĩa trong \ref{subsec:instruction-set}).}. Do đó, bất kỳ cuộc gọi tin nhắn nào được nhận vào nó trong thời gian này đều không gây ra việc thực thi mã. Nếu việc thực hiện mã khởi tạo kết thúc bằng một lệnh {\small SELFDESTRUCT}, thì vấn đề không có ý nghĩa vì tài khoản sẽ bị xóa trước khi giao dịch được hoàn thành. Đối với một mã {\small STOP} bình thường, hoặc nếu mã trả về rỗng, thì trạng thái sẽ bị để lại với một tài khoản zombie và bất kỳ số dư còn lại sẽ bị khóa vào tài khoản mãi mãi.
\section{Cuộc Gọi Tin Nhắn (Message Call)} \label{ch:call}
Trong trường hợp thực hiện cuộc gọi tin nhắn, một số tham số được yêu cầu: người gửi ($s$), người khởi tạo giao dịch (transaction originator) ($o$), người nhận ($r$), tài khoản có mã (code) sẽ được thực thi ($c$, thường giống với người nhận), lượng gas khả dụng ($g$), giá trị ($v$) và giá gas hiệu quả ($p$) cùng với một mảng byte có độ dài tùy ý, $\mathbf{d}$, dữ liệu đầu vào của cuộc gọi, độ sâu hiện tại của ngăn xếp cuộc gọi tin nhắn/tạo hợp đồng ($e$) và cuối cùng là quyền được phép thực hiện sửa đổi trạng thái ($w$).
Ngoài việc đánh giá sang trạng thái mới và trạng thái con tích lũy của giao dịch, cuộc gọi tin nhắn cũng có một thành phần phụ thêm - dữ liệu đầu ra được biểu thị bằng mảng byte~$\mathbf{o}$. Điều này được bỏ qua khi thực hiện các giao dịch, tuy nhiên cuộc gọi tin nhắn có thể được bắt đầu do việc thực thi mã VM và trong trường hợp này thông tin này được sử dụng.
\begin{equation}
(\boldsymbol{\sigma}', g', A', z, \mathbf{o}) \equiv \linkdest{theta}{\Theta}(\boldsymbol{\sigma}, A, s, o, r, c, g, p, v, \tilde{v}, \mathbf{d}, e, w)
\end{equation}