अचूकता कमी होणे (Precision Loss) आणि राउंडिंगमधील त्रुटींचा फायदा घेणे (Rounding Exploits)
स्मार्ट कॉन्ट्रॅक्ट्समध्ये पैसे गमावण्यासाठी ॲक्सेस कंट्रोलमध्ये (access control) त्रुटी असणे आवश्यक नाही.
कधीकधी ही त्रुटी एका साध्या भागाकारामध्ये लपलेली असते.
आर्थिक स्मार्ट कॉन्ट्रॅक्ट्स पूर्णांक अंकगणित (integer arithmetic) वापरतात. अपूर्णांक काढून टाकले जातात. राउंडिंगची ही दिशा मूल्य कोणाला मिळते हे ठरवते. एका युनिटची चूक हजारो व्यवहारांमध्ये पुन्हा पुन्हा होऊ शकते.
आर्थिक प्रोटोकॉलमध्ये, राउंडिंग हे मूल्य-हस्तांतरण धोरण (value-transfer policy) असते.
प्रत्येक भागाकाराने तीन प्रश्नांची उत्तरे देणे आवश्यक आहे:
- गणना कोणत्या दिशेने राउंड होते?
- त्या दिशेचा फायदा कोणत्या पक्षाला होतो?
- एखादा अटॅकर त्या फायद्याची पुनरावृत्ती किंवा वाढ करू शकतो का?
सामान्य गणितीय त्रुटींमध्ये खालील गोष्टींचा समावेश होतो:
खूप लवकर भागाकार करणे जर तुम्ही गुणाकार करण्यापूर्वी भागाकार केला, तर तुम्ही अचूकता (precision) गमावता. उदाहरण:
(amount / 1e18) * rate. गुणाकार होण्यापूर्वीच मध्यवर्ती भागाकार डेटा काढून टाकतो. नियम: नेहमी भागाकार करण्यापूर्वी गुणाकार करा.मध्यवर्ती ओव्हरफ्लो (Intermediate overflows) गुणाकार आधी केल्यामुळे ओव्हरफ्लो होऊ शकतो, जरी अंतिम निकाल
uint256मध्ये बसत असला तरीही. पूर्ण-अचूकता असलेला गुणाकार आणि भागाकार एकाच टप्प्यात करण्यासाठी OpenZeppelin Math सारखी लायब्ररी वापरा.चुकीच्या दिशेने राउंडिंग करणे राउंडिंग ही केवळ सूचना नाही, तर तो एक सुरक्षा नियम आहे. एक सावध प्रोटोकॉल खालील तत्त्वांचे पालन करतो:
- कर्ज (debt) वरच्या दिशेने राउंड करा.
- आवश्यक देयके (payments) वरच्या दिशेने राउंड करा.
- तारण मूल्य (collateral value) खालच्या दिशेने राउंड करा.
- वापरकर्त्यांना दिली जाणारी मालमत्ता (assets) खालच्या दिशेने राउंड करा.
- वापरकर्त्यांकडून आकारले जाणारे शेअर्स (shares) वरच्या दिशेने राउंड करा.
जेव्हा अचूक निकाल मिळवणे अशक्य असते, तेव्हा मूल्य काढण्याचा प्रयत्न करणाऱ्या पक्षाच्या विरुद्ध (म्हणजेच त्यांच्या नुकसानीसाठी) राउंड करा.
इन्फ्लेशन अटॅक्स (Inflation attacks) कमी लिक्विडिटी असलेल्या व्हॉल्ट्समध्ये (vaults), अटॅकर्स एक्सचेंज रेटमध्ये फेरफार करण्यासाठी देणग्यांचा वापर करू शकतात. ते शेअर्सची संख्या न वाढवता एकूण मालमत्तेची संख्या वाढवण्यासाठी मालमत्ता दान करतात. यामुळे नवीन ठेवींचे शेअर्स शून्य राउंड होतात. उपाय (Mitigation): स्थिर सुरुवातीचा दर प्रस्थापित करण्यासाठी व्हर्च्युअल मालमत्ता किंवा शेअर्स वापरा.
फ्रिक्वेन्सी अटॅक्स (Frequency attacks) जर व्याज प्रत्येक ब्लॉकवर जमा होत असेल आणि खालच्या दिशेने राउंड होत असेल, तर अटॅकर व्याज शून्य ठेवण्यासाठी सतत जमा करण्याची प्रक्रिया (accrual) सुरू ठेवू शकतो. उपाय (Mitigation): उच्च-अचूकता असलेला इंडेक्स वापरा किंवा उर्वरित रक्कम (remainder) पुढे न्या.
सुरक्षित आर्थिक अभियांत्रिकीसाठी (financial engineering) खालील गोष्टी आवश्यक आहेत:
- स्पष्ट युनिट्स आणि डेसिमल स्केल.
- पूर्ण-अचूकता असलेला गुणाकार आणि भागाकार.
- ऑपरेशन-विशिष्ट राउंडिंग.
- उर्वरित रक्कम (remainder) ट्रॅकिंग.
- इनव्हेरिएंट (Invariant) आणि फझ टेस्टिंग (fuzz testing).
गणना पुरेशी जवळची आहे का एवढेच विचारू नका. तर, काढून टाकलेले मूल्य कुठे जाते आणि ते कोणाला मिळते, हे विचारा.
स्रोत: https://dev.to/stablenaira/precision-loss-and-rounding-exploits-in-financial-smart-contracts-4c93