Máy ảo Klaytn
NOTE: KLVM has changed with the Kore
hardfork. If you want the previous document, please refer to previous document.
Kore
hardfork block numbers are as follows.
Baobab Testnet:
#111736800
Cypress Mainnet:
#119750400
Tổng quan
Phiên bản hiện tại của Máy ảo Klaytn (KLVM) có nguồn gốc từ Máy ảo Ethereum (EVM). Nội dung của chương này chủ yếu dựa theo Ethereum Yellow Paper. KLVM liên tục được cải thiện bởi đội ngũ Klaytn, vì thế, tài liệu này có thể được cập nhật thường xuyên. Vui lòng không coi tài liệu này là phiên bản cuối cùng về thông số kỹ thuật của KLVM. Như đã được mô tả trong tuyên bố lập trường, đội ngũ Klaytn cũng có dự định áp dụng các máy ảo khác hoặc môi trường thực thi khác nhằm củng cố khả năng và hiệu suất của nền tảng Klaytn. Chương này đề cập đến thông số kỹ thuật của KLVM và sự khác biệt giữa KLVM và EVM.
KLVM là một cỗ máy trạng thái ảo, chính thức chỉ định mô hình thực thi của Klaytn. Mô hình thực thi này chỉ định cách thay đổi trạng thái hệ thống dựa trên một loạt chỉ thị bytecode và một tuple dữ liệu môi trường nhỏ. KLVM là một cỗ máy gần giống với Turing Complete, tính chất gần giống này bắt nguồn từ một thực tế là việc tính toán chịu sự ràng buộc nội tại qua một tham số, gas, tham số này hạn chế tổng lượng tính toán được thực hiện.
KLVM thực thi mã máy ảo Klaytn (hoặc bytecode Klaytn), trong đó có chứa một chuỗi các hướng dẫn KLVM. Mã KLVM là ngôn ngữ lập trình được dùng cho các tài khoản trên chuỗi khối Klaytn có chứa mã. Mã KLVM liên kết với một tài khoản được thực thi mỗi lần có một tin nhắn được gửi đến tài khoản đó; mã này có khả năng đọc/viết dữ liệu từ/vào lưu trữ và gửi tin nhắn.
Thông số kỹ thuật của KLVM
Các quy tắc
Trong tài liệu này, chúng tôi sử dụng các ký hiệu và quy tắc sau.
A := B
:=
được dùng để xác địnhA
làB
.
Chúng tôi sử dụng thuật ngữ "hợp đồng thông minh" và "hợp đồng" thay thế lẫn nhau.
Ký hiệu
Bảng dưới đây tóm tắt các ký hiệu được dùng trong thông số kỹ thuật của KLVM.
Các ký hiệu liên quan đến chuỗi khối
BC
Chuỗi khối
B
Khối
B_header
Tiêu đề khối của khối hiện tại
Các ký hiệu liên quan đến trạng thái
S
Trạng thái
S_system
Trạng thái của hệ thống
S_machine
Trạng thái của máy
P_modify_state
Quyền được phép thực hiện thay đổi trạng thái
Các ký hiệu liên quan đến giao dịch
T
Giao dịch
T_code
Một mảng byte chứa mã máy cần thực thi
T_data
Một mảng byte chứa dữ liệu đầu vào để thực thi; nếu tác nhân thực thi là một giao dịch, dữ liệu này sẽ là dữ liệu giao dịch.
T_value
Một giá trị tình bằng peb được đưa vào tài khoản như một phần của quy trình thực thi; nếu tác nhân thực thi là một giao dịch, giá trị này sẽ là giá trị giao dịch.
T_depth
Độ sâu của ngăn xếp dữ liệu tin nhắn-cuộc gọi hoặc tạo hợp đồng (nghĩa là số lượng CALL
hoặc CREATE
đang được thực thi ở thời điểm hiện tại)
Các ký hiệu liên quan đến gas
G
Gas
G_rem
Lượng gas còn lại để tính toán
G_price
Giá gas trong giao dịch phát sinh từ việc thực thi
Các ký hiệu liên quan đến địa chỉ
A
Địa chỉ
A_code_owner
Địa chỉ của tài khoản sở hữu mã thực thi
A_tx_sender
Địa chỉ người gửi của giao dịch phát sinh từ việc thực thi hiện tại
A_code_executor
địa chỉ của tài khoản bắt đầu việc thực thi mã; nếu tác nhân thực thi là một giao dịch, địa chỉ này sẽ là của người gửi giao dịch.
Hàm
F_apply
Một hàm áp dụng một giao dịch kèm dữ liệu đầu vào cho một trạng thái cho trước và trả về trạng thái tổng hợp kèm dữ liệu đầu ra
Cơ bản
KLVM là một kiến trúc dựa trên ngăn xếp dữ liệu đơn giản. Kích thước từ của máy (cũng là kích thước của các mục trong ngăn xếp dữ liệu) là 256 bit. Con số này được chọn để tạo điều kiện thuận lợi cho hệ thống hàm băm Keccak-256 và các tính toán đường cong elip. Mô hình bộ nhớ là một mảng byte chứa từ có gắn địa chỉ đơn giản. Ngăn xếp dữ liệu có kích thước tối đa là 1024. Máy cũng có một mô hình lưu trữ độc lập; về khái niệm thì nó cũng giống như bộ nhớ, nhưng thay vì một mảng byte, nó là một mảng từ với khả năng xác định địa chỉ từ. Khác với bộ nhớ mang tính biến động, lưu trữ không biến động và được duy trì như một phần của trạng thái hệ thống. Tất cả các vị trí trong lưu trữ và bộ nhớ đều được xác định bằng 0 ngay từ đầu.
Máy không tuân theo kiến trúc von Neumann tiêu chuẩn. Thay vì lưu trữ mã chương trình trong một bộ nhớ hoặc lưu trữ dễ truy cập, mã được lữu trữ riêng trong một bộ nhớ ảo chỉ đọc và chỉ có thể được tương tác qua các chỉ thị chuyên biệt.
Máy có thể thực thi mã ngoại lệ vì một số lí do, bao gồm hiện tượng tràn dưới ngăn xếp và chỉ thị không hợp lệ. Tương tự như trường hợp ngoại lệ hết gas, những ngoại lệ này không giữ nguyên các thay đổi về trạng thái. Thay vào đó, máy ảo sẽ tạm dừng ngay lập tức và báo cáo vấn đề cho tác nhân thực thi (trình xử lý giao dịch hoặc theo cách đệ quy, môi trường thực thi phát sinh), việc này sẽ được xử lý riêng biệt.
Tổng quan về phí
Phí (được ghi bằng gas) được tính trong ba trường hợp riêng biệt, cả ba trường hợp đều là điều kiện tiên quyết để thực thi hoạt động. Trường hợp đầu tiên và phổ biến nhất là phí nội tại để tính toán hoạt động. Trường hợp thứ hai, gas có thể được trừ để hình thành một khoản thanh toán cho một cuộc gọi tin nhắn phụ thuộc hoặc tạo hợp đồng; đây là một phần trong khoản thanh toán dành cho CREATE
, CALL
và CALLCODE
. Cuối cùng, gas có thể được tính do có sự tăng lên trong việc sử dụng bộ nhớ.
Trong quá trình thực thi tài khoản, tổng phí phải trả cho việc sử dụng bộ nhớ phải trả tỷ lệ thuận với bội số nhỏ nhất của 32 byte cần có để bao gồm tất cả các chỉ báo bộ nhớ (dù là để đọc hay để ghi) trong phạm vi. Phí này được thanh toán dựa trên cơ sở kịp thời; do đó, việc tham chiếu một vùng bộ nhớ có kích thước lớn hơn ít nhất 32 byte so với bất kỳ bộ nhớ nào khác được lập chỉ mục trước đó sẽ dẫn đến phí sử dụng bộ nhớ bổ sung. Do phí này, các địa chỉ ít có khả năng vượt quá giới hạn 32 bit. Như vậy nghĩa là việc triển khai phải có khả năng kiểm soát được tình huống này.
Phí lưu trữ có cách vận hành hơi khác biệt. Để khuyến khích việc giảm thiểu sử dụng bộ nhớ (tương ứng trực tiếp với một cơ sở dữ liệu trạng thái lớn hơn trên tất cả các nút), phí thực thi cho một hoạt động xóa mục nhập khỏi lưu trữ sẽ được miễn phí và đủ điều kiện để nhận hoàn phí; trên thực tế, khoản hoàn phí này được thanh toán trước vì chi phí sử dụng ban đầu của một vị trí lưu trữ lại cao hơn đáng kể so với việc sử dụng thông thường.
Biểu phí
Biểu phí G
là một tuple gồm 37 giá trị vô hướng, tương ứng với chi phí tương đối tính bằng gas của một số hoạt động trừu tượng mà một giao dịch có thể làm phát sinh. Để xem các bảng khác như Precompiled contracts
và tài khoảns
, vui lòng tham khảo tài liệu này
LƯU Ý: Phí đã thay đổi sau việc nâng cấp giao thức IstanbulEVM
hay còn gọi là "hard fork". Nếu bạn muốn đọc tài liệu trước đây, vui lòng tham khảo phần tài liệu trước đây.
Số khối nâng cấp giao thức IstanbulEVM
như sau.
Mạng thử nghiệm Baobab:
#75373312
Mạng chính thức Cypress:
#86816005
G_zero
0
Không cần thanh toán cho các hoạt động của bộ W_zero
G_base
2
Lượng gas thanh toán cho các hoạt động của bộ W_base
G_verylow
3
Lượng gas thanh toán cho các hoạt động của bộ W_verylow
G_low
5
Lượng gas thanh toán cho các hoạt động của bộ W_low
G_mid
8
Lượng gas thanh toán cho các hoạt động của bộ W_mid
G_high
10
Lượng gas thanh toán cho các hoạt động của bộ W_high
G_blockhash
20
Khoản thanh toán cho một hoạt động BLOCKHASH
G_extcode
700
Lượng gas thanh toán cho các hoạt động của bộ W_extcode
G_balance
700
Lượng gas thanh toán cho một hoạt động BALANCE
G_sload
800
Lượng gas thanh toán cho một hoạt động SLOAD
G_jumpdest
1
Lượng gas thanh toán cho một hoạt động JUMPDEST
G_sset
20000
Lượng gas thanh toán cho một hoạt động SSTORE
khi giá trị lưu trữ được đặt từ số khác 0 sang số 0
G_sreset
5000
Lượng gas thanh toán cho một hoạt động SSTORE
khi giá trị lưu trữ giữ nguyên không đổi ở mức 0 hoặc được đặt thành 0
R_sclear
15000
Khoản hoàn tiền đã được thực hiện (được thêm vào bộ đếm hoàn tiền) khi giá trị lưu trữ được đặt từ số khác 0 sang số 0
R_selfdestruct
24000
Khoản hoàn tiền đã thực hiện (được thêm vào bộ đếm hoàn tiền) cho việc tự hủy một tài khoản
G_selfdestruct
5000
Lượng gas thanh toán cho một hoạt động SELFDESTRUCT
G_create
32000
Lượng gas thanh toán cho một hoạt động CREATE
G_codedeposit
200
Lượng gas thanh toán cho mỗi byte cho một hoạt động CREATE
thành công trong việc đặt mã vào trạng thái
G_call
700
Lượng gas thanh toán cho một hoạt động CALL
G_callvalue
9000
Lượng gas thanh toán một giao dịch chuyển giá trị khác 0 như một phần của hoạt động CALL
G_callstipend
2300
Khoản trợ cấp cho hợp đồng được gọi ra, được trừ khỏi G_callvalue
đối với giao dịch chuyển giá trị khác 0
G_newtài khoản
25000
Lượng gas thanh toán cho một hoạt động CALL
hoặc SELFDESTRUCT
tạo ra một tài khoản
G_exp
10
Khoản thanh toán một phần cho một hoạt động EXP
G_expbyte
50
Khoản thanh toán một phần khi nhân với ceil(log_256(exponent))
cho một hoạt động EXP
G_memory
3
Lượng gas thanh toán cho mỗi một từ bổ sung khi mở rộng bộ nhớ
G_txcreate
32000
Lượng gas được trả bởi tất cả các giao dịch tạo hợp đồng
G_txdatazero
4
Lượng gas thanh toán cho mỗi byte 0 của dữ liệu hoặc mã cho một giao dịch
G_txdatanonzero
68
Lượng gas thanh toán cho mỗi byte khác 0 của dữ liệu hoặc mã cho một giao dịch
G_transaction
21000
Lượng gas thanh toán cho mỗi giao dịch
G_log
375
Khoản thanh toán một phần cho một hoạt động LOG
G_logdata
8
Lượng gas thanh toán cho mỗi byte trong dữ liệu của một hoạt động LOG
G_logtopic
375
Lượng gas thanh toán cho mỗi chủ đề của một hoạt động LOG
G_sha3
30
Lượng gas thanh toán cho từng hoạt động SHA3
G_sha3word
6
Lượng gas thanh toán cho từng từ (được làm tròn) cho dữ liệu nhập vào một hoạt động SHA3
G_copy
3
Thanh toán một phần cho các hoạt động COPY
, nhân lên theo số từ được sao chép, được làm tròn
G_extcodehash
700
Được trả cho việc nhận hàm băm keccak256
của mã hợp đồng
G_create2
32000
Được trả cho mã vận hành CREATE2
, hoạt động giống hệt như CREATE nhưng dùng những đối số khác
Chúng tôi xác định những tập hợp con gồm những chỉ thị sau:
Last updated