Tôi nghĩ rằng chúng ta thường đặt câu hỏi sai khi một giao dịch Dusk “bị lỗi” (fails).
Chỉ việc nhận mã 202 Accepted nghĩa là node đã chấp nhận yêu cầu để định tuyến. Điều đó không có nghĩa là giao dịch đã nằm trong mempool hay đã xuất hiện trong một block. Một ví dụ tôi thấy thú vị là nonce trong tương lai. Nếu một giao dịch Moonlight đến với nonce trong tương lai trong khi nonce trước đó vẫn còn thiếu, Dusk có thể giữ nó nằm ngoài mempool thực tế và chờ khoảng trống nonce được khép lại thay vì từ chối ngay lập tức. Khi đó, nó sẽ ở trạng thái bị trì hoãn (deferred).
Chỉ là một phần của câu chuyện. Khi một giao dịch đã vượt qua bước nhận (admission), nó sẽ đi vào mempool cục bộ của node đó. Các node khác vẫn duy trì mempool riêng của họ và chạy các kiểm tra admission của chính họ. Sau đó, một giao dịch có thể được chọn để đưa vào một block, được thực thi, và cuối cùng được hoàn tất (finalized). Nó cũng có thể rời khỏi mempool cục bộ mà không đồng nghĩa tự động rằng giao dịch đã thất bại. Việc hết hạn (expiry), thay thế (replacement), giới hạn dung lượng (capacity limits) và xung đột (conflicts) đều có thể dẫn đến việc loại bỏ.
Đây là nơi tôi cho rằng sự khác biệt quan trọng đối với ví và sàn giao dịch. Hướng dẫn tích hợp của chính Dusk nói rằng cần giữ nguyên chính xác giao dịch đã ký (exact signed transaction), coi 202 Accepted chỉ là định tuyến thành công, và phát lại (re-broadcast) chính những byte đã ký đó sau khi hết thời gian chờ (transport timeout) thay vì tạo một giao dịch mới một cách mù quáng. Việc rút tiền chỉ nên được đánh dấu là hoàn tất sau khi đã kiểm tra việc thực thi (execution) và sau khi block đã được final hóa.
Càng xem xét, tôi càng thấy cụm “transaction submitted” (giao dịch đã được gửi) nghe không còn là một trạng thái hữu ích nếu đứng một mình. Một giao dịch có thể đang chờ nonce, đang nằm trong mempool của một node nào đó, đã được thực thi nhưng gặp lỗi, hoặc đang nằm trong một block chưa final. Đó là những tình huống rất khác nhau, dù từ bên ngoài chúng đều có thể trông như “vẫn đang chờ” (pending).
Với tôi, đó là thông điệp rút ra hữu ích từ luồng giao dịch của Dusk: “submitted” chỉ là điểm bắt đầu. Điều quan trọng là trạng thái mà bạn có thể thực sự chứng minh rằng giao dịch đã đạt được.
$DUSK @Dusk #dusk
Chỉ việc nhận mã 202 Accepted nghĩa là node đã chấp nhận yêu cầu để định tuyến. Điều đó không có nghĩa là giao dịch đã nằm trong mempool hay đã xuất hiện trong một block. Một ví dụ tôi thấy thú vị là nonce trong tương lai. Nếu một giao dịch Moonlight đến với nonce trong tương lai trong khi nonce trước đó vẫn còn thiếu, Dusk có thể giữ nó nằm ngoài mempool thực tế và chờ khoảng trống nonce được khép lại thay vì từ chối ngay lập tức. Khi đó, nó sẽ ở trạng thái bị trì hoãn (deferred).
Chỉ là một phần của câu chuyện. Khi một giao dịch đã vượt qua bước nhận (admission), nó sẽ đi vào mempool cục bộ của node đó. Các node khác vẫn duy trì mempool riêng của họ và chạy các kiểm tra admission của chính họ. Sau đó, một giao dịch có thể được chọn để đưa vào một block, được thực thi, và cuối cùng được hoàn tất (finalized). Nó cũng có thể rời khỏi mempool cục bộ mà không đồng nghĩa tự động rằng giao dịch đã thất bại. Việc hết hạn (expiry), thay thế (replacement), giới hạn dung lượng (capacity limits) và xung đột (conflicts) đều có thể dẫn đến việc loại bỏ.
Đây là nơi tôi cho rằng sự khác biệt quan trọng đối với ví và sàn giao dịch. Hướng dẫn tích hợp của chính Dusk nói rằng cần giữ nguyên chính xác giao dịch đã ký (exact signed transaction), coi 202 Accepted chỉ là định tuyến thành công, và phát lại (re-broadcast) chính những byte đã ký đó sau khi hết thời gian chờ (transport timeout) thay vì tạo một giao dịch mới một cách mù quáng. Việc rút tiền chỉ nên được đánh dấu là hoàn tất sau khi đã kiểm tra việc thực thi (execution) và sau khi block đã được final hóa.
Càng xem xét, tôi càng thấy cụm “transaction submitted” (giao dịch đã được gửi) nghe không còn là một trạng thái hữu ích nếu đứng một mình. Một giao dịch có thể đang chờ nonce, đang nằm trong mempool của một node nào đó, đã được thực thi nhưng gặp lỗi, hoặc đang nằm trong một block chưa final. Đó là những tình huống rất khác nhau, dù từ bên ngoài chúng đều có thể trông như “vẫn đang chờ” (pending).
Với tôi, đó là thông điệp rút ra hữu ích từ luồng giao dịch của Dusk: “submitted” chỉ là điểm bắt đầu. Điều quan trọng là trạng thái mà bạn có thể thực sự chứng minh rằng giao dịch đã đạt được.
$DUSK @Dusk #dusk
