एक साधारण त्रुटि कैसे 1,000 USDC को 1 XLM में बदल सकती है

एक साधारण त्रुटि कैसे 1,000 USDC को 1 XLM में बदल सकती है

अंग्रेज़ी से अनूदित

एक दिन, एक उपयोगकर्ता ने rabbit.io सपोर्ट से संपर्क किया और दावा किया कि एक एक्सचेंज के बाद उसे 1,000 USDC के बजाय 1 XLM प्राप्त हुआ है।

यह एक गंभीर नुकसान जैसा लग रहा था। एक ल्यूमेन (lumen) की कीमत एक डॉलर से बहुत कम है: इस समय, XLM लगभग $0.22 पर कारोबार कर रहा है। इस तरह से लगभग पूरी राशि खो देना किसी के लिए भी चिंताजनक होगा।

स्वाभाविक रूप से, हमने तुरंत मामले की जांच शुरू कर दी। अगर यह पता चलता कि हमारी गलती के कारण गलत राशि या गलत संपत्ति भेजी गई थी, तो हम तुरंत कार्रवाई करते और यह सुनिश्चित करते कि उपयोगकर्ता को सही फंड मिले।

लेकिन कहानी कहीं अधिक दिलचस्प निकली।

हमारे सिस्टम ने बिल्कुल वैसा ही काम किया जैसा उन्हें करना चाहिए था। उपयोगकर्ता द्वारा दिए गए पते पर 1,000 USDC भेजे गए थे, और हमारी ओर से कोई त्रुटि या विफलता नहीं हुई थी। और फिर भी, स्टेलर (Stellar) नेटवर्क में एक सूक्ष्म वास्तुकला विवरण (architectural detail) है जो, शाब्दिक रूप से, 1,000 USDC को 1 XLM में बदल सकता है यदि आप उसे अनदेखा कर देते हैं।

मैं समझाता हूँ कि यह कैसे होता है।

इथेरियम (Ethereum) की आदत

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,000 USDC को Claimable Balance Entry नामक एक विशेष लेजर ऑब्जेक्ट में रखा गया।

दूसरे शब्दों में, फंड लेजर पर दर्ज किए गए और वहीं रहे, किसी के द्वारा उन्हें स्पष्ट रूप से क्लेम (दावा) करने का इंतज़ार करते हुए। ऐसा करने की अनुमति किसे है, यह लेनदेन की शर्तों द्वारा परिभाषित किया जाता है। डिफ़ॉल्ट रूप से, भेजने वाला और प्राप्तकर्ता दोनों ही पात्र दावेदार होते हैं।

लेकिन प्राप्तकर्ता के खाते में 1 XLM कहाँ से आया? जवाब है: हमारी ओर से — हालांकि हमने इसे जानबूझकर कभी नहीं भेजा था।

यहाँ बताया गया है कि ऐसे लेनदेन वास्तव में कैसे संसाधित होते हैं।

चरण 1. भेजने वाला एक USDC ट्रांसफर शुरू करता है और निम्नलिखित मापदंडों के साथ एक लेनदेन पर हस्ताक्षर करता है:

  • ऑपरेशन: भुगतान (payment)
  • संपत्ति (Asset): USDC
  • गंतव्य (Destination): एक ऐसा पता जो अभी तक स्टेलर नेटवर्क पर मौजूद नहीं है
  • राशि: 1,000 USDC

इस स्तर पर, भेजने वाला लेनदेन को संसाधित करने के लिए आवश्यक XLM की किसी भी राशि का भुगतान करने के लिए परोक्ष रूप से सहमत होता है। व्यवहार में, उपयोगकर्ता शायद ही कभी इस विवरण पर ध्यान देते हैं, क्योंकि स्टेलर पर लेनदेन शुल्क आमतौर पर नगण्य होता है।

चरण 2. स्टेलर यह जांचने के लिए बुनियादी सत्यापन की एक श्रृंखला करता है कि क्या ऑपरेशन निष्पादित किया जा सकता है

  • क्या प्राप्तकर्ता खाता मौजूद है? नहीं
  • क्या स्थानांतरित संपत्ति नेटिव टोकन XLM है? नहीं
  • क्या प्राप्तकर्ता के पास भेजी जा रही संपत्ति के लिए ट्रस्टलाइन है? नहीं

कुल मिलाकर, इन शर्तों का मतलब है कि सीधा भुगतान संभव नहीं है।

चरण 3. लेनदेन को सीधे खारिज करने के बजाय, स्टेलर क्लेमेबल बैलेंस तंत्र को सक्रिय करता है।

