Skip to content
Tất cả hướng dẫn quyền chọn
Giao dịch Ethereum đang chờ11 phút đọc

Giải thích giao dịch Ethereum đang chờ: nonce, thay thế và hủy

Tìm hiểu vì sao giao dịch Ethereum phải chờ, nonce sắp xếp giao dịch của tài khoản như thế nào và các nút tăng tốc hoặc hủy trong ví có thể làm gì, không thể làm gì.

Trong hướng dẫn nàyNhãn “đang chờ” cho biết giao dịch chưa được đưa vào khối

Tóm tắt ngắn

Giao dịch Ethereum từ một tài khoản do bên ngoài kiểm soát thông thường (EOA) sử dụng nonce tuần tự. Giao dịch có nonce sau không thể thực thi khi nonce trước của cùng tài khoản chưa được dùng. Nút tăng tốc hoặc hủy trong ví thường tạo một giao dịch cạnh tranh có cùng nonce; đó không phải lời hứa giao dịch sẽ được đưa vào khối, và giao dịch đã xác nhận không thể hoàn tác.

Nhãn “đang chờ” cho biết giao dịch chưa được đưa vào khối

Sau khi bạn ký một giao dịch Ethereum, ví có thể gửi giao dịch đến máy khách thực thi hoặc dịch vụ giao dịch. Các nút chấp nhận giao dịch có thể chuyển tiếp giao dịch cho các nút ngang hàng, rồi một người đề xuất khối có thể đưa giao dịch vào một khối sau đó. Trước khi được đưa vào khối, giao dịch chưa làm thay đổi trạng thái chuỗi chính tắc. Trạng thái “đang chờ” trong ví hoặc trình khám phá thường có nghĩa là dịch vụ biết giao dịch tồn tại nhưng chưa thấy giao dịch trong khối; nó không cho biết có một hàng đợi mạng duy nhất. Hướng dẫn giao dịch của Ethereum.org mô tả quá trình từ ký và phát tán đến khi giao dịch được đưa vào khối.

Giao dịch có thể phải chờ vì nhiều lý do. Mức trần phí có thể không đáp ứng điều kiện đưa vào khối, một giao dịch trước đó từ cùng tài khoản có thể chưa được giải quyết, một nút có thể chưa nhận được giao dịch, hoặc ví có thể đang hiển thị thông tin cũ hay riêng theo nhà cung cấp. Mỗi nguyên nhân cần cách kiểm tra khác nhau. Tăng phí không khắc phục việc chọn sai mạng, còn gửi một khoản thanh toán khác khi chưa kiểm tra giao dịch đầu tiên có thể khiến bạn trả tiền hai lần.

“Đang chờ” cũng khác với “đã xác nhận”, “đã hoàn tất” hoặc “thất bại”. Hash giao dịch có thể hiển thị trước khi có biên nhận; biên nhận xuất hiện sau khi giao dịch được đưa vào khối. Sau đó, các khối Ethereum trải qua những trạng thái đồng thuận. Ví và trình khám phá có thể dùng các nhãn này khác nhau, vì vậy hãy kiểm tra hash giao dịch, khối, biên nhận và trạng thái chuỗi hiện tại thay vì chỉ dựa vào một nhãn ngắn.

Nonce là số thứ tự giao dịch của một tài khoản

Một tài khoản Ethereum do bên ngoài kiểm soát thông thường (EOA) có nonce để sắp xếp các giao dịch. Nonce là bộ đếm, không phải phí, dấu thời gian hay hash giao dịch duy nhất. Với mỗi tài khoản, chuỗi chỉ chấp nhận giao dịch dùng nonce tiếp theo mà trạng thái tài khoản đang chờ. Trên chuỗi chính tắc, cùng một tài khoản không thể thực thi hai giao dịch có cùng nonce. Tài liệu tài khoản của Ethereum.org mô tả nonce là bộ đếm giao dịch và cơ chế chống phát lại của tài khoản.

Giả sử nonce chưa dùng tiếp theo của một tài khoản là 41. Giao dịch hợp lệ tiếp theo dùng nonce 41; sau khi giao dịch đó được đưa vào khối và áp dụng, giao dịch kế tiếp dùng nonce 42. Nonce gắn với tài khoản gửi, không phải địa chỉ nhận. Hai tài khoản khác nhau có thể đồng thời có giao dịch mang số 41 vì mỗi tài khoản có chuỗi riêng.

