Bạn có biết rằng trên XRP Ledger, một giao dịch có thể ghi nhận thành công trong khi số tiền thực nhận lại nhỏ hơn số tiền hiển thị trên lệnh? Nghe vô lý đúng không. Nhưng đây không phải lỗi. Đây là một thiết kế có chủ đích, tồn tại gần như suốt vòng đời của giao thức. Và chính sự hiểu lầm xung quanh nó mới là thứ nguy hiểm thật sự.
Trong những ngày thị trường giảm, tôi nhận được không ít tin nhắn từ các nhà đầu tư lo lắng về tính an toàn của tài sản trên các blockchain khác nhau. Nỗi sợ bị "nuốt" tiền luôn trực tràng. Nhưng ít ai ngờ rằng một trong những rủi ro tinh vi nhất không nằm ở mã độc hay hack, mà nằm ngay trong một trường dữ liệu mà hầu hết mọi người không bao giờ kiểm tra: delivered_amount.
Câu chuyện bắt đầu từ một thuật ngữ: Partial Payments. Trên XRP Ledger, đây là một flag đặc biệt được gắn vào lệnh chuyển tiền. Khi flag này được bật, giao dịch vẫn có thể hoàn tất ngay cả khi số tiền thực tế giao cho người nhận ít hơn số tiền được khai báo trong trường amount. Nói cách khác, bạn có thể gửi một lệnh chuyển 100 XRP, nhưng người nhận chỉ nhận được 80 XRP — và hệ thống vẫn coi đó là một giao dịch hợp lệ, thành công.
Nghe như một lỗ hổng bảo mật, phải không? Đó chính xác là lý do vì sao bài viết gốc phải lên tiếng khẳng định: đây không phải bug. Có lẽ bạn sẽ ngạc nhiên, nhưng sau 25 năm quan sát thị trường, tôi học được rằng trong crypto, thứ trông giống lỗi thường không phải lỗi. Nó thường là một tính năng mà ai đó đã thiết kế cho một mục đích rất cụ thể, và chỉ trở thành vấn đề khi bị tích hợp sai cách.
Hãy cùng tôi đi sâu vào bên trong cơ chế này, xem vì sao nó tồn tại, vì sao nó bị gọi là bug, và vì sao việc hiểu đúng bản chất của nó lại quyết định bạn có an toàn hay không.
Bối cảnh: Vì sao XRP Ledger lại có một thứ nghe "phi lý" như vậy?
Để hiểu Partial Payments, bạn cần hiểu một chút về bản chất của XRP Ledger. Đây là một blockchain được thiết kế từ đầu cho thanh toán, không phải cho hợp đồng thông minh phức tạp. Một trong những thế mạnh lớn nhất của XRPL là khả năng thực hiện path finding — tức là tìm đường đi cho thanh toán xuyên qua nhiều loại tài sản khác nhau. Bạn có thể gửi một khoản thanh toán bằng USD (phát hành trên XRPL) nhưng người nhận lại muốn nhận bằng EUR, cũng phát hành trên XRPL. Giao thức sẽ tự động tìm một chuỗi các bước trung gian, thường là đi qua XRP như một loại tiền cầu, để hoàn tất giao dịch.

