อธิบายธุรกรรม Ethereum ที่รอดำเนินการ: nonce การแทนที่ และการยกเลิก
ทำความเข้าใจว่าเหตุใดธุรกรรม Ethereum จึงต้องรอ nonce จัดลำดับธุรกรรมของบัญชีอย่างไร และปุ่มเร่งหรือยกเลิกในกระเป๋าทำอะไรได้และทำอะไรไม่ได้
ในคู่มือนี้ป้ายสถานะรอดำเนินการหมายถึงธุรกรรมยังไม่ถูกรวมในบล็อก
สรุปสั้น
ธุรกรรม Ethereum จากบัญชีที่ควบคุมจากภายนอกทั่วไป (EOA) ใช้ nonce ตามลำดับ ธุรกรรมที่มี nonce ทีหลังจะทำงานไม่ได้ตราบใดที่ nonce ก่อนหน้าของบัญชียังไม่ถูกใช้ ปุ่มเร่งหรือยกเลิกในกระเป๋ามักสร้างธุรกรรมอีกชุดที่แข่งขันกันโดยใช้ nonce เดิม แต่ไม่ได้รับประกันว่าจะถูกรวมในบล็อก และธุรกรรมที่ยืนยันแล้วไม่สามารถย้อนกลับได้
ป้ายสถานะรอดำเนินการหมายถึงธุรกรรมยังไม่ถูกรวมในบล็อก
หลังจากคุณลงนามธุรกรรม Ethereum กระเป๋าอาจส่งธุรกรรมนั้นไปยังไคลเอนต์ประมวลผลหรือบริการธุรกรรม โหนดที่รับธุรกรรมอาจส่งต่อไปยังโหนดอื่น และผู้เสนอสร้างบล็อกอาจรวมธุรกรรมนั้นไว้ในบล็อกภายหลัง ก่อนที่จะถูกรวม ธุรกรรมยังไม่ได้เปลี่ยนสถานะของเชนหลัก คำว่า “รอดำเนินการ” ที่แสดงในกระเป๋าหรือเครื่องมือสำรวจมักหมายถึงบริการนั้นทราบธุรกรรมแล้วแต่ยังไม่พบในบล็อก ไม่ได้หมายความว่ามีคิวกลางเพียงคิวเดียวของทั้งเครือข่าย คู่มือธุรกรรมของ Ethereum.org อธิบายเส้นทางตั้งแต่ลงนามและเผยแพร่ไปจนถึงการรวมในบล็อก
ธุรกรรมอาจต้องรอด้วยหลายสาเหตุ เพดานค่าธรรมเนียมอาจไม่เข้าเงื่อนไขของบล็อก ธุรกรรมก่อนหน้าจากบัญชีเดียวกันอาจยังไม่คลี่คลาย โหนดอาจยังไม่ได้รับธุรกรรม หรือกระเป๋าอาจแสดงข้อมูลที่ล้าสมัยหรือเฉพาะผู้ให้บริการ สาเหตุแต่ละแบบต้องตรวจสอบต่างกัน การเพิ่มค่าธรรมเนียมแก้การเลือกเครือข่ายผิดไม่ได้ และการส่งการชำระเงินอีกครั้งโดยไม่ตรวจรายการแรกอาจทำให้จ่ายซ้ำ
“รอดำเนินการ” ต่างจาก “ยืนยันแล้ว” “finalized” หรือ “ล้มเหลว” คุณอาจเห็นแฮชธุรกรรมก่อนที่จะมีใบรับรองธุรกรรม โดยใบรับรองจะพร้อมหลังจากธุรกรรมถูกรวมในบล็อก จากนั้นบล็อก Ethereum จะผ่านสถานะต่าง ๆ ตามฉันทามติ กระเป๋าและเครื่องมือสำรวจอาจใช้ป้ายเหล่านี้ไม่เหมือนกัน จึงควรตรวจแฮชธุรกรรม บล็อก ใบรับรอง และสถานะเชนปัจจุบัน แทนการดูป้ายสั้น ๆ เพียงอย่างเดียว
nonce คือหมายเลขลำดับธุรกรรมของบัญชี
บัญชี Ethereum ที่ควบคุมจากภายนอกทั่วไป (EOA) มี nonce สำหรับจัดลำดับธุรกรรม nonce เป็นตัวนับ ไม่ใช่ค่าธรรมเนียม เวลา หรือแฮชธุรกรรมที่ไม่ซ้ำกัน สำหรับแต่ละบัญชี เชนจะรับธุรกรรมก็ต่อเมื่อธุรกรรมนั้นใช้ nonce ถัดไปที่สถานะบัญชีคาดไว้ บัญชีเดียวกันไม่สามารถทำธุรกรรมสองรายการที่มี nonce เดียวกันบนเชนหลักได้ เอกสารบัญชีของ Ethereum.org อธิบาย nonce ว่าเป็นตัวนับธุรกรรมของบัญชีและกลไกป้องกันการเล่นธุรกรรมซ้ำ
สมมติว่า nonce ที่ยังไม่ถูกใช้ถัดไปของบัญชีคือ 41 ธุรกรรมถัดไปที่ถูกต้องใช้ nonce 41 และหลังธุรกรรมนั้นถูกรวมและประมวลผลแล้ว ธุรกรรมถัดไปจึงใช้ nonce 42 nonce ผูกกับบัญชีผู้ส่ง ไม่ใช่ที่อยู่ปลายทาง บัญชีสองบัญชีต่างกันสามารถมีธุรกรรมหมายเลข 41 พร้อมกันได้ เพราะแต่ละบัญชีมีลำดับของตัวเอง
คุณลงนามธุรกรรมด้วย nonce ที่สูงกว่า nonce ปัจจุบันบนเชนของบัญชีได้ แต่เมื่อนำไปประมวลผล ธุรกรรมจะข้ามลำดับไม่ได้ ต้องใช้ nonce ที่ขาดอยู่ก่อน ธุรกรรมที่ใช้ nonce ซึ่งบัญชีใช้ไปแล้วเป็นธุรกรรมเก่าและจะประมวลผลเป็นธุรกรรมใหม่ไม่ได้ ลำดับนี้ทำให้เครือข่ายประมวลผลธุรกรรมของแต่ละบัญชีต่อเนื่องกัน แม้จะเผยแพร่คนละเวลา หรือมาถึงผ่านคนละโหนด
กฎ nonce นี้ใช้กับธุรกรรม EOA ทั่วไปในชั้นประมวลผลของ Ethereum ไม่ได้อธิบายกระเป๋าทุกรูปแบบ ตัวจัดลำดับธุรกรรมของ rollup หรือทุกเชนอย่างครอบคลุม ระบบบัญชีอัจฉริยะอาจเพิ่มกฎการดำเนินการและ nonce ของตนเอง ซึ่งจะกล่าวถึงต่อไป
“รอดำเนินการ” และ “เข้าคิว” เป็นป้ายของพูลธุรกรรมในแต่ละโหนด
Ethereum ไม่มีห้องรอส่วนกลางที่ซิงก์กัน ซึ่งกระเป๋า โหนด เครื่องมือสำรวจบล็อก และผู้เสนอบล็อกทุกแห่งเห็นเหมือนกันทุกประการ ไคลเอนต์ประมวลผลแต่ละตัวเก็บพูลธุรกรรมในเครื่องของตน โดยมีธุรกรรมที่ได้รับและเห็นว่าเข้าเกณฑ์ตามข้อจำกัดและนโยบายของตัวเอง ธุรกรรมอาจอยู่ในพูลของโหนดหนึ่ง แต่ไม่อยู่ในอีกโหนดหนึ่ง เอกสาร RPC txpool ของ Geth แสดงกลุ่ม pending และ queued ในเครื่องของไคลเอนต์นั้น และระบุว่าอาจมีธุรกรรมหลายรายการที่เกี่ยวข้องกับผู้ส่งและ nonce เดียวกัน
ในคำศัพท์ของ Geth pending โดยทั่วไปหมายถึงธุรกรรมที่ประมวลผลตามลำดับ nonce จากสถานะปัจจุบันของบัญชีได้ ส่วน queued อาจรวมธุรกรรม nonce ในอนาคตที่รอให้ช่องว่างถูกเติม ชื่อเหล่านี้เป็นสถานะในอินเทอร์เฟซของไคลเอนต์ ไม่ใช่สถานะระดับฉันทามติที่ซอฟต์แวร์ Ethereum ทุกตัวต้องแสดง กระเป๋าอาจเรียกรายการธุรกรรมที่ยังไม่ยืนยันทั้งหมดว่า “รอดำเนินการ” ส่วนเครื่องมือสำรวจอาจแสดงเฉพาะธุรกรรมที่ผู้ให้บริการข้อมูลของตนพบ
ตัวอย่างเช่น หากโหนดรู้จักธุรกรรม nonce 41 และอีกธุรกรรม nonce 43 ก็จะประมวลผล 43 ก่อน 42 ไม่ได้ โหนดนั้นอาจเก็บ 43 ไว้ในคิวจนกว่า 42 จะมาถึง หรือสถานะบัญชีจะขยับไปด้วยวิธีอื่น ส่วนอีกโหนดที่ไม่เคยได้รับ 43 ก็จะไม่แสดงธุรกรรมนั้น นี่จึงเป็นเหตุผลที่เครื่องมือสำรวจสองแห่งอาจเห็นต่างกันว่าธุรกรรมรอดำเนินการหรือหาไม่พบ โดยไม่มีหน้าจอใดพิสูจน์ได้ว่าผู้ตรวจสอบทุกคนเห็นอะไร
ไคลเอนต์บางตัวอนุญาตให้มีธุรกรรมที่ยังไม่ยืนยันมากกว่าหนึ่งรายการเป็นตัวเลือกสำหรับผู้ส่งและ nonce เดียวกัน รายการเหล่านั้นเป็นตัวเลือกที่แย่งลำดับเดียวกัน ไม่ใช่ธุรกรรมสองรายการที่ประมวลผลต่อกันได้ ความจุของพูล อายุธุรกรรม และกฎการแทนที่เป็นนโยบายของซอฟต์แวร์ ซึ่งเปลี่ยนได้ตามรุ่น ตัวอย่างเช่น ตัวเลือกของพูลธุรกรรม Geth มีการตั้งค่าเกณฑ์การเพิ่มราคาเฉพาะไคลเอนต์ อย่าถือว่าค่านั้นเป็นกฎค่าธรรมเนียมสากลของ Ethereum ดูขอบเขตของตัวเลือกเหล่านี้ได้ใน คู่มือคำสั่ง Geth
nonce ที่ยังไม่คลี่คลายเพียงรายการเดียวอาจทำให้ธุรกรรมถัดไปรอ
สมมติว่า nonce ถัดไปบนเชนของบัญชีคือ 41 คุณเผยแพร่ธุรกรรม A ด้วย nonce 41 แล้วตามด้วยธุรกรรม B ด้วย nonce 42 หาก A ยังไม่คลี่คลาย B จะประมวลผลก่อน A ไม่ได้ B อาจอยู่ในคิวของโหนด แสดงเป็นรอดำเนินการเฉพาะในกระเป๋า หรือไม่ปรากฏในเครื่องมือสำรวจที่ยังไม่ได้รับรายการ สิ่งสำคัญคือความสัมพันธ์ของลำดับ nonce ไม่ใช่ลำดับที่กระเป๋าสร้างหรือแสดงธุรกรรม
ถ้า A ถูกรวมในบล็อกในภายหลัง nonce ของบัญชีจะขยับเป็น 42 และ B อาจเข้าเกณฑ์ โดยยังต้องผ่านเงื่อนไขความถูกต้อง ค่าธรรมเนียม และนโยบายพูลของตัวเอง หาก A ถูกแทนที่ด้วยธุรกรรมที่ถูกต้องรายการอื่นซึ่งใช้ nonce 41 รายการใหม่จะครองลำดับเดียวกันหากเป็นรายการที่ถูกรวมในบล็อก หากธุรกรรมอื่นจากบัญชีใช้ nonce 41 ไปแล้ว ตัวเลือกเก่าเลข 41 จะล้าสมัยและประมวลผลภายหลังไม่ได้
นี่คือเหตุผลที่การส่งธุรกรรมใหม่ด้วย nonce ที่สูงขึ้นไม่ใช่วิธีทั่วไปในการปลดธุรกรรมที่ค้างอยู่ แต่เป็นการเพิ่มธุรกรรมอีกหนึ่งรายการไว้หลังช่องว่าง และการยกเลิก B ก็ไม่แก้ A หาก B เป็นรายการที่มาทีหลังอยู่แล้ว ให้เริ่มจาก nonce ที่ยังไม่คลี่คลายและอยู่ลำดับต่ำที่สุดของบัญชี พร้อมตรวจสอบสถานะก่อนเปลี่ยนแปลงอะไร
ช่องว่างอาจเกิดขึ้นชั่วคราวหรือค้างนาน ธุรกรรมก่อนหน้าอาจยังไม่ถึงโหนดที่คุณตรวจสอบ อาจตั้งค่าธรรมเนียมไม่น่าดึงดูดหรือไม่พอกับสถานการณ์ปัจจุบัน หรืออาจถูกนำออกจากพูลของโหนดหนึ่ง กระเป๋าอาจแสดงธุรกรรมในคิวที่สร้างจากอุปกรณ์อีกเครื่องก็ได้ หน้าจอเพียงอย่างเดียวบอกไม่ได้ว่าเกิดอะไรขึ้น ให้เทียบ nonce ที่ยืนยันแล้วของบัญชี แฮชธุรกรรม และข้อมูลจากแหล่งที่เชื่อถือได้มากกว่าหนึ่งแห่ง

