Một ngày nọ, một người dùng đã liên hệ với bộ phận hỗ trợ của rabbit.io khiếu nại rằng sau khi trao đổi, anh ấy đã nhận được 1 XLM thay vì 1.000 USDC.
Nó trông giống như một khoản lỗ nghiêm trọng. Một lumen có giá trị thấp hơn nhiều so với một đô la: tại thời điểm đó, XLM đang giao dịch ở mức khoảng 0,22 USD. Việc mất gần như toàn bộ số tiền theo cách như vậy sẽ là điều đáng lo ngại đối với bất kỳ ai.
Lẽ tự nhiên, chúng tôi đã bắt đầu điều tra vụ việc ngay lập tức. Nếu hóa ra số tiền sai hoặc tài sản sai đã được gửi do lỗi của chúng tôi, chúng tôi sẽ hành động ngay lập tức và đảm bảo người dùng nhận được số tiền chính xác.
Nhưng câu chuyện hóa ra lại thú vị hơn nhiều.
Hệ thống của chúng tôi đã hoạt động chính xác như dự định. 1.000 USDC đã được gửi đến địa chỉ do người dùng cung cấp, không có lỗi hay sự cố nào từ phía chúng tôi. Tuy nhiên, trong mạng lưới Stellar có một chi tiết kiến trúc tinh vi mà nếu bạn bỏ qua, nó có thể biến 1.000 USDC thành 1 XLM theo đúng nghĩa đen.
Hãy để tôi giải thích điều này xảy ra như thế nào.
Khách hàng của rabbit.io không phải là người mới bắt đầu. Ngược lại, anh ấy là một người dùng tiền điện tử có kinh nghiệm, người đã chủ động lưu trữ tiền của mình trong các ví không lưu ký (non-custodial) thay vì trên các sàn giao dịch. Tuy nhiên, phần lớn kinh nghiệm của anh ấy đến từ các mạng lưới dựa trên EVM.
Trong thế giới Ethereum, người dùng đã quen với một mô hình đơn giản: bất kỳ token nào được gửi đến địa chỉ của bạn sẽ đến nơi thành công. Trong trường hợp xấu nhất, bạn chỉ cần thêm token vào giao diện ví của mình một cách thủ công. Và ngay cả khi ứng dụng ví hoàn toàn không hỗ trợ một token cụ thể, bạn vẫn có thể nhập cụm từ khôi phục (seed phrase) của mình vào một ví khác có hỗ trợ.
Stellar hoạt động rất khác biệt.
Kiến trúc của nó về cơ bản không giống như Ethereum, Binance Smart Chain hay Polygon. Ngay cả khái niệm về địa chỉ cũng khác. Trong các mạng EVM, các địa chỉ về hiệu quả là miễn phí. Trong Stellar, việc tạo một địa chỉ trên sổ cái (ledger) tốn phí 1 XLM.
Và đó chính xác là số tiền — 1 XLM — mà khách hàng của chúng tôi đã thấy trong ví của mình sau khi trao đổi.
Sự khác biệt quan trọng nhất giữa Stellar và các mạng dựa trên EVM nằm ở cách nhận tài sản.
Trong Stellar, một ví phải phê duyệt rõ ràng bất kỳ token mới nào trước khi nó có thể được ghi có. Ví dụ: để nhận USDC lần đầu tiên, một tài khoản Stellar phải tạo một trustline (đường dây tin cậy) với bên phát hành USDC. Việc tạo trustline yêu cầu khóa 0,5 XLM làm dự trữ để đảm bảo cho mục nhập sổ cái tương ứng.
Ban đầu, nếu một token được gửi đến một địa chỉ mà không có trustline hiện có, giao dịch sẽ đơn giản là thất bại. Toàn bộ số tiền sẽ vẫn ở lại với người gửi.
Bắt đầu với Stellar Protocol 15, hành vi này đã được thay đổi với sự ra đời của claimable balances (số dư có thể yêu cầu). Mục tiêu là để cải thiện khả năng sử dụng và cho phép gửi token ngay cả đến các tài khoản "chưa chuẩn bị".
Khi chúng tôi gửi USDC đến địa chỉ Stellar của khách hàng vốn chưa có trustline với USDC, giao thức đã xử lý giao dịch như sau:
Nói cách khác, tiền đã được ghi lại trên sổ cái và nằm ở đó, chờ ai đó yêu cầu chúng một cách rõ ràng. Ai được phép làm như vậy được xác định bởi các điều kiện của giao dịch. Theo mặc định, cả người gửi và người nhận đều là những bên yêu cầu đủ điều kiện.
Nhưng 1 XLM trên tài khoản của người nhận đến từ đâu? Câu trả lời là: từ chúng tôi — mặc dù chúng tôi chưa bao giờ cố ý gửi nó.
Dưới đây là cách các giao dịch như vậy thực sự được xử lý.
Bước 1. Người gửi khởi tạo chuyển khoản USDC và ký một giao dịch với các tham số sau:
Ở giai đoạn này, người gửi mặc định đồng ý trả bất kỳ lượng XLM nào cần thiết để xử lý giao dịch. Trên thực tế, người dùng hiếm khi chú ý đến chi tiết này, vì phí giao dịch trên Stellar thường không đáng kể.
Bước 2. Stellar thực hiện một loạt các xác thực cơ bản để kiểm tra xem hoạt động có thể được thực hiện hay không
Tổng hợp lại, các điều kiện này có nghĩa là thanh toán trực tiếp không khả thi.
Bước 3. Thay vì từ chối giao dịch ngay lập tức, Stellar kích hoạt cơ chế claimable balance.
Để làm như vậy, mạng lưới:
Tuy nhiên, để người nhận được liệt kê là một bên yêu cầu tiềm năng, tài khoản của người nhận phải tồn tại trên mạng lưới. Tại thời điểm giao dịch, tài khoản chỉ tồn tại bên trong ứng dụng ví của người nhận. Nó vẫn chưa được tạo trên sổ cái Stellar.
Trong những điều kiện này, tài khoản sẽ được tạo như một phần của cùng một giao dịch.
Như đã đề cập trước đó, việc tạo tài khoản trên Stellar không phải là miễn phí. 1 XLM cần thiết để tạo tài khoản được lấy từ nguồn của hoạt động, nghĩa là từ số dư của người gửi:
1 XLM này là một phần chi phí thực hiện giao dịch — một chi phí mà chúng tôi đã mặc định chấp nhận khi ký giao dịch. Về mặt kỹ thuật, nó nằm trong số dư của người nhận, nhưng người nhận thực sự không thể sử dụng nó. Cụ thể, người nhận không thể lấy một nửa số tiền đó để tạo trustline cho USDC và yêu cầu số tiền.
Nếu tài khoản của người nhận đã tồn tại trên mạng lưới nhưng chỉ thiếu trustline với USDC, thì sẽ không cần thêm 1 XLM. Trong trường hợp đó, người nhận sẽ hoàn toàn không thấy bất kỳ thay đổi rõ rệt nào trong ví của mình.
Bước đầu tiên là người nhận ký một hoạt động changeTrust cho tài sản USDC. Để hoạt động này thành công, ví phải có ít nhất 0,5 XLM số dư tự do, số tiền này sẽ bị khóa làm dự trữ khi trustline được tạo.
Khách hàng của chúng tôi không có bất kỳ XLM tự do nào. Chính xác hơn, XLM duy nhất trên tài khoản là 1 XLM xuất hiện ở đó do kết quả của việc trao đổi — nhưng số tiền đó đã bị khóa hoàn toàn làm mức dự trữ cơ bản và không thể sử dụng.
Do đó, chúng tôi đã gợi ý một giải pháp tạm thời đơn giản: trao đổi một lượng nhỏ bất kỳ loại tiền điện tử có sẵn nào sang lumen. Sau khi làm như vậy, cuối cùng khách hàng đã có đủ XLM tự do để tạo trustline trong ví của mình.
Khi trustline với USDC được thiết lập, người dùng đã có thể yêu cầu 1.000 USDC. Trong trường hợp này, mọi thứ đã kết thúc tốt đẹp cho tất cả các bên liên quan.
Tình huống mà khách hàng của chúng tôi gặp phải không phải là duy nhất. Và anh ấy thực sự may mắn vì đã sử dụng các ví không lưu ký hoàn toàn dưới quyền kiểm soát của mình. Đó chính xác là điều khiến vấn đề tương đối dễ giải quyết.
Tôi nhớ lại câu chuyện này vì chỉ vài ngày trước, tôi đã đọc về một trường hợp rất giống liên quan đến một người dùng khác. Số tiền hoàn toàn giống nhau — 1.000 USDC — nhưng các tình huống khiến vấn đề trở nên khó khắc phục hơn nhiều.
Cách đây ba ngày, một bình luận đã xuất hiện trên LinkedIn dưới bài đăng mới nhất của CEO Uphold, Simon McLoughlin, nơi một người dùng Uphold đã mô tả tình huống sau:
Với mức độ tương đồng của các triệu chứng, tôi tin rằng vấn đề cơ bản là hoàn toàn giống nhau.
Rất có thể, Uphold tạo địa chỉ nạp tiền theo yêu cầu, và địa chỉ XLM mà người dùng gửi tiền vào vẫn chưa được tạo trên sổ cái Stellar. Điều đó giải thích tại sao 1 XLM xuất hiện trên tài khoản do kết quả của giao dịch. Tuy nhiên, 1.000 USDC thì không, và để giải quyết tình huống này, Uphold cần phải tạo trustline với USDC cho địa chỉ đó một cách thủ công.
Tại sao bộ phận hỗ trợ lại từ chối giúp đỡ?
Tôi đoán là do kiến trúc bảo mật. Bất kỳ doanh nghiệp nào giao dịch với tiền điện tử đều đầu tư rất lớn vào bảo mật ví. Có vẻ như Uphold đã không triển khai quy trình tạo trustline ngoài luồng nạp tiền tiêu chuẩn dự kiến. Việc thêm chức năng như vậy một cách hồi tố, trong khi vẫn phải đáp ứng tất cả các yêu cầu bảo mật nội bộ, có thể tốn kém cho sàn giao dịch hơn nhiều so với khoản lỗ .1000 USDC của người dùng.
Tính đến ngày hôm nay, bình luận dưới bài đăng của CEO đã bị xóa. Tôi không biết liệu nó bị xóa bởi chính người dùng hay bởi sàn giao dịch. Tôi hy vọng vấn đề đã được giải quyết và người dùng đã chọn tự mình xóa bình luận. Nhưng nếu bình luận bị xóa bởi Uphold, đó sẽ là một tín hiệu đáng lo ngại.
Những vấn đề này không nên bị chôn vùi một cách lặng lẽ. Ngược lại, chúng đáng được chú ý — để những người dùng khác không lặp lại sai lầm tương tự. Đó là lý do tại sao tôi quyết định chia sẻ cả câu chuyện của chúng tôi và câu chuyện của người dùng Uphold tại đây.
Nếu ít nhất một trong các ví liên quan — của người gửi hoặc người nhận — hoàn toàn do chủ sở hữu tiền kiểm soát, tình huống tương đối đơn giản:
Tuy nhiên, khi các ví lưu ký có liên quan — ví dụ: ví CEX — mọi thứ trở nên phức tạp hơn nhiều.
Các dịch vụ lưu ký không có nghĩa vụ phải can thiệp thủ công vào cơ sở hạ tầng ví của họ để sửa lỗi của người dùng, đặc biệt nếu làm như vậy gây ra thêm các rủi ro vận hành hoặc bảo mật. Kết quả là bạn có thể bị từ chối hỗ trợ, mặc dù về mặt kỹ thuật tiền vẫn tồn tại trên sổ cái.
Dù vậy, vẫn rất đáng để thử. Miễn là sàn giao dịch kiểm soát các khóa riêng (private keys), vẫn có cơ hội tiền có thể được phục hồi.
Nếu bạn thấy mình trong tình huống này:
Cuối cùng, giải pháp tốt nhất vẫn là phòng ngừa. Trở thành người lưu ký của chính mình có nhiều lợi thế, nhưng nó cũng đi kèm với mức độ trách nhiệm cao. Khi gửi tiền điện tử, việc chú ý đến các chi tiết là rất quan trọng, vì một số lỗi phạm phải thì dễ nhưng sửa chữa thì khó hơn nhiều.