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

วิธีแก้ “replacement transaction underpriced”

ข้อผิดพลาด RPC นี้หมายถึงธุรกรรมจากผู้ส่งและ nonce เดียวกันไม่ผ่านนโยบายเพิ่มค่าธรรมเนียมของโหนด เรียนรู้วิธีตรวจสอบ เร่ง หรือยกเลิกอย่างปลอดภัย

อัปเดต

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

คำตอบโดยตรง

replacement transaction underpriced คือการปฏิเสธจาก RPC หรือพูลธุรกรรม ไม่ใช่การ revert ของสัญญา EVM โดยทั่วไปโหนดรู้จักธุรกรรมจากผู้ส่งเดียวกันที่ใช้ nonce เดียวกันอยู่แล้ว แต่ธุรกรรมใหม่ไม่ได้เพิ่มช่องค่าธรรมเนียมมากพอที่จะผ่านนโยบายการแทนที่ของโหนดนั้น

ตรวจสอบเชน ผู้ส่ง nonce และสถานะของแฮชทั้งหมดที่ทราบก่อน หากธุรกรรมเดิมยัง pending และต้องการแทนที่ ให้ใช้ nonce เดิมทุกประการและเพิ่มค่าธรรมเนียมตามนโยบายกระเป๋าหรือโหนด การเพิ่มเพียง gasLimit เปลี่ยน slippage หรือส่งธุรกรรมที่ลงนามเดิมซ้ำ ไม่ผ่านกฎการเพิ่มค่าธรรมเนียม

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

  1. Nonce ระบุตำแหน่งธุรกรรม ธุรกรรมจากบัญชีภายนอกใช้ nonce ตามลำดับ หากโหนดมีธุรกรรมของผู้ส่งที่ nonce นั้นแล้ว ธุรกรรมอื่นในตำแหน่งเดียวกันจะเป็นตัวเลือกแทนที่ nonce ที่ตามมาอาจอยู่ในคิวจนกว่ารายการก่อนหน้าจะถูกบรรจุหรือแก้ไข
  2. การแทนที่เป็นนโยบายของพูลในแต่ละโหนด ฉันทามติ Ethereum ไม่กำหนดเปอร์เซ็นต์ร่วมกัน ไคลเอนต์ ผู้ให้บริการ RPC และรีเลย์ส่วนตัวอาจใช้กฎหรือเห็นธุรกรรม pending ต่างกัน legacy pool ของ Geth ใช้ 10% เป็นค่าเริ่มต้นในปัจจุบัน แต่ผู้ดูแลปรับได้และไคลเอนต์อื่นไม่จำเป็นต้องเหมือนกัน
  3. EIP-1559 มีเพดานค่าธรรมเนียมสองค่า maxPriorityFeePerGas จำกัดทิปผู้ตรวจสอบ และ maxFeePerGas จำกัดราคารวมต่อ gas รวม base fee ใน legacy pool ของ Geth ค่า fee cap และ tip cap ใหม่ต้องสูงกว่าค่าเดิมและผ่านเกณฑ์เปอร์เซ็นต์ที่ตั้งไว้ กระเป๋าควรคำนวณทั้งสองค่า
  4. พูลยอมรับไม่เท่ากับยืนยัน โหนดหนึ่งอาจรับธุรกรรมแทนที่ แต่อีกโหนดยังเก็บธุรกรรมเดิม มีเพียงหนึ่งธุรกรรมจากผู้ส่งและ nonce นั้นที่เข้าสู่ลำดับ canonical ตัวเลือกที่ถูกต้องซึ่งถูกบรรจุก่อนทำให้รายการอื่นใช้ไม่ได้บนเชนนั้น แม้หน้าจออาจอัปเดตช้า
  5. เพดานกับจำนวนที่จ่ายต่างกัน ราคา 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 ต่ำเกินไป เปอร์เซ็นต์นี้เป็นตัวอย่าง ไม่ใช่การรับประกันทั้งเครือข่าย

ดำเนินการตามลำดับนี้:

  1. ตรวจสอบเครือข่ายและผู้ส่งให้ถูกต้อง ค้นหาแฮชเดิมและแฮชแทนที่ทั้งหมดผ่านกระเป๋า รวมถึง RPC หรือ block explorer อิสระ
  2. เปรียบเทียบจำนวนธุรกรรมที่ยืนยันแล้วกับมุมมอง pending หาก nonce 42 ยืนยันแล้ว อย่าสร้างธุรกรรมอีกโดยคิดว่ายังรอดำเนินการ
  3. ถอดรหัส to, value และ data ของธุรกรรมเดิม สำหรับการเร่งให้คงการดำเนินการและ nonce เดิม สำหรับการยกเลิก กระเป๋ามักส่ง 0 ETH กลับหาผู้ส่งด้วย nonce เดิม ซึ่งเป็นการแทนที่ที่แข่งขันกัน ไม่ใช่การเรียกคืนระดับโปรโตคอล
  4. ใช้ฟังก์ชันเร่งหรือยกเลิกของกระเป๋าเมื่อทำได้ มิฉะนั้นให้ดูนโยบายและประมาณค่าธรรมเนียมปัจจุบัน เพิ่มเพดาน EIP-1559 ทั้งสองโดยเผื่อการปัดเศษ และยืนยันว่าบัญชีรองรับ value + gasLimit x maxFeePerGas
  5. ตรวจสอบธุรกรรมทั้งหมดก่อนลงนาม ส่งครั้งเดียว เก็บทุกแฮช และติดตาม 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 ยังไม่คลี่คลาย การเปลี่ยนสถานะที่ยืนยันแล้วต้องใช้วิธีระดับแอปพลิเคชันหากมี

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

แหล่งข้อมูล

การนำทาง

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