ऐसा करने के लिए, नेटवर्क:

  • 1,000 USDC के लिए एक क्लेमेबल बैलेंस बनाता है,
  • निर्दिष्ट करता है कि इसे क्लेम करने की अनुमति किसे है (भेजने वाला और प्राप्तकर्ता दोनों)।

हालांकि, प्राप्तकर्ता को संभावित दावेदार के रूप में सूचीबद्ध करने के लिए, प्राप्तकर्ता का खाता नेटवर्क पर मौजूद होना चाहिए। लेनदेन के समय, खाता केवल प्राप्तकर्ता के वॉलेट ऐप के अंदर मौजूद था। इसे अभी तक स्टेलर लेजर पर नहीं बनाया गया था।

इन परिस्थितियों में, खाता उसी लेनदेन के हिस्से के रूप में बनाया जाता है।

जैसा कि पहले उल्लेख किया गया है, स्टेलर पर खाता बनाना मुफ्त नहीं है। खाता बनाने के लिए आवश्यक 1 XLM ऑपरेशन के स्रोत से लिया जाता है, जिसका अर्थ है भेजने वाले के बैलेंस से:

  • भेजने वाले से 1 XLM काट लिया जाता है,
  • वह 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 साइमन मैकलॉघलिन की नवीनतम पोस्ट के नीचे लिंक्डइन पर एक टिप्पणी दिखाई दी, जहां एक अपहोल्ड उपयोगकर्ता ने निम्नलिखित स्थिति का वर्णन किया:

  • उसने स्टेलर नेटवर्क के माध्यम से अपहोल्ड एक्सचेंज में USDC जमा करने का प्रयास किया।
  • गलती से, उसने अपहोल्ड इंटरफ़ेस में USDC डिपॉजिट एड्रेस के बजाय XLM डिपॉजिट एड्रेस चुन लिया।
  • हमारे मामले की तरह ही, उसने 1,000 USDC के बजाय 1 XLM अपने बैलेंस में क्रेडिट होते देखा।
  • अपहोल्ड सपोर्ट, जिसमें एक वरिष्ठ विशेषज्ञ भी शामिल था, ने स्पष्ट रूप से जवाब दिया: “हमारे पास आपके टोकन नहीं हैं। हम उन्हें नहीं देख सकते। हम उन्हें वापस नहीं कर सकते।”
  • जिस वॉलेट से फंड भेजे गए थे, उसने ऐसी स्थितियों के लिए क्लेम (Claim) फंक्शन प्रदान नहीं किया था। सबसे अधिक संभावना है, यह सीमित कार्यक्षमता वाला एक कस्टोडियल वॉलेट था, संभवतः कोई अन्य CEX।
  • सभी मानक चैनलों को आज़माने के बाद, उपयोगकर्ता ने सीधे CEO के पास मामला ले जाने का प्रयास किया।

यह देखते हुए कि लक्षण कितनी बारीकी से मेल खाते हैं, मेरा मानना ​​है कि अंतर्निहित समस्या बिल्कुल वैसी ही है।

सबसे अधिक संभावना है, अपहोल्ड मांग पर डिपॉजिट एड्रेस जेनरेट करता है, और जिस XLM एड्रेस पर उपयोगकर्ता ने फंड भेजा था, वह अभी तक स्टेलर लेजर पर नहीं बनाया गया था। इससे पता चलता है कि लेनदेन के परिणामस्वरूप खाते पर 1 XLM क्यों दिखाई दिया। हालांकि, 1,000 USDC नहीं दिखाई दिए, और स्थिति को हल करने के लिए अपहोल्ड को उस पते के लिए मैन्युअल रूप से USDC के लिए ट्रस्टलाइन बनाने की आवश्यकता होगी।

सपोर्ट ने मदद करने से इनकार क्यों किया?

मेरा अनुमान सुरक्षा संरचना (security architecture) है। क्रिप्टोकरेंसी से निपटने वाला कोई भी व्यवसाय वॉलेट सुरक्षा में भारी निवेश करता है। ऐसा लगता है कि अपहोल्ड ने अपेक्षित, मानक डिपॉजिट फ्लो के बाहर ट्रस्टलाइन बनाने की प्रक्रिया लागू नहीं की थी। सभी आंतरिक सुरक्षा आवश्यकताओं को पूरा करते हुए, पूर्वव्यापी रूप से ऐसी कार्यक्षमता जोड़ना, एक्सचेंज को उपयोगकर्ता द्वारा खोए गए 1,000 USDC से कहीं अधिक महंगा पड़ सकता है।

