﻿---
title: "เครื่องเสมือน Ethereum (EVM)"
description: "คู่มือที่คำนึงถึง fork สำหรับธุรกรรม EVM เฟรม message call, bytecode, stack, memory, storage, gas, REVERT, DELEGATECALL, precompile, receipt และการกระทบยอด state"
image: "https://wiki.fcontext.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://wiki.fcontext.com/llms.txt
> Use this file to discover all available pages before exploring further.

# เครื่องเสมือน Ethereum (EVM)

> จัดทำขึ้นเพื่อการศึกษาเท่านั้น ไม่ใช่คำแนะนำการลงทุน การลงทุนอาจทำให้สูญเสียเงินลงทุนได้

<a id="answer"></a>

## คำตอบโดยตรง

เครื่องเสมือน Ethereum คือเครื่องเปลี่ยนผ่าน state ในชั้น execution ซึ่งแปล bytecode ตามกฎของ fork ที่ระบุ เมื่อกำหนด pre-state ที่ถูกต้อง ธุรกรรมหรือ message ระดับบนสุด สภาพแวดล้อมของบล็อก และข้อกำหนด fork ชุดเดียวกัน client ฝั่ง execution ที่ปฏิบัติตามข้อกำหนดต้องคำนวณ post-state หรือผลล้มเหลวเดียวกัน EVM ไม่ได้เลือกลำดับธุรกรรม ไม่ได้ให้ finality ของฉันทามติ ไม่ได้ยืนยันตัวตนของส่วนติดต่อ และไม่ได้ทำให้ทุกเชนที่เข้ากันได้กับ EVM ปลอดภัยเท่ากับ Ethereum

ธุรกรรมที่ลงนามจากภายนอกเป็นออบเจ็กต์โปรโตคอลระดับบนสุด กิจกรรมระหว่างสัญญาประกอบด้วย message call และ call frame ที่ซ้อนกัน ไม่ใช่ธุรกรรมอิสระที่มี transaction nonce, receipt หรือ hash ของตนเอง แต่ละเฟรมมี code, program counter, stack ของคำขนาด 256 บิต, memory, calldata, returndata, gas และบริบทการดำเนินการ persistent storage เป็นของบัญชี ส่วน transient storage มีอายุการใช้งานครอบคลุมธุรกรรมตามกฎของ fork

<a id="mechanism"></a>

## กลไกการทำงาน

1. ระบุ snapshot การดำเนินการ ได้แก่ เชนและ `chainId` เครือข่าย หมายเลขและ hash ของบล็อก สถานะ canonical หรือ finalized, fork, client ฝั่ง execution และฉบับข้อกำหนด pre-state หรือ state root ประเภทธุรกรรม ไบต์ดิบที่ลงนาม hash ธุรกรรม และ receipt ความแน่นอนของผลขึ้นอยู่กับบริบทที่ตรงกันทั้งหมดนี้
2. ถอดรหัส envelope ธุรกรรมและแยกความถูกต้องก่อนดำเนินการออกจากการดำเนินการ ตรวจสอบลายเซ็นและผู้ส่ง nonce ปลายทางหรือการสร้างสัญญา value, calldata, gas limit ช่องข้อมูลค่าธรรมเนียม access list และช่องเฉพาะของแต่ละประเภท ธุรกรรมที่ถูกปฏิเสธก่อนรวมเข้าบล็อกไม่ใช่ธุรกรรมที่ถูกรวมแล้วดำเนินการก่อน revert
3. สร้าง message ระดับบนสุดและ call tree ทั้งหมด บันทึกเฟรม `CALL`, `STATICCALL`, `DELEGATECALL` การสร้างสัญญา และ precompile รวมทั้ง caller, context address, code address, `msg.sender`, `msg.value` การโอน value, calldata, returndata, gas ที่ส่งต่อ และ flag ความสำเร็จ ป้าย internal transaction ของ explorer เป็นมุมมองจาก trace ไม่ใช่ธุรกรรมที่ลงนาม
4. ติดตาม program counter, stack, memory, calldata, returndata, log, persistent storage และสมุดบันทึก transient storage ของแต่ละเฟรม `CALL` ใช้ที่อยู่และบริบท storage ของ callee ส่วน `DELEGATECALL` ดำเนิน code เป้าหมายในที่อยู่และบริบท storage ของ caller โดยรักษา sender และ value จากระดับก่อนหน้า ขณะที่ `STATICCALL` ห้ามแก้ไข state
5. ใช้กฎ gas ของ fork เป้าหมาย ได้แก่ intrinsic gas ต้นทุนผันแปรของ opcode การขยาย memory การเข้าถึงแบบ cold และ warm การส่งต่อ gas ใน call, stipend ค่า precompile, refund และเพดาน refund จากนั้นคำนวณค่าธรรมเนียมธุรกรรมแยกจาก value โดยใช้ gas ที่ใช้จริงและราคา gas ที่มีผล การประมาณ gas มีเงื่อนไขและไม่ใช่การรับประกัน
6. ตัดสินผลของเฟรมตามขอบเขต `RETURN` commit เฟรมเมื่อ ancestor ทั้งหมด commit ในภายหลัง `REVERT` ย้อนเฟรมและ descendant ส่งข้อมูลกลับ และไม่จำเป็นต้องใช้ gas ที่เหลือของเฟรมทั้งหมด ส่วน exceptional halt มีผลต่างกัน parent สามารถจับ low-level call ที่ล้มเหลวแล้วดำเนินการต่อได้ ดังนั้นสถานะ receipt ระดับบนสุดอาจเป็น `1` แม้ child ล้มเหลว ความล้มเหลวระดับบนสุดที่รวมในบล็อกแล้วยังคงใช้ nonce ของผู้ส่งและ gas ที่ชำระ
7. กระทบยอดสถานะ receipt, gas ที่ใช้, log, ที่อยู่ที่สร้าง และ return data กับยอดคงเหลือ nonce, code, persistent และ transient storage, บัญชี token, trace และ block state root ก่อนและหลังดำเนินการ ทำซ้ำด้วย client อิสระเมื่อเหมาะสม และตรวจสอบ implementation ของ proxy โครงร่าง storage, precompile, เป้าหมาย EVM ของ compiler และการอัปเกรด fork แยกจาก finality ของฉันทามติ

