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

การแทนที่ธุรกรรมใน mempool ของ Ethereum

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

อัปเดต

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

คำตอบโดยตรง

การแทนที่ธุรกรรม Ethereum เป็นนโยบายภายในของพูลธุรกรรม ซึ่งโหนดอาจเลือกธุรกรรมที่ลงนามใหม่เหนือธุรกรรมตัวเลือกอื่นจากผู้ส่งเดียวกันและมี nonce เดียวกัน กลไกนี้ไม่ใช่สวิตช์ Replace-by-Fee ระดับฉันทามติที่ใช้ร่วมกันทั้งเครือข่าย การที่โหนดหนึ่งยอมรับแฮชใหม่ไม่ได้ลบธุรกรรมเดิมที่ลงนามแล้วออกจากโหนดอื่น รีเลย์ส่วนตัว หรือข้อมูลขาเข้าของผู้สร้างบล็อก การบรรจุในเชนมาตรฐานเท่านั้นที่ตัดสินว่าธุรกรรมตัวเลือกใดใช้ nonce ของบัญชี

คำสั่งเร่งธุรกรรมของกระเป๋าสินทรัพย์ดิจิทัลมักคงปลายทาง มูลค่า และ calldata เดิมไว้พร้อมเพิ่มช่องค่าธรรมเนียม ส่วนคำสั่งยกเลิกผ่านพูลสาธารณะมักสร้างธุรกรรมมูลค่าศูนย์ที่ส่งกลับหาตนเอง โดยใช้ผู้ส่งและ nonce เดียวกัน นี่คือธุรกรรมคู่แข่ง ไม่ใช่คำสั่งย้อนกลับ หากธุรกรรมเดิมถูกบรรจุก่อน การโอนหรือการเรียกสัญญาจะไม่ถูกย้อนคืน ช่องทางส่วนตัวของแต่ละผลิตภัณฑ์อาจมี API ยกเลิกต่างกัน เช่น Flashbots Protect ระบุการยกเลิกเพื่อยืนยันตัวตนซึ่งไม่ถูกบันทึกบนเชน จึงห้ามนำไปเหมารวมกับการแทนที่ธุรกรรม Ethereum ผ่านพูลสาธารณะ

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

  1. ระบุลำดับธุรกรรมทั้งหมดให้แน่นอน ได้แก่ chain ID ไคลเอนต์และเวอร์ชัน บล็อกส่วนหัวและค่าธรรมเนียมฐาน ช่องทางส่ง ผู้ส่ง nonce ของบัญชีในเชนมาตรฐาน ไบต์ดิบที่ลงนามของธุรกรรมเดิม แฮช และประเภทธุรกรรม ตรวจสอบมุมมองสาธารณะหรือส่วนตัวที่เกี่ยวข้องหลายแห่ง เพราะป้ายสถานะในกระเป๋าสินทรัพย์ดิจิทัลหรือคำตอบ RPC แห่งเดียวไม่ใช่สถานะของทั้งเครือข่าย
  2. จำแนกธุรกรรมเดิมให้ถูกต้องว่า ถูกปฏิเสธ รออยู่ภายในโหนด อยู่ในคิวเพราะมีช่องว่างของ nonce ถูกทิ้งหรือขับออก ส่งผ่านช่องทางส่วนตัว บรรจุและสำเร็จ บรรจุพร้อม status = 0 ถูกนำออกจากการจัดระเบียบเชนใหม่ หรือเข้าสู่ภาวะสิ้นสุดแล้ว เมื่อ nonce ถูกใช้ในเชนมาตรฐานต้องหยุดถือว่ายังแทนที่ได้ แม้การจัดระเบียบเชนใหม่อาจเปิดการแข่งขันอีกครั้ง
  3. กำหนดเจตนาใหม่ การเร่งธุรกรรมต้องทำซ้ำช่องข้อมูลที่กำหนดความหมายทั้งหมด ส่วนการพยายามยกเลิกผ่านพูลสาธารณะมักใช้ผู้ส่งและ nonce เดิม พร้อม to = sender, value = 0 และ calldata ว่าง ก่อนลงนามให้เปรียบเทียบ chain ID ประเภท ปลายทาง มูลค่า calldata รายการเข้าถึง เพดาน gas แฮช blob และการมอบอำนาจ
  4. อ่านนโยบายแทนที่จริงของโหนดเป้าหมาย ธุรกรรมแบบดั้งเดิมและประเภท 1 ใช้ gasPrice; ประเภท 2 มี maxFeePerGas และ maxPriorityFeePerGas; ประเภท 3 ยังมี maxFeePerBlobGas และต้องมี sidecar ค่าตั้งต้นปัจจุบันของ Geth คือ txpool.pricebump = 10 สำหรับพูลทั่วไปและ blobpool.pricebump = 100 สำหรับพูล blob ซึ่งเป็นเพียงตัวอย่างการตั้งค่า Geth ไม่ใช่ค่าคงที่ของ Ethereum ทั้งเครือข่าย
  5. คำนวณคุณสมบัติในการบรรจุและเงินทุนแยกจากอัตราเพิ่ม สำหรับประเภท 2 ราคาจริงคือ min(maxFeePerGas, baseFeePerGas + maxPriorityFeePerGas) ธุรกรรมตัวเลือกยังต้องมีการเข้ารหัสที่ถูกต้อง มี gas ขั้นต่ำตามธุรกรรมเพียงพอ และมียอดคงเหลือครอบคลุมมูลค่ารวมถึงภาระค่าธรรมเนียมสูงสุด เพดานที่สูงขึ้นไม่แก้ calldata ที่ไม่ถูกต้องและไม่รับประกันว่า EVM จะทำงานสำเร็จ
  6. ส่งอย่างรอบคอบและเก็บคำตอบทั้งหมด การเผยแพร่ซ้ำต่อสาธารณะอาจเปิดเผยเจตนาและสร้างความเสี่ยง MEV ส่วนรีเลย์ส่วนตัวมีขอบเขตการมองเห็น วิธีการยกเลิก การครอบคลุมผู้สร้างบล็อก และความพร้อมใช้งานของตนเอง ติดตามแฮชเดิมและแฮชใหม่ในทุกช่องทางโดยไม่สรุปว่าการยอมรับภายในโหนดได้ลบคู่แข่ง และอย่าส่งธุรกรรมตัวเลือกที่สามซึ่งมีการโอนมูลค่าโดยไม่ตรวจสอบ
  7. กระทบยอดธุรกรรมที่ชนะกับเชนมาตรฐาน ตรวจสอบบล็อกและแฮชของใบรับธุรกรรม ดัชนีธุรกรรม status gas ที่ใช้ ราคาค่า gas จริง บันทึกเหตุการณ์ nonce ของผู้ส่ง ยอดคงเหลือ และสถานะสัญญาที่ระดับภาวะสิ้นสุดตามต้องการ บันทึกแฮชที่แพ้ว่าแทนที่ ถูกทิ้ง หรือยังตรวจพบตามหลักฐาน และเริ่มวิเคราะห์ใหม่หลังการจัดระเบียบเชนใหม่

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

  • ตัวอย่างการเพิ่มค่าธรรมเนียมสำหรับประเภท 2 ทั่วไป. ธุรกรรมตัวเลือกเดิมมี maxFeePerGas = 40 gwei และ maxPriorityFeePerGas = 2 gwei ภายใต้การตั้งค่า Geth เพื่อการเรียนรู้ที่เพิ่ม 10% เกณฑ์คำนวณคือ 44 gwei และ 2.2 gwei ธุรกรรมที่ 44/2.1 gwei ไม่ถึงเกณฑ์ทิป ส่วน 44/2.2 gwei ถึงเกณฑ์ทั้งสอง เมื่อค่าธรรมเนียมฐานเป็น 32 gwei และใช้ gas 21,000 ราคาจริงคือ 34.2 gwei ค่าธรรมเนียมรวมคือ 718,200 gwei = 0.0007182 ETH ส่วนที่เผาคือ 0.000672 ETH และทิปคือ 0.0000462 ETH การยอมรับจริงขึ้นอยู่กับการติดตั้ง เวอร์ชัน และการปัดเศษจำนวนเต็มหน่วย wei
  • ความไวต่อค่าธรรมเนียมฐาน. ธุรกรรมแทนที่มีเพดาน 66/4.4 gwei เมื่อค่าธรรมเนียมฐานเป็น 60 gwei ราคาจริงคือ min(66, 60 + 4.4) = 64.4 gwei เมื่อค่าธรรมเนียมฐานเป็น 65 gwei ราคาจริงเป็น 66 gwei และทิปจริงเหลือเพียง 1 gwei เมื่อค่าธรรมเนียมฐานเป็น 67 gwei จะได้ 66 < 67 ธุรกรรมจึงไม่มีคุณสมบัติภายใต้เพดานนี้ แม้จะผ่านเกณฑ์เพิ่มค่าธรรมเนียมภายในโหนด
  • การแข่งขันเพื่อยกเลิก. ธุรกรรมเดิมที่มี nonce 20 ส่ง 5 ETH ให้ร้านค้า หากธุรกรรมเดิมชนะด้วยค่าธรรมเนียม 21,000 * 42 gwei = 0.000882 ETH ร้านค้าจะได้รับ 5 ETH และธุรกรรมยกเลิกจะมี nonce ต่ำเกินไป หากธุรกรรมมูลค่าศูนย์ที่ส่งหาตนเองชนะด้วยค่าธรรมเนียม 21,000 * 45 gwei = 0.000945 ETH ธุรกรรมนั้นจะใช้ nonce 20 และกันไม่ให้ธุรกรรมเดิมเข้าสู่ประวัติเชนมาตรฐานเดียวกันในภายหลัง การคลิกปุ่มยกเลิกเพียงอย่างเดียวไม่อาจบอกผลลัพธ์ได้
  • ขอบเขตของพูล blob. ธุรกรรมตัวเลือกเดิมประเภท 3 มีเพดานค่าธรรมเนียมดำเนินการ 100 gwei เพดานทิป 3 gwei และเพดานค่าธรรมเนียม blob 20 gwei ภายใต้การตั้งค่าพูล blob ของ Geth เพื่อการเรียนรู้ที่เพิ่ม 100% เกณฑ์คำนวณคือ 200/6/40 gwei ธุรกรรมที่ 200/6/39 gwei ไม่ถึงเพดาน blob ส่วน 200/6/40 gwei ถึงเกณฑ์ทั้งสาม แต่ยังต้องมี sidecar, nonce, ยอดคงเหลือ และการยอมรับเข้าพูลที่ถูกต้อง ตัวเลขเหล่านี้ไม่ใช่กฎสำหรับธุรกรรมทั่วไปหรือไคลเอนต์อื่น

