प्रिसिजन लॉस और राउंडिंग एक्सप्लॉइट्स

स्मार्ट कॉन्ट्रैक्ट्स को पैसा खोने के लिए एक्सेस कंट्रोल में बग की आवश्यकता नहीं होती है।

कभी-कभी एक्सप्लॉइट एक साधारण विभाजन (division) में छिपा होता है।

वित्तीय स्मार्ट कॉन्ट्रैक्ट्स पूर्णांक अंकगणित (integer arithmetic) का उपयोग करते हैं। भिन्नों (fractions) को छोड़ दिया जाता है। राउंडिंग की यह दिशा यह तय करती है कि वैल्यू किसे प्राप्त होती है। एक यूनिट की त्रुटि हजारों लेनदेन में दोहराई जा सकती है।

एक वित्तीय प्रोटोकॉल में, राउंडिंग एक वैल्यू-ट्रांसफर पॉलिसी है।

प्रत्येक विभाजन को तीन प्रश्नों के उत्तर देने चाहिए:

  • गणना किस दिशा में राउंड होती है?
  • उस दिशा से किस पक्ष को लाभ होता है?
  • क्या कोई हमलावर उस लाभ को दोहरा या बढ़ा सकता है?

सामान्य गणितीय त्रुटियों में शामिल हैं:

  1. बहुत जल्दी विभाजित करना (Dividing too early) यदि आप गुणा करने से पहले विभाजित करते हैं, तो आप प्रिसिजन खो देते हैं। उदाहरण: (amount / 1e18) * rate। मध्यवर्ती विभाजन (intermediate division) गुणा होने से पहले डेटा को हटा देता है। नियम: हमेशा विभाजित करने से पहले गुणा करें।

  2. इंटरमीडिएट ओवरफ्लो (Intermediate overflows) पहले गुणा करने से ओवरफ्लो हो सकता है, भले ही अंतिम परिणाम uint256 में फिट हो जाए। फुल-प्रिसिजन गुणा और विभाजन एक ही चरण में करने के लिए OpenZeppelin Math जैसी लाइब्रेरी का उपयोग करें।

  3. गलत दिशा में राउंडिंग (Rounding in the wrong direction) राउंडिंग कोई सुझाव नहीं है। यह एक सुरक्षा नियम है। एक रूढ़िवादी (conservative) प्रोटोकॉल इन सिद्धांतों का पालन करता है:

  • कर्ज (debt) को ऊपर की ओर (upward) राउंड करें।
  • आवश्यक भुगतानों को ऊपर की ओर राउंड करें।
  • कोलैटरल वैल्यू को नीचे की ओर (downward) राउंड करें।
  • उपयोगकर्ताओं को भुगतान की जाने वाली संपत्ति को नीचे की ओर राउंड करें।
  • उपयोगकर्ताओं से लिए जाने वाले शेयर्स को ऊपर की ओर राउंड करें।

जब सटीक परिणाम असंभव हो, तो उस पक्ष के विरुद्ध राउंड करें जो वैल्यू निकालने की कोशिश कर रहा है।

  1. इन्फ्लेशन अटैक (Inflation attacks) कम लिक्विडिटी वाले वॉल्ट्स में, हमलावर एक्सचेंज रेट को मैनिपुलेट करने के लिए डोनेशन का उपयोग कर सकते हैं। वे शेयर काउंट बढ़ाए बिना कुल संपत्ति की संख्या बढ़ाने के लिए संपत्ति दान करते हैं। इससे नए डिपॉजिट्स राउंड डाउन होकर शून्य शेयर हो जाते हैं। शमन (Mitigation): एक स्थिर प्रारंभिक दर स्थापित करने के लिए वर्चुअल एसेट्स या शेयर्स का उपयोग करें।

  2. फ्रीक्वेंसी अटैक (Frequency attacks) यदि ब्याज हर ब्लॉक में जमा (accrue) होता है और राउंड डाउन होता है, तो एक हमलावर ब्याज को शून्य रखने के लिए लगातार जमा प्रक्रिया को ट्रिगर कर सकता है। शमन (Mitigation): एक हाई-प्रिसिजन इंडेक्स का उपयोग करें या शेष राशि (remainder) को आगे बढ़ाएं।

सुरक्षित वित्तीय इंजीनियरिंग के लिए आवश्यक है:

  • स्पष्ट इकाइयाँ और डेसिमल स्केल।
  • फुल-प्रिसिजन गुणा और विभाजन।
  • ऑपरेशन-विशिष्ट राउंडिंग।
  • शेष राशि (remainder) की ट्रैकिंग।
  • इनवेरिएंट (Invariant) और फज़ (fuzz) टेस्टिंग।

केवल यह न पूछें कि क्या गणना पर्याप्त रूप से करीब है। यह पूछें कि छोड़ी गई वैल्यू कहाँ जाती है और इसे कौन प्राप्त करता है।

स्रोत: https://dev.to/stablenaira/precision-loss-and-rounding-exploits-in-financial-smart-contracts-4c93