ข้ามไปยังเนื้อหา

Mempool และพูลธุรกรรม

คู่มือจากมุมมองเฉพาะของแต่ละโหนดเกี่ยวกับการรับธุรกรรม Ethereum, nonce แบบ pending และ queued, การเผยแพร่, คุณสมบัติด้านค่าธรรมเนียม, การแทนที่, private order flow, การบรรจุ, การคัดออก และ reorganization

อัปเดต

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

คำตอบโดยตรง

Mempool หรือพูลธุรกรรมคือชุดธุรกรรมที่ลงนามแล้วซึ่งโหนดเก็บไว้ชั่วคราวในหน่วยความจำและบางครั้งบันทึกลงดิสก์ ธุรกรรมเหล่านี้ผ่านกฎตรวจสอบและนโยบายปัจจุบันของโหนด แต่ยังไม่อยู่ใน chain ที่โหนดยอมรับว่าเป็น canonical Mempool ไม่ใช่ออบเจ็กต์ฉันทามติ ไม่ใช่คิวส่วนกลาง และไม่ใช่คำรับประกันว่าจะถูกบรรจุ โหนดสุจริตสองโหนดอาจเก็บธุรกรรมต่างกันเพราะได้รับ gossip ต่างกัน ใช้ไคลเอนต์หรือการตั้งค่าต่างกัน รีสตาร์ต คัดรายการออก หรือใช้เส้นทางส่งแบบสาธารณะและส่วนตัวต่างกัน

ใน execution client ของ Ethereum ธุรกรรมที่ดำเนินการได้และมี nonce ถัดไปของบัญชีมักถูกเรียกว่า pending ส่วน nonce ที่สูงกว่าและติด gap มักถูกเรียกว่า queued ป้ายเหล่านี้เป็นคำของส่วนติดต่อไคลเอนต์ ไม่ใช่สถานะสุดท้ายของโปรโตคอล ธุรกรรมอาจถูกปฏิเสธก่อนรับเข้า เผยแพร่ ถูกแทนที่ด้วยธุรกรรมที่ลงนามโดยผู้ส่งและ nonce เดิม ถูกคัดออก ถูกทิ้ง บรรจุและสำเร็จ บรรจุแต่ execution ย้อนกลับ หรือถูกพิจารณาใหม่หลัง reorganization

1
สร้าง

กระเป๋าเงินสร้างธุรกรรมด้วยปลายทาง มูลค่า พารามิเตอร์ค่าธรรมเนียม และข้อมูลการป้องกันการเล่นซ้ำ เช่น อินพุตที่ใช้ไปหรือ nonce

