फ्लैश लोन (Flash loans) स्मार्ट कॉन्ट्रैक्ट्स के बीच दिए जाने वाले ऐसे लोन हैं जिन्हें उसी ट्रांजैक्शन (transaction) में वापस चुकाना अनिवार्य होता है। यह लेख ERC 3156 फ्लैश लोन स्पेसिफिकेशन के साथ-साथ उन तरीकों का वर्णन करता है जिनसे फ्लैश लेंडर्स (lenders) और बॉरोअर्स (borrowers) को हैक किया जा सकता है। अंत में कुछ सुझाई गई सिक्योरिटी एक्सरसाइज़ (security exercises) भी दी गई हैं।
नीचे एक फ्लैश लोन का अत्यंत सरल उदाहरण दिया गया है।

यदि बॉरोअर (borrower) लोन वापस नहीं चुकाता है, तो “flash not paid back” मैसेज वाले require स्टेटमेंट के कारण पूरा ट्रांजैक्शन revert हो जाएगा।
केवल कॉन्ट्रैक्ट्स ही फ्लैश लोन के साथ काम कर सकते हैं
एक EOA वॉलेट किसी फ़ंक्शन को कॉल करके फ्लैश लोन प्राप्त करने और फिर उसी ट्रांजैक्शन में टोकन वापस ट्रांसफर करने का काम नहीं कर सकता है। फ्लैश लोन के साथ इंटीग्रेशन के लिए एक अलग स्मार्ट कॉन्ट्रैक्ट की आवश्यकता होती है।
फ्लैश लोन के लिए कोलैटरल (collateral) की आवश्यकता नहीं होती है
यदि किसी फ्लैश लोन को सही ढंग से इम्प्लीमेंट (implement) किया गया है (जो कि एक बहुत बड़ी शर्त है!), तो लोन वापस न मिलने का कोई जोखिम नहीं होता, क्योंकि एक revert या फेल हुआ require स्टेटमेंट ट्रांजैक्शन को फेल कर देगा, और Ether ट्रांसफर नहीं होगा।
फ्लैश लोन का उपयोग किस लिए किया जाता है?
आर्बिट्राज (Arbitrage)
फ्लैश लोन का सबसे आम उपयोग आर्बिट्राज (arbitrage) ट्रेड करना है। उदाहरण के लिए, यदि Ether एक पूल में $1,200 पर ट्रेड कर रहा है और दूसरे DeFi एप्लिकेशन में $1,300 पर, तो पहले पूल में Ether खरीदना और उसे दूसरे पूल में $100 के लाभ के लिए बेचना फायदेमंद होगा। हालाँकि, शुरुआत में Ether खरीदने के लिए आपके पास पैसे होने चाहिए। इसके लिए फ्लैश लोन एक आदर्श समाधान है, क्योंकि आपको अपनी जेब से $1,200 खर्च करने की आवश्यकता नहीं है। आप $1,200 मूल्य का Ether उधार ले सकते हैं, उसे $1,300 में बेच सकते हैं, और अपने लिए $100 का लाभ (फीस घटाकर) रखते हुए $1,200 वापस चुका सकते हैं।
लोन रीफाइनेंसिंग (Refinancing Loans)
नियमित DeFi लोन के लिए, आमतौर पर किसी प्रकार के कोलैटरल (collateral) की आवश्यकता होती है। उदाहरण के लिए, यदि आप स्टेबल कॉइन (stable coins) में $10,000 उधार ले रहे थे, तो आपको कोलैटरल के रूप में $15,000 का Ether जमा करना होगा।
यदि आपके स्टेबल कॉइन लोन पर 5% ब्याज था और आप किसी अन्य लेंडिंग (lending) स्मार्ट कॉन्ट्रैक्ट के साथ 4% पर रीफाइनेंस करना चाहते थे, तो आपको निम्नलिखित कदम उठाने होंगे:
- स्टेबल कॉइन में $10,000 वापस चुकाने होंगे
- $15,000 का Ether कोलैटरल निकालना होगा
- $15,000 के Ether कोलैटरल को दूसरे प्रोटोकॉल (protocol) में जमा करना होगा
- कम दर पर फिर से स्टेबल कॉइन में $10,000 उधार लेने होंगे
यदि आपके $10,000 किसी अन्य एप्लिकेशन में फँसे हुए हैं तो यह समस्या पैदा कर सकता है। फ्लैश लोन के साथ, आप अपने स्वयं के किसी भी स्टेबल कॉइन का उपयोग किए बिना कदम 1-4 पूरे कर सकते हैं।
कोलैटरल बदलना (Exchanging collateral)
ऊपर दिए गए उदाहरण में, बॉरोअर कोलैटरल के रूप में $15,000 के Ether का उपयोग कर रहा था। लेकिन मान लें कि प्रोटोकॉल wBTC (wrapped bitcoin) का उपयोग करके कम कोलैटरलाइज़ेशन अनुपात (collateralization ratio) दे रहा है? बॉरोअर मूलधन (principal) के बजाय कोलैटरल को स्वैप (swap) करने के लिए फ्लैश लोन और ऊपर बताए गए चरणों के समान एक प्रक्रिया का उपयोग कर सकता है।
बॉरोअर्स को लिक्विडेट (Liquidate) करना
DeFi लोन के संदर्भ में, यदि कोलैटरल एक निश्चित सीमा से नीचे आ जाता है, तो कोलैटरल को लिक्विडेट किया जा सकता है — यानी लोन की लागत को कवर करने के लिए इसे जबरन बेचा जा सकता है। ऊपर दिए गए उदाहरण में, यदि Ether का मूल्य गिरकर $12,000 हो जाता है, तो प्रोटोकॉल किसी व्यक्ति को $11,500 में Ether खरीदने की अनुमति दे सकता है यदि वह पहले $10,000 का लोन वापस चुका देता है।
एक लिक्विडेटर (liquidator) $10,000 के स्टेबल कॉइन लोन का भुगतान करने और $11,500 प्राप्त करने के लिए फ्लैश लोन का उपयोग कर सकता है। फिर वे इसे स्टेबल कॉइन के लिए किसी अन्य एक्सचेंज पर बेच सकते हैं, और उसके बाद फ्लैश लोन वापस चुका सकते हैं।
अन्य DeFi एप्लिकेशन्स के लिए यील्ड (yield) बढ़ाना
Uniswap और AAVE ट्रेडिंग फीस या लेंडिंग इंट्रेस्ट के माध्यम से डिपॉजिटर्स (depositors) का पैसा कमाते हैं। लेकिन चूँकि उनके पास एक ही स्थान पर इतनी बड़ी मात्रा में पूंजी होती है, इसलिए वे फ्लैश लोन की पेशकश करके भी अतिरिक्त पैसा कमा सकते हैं। इससे पूंजी की दक्षता (efficiency) बढ़ जाती है क्योंकि अब उसी पूंजी के अधिक उपयोग होते हैं।
एक ही ट्रांजैक्शन में लीवरेज लूप (leverage loop) बनाना
कोई भी लेंडिंग प्रोटोकॉल का उपयोग करके लीवरेज्ड लॉन्ग और शॉर्ट (leveraged longs and shorts) प्राप्त कर सकता है। उदाहरण के लिए, ETH पर लीवर्ड लॉन्ग (levered long) जाने के लिए, एक उपयोगकर्ता ETH को लेंडिंग पूल में collateral के रूप में जमा कर सकता है, एक स्टेबल कॉइन उधार ले सकता है, स्टेबल कॉइन को ETH के लिए स्वैप कर सकता है, और फिर ETH को लेंडिंग पूल में जमा कर सकता है और इस प्रक्रिया को दोहराता रह सकता है। कोलैटरल और उधार लिए गए ETH का संयुक्त आकार मूल राशि से अधिक होगा, जिससे बॉरोअर को ETH की कीमत के प्रति अधिक एक्सपोज़र मिलेगा।
ETH पर लीवर्ड शॉर्ट (levered short) जाने के लिए, एक उपयोगकर्ता स्टेबल कॉइन को लेंडिंग पूल में जमा कर सकता है, ETH उधार ले सकता है, ETH को स्टेबल कॉइन के लिए स्वैप कर सकता है, और फिर स्टेबल कॉइन को लेंडिंग पूल में जमा कर सकता है और इस प्रक्रिया को दोहराता रह सकता है। अब उपयोगकर्ता के पास ETH का एक बड़ा कर्ज है जिसे चुकाना आसान हो जाएगा यदि ETH की कीमत गिरती है।
इस तरह से उधार ली जा सकने वाली एसेट्स (assets) की कुल राशि है:
जहाँ वह अधिकतम लोन-टू-वैल्यू (loan-to-value) है जिसे प्रोटोकॉल स्वीकार करेगा। उदाहरण के लिए, यदि प्रोटोकॉल को $800 के ETH उधार लेने के लिए $1000 मूल्य के स्टेबल कॉइन जमा करने की आवश्यकता है, तो LTV है। इस प्रकार, उपयोगकर्ता अपनी जमा राशि के मूल्य के रूप में ETH की कीमत के प्रति गुना तक एक्सपोज़र प्राप्त कर सकता है। अर्थात, वे $1000 के जमा के साथ $5,000 मूल्य के ETH के प्रति एक्सपोज़्ड हो सकते हैं।
इन सभी ट्रांजैक्शन को एक लूप में करने के बजाय, जिसमें काफी गैस (gas) खर्च हो सकती है, कोई व्यक्ति यह कर सकता है:
- $5,000 मूल्य के स्टेबल कॉइन उधार लेने के लिए फ्लैश लोन का उपयोग करें।
- स्टेबल कॉइन को $5,000 मूल्य के ETH में स्वैप करें।
- कोलैटरल के रूप में ETH को लेंडिंग पूल में डालें।
- लेंडिंग पूल से $4,000 मूल्य के स्टेबल कॉइन उधार लें।
- लेंडिंग पूल से उधार लिए गए $4,000 के स्टेबल कॉइन के साथ अपने स्वयं के $1,000 स्टेबल कॉइन जोड़ें और फ्लैश लोन वापस चुकाएं।
अब उपयोगकर्ता के पास कोलैटरल के रूप में $5,000 मूल्य का ETH है और लेंडिंग पूल से उधार लिए गए $4,000 मूल्य के स्टेबल कॉइन हैं।
स्मार्ट कॉन्ट्रैक्ट्स को हैक करना
फ्लैश लोन शायद ब्लैक हैट (black hat) हैकर्स द्वारा प्रोटोकॉल का फायदा उठाने के लिए उनके उपयोग के लिए सबसे प्रसिद्ध हैं। फ्लैश लोन के लिए प्राथमिक अटैक वेक्टर्स (attack vectors) मूल्य में हेरफेर (price manipulation) और गवर्नेंस (वोट) में हेरफेर हैं। अपर्याप्त सुरक्षा वाले DeFi एप्लिकेशन्स पर उपयोग किए जाने पर, फ्लैश लोन हमलावरों को किसी एसेट (asset) को भारी मात्रा में खरीदने और उसकी कीमत बढ़ाने की अनुमति देते हैं, या गवर्नेंस प्रस्ताव (governance proposal) को पास कराने के लिए बड़ी मात्रा में वोटिंग टोकन (voting tokens) प्राप्त करने की सुविधा देते हैं।
जिज्ञासु लोगों के लिए फ्लैश लोन हैक्स की एक सूची नीचे दी गई है। हालांकि, वल्नेरेबिलिटी (Vulnerability) दोनों तरफ होती है। यदि ठीक से इम्प्लीमेंट न किया जाए तो एक फ्लैश लेंडिंग और फ्लैश बॉरोइंग कॉन्ट्रैक्ट में भी पैसे खोने का जोखिम हो सकता है।
फ्लैश लोन हैक्स के उदाहरण
फ्लैश लोन हमले सबसे आम कारनामों (exploits) में से एक हैं, संभवतः इसलिए क्योंकि web2 बैकग्राउंड से आने वाले डेवलपर्स इसके अभ्यस्त नहीं होते हैं। यहाँ कुछ सबसे कुख्यात उदाहरण दिए गए हैं।
rekt.news/deus-dao-rekt/
rekt.news/jimbo-rekt/
rekt.news/platypus-finance-rekt/
rekt.news/beanstalk-rekt/
rekt.news/inverse-rekt2/
प्रोटोकॉल को हैक करने के लिए फ्लैश लोन का उपयोग करना एक अलग विषय है, यह लेख फ्लैश लेंडिंग और बॉरोइंग कॉन्ट्रैक्ट्स के असुरक्षित इम्प्लीमेंटेशन पर केंद्रित है।
ERC3156 प्रोटोकॉल
ERC3156 फ्लैश लोन प्राप्त करने के इंटरफ़ेस (interface) को मानकीकृत (standardize) करने का प्रयास करता है। यद्यपि इसका वर्कफ़्लो (workflow) सीधा है, सटीक इम्प्लीमेंटेशन विवरण निर्धारित करने की आवश्यकता होती है, उदाहरण के लिए, क्या हमें फ़ंक्शन को getFlashLoan, onFlashLoan, या कुछ और कहना चाहिए? और फिर उसे किन पैरामीटर्स (parameters) को स्वीकार करना चाहिए?
ERC3156 रिसीवर स्पेसिफिकेशन (Receiver Specification)
मानक का पहला पहलू वह इंटरफ़ेस है जिसे बॉरोअर को इम्प्लीमेंट करने की आवश्यकता होती है, जिसे नीचे दिखाया गया है। बॉरोअर को केवल एक फ़ंक्शन को इम्प्लीमेंट करने की आवश्यकता होती है।

