TL;DR – Tóm tắt
EVM (Ethereum Virtual Machine) là máy tính ảo phi tập trung — nơi smart contract được execute đồng nhất trên mọi node Ethereum. EVM là stack machine với 256-bit word size, chạy EVM bytecode, dùng gas để đo lường computation. Hơn 30 blockchain lớn implement EVM compatibility — biến EVM thành chuẩn mực thực tế (de facto standard) của toàn ngành. So sánh chi tiết tại bài EVM vs SVM vs MoveVM.
IEVM là gì?
Ethereum Virtual Machine (EVM) là môi trường execution phi tập trung — một máy tính ảo chạy cùng một code và cho ra cùng một kết quả trên mọi node tham gia mạng Ethereum.
Tại sao cần EVM? Trong blockchain phi tập trung, hàng nghìn node phải đồng thuận về kết quả của computation. EVM đảm bảo điều đó bằng cách:
- Deterministic: cùng input → cùng output trên mọi hardware, OS, kiến trúc CPU
- Sandboxed: smart contract không thể truy cập network, filesystem hay OS ngoài EVM environment
- Metered: mọi computation đều có chi phí gas — ngăn chặn infinite loop và tấn công DoS
- Turing-complete: có thể biểu diễn bất kỳ computation logic nào (với giới hạn gas)
IIKiến trúc Stack Machine
EVM là stack-based machine — không dùng register như CPU thông thường. Mọi computation đều thông qua stack:
- Stack depth tối đa: 1024 phần tử
- Mỗi phần tử: 256-bit (32 bytes) — tối ưu cho Ethereum hash (keccak256) và address (20 bytes)
- Hầu hết opcode lấy input từ stack và push result trở lại stack
EVM có ba vùng lưu trữ:
| Vùng lưu trữ | Scope | Chi phí | Mô tả |
|---|---|---|---|
| Stack | Execution | Rất thấp | Tạm thời, reset sau mỗi lệnh |
| Memory | Transaction | Thấp → tăng dần | Byte array tạm thời, reset sau transaction |
| Storage | Permanent | Rất cao | Persistent key-value store của contract |
Storage là vùng tốn kém nhất — SSTORE (write) tốn 20,000 gas so với ADD chỉ 3 gas. Tối ưu smart contract chủ yếu là giảm SSTORE operations.
IIIOpcodes và EVM Bytecode
Smart contract được viết bằng Solidity/Vyper → compile thành EVM bytecode — chuỗi opcode hex. Mỗi opcode là 1 byte (256 opcode có thể có).
Một số opcode quan trọng:
| Opcode | Mô tả | Gas |
|---|---|---|
ADD | Cộng 2 giá trị trên stack | 3 |
SLOAD | Đọc từ storage | 2,100 (cold) / 100 (warm) |
SSTORE | Ghi vào storage | 20,000 (new) / 2,900 (update) |
CALL | Gọi contract khác | 700+ |
KECCAK256 | Hash 32 bytes | 30 + 6/word |
LOG | Emit event | 375 + 8/byte |
Developer viết Solidity, không cần biết opcode trực tiếp. Nhưng hiểu opcode giúp tối ưu gas hiệu quả hơn — ví dụ tránh SLOAD nhiều lần bằng cách cache vào memory variable.
IVGas Model — Cơ chế Kinh tế của EVM
Gas là đơn vị đo lường computational work trong EVM. Mọi opcode đều có chi phí gas cụ thể. Gas model giải quyết hai vấn đề:
- Halting problem: không thể biết trước computation sẽ kết thúc không — gas limit đảm bảo luôn kết thúc
- Resource pricing: buộc user trả chi phí tương ứng computation họ yêu cầu
Sau EIP-1559, gas fee = base fee (đốt cháy) + priority tip (trả cho validator). Base fee tự điều chỉnh theo demand.
VWorld State và Account Model
EVM duy trì World State — mapping từ địa chỉ (20 bytes) đến account state. Có hai loại account:
| Loại | Đặc điểm | Code | Storage |
|---|---|---|---|
| EOA (Externally Owned Account) | Controlled bằng private key | ❌ Không có | ❌ Không có |
| Contract Account | Controlled bằng code | ✅ EVM bytecode | ✅ Key-value store |
Mỗi account có: nonce (số transaction đã gửi), balance (ETH), codeHash (hash của bytecode), storageRoot (Merkle root của storage).
World State được lưu trữ dưới dạng Merkle Patricia Trie — cấu trúc dữ liệu cho phép chứng minh hiệu quả rằng một account có state nhất định mà không cần đọc toàn bộ state.
VIExecution Flow của Smart Contract Call
- EOA gửi transaction đến địa chỉ contract với calldata (function selector + arguments)
- EVM load bytecode của contract từ World State
- EVM tạo execution context: caller address, value, calldata, gas available
- EVM bắt đầu execute bytecode từ đầu (hoặc từ function dispatch dựa trên function selector)
- Mỗi opcode được execute, gas decremented tương ứng
- Contract có thể CALL contract khác — tạo sub-context (call stack depth tối đa 1024)
- Transaction kết thúc: SUCCESS (STOP/RETURN) hoặc REVERT
- Nếu SUCCESS: World State được cập nhật, gas còn lại được refund
- Nếu REVERT hoặc hết gas: mọi state change bị rollback, gas đã dùng bị mất
VIIGiới hạn và Nhược điểm của EVM
- 256-bit word size bất tiện: với số nhỏ (bool, uint8) phải pack thủ công để tiết kiệm storage — tốn công của developer
- Sequential execution: transaction không thể execute song song — throughput bị giới hạn, trái với thiết kế của SVM (Solana)
- Storage cost cao: SSTORE tốn kém khiến nhiều pattern hiệu quả trong lập trình thông thường lại không hiệu quả trong EVM
- Reentrancy vulnerability: CALL opcode cho phép reentrant execution — nguồn gốc của nhiều lỗ hổng smart contract lịch sử (The DAO hack 2016)
- Khó ZK-prove: EVM không được thiết kế cho ZK proof → zkEVM cần nhiều overhead, proof generation chậm
VIIIEVM Compatibility Ecosystem
EVM đã trở thành chuẩn mực thực tế của blockchain execution. Hơn 30 chain implement EVM compatibility:
| Chain | EVM Compatibility Level | Ghi chú |
|---|---|---|
| Ethereum L1 | Native EVM | Reference implementation |
| Arbitrum | EVM equivalent | ArbOS on top, custom precompiles |
| Optimism / Base | EVM equivalent | OP Stack, minor differences |
| BNB Chain | EVM compatible | Geth fork, custom consensus |
| Polygon PoS | EVM compatible | Bor client (Geth fork) |
| Avalanche C-Chain | EVM compatible | Subnet EVM |
Lý do EVM trở thành chuẩn mực: network effect — developer học Solidity một lần, deploy trên hàng chục chain. Tool (Hardhat, Foundry, Remix), library (OpenZeppelin), audit pattern đều chuẩn hóa cho EVM.
IXEVM vs SVM vs MoveVM
Xem phân tích chi tiết tại bài EVM vs SVM vs MoveVM. Tóm tắt:
| VM | Execution | Ưu điểm | Dùng bởi |
|---|---|---|---|
| EVM | Sequential | Ecosystem lớn nhất, tooling trưởng thành | Ethereum và 30+ chain |
| SVM | Parallel (Sealevel) | Throughput cao, tối ưu cho high-frequency | Solana |
| MoveVM | Sequential | Resource-oriented, an toàn hơn về tài sản | Aptos, Sui |
❓Câu Hỏi Thường Gặp
Có — EVM có thể run locally để test smart contract (Hardhat, Foundry, Ganache đều là local EVM implementations). Về lý thuyết, bất kỳ phần mềm nào cũng có thể embed EVM để chạy smart contract logic. Tuy nhiên để có tính phi tập trung và đồng thuận, cần đặt EVM trong context blockchain với nhiều node.
Ethereum được thiết kế để native support keccak256 hash (256-bit output) và ECDSA secp256k1 (256-bit key). Dùng 256-bit word size giúp hash và cryptographic operations thực hiện trong một opcode, không phải ghép nhiều word. Trade-off: bộ nhớ và gas tốn hơn cho số nhỏ, nhưng cryptographic operations hiệu quả hơn nhiều.
zkEVM là ZK Rollup có thể execute EVM bytecode và generate ZK proof cho execution đó. Đây là thách thức kỹ thuật lớn vì EVM không được thiết kế cho ZK proof. Các cấp độ EVM compatibility: Type 1 (bytecode identical — chậm nhất), Type 2 (behavior equivalent), Type 4 (Solidity transpile — nhanh nhất nhưng kém compatible nhất). Polygon zkEVM, Scroll, Taiko đang theo đuổi Type 1–2.
EVM bytecode của contract là immutable sau khi deploy. Nhưng có patterns cho phép "upgradeable": proxy pattern (contract A delegate call đến contract B có logic thực, B có thể thay đổi) và diamond pattern (nhiều implementation). Upgrade thường cần multisig hoặc DAO governance. Đây là trade-off giữa immutability (trustless) và upgradeability (fixable bugs).
📚Tài liệu tham khảo
- Ethereum Yellow Paper (2022). Ethereum: A Secure Decentralised Generalised Transaction Ledger. ethereum.github.io/yellowpaper/paper.pdf
- Ethereum Foundation (2023). Ethereum Virtual Machine (EVM). ethereum.org/en/developers/docs/evm
- Buterin, V. (2014). Ethereum Whitepaper. ethereum.org/en/whitepaper
- Perez, D. & Livshits, B. (2019). Smart Contract Vulnerabilities: Vulnerable Does Not Imply Exploited. USENIX Security 2021.
- EVM Codes (2024). EVM Opcodes reference. evm.codes
- Solidity Documentation (2023). solidity.readthedocs.io