วิธีการทำงาน

  1. กำหนดสภาพแวดล้อมให้แน่นอน ได้แก่ chain ID, execution client และเวอร์ชัน, head และ base fee ปัจจุบัน, ประเภทธุรกรรม, ผู้ส่ง, nonce, value, calldata, gas limit, fee cap และเส้นทางส่ง แยก public gossip, relay หรือ builder ส่วนตัว และเส้นทาง ERC-4337 UserOperation เพราะไม่ได้ใช้พูลส่วนกลางเดียวกัน
  2. ถอดรหัส byte ที่ลงนามและตรวจสอบก่อนรับเข้า ตรวจลายเซ็นและผู้ส่ง, chain ID, ประเภทและ encoding, intrinsic gas, ความสัมพันธ์ของ nonce, ยอดเงินสำหรับ value บวกภาระค่าธรรมเนียมสูงสุด, field ค่าธรรมเนียม และ blob sidecar ที่ต้องมี การปฏิเสธขั้นนี้ไม่ใช่ EVM REVERT และโดยทั่วไปไม่สร้าง receipt หรือค่าธรรมเนียมบน chain
  3. ระบุนโยบายพูลภายใน บันทึกว่าไคลเอนต์จัดธุรกรรมเป็น pending หรือ queued, ความจุต่อบัญชีและรวม, ตัวกรองค่าธรรมเนียมขั้นต่ำ, อายุรายการ, ข้อยกเว้นบัญชีในเครื่อง, replacement bump และการเก็บข้อมูลถาวร Flag และค่า default ของ Geth อธิบาย Geth ไม่ใช่ฉันทามติ Ethereum หรือผู้ให้บริการทุกราย
  4. สังเกตการเผยแพร่โดยไม่สมมติว่ามีมุมมองส่วนกลาง เปรียบเทียบ hash ธุรกรรมดิบและ byte ที่ลงนามผ่านโหนดอิสระ แต่การไม่พบยังตีความได้หลายอย่าง: โหนดอาจยังไม่ได้รับ ปฏิเสธตามนโยบาย คัดออก หรือไม่เปิดเผยพูล เส้นทางส่วนตัวอาจข้าม public gossip แต่ยังเปิดเผยธุรกรรมแก่ผู้ดำเนินการและ builder ของเส้นทางนั้น
  5. จำลองคุณสมบัติและลำดับใน candidate block สำหรับธุรกรรมประเภท 2 ราคา gas ฝั่ง execution คือ min(maxFeePerGas, baseFeePerGas + maxPriorityFeePerGas) หาก base fee สูงกว่า maximum fee ธุรกรรมจะไม่มีคุณสมบัติภายใต้ cap นั้น การพึ่งพา nonce, ขีดจำกัด gas และ blob, ความถูกต้องของ state, bundle ของ builder และ MEV อาจสำคัญกว่าเวลาที่พบครั้งแรก
  6. จัดการ lifecycle อย่างตั้งใจ รอ หรือส่ง replacement ที่มี nonce เดิมตามวิธีที่บันทึกไว้หลังตรวจ chain ที่ใช้งาน ผู้ส่ง และนโยบาย replacement แล้วเท่านั้น การโอนให้ตนเองด้วย nonce เดิมเป็นเพียง replacement candidate อีกรายการ ไม่ใช่กลไกยกเลิกของโปรโตคอล ห้ามส่ง value ซ้ำเพียงเพราะ explorer แห่งหนึ่งหยุดแสดงธุรกรรมเดิม
  7. กระทบยอดกับ state ฉันทามติ เก็บ hash ที่ลงนามและลำดับการแทนที่ทั้งหมด แล้วตรวจ receipt ที่เป็น canonical, block hash, status, gas ที่ใช้, log, nonce ที่ถูกใช้ และ state ของบัญชีหรือสัญญาที่ระดับ confirmation หรือ finality ตามต้องการ หาก reorganization นำบล็อกออก ธุรกรรมที่ยังใช้ได้อาจกลับเข้าสู่พูลบางโหนด แต่พฤติกรรมนี้ขึ้นกับไคลเอนต์และ state

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

  • คุณสมบัติตาม fee cap ธุรกรรมโอนประเภท 2 มี gasUsed = 21,000, baseFeePerGas = 32 gwei, maxPriorityFeePerGas = 3 gwei และ maxFeePerGas = 34 gwei ราคาที่ใช้จริงคือ min(34, 32 + 3) = 34 gwei ดังนั้น tip จริงคือ 2 gwei ค่าธรรมเนียมคือ 21,000 * 34 = 714,000 gwei = 0.000714 ETH แบ่งเป็น base fee ที่ถูกเผา 0.000672 ETH และ tip 0.000042 ETH หาก base fee ของ candidate block เพิ่มเป็น 35 gwei cap 34 gwei จะไม่พอสำหรับบล็อกนั้น
  • Nonce gap Nonce ของบัญชีตาม canonical state คือ 10 พูลหนึ่งได้รับธุรกรรม nonce 10 และ 12 แต่ไม่มี 11 จึงอาจจัด 10 เป็น pending และ 12 เป็น queued หลัง nonce 10 ถูกบรรจุ nonce ตาม canonical state จะเป็น 11 และ 12 ยังถูกกั้นจนกว่าธุรกรรม nonce 11 ที่ถูกต้องจะถูกบรรจุ การเห็น nonce 12 ในพูลไม่ได้ทำให้ดำเนินการแยกเดี่ยวได้
  • Replacement ตามนโยบายเฉพาะ ภายใต้การตั้งค่า Geth เพื่อการสอนที่ txpool.pricebump = 10 ธุรกรรมเก่ามี maxFeePerGas = 40 gwei และ maxPriorityFeePerGas = 2 gwei เกณฑ์ replacement ที่คำนวณจากการเพิ่ม 10% คือ 44 gwei และ 2.2 gwei ข้อเสนอ 43 gwei และ 3 gwei อาจยังถูกปฏิเสธเพราะ cap หนึ่งไม่ถึงเกณฑ์ ส่วน 44 gwei และ 2.2 gwei ถึงเกณฑ์การสอนทั้งสอง การปัดเศษจำนวนเต็ม ประเภทธุรกรรม และตรรกะรับเข้าจริงขึ้นกับเวอร์ชัน และโหนดอื่นอาจเก็บ candidate ต่างกัน
  • ไม่มีพูลส่วนกลาง โหนด A รายงาน hash ธุรกรรมต่างกัน 120,000 รายการ โหนด B รายงาน 100,000 รายการ และส่วนร่วมคือ 80,000 รายการ ส่วนรวมคือ 120,000 + 100,000 - 80,000 = 140,000; Jaccard overlap คือ 80,000 / 140,000 = 57.1428571429% มี hash 40,000 รายการที่ A เห็นเพียงรายเดียว และ 20,000 รายการที่ B เห็นเพียงรายเดียว จำนวนเหล่านี้ไม่พิสูจน์ว่า builder, relay ส่วนตัว หรือเครือข่ายที่เหลือมองเห็นอะไร