การตั้งค่าค่าธรรมเนียมมีผลต่อการรวมในบล็อก แต่ไม่เปลี่ยนลำดับ nonce
ลำดับ nonce และเงื่อนไขค่าธรรมเนียมเป็นข้อจำกัดคนละส่วน ธุรกรรมที่ใช้ nonce ถัดไปถูกต้องก็ยังต้องรอได้ หากพารามิเตอร์ค่าธรรมเนียมไม่เข้าเงื่อนไขของบล็อก ธุรกรรมที่มี nonce สูงกว่าจะข้ามคิวไม่ได้เพียงเพราะเสนอทิปสูงกว่า การเพิ่มค่าธรรมเนียมให้ nonce 42 ไม่ได้ทำให้ nonce 41 หายไป
สำหรับธุรกรรม EIP-1559 ทั่วไป ค่าธรรมเนียมสูงสุดต้องครอบคลุม base fee ของบล็อกที่จะรวมธุรกรรม และ priority fee อาจมีผลต่อการเลือกของผู้เสนอบล็อก ทั้ง base fee และพื้นที่บล็อกที่มีอยู่เปลี่ยนได้ระหว่างที่ธุรกรรมรอ ค่าธรรมเนียมสูงสุดเป็นเพดาน และการเพิ่มเพดานไม่ได้รับประกันเวลายืนยันที่แน่นอน คู่มือค่าธรรมเนียมแก๊สของ Ethereum อธิบายช่องข้อมูลเหล่านี้และวิธีหาค่าธรรมเนียมจริง
โหนดหรือกระเป๋าอาจใช้กฎการส่งต่อหรือการแทนที่เพิ่มเติม นโยบายเหล่านี้กำหนดว่าบริการนั้นยอมรับหรือส่งต่ออะไร ไม่ใช่ทุกข้อจะเป็นกฎฉันทามติ ตัวอย่างเช่น Geth เปิดให้ตั้งเกณฑ์เพิ่มราคาสำหรับการแทนธุรกรรมรอดำเนินการในพูลของตน ไคลเอนต์ ผู้ให้บริการ กระเป๋า หรือรุ่นซอฟต์แวร์อื่นอาจทำงานต่างกัน อย่าอาศัยเปอร์เซ็นต์ที่จำได้หรือเวลารอคงที่เป็นหลักประกันทั่วทั้งเครือข่าย
หากธุรกรรมรอเพราะ nonce ที่ต่ำกว่ายังไม่คลี่คลาย ให้หาให้พบก่อนว่าธุรกรรมใดใช้ nonce นั้น หากรอเพราะเพดานค่าธรรมเนียมไม่ครอบคลุมเงื่อนไข base fee ปัจจุบัน ให้เข้าใจช่องค่าธรรมเนียมก่อนเปลี่ยน คู่มือค่าธรรมเนียม Ethereum เหมาะกับการคำนวณค่าธรรมเนียม ส่วนบทความนี้เน้นปัญหาการเรียงลำดับซึ่งเป็นอีกเรื่องหนึ่ง
การเร่งส่งตัวเลือกแทนที่ซึ่งใช้ nonce เดิม
ฟังก์ชัน “เร่ง” ของกระเป๋ามักสร้างธุรกรรมใหม่จากบัญชีเดิม โดยใช้ nonce เดิมและปรับพารามิเตอร์ค่าธรรมเนียม ตัวเลือกทั้งสองขัดแย้งกัน เพราะบัญชีดำเนินธุรกรรมที่มี nonce นั้นได้เพียงรายการเดียว หากพูลธุรกรรมที่เกี่ยวข้องรับธุรกรรมแทนที่และรวมไว้ในบล็อก รายการใหม่อาจครองลำดับ nonce นั้น และรายการเดิมจะประมวลผลพร้อมกันบนเชนหลักไม่ได้ คำแนะนำธุรกรรมรอดำเนินการของ MetaMask อธิบายฟังก์ชันเร่งของบริการตนว่าเป็นการส่งซ้ำด้วย nonce เดิมและค่าธรรมเนียมสูงขึ้น
ธุรกรรมแทนที่อาจคงผู้รับและการทำงานเดิมแล้วเปลี่ยนเฉพาะช่องค่าธรรมเนียม แต่ควรตรวจหน้าจอลงนามแทนการคาดเดา กระเป๋าแต่ละแบบอาจแสดงช่องอื่นหรือเรียกฟังก์ชันไม่เหมือนกัน ก่อนลงนามธุรกรรมแทนที่ ให้ตรวจบัญชีผู้ส่ง nonce ที่อยู่ปลายทาง มูลค่า และข้อมูลสัญญา หากธุรกรรมใหม่เปลี่ยนสิ่งที่จะทำ ก็ไม่ใช่แค่การปรับค่าธรรมเนียมที่ไม่มีผลอย่างอื่น
ไม่มีการรับประกันว่าธุรกรรมแทนที่จะได้รับการยอมรับทุกแห่งหรือถูกรวมอย่างรวดเร็ว ธุรกรรมเดิมอาจถูกรวมไปแล้ว โหนดอาจปฏิเสธรายการใหม่ตามนโยบาย รายการใหม่อาจยังไม่น่าสนใจสำหรับผู้เสนอบล็อก หรือบริการอาจไม่ส่งต่อไปยังโหนดที่คุณกำลังตรวจสอบ หากธุรกรรมเดิมยืนยันแล้ว การส่งรายการอื่นด้วย nonce ที่ใช้ไปแล้วจะย้อนผลไม่ได้ และมักถูกปฏิเสธว่าเป็น nonce เก่า
คำว่า “แทนที่” ในที่นี้หมายถึงธุรกรรมแข่งขันจากบัญชีและ nonce เดียวกัน อย่านำขั้นตอน RBF หรือ CPFP ของ Bitcoin มาใช้กับ Ethereum Bitcoin ใช้แบบจำลองธุรกรรมต่างออกไป และวิธีเพิ่มค่าธรรมเนียมของ Bitcoin ไม่ใช่คำแนะนำสำหรับบัญชี Ethereum
การยกเลิกคือความพยายามชนะลำดับ nonce เดิม
เมื่อเผยแพร่ธุรกรรม Ethereum ที่ลงนามแล้ว จะไม่มีคำสั่งยกเลิกระดับโปรโตคอลที่ดึงธุรกรรมออกจากทุกโหนด บางกระเป๋ามีปุ่มยกเลิกขณะที่ธุรกรรมยังไม่ยืนยัน โดยทั่วไปปุ่มนี้พยายามเผยแพร่ธุรกรรมอีกรายการจากบัญชีเดิมและใช้ nonce เดิม รูปแบบที่พบได้อย่างหนึ่งคือธุรกรรมมูลค่า 0 ไปยังที่อยู่ผู้ส่งเอง หากพูลรับธุรกรรมยกเลิกและรวมก่อนรายการเดิม ก็จะใช้ nonce นั้น ทำให้ตัวเลือกเดิมไม่สามารถประมวลผลภายหลังได้ รูปแบบที่สร้างและการใช้งานได้ขึ้นอยู่กับกระเป๋า
ธุรกรรมเดิมกับตัวเลือกยกเลิกอาจแข่งกัน หากรายการเดิมถูกรวมก่อน การส่งยกเลิกภายหลังจะย้อนผลของรายการเดิมไม่ได้ หากไม่มีรายการใดถูกยอมรับหรือรวม nonce อาจยังไม่คลี่คลาย การกดปุ่มหรือเห็นข้อความสำเร็จในกระเป๋าไม่ได้พิสูจน์ว่าการยกเลิกชนะ ให้ตรวจแฮชธุรกรรมที่ได้และสถานะเชนหลัก คำแนะนำของ MetaMask จำกัดความพยายามยกเลิกไว้กับธุรกรรมที่ยังรอดำเนินการ และอธิบายว่าธุรกรรมที่ยืนยันแล้วไม่สามารถยกเลิกได้
ก่อนลงนามธุรกรรมยกเลิก ตรวจว่ารายการนั้นใช้บัญชีและ nonce เดียวกับธุรกรรมที่ต้องการแทนที่ และตรวจทุกช่องที่กระเป๋าแสดง หากถูกนำไปรวมในบล็อก อาจต้องเสียค่าธรรมเนียมเครือข่ายอีกครั้ง ตัวเลือกยกเลิกเองก็อาจต้องรอหรือแทนรายการเดิมไม่สำเร็จตามนโยบายพูลที่เกี่ยวข้อง คำว่า “ยกเลิกแล้ว” ในกระเป๋าไม่ใช่หลักฐานว่ามีการย้อนกลับระดับโปรโตคอล ควรสรุปผลหลังตรวจว่าธุรกรรมใดใช้ nonce นั้น
หากธุรกรรมได้อนุมัติโทเคน เรียกสัญญา หรือโอนสินทรัพย์ไปแล้ว การยกเลิกธุรกรรมที่ตามมาจะย้อนการเปลี่ยนแปลงสถานะที่เสร็จแล้วไม่ได้ บางการทำงานของสัญญาอาจมีวิธีดำเนินการแยกต่างหาก แต่ขึ้นอยู่กับสัญญา อย่าลงนามธุรกรรมที่ไม่รู้จักเพียงเพราะอินเทอร์เฟซเรียกว่าการยกเลิก
รวมในบล็อกแล้ว ย้อนการทำงานแล้ว ถูกนำออก หรือไม่พบ เป็นคนละข้อสังเกต
ธุรกรรมที่รวมในบล็อกมีข้อมูลบล็อกและใบรับรอง หากทำงานสำเร็จ การเปลี่ยนแปลงสถานะตามที่ตั้งใจอาจเกิดขึ้น หากการประมวลผล EVM revert การเปลี่ยนแปลงจากการทำงานนั้นจะย้อนกลับ แต่ธุรกรรมยังใช้ nonce ของบัญชีและอาจยังเสียค่าแก๊ส ให้ดูใบรับรองธุรกรรมและสถานะการประมวลผล แทนการอนุมานจากการแจ้งเตือนของกระเป๋า ความแตกต่างระหว่างการรวมในบล็อกกับผลการประมวลผลอธิบายไว้ใน คู่มือธุรกรรมของ Ethereum.org และคู่มือค่าแก๊ส
ป้าย “ถูกนำออก” หรือ “ไม่พบ” มักเป็นรายงานจากกระเป๋า เครื่องมือสำรวจ ผู้ให้บริการ RPC หรือพูลในเครื่องแห่งเดียว ข้อความนี้ไม่พิสูจน์เองว่าโปรโตคอลยกเลิกธุรกรรมหรือ nonce ว่างแล้ว โหนดอื่นอาจยังรู้จักรายการนั้น กระเป๋าอาจเผยแพร่ธุรกรรมที่ลงนามไว้อีกครั้ง หรือบล็อกภายหลังอาจแสดงว่า nonce ของบัญชีขยับแล้ว ในทางกลับกัน แม้ไม่พบธุรกรรมในแหล่งข้อมูลที่ตรวจ สถานะ nonce ที่ยืนยันแล้วของบัญชีก็อาจยังไม่เปลี่ยน
หากค้นหาแฮชไม่พบ ให้ตรวจว่าเลือกเชนและบัญชีเดียวกับที่ใช้สร้างธุรกรรม เปรียบเทียบ nonce ล่าสุดบนเชนของบัญชีกับ nonce ของธุรกรรม และตรวจธุรกรรมล่าสุดจากผู้ส่งนั้น การตอบกลับ nonce too low เป็นเบาะแสว่ามุมมองของเอนด์พอยต์ที่สอบถามอาจเห็นว่า nonce ถูกใช้แล้ว ไม่ใช่เหตุผลให้ส่งคำขอเดิมซ้ำไปเรื่อย ๆ ตรวจว่าธุรกรรมใดใช้ nonce นั้น และบล็อกยังเป็นเชนหลักหรือไม่
ธุรกรรมที่รวมในบล็อกยังได้รับผลจากการจัดระเบียบเชนใหม่ในช่วงสั้น ๆ ก่อนเชนจะเสถียรได้ กระเป๋าและเครื่องมือสำรวจอาจปรับป้ายสถานะเมื่อมุมมองเปลี่ยน สำหรับการโอนสำคัญ ให้รอตามเกณฑ์ยืนยันของบริการผู้รับ และตรวจ finality ที่เข้มแข็งขึ้นของฉันทามติเมื่อจำเป็น “เห็นในบล็อกหนึ่งแล้ว” ไม่ได้เท่ากับ “ย้อนกลับไม่ได้ในทุกสถานการณ์”
ตรวจ nonce ที่ยังไม่คลี่คลายและอยู่ก่อนที่สุดก่อนดำเนินการ
เริ่มจากตรวจเชน บัญชีผู้ส่ง และแฮชธุรกรรมให้ถูกต้อง ค้นหาแฮชในเครื่องมือสำรวจที่เชื่อถือได้ของเครือข่ายนั้น ตรวจว่ามีใบรับรองหรือไม่ ใช้ nonce ใด การทำงานสำเร็จหรือไม่ และบัญชีมีธุรกรรมภายหลังแล้วหรือยัง อย่าเปิดเผยหรือป้อนวลีตั้งต้นเพื่อเช็กธุรกรรม ที่อยู่สาธารณะกับแฮชธุรกรรมก็เพียงพอสำหรับค้นข้อมูลบนเชนสาธารณะ
ถ้าไม่เห็นแฮช ให้เปรียบเทียบ nonce ล่าสุดที่ยืนยันแล้วของบัญชีกับ nonce ที่กระเป๋าแสดง นักพัฒนาหรือผู้ดูแลโหนดสามารถเรียก eth_getTransactionCount โดยใช้แท็กบล็อก latest และ pending เอกสารอ้างอิง JSON-RPC ของ Ethereum.org ระบุว่า latest หมายถึงสถานะบล็อกล่าสุด ส่วน pending หมายถึงสถานะที่มีธุรกรรมรอดำเนินการ ผล pending ยังคงขึ้นกับมุมมองของ RPC เอนด์พอยต์นั้น และการสอบถามผู้ให้บริการสองรายอาจได้ค่าต่างกัน ผู้ใช้ส่วนใหญ่ตรวจเบาะแสแรกแบบเดียวกันได้จากกิจกรรมบัญชีในกระเป๋าและเครื่องมือสำรวจที่น่าเชื่อถือ โดยไม่ต้องรันคำสั่ง
จากนั้นเริ่มตรวจ nonce ต่ำสุดที่ยังไม่ถูกใช้ หากยังเห็นธุรกรรมเดิมและกระเป๋ารองรับการแทนที่ ให้ตรวจทุกช่องของรายการใหม่และการตั้งค่าค่าธรรมเนียมก่อนลงนาม หากไม่เห็นรายการเดิม ให้ถามกระเป๋าหรือผู้ให้บริการ RPC ว่าจัดการการเผยแพร่ซ้ำและการแทนที่อย่างไร แทนการคิดว่าธุรกรรมหายจากเครือข่ายแล้ว หาก nonce ถูกใช้ไปแล้ว ให้ระบุธุรกรรมที่ถูกรวมก่อนทำอย่างอื่น หลีกเลี่ยงการส่งธุรกรรม nonce ที่สูงขึ้นซ้ำ ๆ เพราะอาจทำให้คิวยาวขึ้นโดยไม่แก้ช่องว่างแรก
ขั้นตอนเหล่านี้ครอบคลุมธุรกรรมมาตรฐานของบัญชี Ethereum ที่ควบคุมจากภายนอก ระบบ account abstraction อาจส่ง UserOperation ผ่าน bundler และสมาร์ตแอ็กเคานต์อาจใช้คีย์ nonce กับลำดับที่ซับซ้อนกว่าตัวนับเดียว EIP-4337 กำหนดโครงสร้าง nonce สำหรับการทำงานเหล่านั้น ดังนั้นกระเป๋าที่ใช้ account abstraction อาจทำงานไม่เหมือนตัวอย่าง EOA ในบทความนี้ หากต้องการตรวจเครือข่ายปลายทาง ที่อยู่ และสถานะการโอน อ่านต่อได้ที่ รายการตรวจสอบการโอนคริปโท
คำถามที่พบบ่อย
Q1ยกเลิกธุรกรรม Ethereum หลังยืนยันแล้วได้ไหม?
ไม่ได้ กระเป๋าอาจพยายามแทนธุรกรรมที่ยังไม่ยืนยันด้วยรายการที่ใช้ nonce เดิม แต่ไม่สามารถย้อนธุรกรรมที่ถูกรวมและประมวลผลแล้วได้ ตรวจแฮชธุรกรรมและสถานะเชนก่อนดำเนินการ
Q2ทำไมธุรกรรม Ethereum ถัดไปของฉันถึงต้องรอด้วย?
ธุรกรรม EOA ทั่วไปทำงานตามลำดับ nonce หาก nonce ก่อนหน้ายังไม่คลี่คลาย nonce ที่สูงกว่าจะทำงานก่อนไม่ได้ แม้จะมองเห็นในกระเป๋าหรือเสนอค่าธรรมเนียมสูงกว่า
Q3สถานะ “ถูกนำออก” หมายความว่าธุรกรรมถูกยกเลิกแล้วหรือไม่?
ไม่จำเป็น อาจหมายถึงกระเป๋า เครื่องมือสำรวจ หรือโหนดแห่งหนึ่งไม่เห็นธุรกรรมนั้นอีกต่อไป ตรวจแฮชธุรกรรมและ nonce ล่าสุดของบัญชีบนเครือข่ายที่ถูกต้องก่อนถือว่า nonce นั้นว่าง
แหล่งข้อมูลและการอ่านเพิ่มเติม
รายงานปัญหา
เราจะเตรียมอีเมลพร้อมลิงก์บทความนี้ Mark จะได้รับรายงานเมื่อคุณส่งอีเมลแล้วเท่านั้น
ตรวจสอบอย่างรวดเร็ว
อ่านคู่มือจบแล้ว ลองตอบคำถาม 3 ข้อ
คำถาม 01
บัญชีหนึ่งมีธุรกรรม nonce 41 ที่ยังไม่คลี่คลายและอีกธุรกรรม nonce 42 ธุรกรรมที่สองทำอะไรได้?
เลือกคำตอบเพื่อดูคำอธิบาย
อภิธานศัพท์ออปชัน
A call or put whose strike is near the underlying price; it has little intrinsic value and often substantial sensitivity to time and volatility.
อ่านคู่มือฉบับละเอียดCall optionA contract that gives its holder the right, but not the obligation, to buy the underlying at the strike before or at expiration under the contract terms.
อ่านคู่มือฉบับละเอียด