เพื่อการศึกษาเท่านั้น ไม่ใช่คำแนะนำทางการเงินหรือความปลอดภัย การแทนที่หรือยกเลิกอาจทำให้ธุรกรรมที่ไม่ตั้งใจถูกดำเนินการ และค่าธรรมเนียมเครือข่ายเรียกคืนไม่ได้
คำตอบโดยตรง
replacement transaction underpriced คือการปฏิเสธจาก RPC หรือพูลธุรกรรม ไม่ใช่การ revert ของสัญญา EVM โดยทั่วไปโหนดรู้จักธุรกรรมจากผู้ส่งเดียวกันที่ใช้ nonce เดียวกันอยู่แล้ว แต่ธุรกรรมใหม่ไม่ได้เพิ่มช่องค่าธรรมเนียมมากพอที่จะผ่านนโยบายการแทนที่ของโหนดนั้น
ตรวจสอบเชน ผู้ส่ง nonce และสถานะของแฮชทั้งหมดที่ทราบก่อน หากธุรกรรมเดิมยัง pending และต้องการแทนที่ ให้ใช้ nonce เดิมทุกประการและเพิ่มค่าธรรมเนียมตามนโยบายกระเป๋าหรือโหนด การเพิ่มเพียง gasLimit เปลี่ยน slippage หรือส่งธุรกรรมที่ลงนามเดิมซ้ำ ไม่ผ่านกฎการเพิ่มค่าธรรมเนียม
กลไกการทำงาน
- Nonce ระบุตำแหน่งธุรกรรม ธุรกรรมจากบัญชีภายนอกใช้ nonce ตามลำดับ หากโหนดมีธุรกรรมของผู้ส่งที่ nonce นั้นแล้ว ธุรกรรมอื่นในตำแหน่งเดียวกันจะเป็นตัวเลือกแทนที่ nonce ที่ตามมาอาจอยู่ในคิวจนกว่ารายการก่อนหน้าจะถูกบรรจุหรือแก้ไข
- การแทนที่เป็นนโยบายของพูลในแต่ละโหนด ฉันทามติ Ethereum ไม่กำหนดเปอร์เซ็นต์ร่วมกัน ไคลเอนต์ ผู้ให้บริการ RPC และรีเลย์ส่วนตัวอาจใช้กฎหรือเห็นธุรกรรม pending ต่างกัน legacy pool ของ Geth ใช้
10%เป็นค่าเริ่มต้นในปัจจุบัน แต่ผู้ดูแลปรับได้และไคลเอนต์อื่นไม่จำเป็นต้องเหมือนกัน - EIP-1559 มีเพดานค่าธรรมเนียมสองค่า
maxPriorityFeePerGasจำกัดทิปผู้ตรวจสอบ และmaxFeePerGasจำกัดราคารวมต่อ gas รวม base fee ใน legacy pool ของ Geth ค่า fee cap และ tip cap ใหม่ต้องสูงกว่าค่าเดิมและผ่านเกณฑ์เปอร์เซ็นต์ที่ตั้งไว้ กระเป๋าควรคำนวณทั้งสองค่า - พูลยอมรับไม่เท่ากับยืนยัน โหนดหนึ่งอาจรับธุรกรรมแทนที่ แต่อีกโหนดยังเก็บธุรกรรมเดิม มีเพียงหนึ่งธุรกรรมจากผู้ส่งและ nonce นั้นที่เข้าสู่ลำดับ canonical ตัวเลือกที่ถูกต้องซึ่งถูกบรรจุก่อนทำให้รายการอื่นใช้ไม่ได้บนเชนนั้น แม้หน้าจออาจอัปเดตช้า
- เพดานกับจำนวนที่จ่ายต่างกัน ราคา gas ที่มีผลของ EIP-1559 ถูกจำกัดด้วย fee cap และ gas ที่ไม่ใช้ไม่ถูกคิดเงิน การเพิ่ม
maxFeePerGasเพิ่มความเสี่ยงสูงสุด ไม่จำเป็นต้องเพิ่มราคาสุดท้าย แต่เพดานสูงอาจถูกจ่ายหาก base fee และทิปต้องการ
ขั้นตอนแก้ไขและตัวอย่าง
สมมติ nonce คือ 42, maxFeePerGas = 30 gwei และ maxPriorityFeePerGas = 2 gwei โหนดที่กำหนด 10% อาจปฏิเสธ 31 gwei และ 2.1 gwei ส่วน 35 gwei และ 2.5 gwei ผ่านเกณฑ์ตัวอย่างนี้ ธุรกรรมยังอาจรอหาก base fee ทำให้ทิปที่มีผลภายใต้ fee cap 35 gwei ต่ำเกินไป เปอร์เซ็นต์นี้เป็นตัวอย่าง ไม่ใช่การรับประกันทั้งเครือข่าย
ดำเนินการตามลำดับนี้:
- ตรวจสอบเครือข่ายและผู้ส่งให้ถูกต้อง ค้นหาแฮชเดิมและแฮชแทนที่ทั้งหมดผ่านกระเป๋า รวมถึง RPC หรือ block explorer อิสระ
- เปรียบเทียบจำนวนธุรกรรมที่ยืนยันแล้วกับมุมมอง pending หาก nonce
42ยืนยันแล้ว อย่าสร้างธุรกรรมอีกโดยคิดว่ายังรอดำเนินการ - ถอดรหัส
to,valueและdataของธุรกรรมเดิม สำหรับการเร่งให้คงการดำเนินการและ nonce เดิม สำหรับการยกเลิก กระเป๋ามักส่ง0 ETHกลับหาผู้ส่งด้วย nonce เดิม ซึ่งเป็นการแทนที่ที่แข่งขันกัน ไม่ใช่การเรียกคืนระดับโปรโตคอล - ใช้ฟังก์ชันเร่งหรือยกเลิกของกระเป๋าเมื่อทำได้ มิฉะนั้นให้ดูนโยบายและประมาณค่าธรรมเนียมปัจจุบัน เพิ่มเพดาน EIP-1559 ทั้งสองโดยเผื่อการปัดเศษ และยืนยันว่าบัญชีรองรับ
value + gasLimit x maxFeePerGas - ตรวจสอบธุรกรรมทั้งหมดก่อนลงนาม ส่งครั้งเดียว เก็บทุกแฮช และติดตาม receipt ของตัวเลือกทั้งหมด แฮช pending ไม่มี receipt; receipt ที่ผูกกับเชนและบล็อกที่ถูกต้องคือจุดยืนยันการดำเนินการ
ความเสี่ยง
- การยกเลิกไม่รับประกัน ธุรกรรมเดิมอาจถูกบรรจุก่อน และธุรกรรมส่วนตัวหรือแพร่กระจายน้อยอาจมองไม่เห็นจาก RPC ที่ตรวจสอบ
- nonce ผิดอาจสร้างการชำระเงินหรือการเรียกสัญญาใหม่ การลงนาม calldata เก่าอีกครั้งอาจดำเนินการเมื่อราคา allowance กำหนดเวลา หรือสถานะโปรโตคอลเปลี่ยนแล้ว
- endpoint หนึ่งอาจรับรายการแทนที่ แต่อีกแห่งปฏิเสธ การสลับ RPC ซ้ำอาจทิ้งตัวเลือกไว้ในพูลต่างกันและทำให้หน้าจอกระเป๋าสับสน
- การเพิ่ม
gasLimitไม่เพิ่มลำดับความสำคัญ การเพิ่มเพดานโดยไม่ตรวจสอบเพิ่มต้นทุนสูงสุด ส่วนการเปลี่ยน slippage หรือ calldata เปลี่ยนความหมายการดำเนินการแต่ไม่แก้กฎพูล - ธุรกรรม blob, user operation ของ account abstraction, L2 และรีเลย์ส่วนตัวอาจใช้พูลและกฎต่างกัน อย่าสมมติว่านโยบายธุรกรรม EVM ปกติของ Geth ใช้กับรายการเหล่านี้
หยุดหากไม่รู้จักผู้ส่งหรือ nonce, ถอดรหัส calldata ไม่ได้, ธุรกรรมอาจยืนยันแล้ว, กระเป๋าเสนอผู้รับหรือมูลค่าต่างไป หรือ RPC ขอ seed phrase หรือ private key การแก้ปัญหาที่ถูกต้องไม่ต้องเปิดเผยข้อมูลลับสำหรับกู้คืน
ความเข้าใจผิดที่พบบ่อย
- “บัญชีมีเงินไม่พอ” เงินไม่พอเป็นข้อผิดพลาดอีกชนิด ข้อความนี้กล่าวถึงธุรกรรมคู่แข่งและราคาที่ใช้แทนที่
- “เพิ่ม 10% ใช้ได้เสมอ” นี่เป็นค่าเริ่มต้นทั่วไปของ Geth ไม่ใช่กฎฉันทามติ การตั้งค่า ไคลเอนต์ ชนิดธุรกรรม และการปัดเศษอาจต้องการมากกว่า
- “ธุรกรรมที่แพงกว่าแทนที่รายการเดิมทุกที่แล้ว” พูลเป็นข้อมูลท้องถิ่น การยอมรับของ RPC หนึ่งแห่งไม่ลบรายการเดิมจากทุกพูลหรือรับประกันลำดับ
- “การยกเลิกย้อนธุรกรรมที่ยืนยันแล้ว” ไม่จริง การยกเลิกแข่งขันได้เฉพาะตอน nonce ยังไม่คลี่คลาย การเปลี่ยนสถานะที่ยืนยันแล้วต้องใช้วิธีระดับแอปพลิเคชันหากมี
หัวข้อที่เกี่ยวข้อง
แหล่งข้อมูล
- ธุรกรรม - ethereum.org (เข้าถึง: 2026-08-21)
- EIP-1559: การเปลี่ยนแปลงตลาดค่าธรรมเนียมของเชน ETH 1.0 - Ethereum Improvement Proposals (เข้าถึง: 2026-08-21)
- ตรรกะการแทนที่ของ legacy pool ใน go-ethereum - go-ethereum (เข้าถึง: 2026-08-21)
- เนมสเปซ txpool - go-ethereum (เข้าถึง: 2026-08-21)