ความเสี่ยง

  • เลือก chain ID หรือเครือข่ายผิด
  • เลือกผู้ส่งหรือ nonce ของบัญชีผิด
  • ใช้บล็อกส่วนหัว ค่าธรรมเนียมฐาน หรือ nonce มาตรฐานที่ล้าสมัย
  • พยายามแทนที่หลังธุรกรรมเดิมถูกบรรจุหรือเข้าสู่ภาวะสิ้นสุด
  • นำกฎ txpool ทั่วไปไปใช้กับ UserOperation ของ ERC-4337
  • สมมติว่าไคลเอนต์ ผู้ให้บริการ เวอร์ชัน หรือการตั้งค่าอื่นใช้นโยบายเดียวกัน
  • เพิ่มไม่ถึงเกณฑ์เพราะการปัดเศษจำนวนเต็มหน่วย wei
  • เพิ่มช่องค่าธรรมเนียม EIP-1559 ที่จำเป็นเพียงช่องเดียว
  • ตั้ง maxFeePerGas ต่ำกว่าค่าธรรมเนียมฐานของบล็อกตัวเลือก
  • ละเลยเพดานค่าธรรมเนียม blob, sidecar หรือกฎเฉพาะของพูล blob
  • ยอดคงเหลือไม่พอสำหรับมูลค่าและค่าธรรมเนียมสูงสุดที่อนุญาต
  • ลายเซ็น ประเภท การเข้ารหัส gas ขั้นต่ำ หรือโดเมนเชนไม่ถูกต้อง
  • เปลี่ยนปลายทาง มูลค่า calldata รายการเข้าถึง หรือแฮช blob โดยไม่ตั้งใจ
  • ธุรกรรมยกเลิกสาธารณะแพ้การแข่งขันเพื่อบรรจุ
  • ธุรกรรมเดิมยังอยู่ในโหนดอื่นหรือข้อมูลขาเข้าของผู้สร้างบล็อก
  • รีเลย์ส่วนตัวเปิดเผย ตรวจพิจารณา ทิ้ง หรือยกเลิกการส่งไม่สำเร็จ
  • การเผยแพร่ซ้ำต่อสาธารณะเปิดเผยเจตนาแก่การแซงหน้า การโจมตีแบบประกบ หรือ MEV รูปแบบอื่น
  • ช่องว่างของ nonce กีดขวางธุรกรรมถัดไปหรือทำให้เกิดการโอนซ้ำ
  • ธุรกรรมแทนที่ถูกบรรจุแต่ย้อนกลับหรือ gas หมด พร้อมทั้งใช้ nonce และค่าธรรมเนียม
  • ข้อผิดพลาดด้านการจัดระเบียบเชนใหม่ ภาวะสิ้นสุด หรือลำดับใบรับธุรกรรม ทำให้ธุรกรรมตัวเลือกกลับมาหรือถูกจำแนกผิด

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

  • ธุรกรรมตัวเลือกที่มีค่าธรรมเนียมสูงกว่าจะลบธุรกรรมเดิมทั่วทั้งเครือข่าย
  • ธุรกรรมใดๆ ที่มีเลข nonce เท่ากันจะแทนที่กัน แม้มาจากคนละผู้ส่ง
  • ปุ่มยกเลิกในกระเป๋าสินทรัพย์ดิจิทัลย้อนคืนธุรกรรมที่ถูกบรรจุแล้ว
  • โหนดหนึ่งยอมรับธุรกรรมแทนที่หมายความว่าผู้สร้างบล็อกจะบรรจุธุรกรรมนั้น
  • กฎเพิ่ม 10% แบบสากลครอบคลุมทุกไคลเอนต์ ธุรกรรม blob รีเลย์ส่วนตัว และ UserOperation

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

แหล่งข้อมูล

การนำทาง

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