Bạn có thể ký giao dịch với nonce cao hơn nonce hiện tại trên chuỗi của tài khoản, nhưng khi được thực thi, giao dịch không thể bỏ qua thứ tự. Nonce trước còn thiếu phải được dùng trước. Giao dịch có nonce mà tài khoản đã dùng là giao dịch cũ và không thể thực thi như một giao dịch mới. Quy tắc này giúp mạng xử lý giao dịch của từng tài khoản theo thứ tự ngay cả khi giao dịch được phát tán vào những thời điểm khác nhau hoặc đến từ các nút khác nhau.

Quy tắc nonce áp dụng cho giao dịch EOA thông thường trên lớp thực thi Ethereum. Nó không mô tả mọi dạng trừu tượng hóa ví, bộ sắp xếp của rollup hay mọi chuỗi. Hệ thống tài khoản thông minh có thể bổ sung quy tắc nonce và thao tác riêng; nội dung này sẽ được đề cập ở phần sau.

“Đang chờ” và “xếp hàng” là nhãn cục bộ của nhóm giao dịch

Ethereum không có một phòng chờ được đồng bộ duy nhất mà mọi ví, nút, trình khám phá khối và người đề xuất đều nhìn thấy giống hệt nhau. Mỗi máy khách thực thi giữ một nhóm giao dịch cục bộ gồm những giao dịch đã nhận và được xem là đủ điều kiện theo giới hạn, chính sách riêng. Một giao dịch có thể nằm trong nhóm của nút này nhưng không có ở nút khác. Tài liệu RPC txpool của Geth cho thấy các nhóm pending và queued cục bộ của máy khách đó, đồng thời ghi nhận rằng nhiều giao dịch có thể gắn với cùng một người gửi và nonce.

Theo thuật ngữ của Geth, pending thường chỉ các giao dịch có thể được xử lý theo thứ tự nonce bắt đầu từ trạng thái hiện tại của tài khoản; queued có thể gồm các giao dịch nonce trong tương lai đang chờ khoảng trống được lấp. Đây là tên gọi trong giao diện máy khách, không phải trạng thái đồng thuận mà mọi phần mềm Ethereum đều phải hiển thị. Ví có thể gọi toàn bộ danh sách chưa xác nhận là “đang chờ”, trong khi trình khám phá chỉ hiển thị giao dịch mà nhà cung cấp dữ liệu của họ đã quan sát được.

Ví dụ, nếu một nút biết giao dịch có nonce 41 và một giao dịch khác có nonce 43, nút đó không thể thực thi 43 trước 42. Nút có thể giữ 43 trong hàng đợi đến khi nhận được 42 hoặc trạng thái tài khoản tiến lên theo cách khác. Một nút khác chưa từng nhận 43 sẽ không hiển thị giao dịch đó. Vì vậy, hai trình khám phá có thể bất đồng về việc giao dịch đang chờ hay không tìm thấy, nhưng không màn hình nào chứng minh được mọi trình xác thực đã nhìn thấy gì.

Một số máy khách cũng cho phép có nhiều ứng viên giao dịch chưa xác nhận cho cùng người gửi và nonce. Chúng là các lựa chọn cạnh tranh cùng một vị trí trong chuỗi, chứ không phải hai giao dịch có thể lần lượt được áp dụng. Dung lượng nhóm, thời gian lưu giao dịch và quy tắc thay thế là chính sách triển khai, có thể thay đổi giữa các phiên bản phần mềm. Chẳng hạn, tùy chọn nhóm giao dịch có thể cấu hình của Geth gồm ngưỡng tăng giá riêng cho máy khách; không nên coi ngưỡng đó là quy tắc phí chung của Ethereum. Phạm vi của các tùy chọn này được nêu trong tài liệu dòng lệnh của Geth.

Một nonce chưa được giải quyết có thể chặn các giao dịch sau