Vấn đề phát sinh khi thanh khoản ở một trong các bước trung gian không đủ. Trong mô hình thanh toán truyền thống, điều này đồng nghĩa với việc giao dịch thất bại. Nhưng nhóm phát triển XRPL nghĩ khác. Họ thiết kế một cơ chế cho phép giao dịch vẫn diễn ra với số tiền thực tế thấp hơn mục tiêu, miễn là người gửi đã chủ động bật flag cho phép điều đó. Đây là một lựa chọn thiết kế nhằm tăng tỷ lệ thành công của thanh toán trong điều kiện thị trường biến động, khi tỷ giá hối đoái thay đổi giữa lúc lệnh được tạo và lúc lệnh được thực thi.
Thực tế, khái niệm này không hề xa lạ. Trong tài chính truyền thống, các lệnh "partial fill" (khớp một phần) là chuyện hết sức bình thường. Bạn đặt lệnh mua 1.000 cổ phiếu nhưng chỉ có 800 cổ phiếu được khớp. Giao dịch vẫn thành công, bạn vẫn sở hữu 800 cổ phiếu. Nhưng trong thế giới tiền mã hóa, nơi mà mọi thứ được kỳ vọng là chính xác tuyệt đối, một giao dịch "chuyển 100 mà nhận 80" bị coi là một hành vi bất thường, thậm chí là gian lận.
Tôi nhớ lại năm 2017, khi tôi 32 tuổi và đang theo dõi cơn sốt ICO. Tôi đã phát hiện ra những lỗ hổng thanh khoản trong mô hình của Bancor — một nền tảng huy động được 150 triệu USD nhưng cơ chế dự trữ token của nó có vấn đề nghiêm trọng. Khi tôi trình bày phát hiện này với các đồng nghiệp nam, họ gạt đi và nói rằng phụ nữ không hiểu công nghệ. Tôi đã viết một báo cáo trên Medium, và nó dự đoán chính xác sự sụp đổ của Bancor.
Bài học tôi rút ra từ đó: trong crypto, những gì được gọi là "bug" thường là tín hiệu của một thiết kế sâu hơn, và việc hiểu sai thiết kế đó có thể khiến bạn mất tiền theo cách mà không ai có thể đổ lỗi cho hacker.
Cốt lõi: Phân tích kỹ thuật Partial Payments dưới góc nhìn của một nhà phân tích đầu tư
Khi tôi nói với các quỹ đầu tư rằng tôi dành thời gian phân tích một flag thanh toán của XRP Ledger, họ thường nhướng mày. Nhưng chính những chi tiết tưởng chừng nhỏ nhặt này lại là nơi ẩn chứa rủi ro lớn nhất.
Hãy tưởng tượng bạn là một sàn giao dịch. Người dùng gửi yêu cầu rút 100 XRP. Sàn nhận được lệnh từ XRP Ledger, ghi nhận trường amount có giá trị 100. Nhưng nếu giao dịch đó là một Partial Payment, số XRP thực tế được gửi đến ví của người dùng có thể chỉ là 80. Nếu sàn giao dịch chỉ dựa vào trường amount để cập nhật số dư cho người dùng, nó sẽ ghi có 100 XRP trong khi thực tế chỉ nhận 80. Kết quả: sàn mất 20 XRP cho mỗi giao dịch như vậy.
Đây không phải là một kịch bản giả định. Trên thực tế, đã có những nỗ lực khai thác chính đặc tính này để đánh lừa các hệ thống thanh toán tự động. Kẻ tấn công có thể gửi một khoản thanh toán một phần đến một địa chỉ do dịch vụ kiểm soát, khiến dịch vụ tin rằng toàn bộ số tiền đã được nhận. Nếu dịch vụ đó cung cấp hàng hóa hoặc dịch vụ dựa trên số tiền hiển thị trong trường amount, kẻ tấn công sẽ nhận được nhiều giá trị hơn số tiền thực sự bỏ ra.
Chìa khóa để tránh thảm họa này chính là trường delivered_amount. Đây là trường dữ liệu do XRP Ledger trả về, cho biết chính xác số tiền thực tế được giao trong giao dịch. Bất kỳ hệ thống thanh toán nào tích hợp với XRPL đều phải đọc trường này, thay vì trường amount, khi xử lý các giao dịch đến. Nhưng đáng buồn thay, không phải ai cũng làm vậy.
Quan điểm của tôi, dựa trên kinh nghiệm kiểm toán các giao thức mà tôi đã làm trong suốt sự nghiệp, là: rủi ro của Partial Payments không nằm ở giao thức, mà nằm ở lớp tích hợp. Chính sự lười biếng hoặc thiếu hiểu biết của các nhà phát triển ví, sàn giao dịch và cổng thanh toán mới là nguyên nhân gây ra tổn thất thực tế.
Trong mùa hè DeFi năm 2020, tôi đã lao vào nghiên cứu Yearn Finance và chứng kiến hàng loạt giao thức bị khai thác không phải vì mã nguồn lỗi, mà vì các ứng dụng phía trên giao thức hiểu sai cách hoạt động của giao thức. Tôi gọi đó là "lỗi của lớp sương mù" — lớp giữa người dùng và giao thức, nơi thông tin bị bóp méo và hiểu lầm dẫn đến tổn thất.
Rủi ro thứ hai của Partial Payments nằm ở chính sự khẳng định "không phải bug". Khi một bài viết tuyên bố điều đó, nó có thể khiến những người mới tham gia tin rằng tính năng này hoàn toàn vô hại. Thực tế, nó chỉ vô hại khi bạn hiểu rõ cách sử dụng nó đúng đắn. Một con dao không phải là lỗi của nhà bếp, nhưng nó có thể cắt vào tay bạn nếu bạn không biết cách cầm. Tương tự, Partial Payments là một công cụ hữu ích trong tay người hiểu biết, nhưng là một vũ khí trong tay kẻ xấu khi đối tượng bị tấn công không hiểu gì về nó.
Một điểm kỹ thuật khác đáng chú ý: delivered_amount không phải lúc nào cũng xuất hiện. Trong các giao dịch XRP-native thông thường, trường này có thể không có mặt. Nhưng trong các giao dịch liên quan đến path finding, đặc biệt là các giao dịch liên quan đến token phát hành trên XRPL, trường này gần như bắt buộc phải được kiểm tra. Vì vậy, các nhà phát triển cần biết rõ khi nào cần đọc trường này và khi nào không.
Theo đánh giá của tôi, mức độ rủi ro của Partial Payments nằm trong vùng "trung bình đến cao" — không phải vì giao thức không an toàn, mà vì xác suất tích hợp sai là rất lớn. Các đội ngũ phát triển nhỏ, thiếu kinh nghiệm, thường không đọc kỹ tài liệu XRPL và dễ bỏ qua trường delivered_amount. Các đội lớn hơn, có quy trình kiểm toán nghiêm ngặt, sẽ xử lý tốt. Nhưng thị trường crypto vốn nổi tiếng với sự phát triển nhanh và cẩu thả, vậy nên đây là một cái bẫy nguy hiểm.
Góc nhìn phản trực giác: "Không phải bug" là câu trả lời đúng cho câu hỏi sai
Bây giờ, hãy để tôi đưa ra góc nhìn có phần ngược lại với bài viết gốc. Bài viết này khẳng định Partial Payments không phải là một lỗi của XRP Ledger. Tôi đồng ý. Nhưng tôi muốn hỏi một câu khác: Vậy tại sao lại có cả một bài viết dài giải thích rằng nó không phải lỗi? Nếu một tính năng thực sự không có vấn đề gì, thì không cần phải bảo vệ nó một cách nhiệt tình đến vậy.
Sự tồn tại của những bài viết "Not a Bug" như thế này chính là bằng chứng cho thấy tính năng đó đã gây ra đủ sự nhầm lẫn và thiệt hại trong quá khứ, đến mức những người hiểu biết phải lên tiếng để trấn an cộng đồng.
Câu hỏi thông minh hơn ở đây không phải là "Partial Payments có phải bug không", mà là "ai chịu trách nhiệm khi người dùng nhận ít hơn số tiền họ mong đợi?". Và câu trả lời không nằm ở bài viết này. Nó nằm ở các sàn giao dịch, các ví, và các nhà phát triển ứng dụng — những người đang nắm giữ trách nhiệm tích hợp an toàn.
Tôi từng chứng kiến quá nhiều vụ việc trong ngành này, nơi mà một tính năng hoàn toàn hợp lệ về mặt kỹ thuật lại trở thành công cụ để lừa đảo những người dùng không được bảo vệ. Năm 2022, khi tôi phân tích Terra Luna và phát hiện ra mô hình mint/burn của nó phụ thuộc vào thanh khoản của Anchor Protocol, tôi đã bị nhiều người gọi là bi quan. Họ nói "đây là thiết kế, không phải lỗi". Và đúng là nó không phải lỗi. Nó chỉ là một thiết kế tồi, dẫn đến sự sụp đổ hoàn toàn.
Điều tương tự cũng có thể xảy ra với Partial Payments. Nó không phải là một lỗi trong mã nguồn của XRPL. Nhưng nó là một thiết kế có thể gây ra hậu quả nghiêm trọng khi được tích hợp một cách thiếu hiểu biết. Và theo tôi, việc gọi nó là "không phải bug" có thể tạo ra một cảm giác an toàn sai lầm.
Một góc nhìn phản trực giác khác: thị trường crypto trong giai đoạn giảm giá hiện tại không cần những bài viết trấn an "cái này không phải lỗi", mà cần những bài viết hướng dẫn cụ thể "làm thế nào để không bị mất tiền vì cái này". Sự khác biệt này quan trọng hơn nhiều.
Khi tôi dẫn dắt các quỹ đầu tư và tư vấn cho BlackRock về chiến lược phân bổ tài sản vào Bitcoin ETF, một trong những nguyên tắc tôi luôn giữ vững là: không bao giờ đánh giá thấp những rủi ro mang tính "tích hợp". Một giao thức có thể an toàn tuyệt đối, nhưng nếu lớp ứng dụng bên trên được xây dựng cẩu thả, người dùng vẫn sẽ mất sạch tiền. Và lỗi luôn bị đổ lên đầu giao thức, ngay cả khi giao thức không hề sai.
Đây cũng là lý do vì sao tôi nhiều lần cảnh báo rằng ngành công nghiệp này có xu hướng đổ lỗi sai nguyên nhân. Chúng ta đổ lỗi cho Bitcoin vì các sàn giao dịch sụp đổ, đổ lỗi cho hợp đồng thông minh vì các dự án gian lận, và đổ lỗi cho XRP Ledger vì các nhà phát triển không đọc nổi tài liệu. Trong khi đó, vấn đề thực sự luôn nằm ở con người và quy trình.
Trong bối cảnh thị trường giảm, khi các quỹ đầu tư đang thắt chặt chi tiêu và các dự án phải cắt giảm chi phí, việc cắt giảm các cuộc kiểm toán bảo mật và kiểm tra tích hợp là điều tôi thấy liên tục. Đây chính là thời điểm những lỗ hổng như "không đọc delivered_amount" dễ bị khai thác nhất. Không phải vì kẻ tấn công trở nên thông minh hơn, mà vì các nhà phát triển trở nên mệt mỏi hơn, vội vàng hơn, và cắt bỏ nhiều bước an toàn hơn.
Kết luận: Bài toán thực sự nằm ở trách nhiệm
Vậy chúng ta học được gì từ câu chuyện Partial Payments này?
Thứ nhất, hãy luôn kiểm tra delivered_amount. Nếu bạn là nhà phát triển, đừng bao giờ tin tưởng trường amount trong các giao dịch đến từ XRP Ledger. Có một lý do khiến giao thức cung cấp trường này — chính là để bạn sử dụng nó. Bỏ qua nó cũng giống như lái xe mà không nhìn gương chiếu hậu: bạn vẫn có thể chạy được, nhưng chỉ đến khi gặp tai nạn.
Thứ hai, hãy cẩn thận với những khẳng định tuyệt đối. "Không phải bug" là một khẳng định đúng về mặt kỹ thuật, nhưng nó không làm giảm đi trách nhiệm của các bên tích hợp. Nếu bạn là người dùng cá nhân, đừng vì một bài viết nói "đây không phải bug" mà chủ quan. Hãy kiểm tra số dư thực tế sau mỗi giao dịch.
Thứ ba, và có lẽ quan trọng nhất: trong thị trường tiền mã hóa, trách nhiệm luôn thuộc về bạn. Dù là một tính năng thiết kế tốt hay một lỗi thực sự, hậu quả cuối cùng đều đổ lên người nắm giữ tài sản. Giao thức có thể đúng, nhưng tiền của bạn có thể bay hơi. Điều đó không công bằng, nhưng đó là cách hoạt động của thế giới này.
Tôi không thể không nhớ lại bài học từ NFT explosion năm 2021, khi tôi quá hưng phấn với lợi nhuận 20 lần và mở rộng danh mục đến mức mất tập trung vào phân tích thanh khoản. Đến cuối năm, khi giá NFT giảm 40%, tôi nhận ra một điều đơn giản: kỷ luật mới là tài sản lớn nhất. Không phải sự thông minh, không phải khả năng phát hiện trend sớm, mà là sự kỷ luật để luôn kiểm tra các chi tiết nhàm chán nhất — như trường delivered_amount.
Vậy câu hỏi cuối cùng tôi muốn để lại cho bạn là: Liệu các sàn giao dịch và ví bạn đang sử dụng có thực sự kiểm tra delivered_amount khi xử lý các giao dịch XRP? Bạn không có cách nào biết chắc chắn, trừ khi họ công bố quy trình kiểm toán của mình. Còn nếu họ không công bố, có lẽ đã đến lúc bạn nên hỏi.
Hãy nhớ rằng, trên thị trường này, sự an toàn không đến từ việc tin rằng "mọi thứ đều được thiết kế đúng", mà đến từ việc liên tục đặt câu hỏi "điều gì có thể đi sai?". Và nếu bạn không tìm ra câu trả lời, có thể bạn chưa tìm đủ chăm.