हम यहाँ फ़ंक्शन आर्गुमेंट्स (arguments) का वर्णन करते हैं:
initiator
यह वह एड्रेस (address) है जिसने फ्लैश लोन शुरू किया था। आप संभवतः यहाँ किसी प्रकार का वैलिडेशन (validation) चाहेंगे ताकि अनट्रस्टेड (untrusted) एड्रेस आपके कॉन्ट्रैक्ट पर फ्लैश लोन शुरू न कर सकें। आमतौर पर, वह एड्रेस आप होंगे, लेकिन आपको ऐसा मान कर नहीं चलना चाहिए!
onFlashLoan फ़ंक्शन को इनिशिएटर द्वारा नहीं, बल्कि फ्लैश लोन कॉन्ट्रैक्ट द्वारा कॉल किए जाने की अपेक्षा की जाती है। आपको यह जांचना चाहिए कि onFlashLoan() फ़ंक्शन के भीतर msg.sender ही फ्लैश लोन कॉन्ट्रैक्ट है क्योंकि यह फ़ंक्शन external है और कोई भी इसे कॉल कर सकता है।
इनिशिएटर msg.sender या फ्लैश लोन कॉन्ट्रैक्ट नहीं है। यह वह एड्रेस है जिसने फ्लैश लेंडिंग कॉन्ट्रैक्ट को रिसीवर के onFlashLoan फ़ंक्शन को कॉल करने के लिए ट्रिगर किया था।
token
यह उस ERC20 टोकन का एड्रेस है जिसे आप उधार ले रहे हैं। फ्लैश लोन की पेशकश करने वाले कॉन्ट्रैक्ट्स आमतौर पर कई ऐसे टोकन रखते हैं जिन्हें वे फ्लैश लोन के रूप में दे सकते हैं। ERC3156 फ्लैश लोन मानक नेटिव Ether को फ्लैश लोन देने का समर्थन नहीं करता है, लेकिन इसे WETH का फ्लैश लोन देकर और बॉरोअर से WETH को अनरैप (unwrap) करवाकर इम्प्लीमेंट किया जा सकता है। चूँकि बॉरोइंग कॉन्ट्रैक्ट जरूरी नहीं कि वह कॉन्ट्रैक्ट हो जिसने फ्लैश लोन देने वाले को कॉल किया था, इसलिए बॉरोइंग कॉन्ट्रैक्ट को यह बताने की आवश्यकता हो सकती है कि कौन सा टोकन फ्लैश लोन पर दिया जा रहा है।
fee
फीस (Fee) वह राशि है जो लोन के लिए शुल्क के रूप में टोकन में चुकाई जानी है। इसे प्रतिशत में नहीं, बल्कि पूर्ण राशि (absolute amount) के रूप में दर्शाया जाता है।
data
यदि आपके फ्लैश लोन रिसीविंग कॉन्ट्रैक्ट को फ्लैश लोन प्राप्त करते समय कोई विशेष कार्रवाई करने के लिए हार्ड कोड (hard coded) नहीं किया गया है, तो आप इसके व्यवहार को data पैरामीटर के साथ पैरामीटराइज़ (parameterize) कर सकते हैं। उदाहरण के लिए, यदि आपका कॉन्ट्रैक्ट ट्रेडिंग पूल में आर्बिट्राज कर रहा है, तो आप निर्दिष्ट करेंगे कि किन पूल्स के साथ ट्रेड करना है।
return value
कॉन्ट्रैक्ट को keccak256("ERC3156FlashBorrower.onFlashLoan") वापस करना अनिवार्य है, जिसके कारणों पर हम बाद में चर्चा करेंगे।
बॉरोअर का रेफरेंस इम्प्लीमेंटेशन (Reference implementation)
कोड स्निपेट (snippet) को छोटा बनाने के लिए इसे ERC 3156 स्पेसिफिकेशन के कोड से मॉडिफाई किया गया है। ध्यान दें कि यह कॉन्ट्रैक्ट अभी भी फ्लैश लेंडर पर पूर्ण विश्वास रख रहा है। यदि फ्लैश लेंडर से किसी तरह समझौता (compromise) किया जाता है, तो नीचे दिए गए कॉन्ट्रैक्ट का गलत amount, fee और initiator डेटा फीड करके शोषण (exploit) किया जा सकता है। यदि लेंडर इम्यूटेबल (immutable) है, तो यह चिंता का विषय नहीं है, लेकिन यदि लेंडर upgradeable है तो यह एक अटैक वेक्टर हो सकता है।