Hãy hình dung nonce tiếp theo trên chuỗi của tài khoản là 41. Bạn phát tán giao dịch A với nonce 41 rồi giao dịch B với nonce 42. Nếu A vẫn chưa được giải quyết, B không thể được áp dụng trước. B có thể nằm trong hàng đợi cục bộ, chỉ hiện trạng thái đang chờ trong ví, hoặc không xuất hiện trong trình khám phá chưa nhận được giao dịch. Mối quan hệ quan trọng là thứ tự nonce, không phải thứ tự ví tạo hay hiển thị hai giao dịch.

Nếu A cuối cùng được đưa vào khối, nonce của tài khoản chuyển sang 42 và B có thể đủ điều kiện, tùy vào tính hợp lệ, điều kiện phí và chính sách nhóm riêng của nó. Nếu A được thay bằng một giao dịch hợp lệ khác dùng nonce 41, giao dịch thay thế sẽ chiếm cùng vị trí trong chuỗi nếu nó là giao dịch được đưa vào khối. Nếu một giao dịch khác của tài khoản đã dùng nonce 41, ứng viên cũ mang số 41 sẽ lỗi thời và không thể thực thi sau đó.

Đó là lý do gửi giao dịch mới với nonce cao hơn không phải cách chung để gỡ một giao dịch bị kẹt. Cách này chỉ thêm một giao dịch khác phía sau khoảng trống. Hủy B cũng không giải quyết A nếu B vốn đã là giao dịch đến sau. Hãy bắt đầu từ nonce chưa được giải quyết sớm nhất của tài khoản và xác minh trạng thái trước khi thay đổi điều gì.

Khoảng trống có thể chỉ tồn tại tạm thời hoặc kéo dài. Giao dịch trước đó có thể chưa đến nút bạn đang kiểm tra, có mức phí không hấp dẫn hoặc không đủ trong điều kiện hiện tại, hoặc đã bị xóa khỏi nhóm của một nút. Ví cũng có thể hiển thị giao dịch xếp hàng được tạo trên thiết bị khác. Chỉ nhìn màn hình không thể biết nguyên nhân nào xảy ra; hãy đối chiếu nonce đã xác nhận của tài khoản, hash giao dịch và nhiều nguồn đáng tin cậy.

Sơ đồ tài khoản với hai ứng viên giao dịch cạnh tranh cùng một vị trí nonce trước chuỗi giao dịch kế tiếp
Hình minh họa biểu diễn thứ tự nonce của tài khoản và các giao dịch cạnh tranh cùng một vị trí, không thể hiện thời gian xác nhận

Cài đặt phí ảnh hưởng khả năng đưa vào khối nhưng không đổi thứ tự nonce

Thứ tự nonce và điều kiện phí là hai ràng buộc riêng. Giao dịch dùng nonce tiếp theo chính xác vẫn có thể phải chờ nếu thông số phí không đáp ứng điều kiện của khối. Giao dịch có nonce cao hơn không thể vượt lên chỉ bằng cách đưa ra tiền boa cao hơn. Tăng phí cho nonce 42 không làm nonce 41 biến mất.

Với giao dịch EIP-1559 tiêu chuẩn, mức phí tối đa phải đủ trả base fee của khối đưa giao dịch vào, còn priority fee có thể ảnh hưởng đến lựa chọn của người đề xuất khối. Cả base fee và không gian khối còn trống đều có thể thay đổi trong lúc giao dịch chờ. Mức phí tối đa là giới hạn trên; tăng giới hạn không đảm bảo thời gian xác nhận cụ thể. Hướng dẫn phí gas Ethereum giải thích các trường này và cách xác định phí thực tế.

Nút hoặc ví có thể áp dụng thêm quy tắc chuyển tiếp hay thay thế. Các chính sách đó xác định dịch vụ cụ thể sẵn sàng nhận hoặc chuyển tiếp giao dịch nào; không phải tất cả đều là quy tắc đồng thuận. Chẳng hạn, Geth có ngưỡng tăng giá cấu hình được để thay giao dịch đang chờ trong nhóm của chính nó. Máy khách, nhà cung cấp, ví hoặc phiên bản phần mềm khác có thể hoạt động khác. Đừng dựa vào một tỷ lệ phần trăm mình nhớ hoặc thời gian chờ cố định như một bảo đảm toàn mạng.

