एक दिन, एक उपयोगकर्ता ने rabbit.io सपोर्ट से संपर्क किया और दावा किया कि एक एक्सचेंज के बाद उसे 1,000 USDC के बजाय 1 XLM प्राप्त हुआ है।
यह एक गंभीर नुकसान जैसा लग रहा था। एक ल्यूमेन (lumen) की कीमत एक डॉलर से बहुत कम है: इस समय, XLM लगभग $0.22 पर कारोबार कर रहा है। इस तरह से लगभग पूरी राशि खो देना किसी के लिए भी चिंताजनक होगा।
स्वाभाविक रूप से, हमने तुरंत मामले की जांच शुरू कर दी। अगर यह पता चलता कि हमारी गलती के कारण गलत राशि या गलत संपत्ति भेजी गई थी, तो हम तुरंत कार्रवाई करते और यह सुनिश्चित करते कि उपयोगकर्ता को सही फंड मिले।
लेकिन कहानी कहीं अधिक दिलचस्प निकली।
हमारे सिस्टम ने बिल्कुल वैसा ही काम किया जैसा उन्हें करना चाहिए था। उपयोगकर्ता द्वारा दिए गए पते पर 1,000 USDC भेजे गए थे, और हमारी ओर से कोई त्रुटि या विफलता नहीं हुई थी। और फिर भी, स्टेलर (Stellar) नेटवर्क में एक सूक्ष्म वास्तुकला विवरण (architectural detail) है जो, शाब्दिक रूप से, 1,000 USDC को 1 XLM में बदल सकता है यदि आप उसे अनदेखा कर देते हैं।
मैं समझाता हूँ कि यह कैसे होता है।
rabbit.io का क्लाइंट कोई नौसिखिया नहीं था। इसके विपरीत, वह एक अनुभवी क्रिप्टो उपयोगकर्ता था जो जानबूझकर अपने फंड को एक्सचेंज के बजाय गैर-कस्टोडियल (non-custodial) वॉलेट में रखता था। हालांकि, उसका अधिकांश अनुभव EVM-आधारित नेटवर्क से आया था।
इथेरियम की दुनिया में, उपयोगकर्ताओं को एक सरल मॉडल की आदत हो जाती है: आपके पते पर भेजा गया कोई भी टोकन सफलतापूर्वक पहुँच जाएगा। सबसे खराब स्थिति में, आपको बस अपने वॉलेट इंटरफ़ेस में टोकन को मैन्युअल रूप से जोड़ने की आवश्यकता होती है। और भले ही वॉलेट ऐप किसी विशिष्ट टोकन का बिल्कुल भी समर्थन न करता हो, आप अपने सीड फ्रेज़ (seed phrase) को दूसरे वॉलेट में इम्पोर्ट कर सकते हैं जो उसका समर्थन करता हो।
स्टेलर बहुत अलग तरीके से काम करता है।
इसकी संरचना मौलिक रूप से इथेरियम, बिनेंस स्मार्ट चेन या पॉलीगॉन से अलग है। यहाँ तक कि एड्रेस (पता) की अवधारणा भी अलग है। EVM नेटवर्क में, पते प्रभावी रूप से मुफ्त होते हैं। स्टेलर में, लेजर पर एक एड्रेस बनाने की लागत 1 XLM होती है।
और ठीक वही राशि — 1 XLM — हमारे क्लाइंट ने एक्सचेंज के बाद अपने वॉलेट में देखी थी।
स्टेलर और EVM-आधारित नेटवर्क के बीच सबसे महत्वपूर्ण अंतर इस बात में है कि संपत्तियां (assets) कैसे प्राप्त की जाती हैं।
स्टेलर में, एक वॉलेट को किसी भी नए टोकन को क्रेडिट होने से पहले स्पष्ट रूप से अनुमोदित करना चाहिए। उदाहरण के लिए, पहली बार USDC प्राप्त करने के लिए, एक स्टेलर खाते को USDC जारीकर्ता के साथ एक ट्रस्टलाइन (trustline) बनानी पड़ती है। ट्रस्टलाइन बनाने के लिए रिजर्व के रूप में 0.5 XLM लॉक करने की आवश्यकता होती है, जो संबंधित लेजर प्रविष्टि (ledger entry) को सुरक्षित करता है।
मूल रूप से, यदि कोई टोकन बिना किसी मौजूदा ट्रस्टलाइन वाले पते पर भेजा जाता था, तो लेनदेन विफल हो जाता था। पूरी राशि भेजने वाले के पास ही रहती थी।
स्टेलर प्रोटोकॉल 15 के साथ, क्लेमेबल बैलेंस (claimable balances) की शुरुआत के साथ इस व्यवहार को बदल दिया गया था। इसका लक्ष्य उपयोगिता में सुधार करना और टोकन को "तैयार नहीं" खातों में भी भेजने की अनुमति देना था।
जब हमने अपने क्लाइंट के स्टेलर पते पर USDC भेजे, जिसमें USDC के लिए ट्रस्टलाइन नहीं थी, तो प्रोटोकॉल ने लेनदेन को इस प्रकार संभाला:
दूसरे शब्दों में, फंड लेजर पर दर्ज किए गए और वहीं रहे, किसी के द्वारा उन्हें स्पष्ट रूप से क्लेम (दावा) करने का इंतज़ार करते हुए। ऐसा करने की अनुमति किसे है, यह लेनदेन की शर्तों द्वारा परिभाषित किया जाता है। डिफ़ॉल्ट रूप से, भेजने वाला और प्राप्तकर्ता दोनों ही पात्र दावेदार होते हैं।
लेकिन प्राप्तकर्ता के खाते में 1 XLM कहाँ से आया? जवाब है: हमारी ओर से — हालांकि हमने इसे जानबूझकर कभी नहीं भेजा था।
यहाँ बताया गया है कि ऐसे लेनदेन वास्तव में कैसे संसाधित होते हैं।
चरण 1. भेजने वाला एक USDC ट्रांसफर शुरू करता है और निम्नलिखित मापदंडों के साथ एक लेनदेन पर हस्ताक्षर करता है:
इस स्तर पर, भेजने वाला लेनदेन को संसाधित करने के लिए आवश्यक XLM की किसी भी राशि का भुगतान करने के लिए परोक्ष रूप से सहमत होता है। व्यवहार में, उपयोगकर्ता शायद ही कभी इस विवरण पर ध्यान देते हैं, क्योंकि स्टेलर पर लेनदेन शुल्क आमतौर पर नगण्य होता है।
चरण 2. स्टेलर यह जांचने के लिए बुनियादी सत्यापन की एक श्रृंखला करता है कि क्या ऑपरेशन निष्पादित किया जा सकता है
कुल मिलाकर, इन शर्तों का मतलब है कि सीधा भुगतान संभव नहीं है।
चरण 3. लेनदेन को सीधे खारिज करने के बजाय, स्टेलर क्लेमेबल बैलेंस तंत्र को सक्रिय करता है।
ऐसा करने के लिए, नेटवर्क:
हालांकि, प्राप्तकर्ता को संभावित दावेदार के रूप में सूचीबद्ध करने के लिए, प्राप्तकर्ता का खाता नेटवर्क पर मौजूद होना चाहिए। लेनदेन के समय, खाता केवल प्राप्तकर्ता के वॉलेट ऐप के अंदर मौजूद था। इसे अभी तक स्टेलर लेजर पर नहीं बनाया गया था।
इन परिस्थितियों में, खाता उसी लेनदेन के हिस्से के रूप में बनाया जाता है।
जैसा कि पहले उल्लेख किया गया है, स्टेलर पर खाता बनाना मुफ्त नहीं है। खाता बनाने के लिए आवश्यक 1 XLM ऑपरेशन के स्रोत से लिया जाता है, जिसका अर्थ है भेजने वाले के बैलेंस से:
यह 1 XLM लेनदेन निष्पादित करने की लागत का हिस्सा है — एक ऐसी लागत जिसे हमने लेनदेन पर हस्ताक्षर करते समय परोक्ष रूप से स्वीकार किया था। तकनीकी रूप से, यह प्राप्तकर्ता के बैलेंस पर समाप्त होता है, लेकिन प्राप्तकर्ता वास्तव में इसका उपयोग नहीं कर सकता है। विशेष रूप से, प्राप्तकर्ता USDC के लिए ट्रस्टलाइन बनाने और फंड क्लेम करने के लिए उस राशि का आधा हिस्सा भी नहीं ले सकता है।
यदि प्राप्तकर्ता का खाता पहले से ही नेटवर्क पर मौजूद होता, लेकिन उसमें केवल USDC के लिए ट्रस्टलाइन की कमी होती, तो किसी अतिरिक्त 1 XLM की आवश्यकता नहीं होती। उस स्थिति में, प्राप्तकर्ता को अपने वॉलेट में कोई दृश्य परिवर्तन नहीं दिखाई देता।
पहला कदम प्राप्तकर्ता के लिए USDC संपत्ति के लिए changeTrust ऑपरेशन पर हस्ताक्षर करना था। इस ऑपरेशन के सफल होने के लिए, वॉलेट में कम से कम 0.5 XLM का फ्री बैलेंस होना चाहिए, जो ट्रस्टलाइन बनने पर रिजर्व के रूप में लॉक हो जाता है।
हमारे क्लाइंट के पास कोई फ्री XLM नहीं था। अधिक सटीक रूप से, खाते में एकमात्र XLM वह 1 XLM था जो एक्सचेंज के परिणामस्वरूप वहां दिखाई दिया था — लेकिन वह राशि पूरी तरह से बेस रिजर्व के रूप में लॉक थी और इसका उपयोग नहीं किया जा सकता था।
इसलिए हमने एक सरल समाधान सुझाया: किसी भी उपलब्ध क्रिप्टोकरेंसी की एक छोटी मात्रा को ल्यूमेन (lumens) में बदलें। ऐसा करने के बाद, क्लाइंट के पास आखिरकार अपने वॉलेट में ट्रस्टलाइन बनाने के लिए पर्याप्त फ्री XLM हो गया।
एक बार USDC के लिए ट्रस्टलाइन स्थापित हो जाने के बाद, उपयोगकर्ता 1,000 USDC क्लेम करने में सक्षम हो गया। इस मामले में, शामिल सभी पक्षों के लिए सब कुछ ठीक रहा।
हमारे क्लाइंट के सामने जो स्थिति आई वह अनोखी नहीं है। और वह वास्तव में भाग्यशाली था कि वह पूरी तरह से अपने नियंत्रण में रहने वाले गैर-कस्टोडियल वॉलेट का उपयोग कर रहा था। इसी वजह से समस्या का समाधान अपेक्षाकृत आसान हो गया।
मुझे यह कहानी याद आई क्योंकि कुछ ही दिन पहले मैंने एक अन्य उपयोगकर्ता से जुड़े इसी तरह के मामले के बारे में पढ़ा था। राशि बिल्कुल वैसी ही थी — 1,000 USDC — लेकिन परिस्थितियों ने समस्या को ठीक करना कहीं अधिक कठिन बना दिया।
तीन दिन पहले, अपहोल्ड (Uphold) के CEO साइमन मैकलॉघलिन की नवीनतम पोस्ट के नीचे लिंक्डइन पर एक टिप्पणी दिखाई दी, जहां एक अपहोल्ड उपयोगकर्ता ने निम्नलिखित स्थिति का वर्णन किया:
यह देखते हुए कि लक्षण कितनी बारीकी से मेल खाते हैं, मेरा मानना है कि अंतर्निहित समस्या बिल्कुल वैसी ही है।
सबसे अधिक संभावना है, अपहोल्ड मांग पर डिपॉजिट एड्रेस जेनरेट करता है, और जिस XLM एड्रेस पर उपयोगकर्ता ने फंड भेजा था, वह अभी तक स्टेलर लेजर पर नहीं बनाया गया था। इससे पता चलता है कि लेनदेन के परिणामस्वरूप खाते पर 1 XLM क्यों दिखाई दिया। हालांकि, 1,000 USDC नहीं दिखाई दिए, और स्थिति को हल करने के लिए अपहोल्ड को उस पते के लिए मैन्युअल रूप से USDC के लिए ट्रस्टलाइन बनाने की आवश्यकता होगी।
सपोर्ट ने मदद करने से इनकार क्यों किया?
मेरा अनुमान सुरक्षा संरचना (security architecture) है। क्रिप्टोकरेंसी से निपटने वाला कोई भी व्यवसाय वॉलेट सुरक्षा में भारी निवेश करता है। ऐसा लगता है कि अपहोल्ड ने अपेक्षित, मानक डिपॉजिट फ्लो के बाहर ट्रस्टलाइन बनाने की प्रक्रिया लागू नहीं की थी। सभी आंतरिक सुरक्षा आवश्यकताओं को पूरा करते हुए, पूर्वव्यापी रूप से ऐसी कार्यक्षमता जोड़ना, एक्सचेंज को उपयोगकर्ता द्वारा खोए गए 1,000 USDC से कहीं अधिक महंगा पड़ सकता है।
आज तक, CEO की पोस्ट के नीचे की टिप्पणी हटा दी गई है। मुझे नहीं पता कि इसे स्वयं उपयोगकर्ता द्वारा हटाया गया था या एक्सचेंज द्वारा। मुझे उम्मीद है कि समस्या का समाधान हो गया होगा और उपयोगकर्ता ने अपनी मर्जी से टिप्पणी हटाने का फैसला किया होगा। लेकिन अगर टिप्पणी अपहोल्ड द्वारा हटाई गई थी, तो यह एक चिंताजनक संकेत होगा।
इन समस्याओं को चुपचाप दफनाया नहीं जाना चाहिए। इसके विपरीत, वे ध्यान देने योग्य हैं — ताकि अन्य उपयोगकर्ता वही गलती न दोहराएं। इसीलिए मैंने अपनी कहानी और अपहोल्ड उपयोगकर्ता की कहानी दोनों को यहाँ साझा करने का निर्णय लिया।
यदि शामिल वॉलेट्स में से कम से कम एक — या तो भेजने वाले का या प्राप्तकर्ता का — पूरी तरह से फंड के मालिक द्वारा नियंत्रित है, तो स्थिति अपेक्षाकृत सरल है:
हालांकि, जब कस्टोडियल वॉलेट शामिल होते हैं — उदाहरण के लिए, CEX वॉलेट — चीजें बहुत अधिक जटिल हो जाती हैं।
कस्टोडियल सेवाएं उपयोगकर्ता की गलती को ठीक करने के लिए अपने वॉलेट इंफ्रास्ट्रक्चर में मैन्युअल रूप से हस्तक्षेप करने के लिए बाध्य नहीं हैं, खासकर यदि ऐसा करने से अतिरिक्त परिचालन या सुरक्षा जोखिम पैदा होते हैं। परिणामस्वरूप, आपको सहायता देने से मना किया जा सकता है, भले ही फंड तकनीकी रूप से अभी भी लेजर पर मौजूद हों।
उसके बावजूद, कोशिश करना अभी भी सार्थक है। जब तक एक्सचेंज निजी चाबियों (private keys) को नियंत्रित करता है, तब तक फंड की रिकवरी की संभावना बनी रहती है।
यदि आप खुद को इस स्थिति में पाते हैं:
अंततः, सबसे अच्छा समाधान अभी भी रोकथाम ही है। अपना स्वयं का कस्टोडियन होने के कई फायदे हैं, लेकिन यह बड़ी जिम्मेदारी के साथ भी आता है। क्रिप्टोकरेंसी भेजते समय, बारीकियों पर ध्यान देना मायने रखता है, क्योंकि कुछ गलतियाँ करना जितना आसान है, उन्हें सुधारना उतना ही कठिन।