<a id="example"></a>

## ตัวอย่างคำนวณ

- **revert ระดับบนสุดที่รวมในบล็อกและบัญชีค่าธรรมเนียม** ธุรกรรมประเภท 2 มี gas limit `80,000` ใช้ gas `52,000`, base fee `20 gwei`, max priority fee `3 gwei` และ max fee `40 gwei` ราคา gas ที่มีผลคือ `min(40, 20 + 3) = 23 gwei` ค่าธรรมเนียมจริงคือ `52,000 * 23 gwei = 0.001196 ETH` ซึ่งประกอบด้วย `52,000 * 20 gwei = 0.001040 ETH` ที่ถูกเผาและ priority fee `52,000 * 3 gwei = 0.000156 ETH` ส่วน `28,000 gas` ที่ไม่ได้ใช้จะไม่ถูกเรียกเก็บ หากการดำเนินการระดับบนสุด revert ผลของ storage การโอน value และ log จะย้อนกลับ แต่ nonce ของผู้ส่งและค่าธรรมเนียมจริงยังคงอยู่
- **จับความล้มเหลวของ child** สัญญา A เริ่มด้วย `A.x = 5` แล้วเรียก B ซึ่งเขียน `B.y = 9` ปล่อย log และดำเนิน `REVERT` การเขียนและ log ของ B จึงย้อนกลับ A เห็น `success = false` เขียน `A.x = 7` และ return ตามปกติ สถานะ receipt สุดท้ายคือ `1`, `A.x = 7` และ B คงค่าก่อนหน้าไว้ ดังนั้นความสำเร็จระดับบนสุดไม่ได้พิสูจน์ว่า child call ทุกครั้งสำเร็จ
- **บริบท storage ของ DELEGATECALL** proxy มี `slot0 = 5` ส่วนบัญชี implementation มี `slot0 = 99` code ของ implementation อ่าน slot 0 เพิ่ม `7` แล้วเก็บผล เมื่อดำเนินผ่าน `DELEGATECALL` ค่าใน proxy เปลี่ยนเป็น `slot0 = 12` ขณะที่ implementation ยังคงเป็น `slot0 = 99` เพราะใช้ที่อยู่และบริบท storage ของ proxy พร้อมรักษา sender และ value จากระดับก่อนหน้า โครงร่าง storage ที่เข้ากันไม่ได้อาจทำลาย state ของ proxy
- **SELFDESTRUCT ที่ขึ้นกับ fork** ภายใต้กฎ EIP-6780 สัญญาที่มีอยู่และถือ `2 ETH` ดำเนิน `SELFDESTRUCT` โดยให้ B เป็นผู้รับ B ได้รับ `2 ETH` และยอดคงเหลือสัญญากลายเป็นศูนย์ แต่บัญชี code และ storage ที่มีอยู่ไม่ถูกลบ พฤติกรรมการลบยังคงอยู่เฉพาะเมื่อสัญญาถูกสร้างและทำลายตัวเองในธุรกรรมเดียวกัน นี่คือพฤติกรรมเฉพาะ fork ไม่ใช่กฎที่จะใช้ย้อนหลังหรือกับทุกเชน EVM

<a id="risks"></a>

## ความเสี่ยง