Nếu giao dịch chờ vì nonce thấp hơn chưa được giải quyết, trước tiên hãy xác định giao dịch đang giữ nonce đó. Nếu giao dịch chờ vì mức phí tối đa không đáp ứng base fee hiện tại, hãy hiểu các trường phí trước khi thay đổi chúng. Hướng dẫn phí Ethereum phù hợp để tính phí; bài viết này tập trung vào vấn đề thứ tự riêng biệt.

Tăng tốc gửi một ứng viên thay thế có cùng nonce

Tính năng “tăng tốc” của ví thường tạo giao dịch mới từ cùng tài khoản, dùng cùng nonce nhưng điều chỉnh thông số phí. Hai ứng viên xung đột vì tài khoản chỉ có thể thực thi một giao dịch cho nonce đó. Nếu các nhóm giao dịch liên quan chấp nhận ứng viên thay thế và đưa nó vào khối, ứng viên mới có thể chiếm vị trí nonce; giao dịch ban đầu không thể đồng thời thực thi trên chuỗi chính tắc. Hướng dẫn giao dịch đang chờ của MetaMask mô tả tính năng tăng tốc của họ là gửi lại cùng nonce với phí cao hơn.

Giao dịch thay thế có thể giữ nguyên người nhận và hành động ban đầu nhưng đổi các trường phí; hãy xem màn hình ký thay vì mặc định rằng điều đó sẽ xảy ra. Cách triển khai ví có thể hiển thị trường khác hoặc đặt tên tính năng khác. Trước khi ký giao dịch thay thế, hãy xác nhận tài khoản gửi, nonce, địa chỉ đích, giá trị và dữ liệu hợp đồng. Nếu giao dịch thay thế đổi nội dung cần thực hiện thì đó không chỉ là điều chỉnh phí vô hại.

Không có bảo đảm giao dịch thay thế sẽ được mọi nơi chấp nhận hoặc được đưa vào khối nhanh chóng. Giao dịch ban đầu có thể đã được đưa vào khối; một nút có thể từ chối giao dịch thay thế theo chính sách của nó; ứng viên mới vẫn có thể không hấp dẫn người đề xuất; hoặc dịch vụ có thể không chuyển tiếp nó đến những nút bạn đang theo dõi. Nếu giao dịch ban đầu đã xác nhận, gửi giao dịch khác với nonce đã dùng không thể đảo ngược nó và thường sẽ bị từ chối là nonce cũ.

Ở đây, “thay thế” nghĩa là một giao dịch cạnh tranh từ cùng tài khoản và nonce. Đừng áp dụng thủ tục RBF hoặc CPFP của Bitcoin cho Ethereum. Bitcoin dùng mô hình giao dịch khác, nên các cách tăng phí đó không phải chỉ dẫn cho tài khoản Ethereum.

Hủy là nỗ lực giành cùng vị trí nonce

Sau khi giao dịch Ethereum đã ký được phát tán, không có lệnh hoàn tác ở cấp giao thức nào thu hồi nó khỏi mọi nút. Một số ví có chức năng hủy khi giao dịch vẫn chưa xác nhận. Chức năng này thường cố gắng phát một giao dịch khác từ cùng tài khoản và cùng nonce; một cách phổ biến ở một số ví là gửi giao dịch giá trị 0 đến chính địa chỉ của người gửi. Nếu ứng viên hủy được chấp nhận và đưa vào khối trước giao dịch ban đầu, nó sẽ dùng nonce đó và khiến ứng viên ban đầu không thể thực thi sau này. Cách tạo giao dịch và tính khả dụng cụ thể tùy thuộc vào ví.

Giao dịch ban đầu và ứng viên hủy có thể chạy đua. Nếu giao dịch ban đầu được đưa vào khối trước, giao dịch hủy gửi sau đó không thể hoàn tác tác động của nó. Nếu không ứng viên nào được chấp nhận hoặc đưa vào khối, nonce có thể vẫn chưa được giải quyết. Nhấn nút hoặc thấy thông báo thành công trong ví không chứng minh ứng viên hủy đã thắng. Hãy kiểm tra hash giao dịch mới và trạng thái chuỗi chính tắc. Hướng dẫn MetaMask giới hạn việc thử hủy ở giao dịch còn đang chờ và giải thích rằng giao dịch đã xác nhận không thể bị hủy.