ERC3156 लेंडर स्पेसिफिकेशन (Lender Specification)
नीचे ERC3156 द्वारा निर्दिष्ट लेंडर का इंटरफ़ेस दिया गया है:

ऊपर दिए गए इंटरफ़ेस में आर्गुमेंट्स का वही अर्थ है जो पिछले भाग में वर्णित है, इसलिए इसे यहाँ दोहराया नहीं जाएगा।
flashLoan() फ़ंक्शन को कुछ महत्वपूर्ण ऑपरेशन्स (operations) पूरे करने होते हैं:
- कोई
flashLoan()को ऐसे टोकन के साथ कॉल कर सकता है जिसका समर्थन फ्लैश लोन कॉन्ट्रैक्ट नहीं करता है। इसकी जाँच की जानी चाहिए। - कोई
flashLoan()को ऐसी राशि के साथ कॉल कर सकता है जोmaxFlashLoanसे बड़ी हो। इसकी भी जाँच की जानी चाहिए। dataको सीधे कॉलर को फॉरवर्ड (forward) कर दिया जाता है।
इससे भी महत्वपूर्ण बात यह है कि flashLoan() को टोकन रिसीवर को ट्रांसफर करने और उन्हें वापस ट्रांसफर करने का काम करना चाहिए। इसे रीपेमेंट (repayment) के लिए टोकन वापस ट्रांसफर करने हेतु बॉरोअर पर निर्भर नहीं रहना चाहिए। इसके पीछे का तर्क अगले भाग में चर्चा किया जाएगा। हमने यहाँ रेफरेंस इम्प्लीमेंटेशन की कॉपी की है जो EIP 3156 स्पेसिफिकेशन में पाया जा सकता है, ताकि महत्वपूर्ण हिस्सों पर जोर दिया जा सके:

ध्यान दें कि रेफरेंस इम्प्लीमेंटेशन यह मान रहा है कि ERC20 टोकन सफलता पर true वापस करते हैं, जो सभी नहीं करते हैं, इसलिए यदि नॉन-कंप्लायंट (non-compliant) ERC20 टोकन का उपयोग कर रहे हैं तो SafeTransfer लाइब्रेरी का उपयोग करें।
सुरक्षा संबंधी विचार (Security Considerations)
बॉरोअर के लिए एक्सेस कंट्रोल (Access control) और इनपुट वैलिडेशन
बॉरोइंग स्मार्ट कॉन्ट्रैक्ट में ऐसे कंट्रोल्स होने चाहिए जो केवल फ्लैश लेंडर कॉन्ट्रैक्ट को ही onFlashLoan() का कॉलर (caller) बनने की अनुमति दें। अन्यथा, फ्लैश लेंडर के अलावा कोई अन्य एक्टर onFlashLoan() को कॉल कर सकता है और अप्रत्याशित व्यवहार का कारण बन सकता है।
इसके अलावा, कोई भी किसी भी आर्बिट्रेरी (arbitrary) बॉरोअर को लक्ष्य बनाकर और आर्बिट्रेरी डेटा पास करके flashloan() को कॉल कर सकता है। यह सुनिश्चित करने के लिए कि डेटा दुर्भावनापूर्ण (malicious) नहीं है, एक फ्लैश लोन रिसीवर कॉन्ट्रैक्ट को केवल इनिशिएटर्स के एक प्रतिबंधित सेट (restricted set) को ही अनुमति देनी चाहिए।
रीएंट्रेंसी लॉक्स (Reentrancy locks) बहुत महत्वपूर्ण हैं
परिभाषा के अनुसार ERC 3156 रीएंट्रेंसी को रोकने के लिए चेक-इफेक्ट्स (check effects) पैटर्न का पालन नहीं कर सकता है। इसे बॉरोअर को यह सूचित करना होता है कि उसे टोकन प्राप्त हो गए हैं (एक external कॉल करनी होती है), और फिर टोकन वापस ट्रांसफर करने होते हैं। इसलिए, कॉन्ट्रैक्ट में nonReentrant लॉक्स जोड़े जाने चाहिए।
यह महत्वपूर्ण है कि लेंडर ही टोकन वापस ट्रांसफर करे या फिर रीएंट्रेंसी लॉक्स मौजूद हों।
उपरोक्त इम्प्लीमेंटेशन में, लेंडर बॉरोअर से टोकन वापस ट्रांसफर करता है। बॉरोअर लेंडर को लोन ट्रांसफर नहीं करता है। यह “साइड एंट्रेंस (side entrances)” से बचने के लिए महत्वपूर्ण है जहाँ बॉरोअर लेंडर के रूप में प्रोटोकॉल में पैसा जमा कर देता है। अब पूल देखता है कि उसका बैलेंस पहले जैसा हो गया है, लेकिन बॉरोअर अचानक एक बड़ी जमा राशि के साथ एक लेंडर बन गया है।
UniswapV2 का फ्लैश लोन, फ्लैश लोन समाप्त होने के बाद टोकन वापस ट्रांसफर नहीं करता है। हालाँकि, यह सुनिश्चित करने के लिए एक रीएंट्रेंसी लॉक का उपयोग करता है कि बॉरोअर लोन को प्रोटोकॉल में वापस इस तरह जमा करके “चुका” न सके मानो वह एक लेंडर हो।
बॉरोअर के लिए, सुनिश्चित करें कि केवल फ्लैश लेंडर कॉन्ट्रैक्ट ही onFlashLoan को कॉल कर सके
फ्लैश लेंडर को केवल रिसीवर के onFlashLoan() फ़ंक्शन को कॉल करने के लिए हार्डकोड किया जाता है और किसी अन्य को नहीं। यदि बॉरोअर के पास यह निर्दिष्ट करने का कोई तरीका होता कि फ्लैश लेंडर किस फ़ंक्शन को कॉल करेगा, तो फ्लैश लोन में हेरफेर करके उसके पास मौजूद अन्य टोकन को ट्रांसफर करवाया जा सकता था (जैसे ERC20.transfer को कॉल करके) या उसके टोकन बैलेंस के लिए किसी दुर्भावनापूर्ण एड्रेस को अप्रूवल (approval) दिया जा सकता था।
चूँकि ऐसी कार्रवाइयों के लिए ERC20 transfer या approve को एक स्पष्ट कॉल की आवश्यकता होती है, इसलिए यह तब नहीं हो सकता जब फ्लैश लेंडर केवल onFlashLoan() को कॉल कर सके।
यह एक्सप्लॉयट (exploit) वास्तविक दुनिया में हुआ था, यहाँ Rekt News ने एक MEV bot getting hacked का दस्तावेजीकरण किया है।
token.balanceOf(address(this)) के उपयोग में हेरफेर किया जा सकता है
उपरोक्त इम्प्लीमेंटेशन में, हम अधिकतम फ्लैश लोन आकार निर्धारित करने के अलावा balanceOf(address(this)) का उपयोग नहीं करते हैं। किसी अन्य व्यक्ति द्वारा सीधे कॉन्ट्रैक्ट में टोकन ट्रांसफर करके इसे बदला जा सकता है, जिससे लॉजिक (logic) में बाधा आ सकती है। हमें इस तरह पता चलता है कि फ्लैश लोन वापस कर दिया गया था क्योंकि लेंडर ने लोन राशि + फीस को वापस ट्रांसफर कर लिया। रीपेमेंट की जाँच करने के लिए balanceOf(address(this)) का उपयोग करने के वैध तरीके हैं, लेकिन लोन को जमा (deposit) के रूप में वापस चुकाने से बचने के लिए इसे रीएंट्रेंसी चेक्स (reentrancy checks) के साथ जोड़ा जाना चाहिए।
फ्लैश बॉरोअर को keccak256(“ERC3156FlashBorrower.onFlashLoan”) वापस करने की आवश्यकता क्यों है;
यह उस स्थिति को संभालता है जहाँ फॉलबैक फ़ंक्शन (fallback function) वाले किसी कॉन्ट्रैक्ट (फ्लैश लेंडर कॉन्ट्रैक्ट नहीं) ने फ्लैश लेंडिंग कॉन्ट्रैक्ट को अप्रूवल दिया है। कोई व्यक्ति प्राप्तकर्ता (recipient) के रूप में उस कॉन्ट्रैक्ट के साथ बार-बार फ्लैश लोन शुरू कर सकता है। फिर निम्नलिखित घटना घटेगी:
- पीड़ित (victim) कॉन्ट्रैक्ट को एक फ्लैश लोन मिलता है।
- पीड़ित कॉन्ट्रैक्ट को
onFlashLoan()के साथ कॉल किया जाता है और फॉलबैक फ़ंक्शन ट्रिगर हो जाता है लेकिन वहrevertनहीं होता है। फॉलबैक फ़ंक्शन किसी भी ऐसे फ़ंक्शन कॉल का जवाब देता है जो कॉन्ट्रैक्ट के बाकी फ़ंक्शन्स से मेल नहीं खाता, इसलिए यहonFlashLoan()कॉल का जवाब देगा। - फ्लैश लेंडर बॉरोअर से टोकन + फीस वापस निकाल लेता है।
यदि यह ऑपरेशन एक लूप में होता है, तो फॉलबैक वाला पीड़ित कॉन्ट्रैक्ट पूरी तरह से खाली (drained) हो जाएगा। ऐसा EOA वॉलेट के साथ भी हो सकता है, क्योंकि वॉलेट एड्रेस को onFlashLoan के साथ कॉल करने पर वह revert नहीं होता है।
यह जाँचना पर्याप्त नहीं है कि onFlashLoan फ़ंक्शन revert नहीं होता है। फ्लैश लेंडर यह भी जाँचता है कि keccack256("ERC3156FlashBorrower.onFlashLoan") वैल्यू वापस की गई है ताकि उसे पता चले कि बॉरोअर का इरादा टोकन उधार लेने और फीस वापस चुकाने का था।
फ्लैश लोन से संबंधित प्रैक्टिस प्रॉब्लम्स (Practice Problems)
DamnVulnerableDeFi और Mr Steal Yo Crypto की निम्नलिखित समस्याएँ आपको ऊपर बताए गए अटैक वेक्टर्स का अभ्यास करने में मदद कर सकती हैं। फ्लैश लोन को समझने के सर्वोत्तम तरीकों में से एक यह सीखना है कि उन्हें इम्प्लीमेंट करते समय क्या नहीं करना चाहिए।
- Naive Receiver (आपका लक्ष्य बॉरोअर को खाली करना है, फ्लैश लेंडर को नहीं)
- Side Entrance
- Truster
ERC 4626 के अपने ज्ञान को ताज़ा (Brush up) करें और फिर इन समस्याओं का अभ्यास करें:
- Unstoppable (यह थोड़ा कठिन है, इसलिए इसे सबसे अंत में करें। आपका लक्ष्य कॉन्ट्रैक्ट को ब्रिक (brick) करना है, फंड्स चुराना नहीं)।
- Flash Loaner (Mr Steal Yo Crypto से। सुनिश्चित करें कि आप ERC 4626 को समझते हैं)
ये सभी समस्याएँ लेंडर या बॉरोअर को हैक करने से संबंधित हैं, न कि किसी अन्य चीज़ को हैक करने के लिए फ्लैश लोन का उपयोग करने से।
RareSkills के साथ और जानें
यह सामग्री हमारे एडवांस Solidity Bootcamp का हिस्सा है। अधिक जानने के लिए कृपया प्रोग्राम देखें।
मूल रूप से 7 नवंबर, 2023 को प्रकाशित