आज तक, CEO की पोस्ट के नीचे की टिप्पणी हटा दी गई है। मुझे नहीं पता कि इसे स्वयं उपयोगकर्ता द्वारा हटाया गया था या एक्सचेंज द्वारा। मुझे उम्मीद है कि समस्या का समाधान हो गया होगा और उपयोगकर्ता ने अपनी मर्जी से टिप्पणी हटाने का फैसला किया होगा। लेकिन अगर टिप्पणी अपहोल्ड द्वारा हटाई गई थी, तो यह एक चिंताजनक संकेत होगा।

इन समस्याओं को चुपचाप दफनाया नहीं जाना चाहिए। इसके विपरीत, वे ध्यान देने योग्य हैं — ताकि अन्य उपयोगकर्ता वही गलती न दोहराएं। इसीलिए मैंने अपनी कहानी और अपहोल्ड उपयोगकर्ता की कहानी दोनों को यहाँ साझा करने का निर्णय लिया।

यदि आप क्लेमेबल बैलेंस जाल में फंस जाते हैं तो क्या करें

यदि शामिल वॉलेट्स में से कम से कम एक — या तो भेजने वाले का या प्राप्तकर्ता का — पूरी तरह से फंड के मालिक द्वारा नियंत्रित है, तो स्थिति अपेक्षाकृत सरल है:

  • प्राप्तकर्ता अपने वॉलेट में XLM की एक छोटी राशि जोड़ सकता है, आवश्यक ट्रस्टलाइन बना सकता है, और फिर क्लेमेबल बैलेंस क्लेम कर सकता है।
  • भेजने वाला एक ही ऑपरेशन के साथ क्लेमेबल बैलेंस को वापस प्राप्त (reclaim) कर सकता है और फिर फंड को एक अलग प्राप्तकर्ता पते पर फिर से भेज सकता है — जो टोकन प्राप्त करने के लिए उचित रूप से तैयार हो।

हालांकि, जब कस्टोडियल वॉलेट शामिल होते हैं — उदाहरण के लिए, CEX वॉलेट — चीजें बहुत अधिक जटिल हो जाती हैं।

कस्टोडियल सेवाएं उपयोगकर्ता की गलती को ठीक करने के लिए अपने वॉलेट इंफ्रास्ट्रक्चर में मैन्युअल रूप से हस्तक्षेप करने के लिए बाध्य नहीं हैं, खासकर यदि ऐसा करने से अतिरिक्त परिचालन या सुरक्षा जोखिम पैदा होते हैं। परिणामस्वरूप, आपको सहायता देने से मना किया जा सकता है, भले ही फंड तकनीकी रूप से अभी भी लेजर पर मौजूद हों।

उसके बावजूद, कोशिश करना अभी भी सार्थक है। जब तक एक्सचेंज निजी चाबियों (private keys) को नियंत्रित करता है, तब तक फंड की रिकवरी की संभावना बनी रहती है

यदि आप खुद को इस स्थिति में पाते हैं:

  • मामले को यथासंभव दृश्यमान बनाएं। इसके बारे में X, LinkedIn, या Medium पर लिखें। आधिकारिक खातों को टैग करें। प्रतिष्ठा $1,000 से अधिक मूल्यवान है।
  • इंजीनियरों की भाषा में बात करें। आपकी रिक्वेस्ट कुछ इस तरह होनी चाहिए: “My transaction resulted in a Claimable Balance Entry with ID […]. The funds are recorded on the ledger and controlled by your wallet’s private key. Please escalate this ticket to the engineering or DevOps team so they can verify ownership and perform a claim_claimable_balance operation. I am willing to pay a recovery fee.”
  • समुदाय (community) तक पहुँचें। स्टेलर इकोसिस्टम में एक बहुत ही जुड़ा हुआ डेवलपर समुदाय है। कभी-कभी डिस्कॉर्ड या अन्य प्लेटफार्मों पर सार्वजनिक चर्चा उन लोगों का ध्यान आकर्षित करती है जो व्यक्तिगत रूप से प्रमुख एक्सचेंजों के पीछे की तकनीकी टीमों को जानते हैं।

अंततः, सबसे अच्छा समाधान अभी भी रोकथाम ही है। अपना स्वयं का कस्टोडियन होने के कई फायदे हैं, लेकिन यह बड़ी जिम्मेदारी के साथ भी आता है। क्रिप्टोकरेंसी भेजते समय, बारीकियों पर ध्यान देना मायने रखता है, क्योंकि कुछ गलतियाँ करना जितना आसान है, उन्हें सुधारना उतना ही कठिन।