Trước khi ký giao dịch hủy, hãy kiểm tra nó dùng cùng tài khoản và nonce với giao dịch bạn muốn loại bỏ, đồng thời xem mọi trường ví hiển thị. Nếu được đưa vào khối, giao dịch này có thể cần thêm phí mạng. Ứng viên hủy cũng có thể phải chờ hoặc không thay được giao dịch ban đầu do chính sách của nhóm liên quan. Từ “đã hủy” trong ví không chứng minh giao thức đã hoàn tác giao dịch; chỉ kết luận sau khi xác minh giao dịch nào đã dùng nonce.

Nếu giao dịch đã thực hiện phê duyệt token, gọi hợp đồng hoặc chuyển tài sản, hủy một giao dịch về sau không thể đảo ngược thay đổi trạng thái đã hoàn tất. Một số thao tác hợp đồng có phương thức tiếp theo riêng, nhưng khả năng và hậu quả phụ thuộc vào hợp đồng. Đừng ký giao dịch lạ chỉ vì giao diện gọi đó là hủy.

Đã đưa vào khối, bị hoàn tác, bị loại và không tìm thấy là những quan sát khác nhau

Giao dịch được đưa vào khối có khối và biên nhận. Nếu thành công, thay đổi trạng thái dự định có thể đã được áp dụng. Nếu quá trình thực thi EVM revert, các thay đổi trạng thái của lần thực thi đó bị hoàn tác, nhưng giao dịch vẫn dùng nonce của tài khoản và có thể vẫn tốn gas. Hãy dùng biên nhận và trạng thái thực thi thay vì suy ra kết quả từ thông báo của ví. Sự khác nhau giữa việc đưa vào khối và kết quả thực thi được giải thích trong hướng dẫn giao dịch Ethereum.org và hướng dẫn gas.

Nhãn “bị loại” hoặc “không tìm thấy” thường là báo cáo của một ví, trình khám phá, nhà cung cấp RPC hoặc nhóm cục bộ. Chỉ riêng nhãn đó không chứng minh giao thức đã hủy giao dịch hoặc nonce đã trống. Một nút khác có thể vẫn biết giao dịch; ví có thể phát lại giao dịch đã ký; hoặc một khối sau đó có thể cho thấy nonce tài khoản đã tiến lên. Ngược lại, giao dịch cũ có thể vắng mặt trong các nơi bạn kiểm tra trong khi nonce đã xác nhận của tài khoản vẫn không đổi.

Nếu không tìm thấy hash giao dịch, hãy kiểm tra bạn đã chọn đúng chuỗi và tài khoản tạo giao dịch. So sánh nonce mới nhất trên chuỗi của tài khoản với nonce giao dịch và xem các giao dịch gần đây từ người gửi đó. Phản hồi nonce too low là dấu hiệu endpoint đang xem có thể cho rằng nonce đã được dùng, không phải lý do để lặp lại yêu cầu tương tự. Hãy xác minh giao dịch nào đã dùng nonce và khối đó còn thuộc chuỗi chính tắc hay không.

Giao dịch đã đưa vào khối cũng có thể chịu ảnh hưởng của một đợt tái tổ chức chuỗi ngắn trước khi chuỗi ổn định. Ví và trình khám phá có thể cập nhật nhãn khi góc nhìn của chúng thay đổi. Với giao dịch quan trọng, hãy đợi theo chính sách xác nhận của dịch vụ nhận và, khi phù hợp, chờ trạng thái hoàn tất mạnh hơn của đồng thuận. “Đã thấy trong một khối” không đồng nghĩa với “không thể đảo ngược trong mọi trường hợp”.

Xác định nonce chưa được giải quyết sớm nhất trước khi hành động

Trước tiên xác nhận đúng chuỗi, tài khoản gửi và hash giao dịch. Tra hash đó trên một trình khám phá đáng tin cậy dành cho đúng mạng. Kiểm tra giao dịch có biên nhận chưa, dùng nonce nào, thực thi thành công không và tài khoản có giao dịch nào về sau chưa. Đừng tiết lộ hoặc nhập cụm từ khôi phục để kiểm tra giao dịch; địa chỉ công khai và hash giao dịch là đủ để tra cứu dữ liệu chuỗi công khai.