ความเสี่ยง

  • ลงนามหรือเผยแพร่บน chain ID หรือเครือข่ายผิด
  • เชื่อถือ RPC endpoint ที่เป็นอันตราย เก่า หรือกำหนดค่าผิด
  • ลายเซ็น ประเภทธุรกรรม encoding หรือ blob sidecar ไม่ถูกต้อง
  • ยอดเงินไม่พอสำหรับ value บวกภาระค่าธรรมเนียมสูงสุด
  • กฎ intrinsic gas หรือ calldata ทำให้ถูกปฏิเสธก่อนรับเข้า
  • Nonce ถูกใช้แล้วหรือต่ำเกินไป
  • Nonce gap ทำให้ธุรกรรมที่ตามมาคงสถานะ queued
  • Replacement nonce เดิมถูกนโยบายภายในปฏิเสธว่า underpriced
  • Maximum fee ต่ำกว่า base fee ของ candidate block
  • Priority ที่ใช้จริงต่ำหรือข้อจำกัดทรัพยากรทำให้ inclusion ล่าช้า
  • นโยบายของไคลเอนต์ ผู้ให้บริการ เวอร์ชัน หรือการตั้งค่าไม่ตรงกัน
  • ความจุ อายุรายการ การรีสตาร์ต หรือ eviction นำธุรกรรมออก
  • การเผยแพร่สู่ peer ไม่ดี การถูก eclipse หรือ relay เลือกปฏิบัติ
  • Relay ส่วนตัวรั่วไหล ปิดกั้น หยุดให้บริการ หรือ builder ไม่เข้าร่วม
  • Frontrunning, sandwiching หรือ MEV อื่นจาก public order flow
  • การเรียงของ builder, bundle หรือธุรกรรมส่วนตัวเปลี่ยน execution state
  • ผล simulation เก่าก่อน inclusion
  • ส่งซ้ำโดยไม่ตรวจสอบหรือสูญเสียลำดับ replacement
  • REVERT ที่ถูกบรรจุ out-of-gas หรือ subcall ล้มเหลวแต่ถูกจับไว้ แม้พูลเคยรับธุรกรรม
  • Reorganization, ความสับสนเรื่อง finality หรือถือ alternate mempool ของ ERC-4337 เป็น txpool ปกติ

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

  • Mempool เป็นคิว FIFO ส่วนกลางหนึ่งเดียวที่ทั้งเครือข่ายซิงค์ตรงกัน
  • Hash ธุรกรรมพิสูจน์ว่าเครือข่ายรับหรือเผยแพร่ธุรกรรมแล้ว
  • Pending หมายถึงถูกบรรจุ สำเร็จ ย้อนกลับไม่ได้ หรือผู้รับได้เงินแล้ว
  • ค่าธรรมเนียมที่สูงพอรับประกัน inclusion และ execution สำเร็จ
  • เส้นทางส่วนตัวเป็นความลับ ต้าน censorship และรับประกันว่าจะถูกบรรจุโดยอัตโนมัติ

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

แหล่งที่มา

การนำทาง

ค้นหาในวิกิ...