- ดำเนินการซ้ำกับเชน บล็อก fork, client หรือ pre-state ผิดชุด
- ถือ state ที่ไม่เป็น canonical หรือถูก reorganization เป็นบริบทสุดท้าย
- สับสนการปฏิเสธก่อนตรวจสอบกับ execution revert ที่รวมในบล็อกแล้ว
- สมมติว่า simulation ของ pending transaction จะตรงกับ state ตอนรวมในภายหลัง
- มองข้าม revert ระดับบนสุด exceptional halt หรือภาวะ out-of-gas
- พลาดความล้มเหลวของ child ที่ parent จับไว้
- อ่าน call context, code address, caller, sender หรือ value ผิด
- ทำลาย state ของ proxy เพราะโครงร่าง storage ไม่ตรงกันใน `DELEGATECALL`
- เปิดช่องให้ reentrancy หรือการโอน value และการควบคุมภายนอกที่ไม่ปลอดภัย
- เชื่อ returndata, success flag หรือ custom error ที่ไม่ได้ตรวจสอบ
- ถือ log หรือ trace เป็น final state ที่มีอำนาจยืนยัน
- คำนวณการเข้าถึง cold และ warm, memory หรือ gas ที่ส่งต่อให้ call ผิด
- ใช้ refund เพดาน refund, stipend หรือกฎ `63/64` ผิด
- ใช้ที่อยู่ input กฎ gas หรือความหมายตาม fork ของ precompile ผิด
- สับสนอายุการใช้งานของ persistent storage, memory และ transient storage
- คาดว่าการแก้ไข state จะสำเร็จภายใน `STATICCALL`
- ใช้สมมติฐานการลบของ `SELFDESTRUCT` ก่อน EIP-6780
- พลาดการเปลี่ยน implementation ของ proxy, admin หรือเป้าหมาย compiler
- ใช้กฎ client ฝั่ง execution ที่แตกต่างหรือไม่ได้อัปเกรด
- อนุมานความปลอดภัยของฉันทามติ bridge, token, governance หรือ finality จากความเข้ากันได้กับ EVM

<a id="misconceptions"></a>

## ความเข้าใจผิดที่พบบ่อย

- source code ของ Solidity คือออบเจ็กต์ที่ดำเนินการบนเชนโดยตรง
- ธุรกรรมที่รวมแล้ว revert ไม่มีค่าใช้จ่ายและ nonce ไม่เปลี่ยน
- สถานะ receipt `1` พิสูจน์ว่า internal call ทุกครั้งสำเร็จตามที่ตั้งใจ
- event หรือ trace คือ state ของสินทรัพย์และ storage ที่มีอำนาจยืนยัน
- ความเข้ากันได้กับ EVM รับประกัน opcode, gas, precompile, ฉันทามติ และความปลอดภัยที่เหมือนกัน

<a id="related"></a>

## หัวข้อที่เกี่ยวข้อง

- [แบบจำลองที่อิงบัญชี](/th/crypto/account-based-model/)
- [ค่าธรรมเนียม gas](/th/crypto/gas-fee/)
- [สัญญาอัจฉริยะ](/th/crypto/smart-contract/)

<a id="sources"></a>

## แหล่งข้อมูล

- [Ethereum Virtual Machine (EVM)](https://ethereum.org/developers/docs/evm/) - Ethereum.org (เข้าถึงเมื่อ: 2026-08-12)
- [Ethereum Yellow Paper: a formal specification of Ethereum, a programmable blockchain](https://ethereum.github.io/yellowpaper/paper.pdf) - Ethereum Foundation (เข้าถึงเมื่อ: 2026-08-12)
- [Ethereum Execution Layer Specification](https://ethereum.github.io/execution-specs/) - Ethereum Execution Specs (เข้าถึงเมื่อ: 2026-08-12)
- [Introduction to Smart Contracts](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html) - Solidity Documentation (เข้าถึงเมื่อ: 2026-08-12)
- [EIP-7: DELEGATECALL](https://eips.ethereum.org/EIPS/eip-7) - Ethereum Improvement Proposals (เข้าถึงเมื่อ: 2026-08-12)
- [EIP-140: REVERT instruction](https://eips.ethereum.org/EIPS/eip-140) - Ethereum Improvement Proposals (เข้าถึงเมื่อ: 2026-08-12)
- [EIP-2929: Gas cost increases for state access opcodes](https://eips.ethereum.org/EIPS/eip-2929) - Ethereum Improvement Proposals (เข้าถึงเมื่อ: 2026-08-12)
- [EIP-6780: SELFDESTRUCT only in same transaction](https://eips.ethereum.org/EIPS/eip-6780) - Ethereum Improvement Proposals (เข้าถึงเมื่อ: 2026-08-12)

Source: https://wiki.fcontext.com/th/crypto/evm/index.mdx