Nếu không thấy hash, hãy so sánh nonce đã xác nhận mới nhất của tài khoản với nonce ví hiển thị. Nhà phát triển hoặc người vận hành nút có thể truy vấn eth_getTransactionCount bằng thẻ khối latest và pending. Tài liệu tham khảo JSON-RPC của Ethereum.org định nghĩa latest là trạng thái khối mới nhất, còn pending là trạng thái đang chờ. Kết quả pending vẫn chỉ phản ánh góc nhìn của endpoint RPC đó; hai nhà cung cấp có thể trả về giá trị khác nhau. Hầu hết người dùng có thể tìm được manh mối ban đầu tương tự từ hoạt động tài khoản trong ví và một trình khám phá uy tín mà không cần chạy lệnh.

Tiếp theo, bắt đầu từ nonce thấp nhất chưa được dùng. Nếu giao dịch ban đầu vẫn hiển thị và ví hỗ trợ thay thế, hãy xem chính xác các trường và cài đặt phí của giao dịch thay thế trước khi ký. Nếu không thấy giao dịch ban đầu, hãy hỏi ví hoặc nhà cung cấp RPC cách họ xử lý việc phát lại và thay thế, thay vì cho rằng giao dịch đã biến mất khỏi mạng. Nếu nonce đã được dùng, hãy xác định giao dịch được đưa vào khối trước khi làm gì khác. Tránh liên tục gửi các giao dịch nonce về sau; việc đó có thể kéo dài hàng đợi mà không giải quyết khoảng trống đầu tiên.

Các bước này dành cho giao dịch thông thường của tài khoản Ethereum do bên ngoài kiểm soát. Hệ thống trừu tượng hóa tài khoản có thể gửi UserOperation qua bundler, còn tài khoản thông minh có thể dùng khóa nonce và chuỗi phức tạp hơn một bộ đếm đơn giản. EIP-4337 định nghĩa cấu trúc nonce cho các thao tác đó, nên ví sử dụng trừu tượng hóa tài khoản có thể không hoạt động giống ví dụ EOA trong bài. Để kiểm tra mạng đích, địa chỉ và trạng thái chuyển, hãy xem tiếp danh sách kiểm tra chuyển tiền mã hóa.

Câu hỏi thường gặp

Q1Tôi có thể hủy giao dịch Ethereum sau khi đã xác nhận không?

Không. Khi giao dịch chưa được xác nhận, ví có thể thử thay thế bằng giao dịch cùng nonce, nhưng không thể hoàn tác giao dịch đã được đưa vào khối và thực thi. Hãy xác minh hash giao dịch và trạng thái chuỗi trước khi hành động.

Q2Vì sao giao dịch Ethereum tiếp theo của tôi cũng phải chờ?

Giao dịch EOA thông thường được thực thi theo thứ tự nonce. Nếu nonce trước vẫn chưa được giải quyết, nonce sau không thể được thực thi trước dù giao dịch hiển thị trong ví hoặc đưa ra mức phí cao hơn.

Q3“Bị loại” có nghĩa là giao dịch của tôi đã bị hủy không?

Không nhất thiết. Có thể một ví, trình khám phá hoặc nút không còn nhìn thấy giao dịch đó. Trước khi coi nonce là còn trống, hãy kiểm tra hash giao dịch và nonce mới nhất của tài khoản trên đúng mạng.

Nguồn và tài liệu đọc thêm

Báo lỗi

Chúng tôi sẽ soạn email kèm liên kết bài viết này. Mark chỉ nhận được báo cáo sau khi bạn gửi email

Kiểm tra nhanh

Đọc xong hướng dẫn? Hãy kiểm tra với 3 câu hỏi

Câu hỏi 1 / 3

Câu hỏi 01

Một tài khoản có giao dịch nonce 41 chưa được giải quyết và một giao dịch nonce 42. Giao dịch thứ hai có thể làm gì?

Chọn một đáp án để xem giải thích

Bảng thuật ngữ quyền chọn