துல்லிய இழப்பு மற்றும் ரவுண்டிங் சுரண்டல்கள் (Precision Loss and Rounding Exploits)
பணம் இழக்க ஸ்மார்ட் ஒப்பந்தங்களுக்கு (smart contracts) அணுகல் கட்டுப்பாட்டில் (access control) பிழை இருக்க வேண்டிய அவசியமில்லை.
சில நேரங்களில், ஒரு சாதாரண வகுத்தல் செயல்பாட்டிலேயே சுரண்டல் மறைந்திருக்கக்கூடும்.
நிதி சார்ந்த ஸ்மார்ட் ஒப்பந்தங்கள் முழு எண் கணிதத்தைப் (integer arithmetic) பயன்படுத்துகின்றன. பின்னங்கள் (fractions) நீக்கப்படுகின்றன. இந்த ரவுண்டிங் திசை (rounding direction) மதிப்பைப் பெறுபவரை மாற்றியமைக்கிறது. ஒரு யூனிட் பிழை ஆயிரக்கணக்கான பரிவர்த்தனைகளில் மீண்டும் மீண்டும் நிகழக்கூடும்.
ஒரு நிதி நெறிமுறையில் (financial protocol), ரவுண்டிங் என்பது ஒரு மதிப்பு-மாற்றக் கொள்கையாகும் (value-transfer policy).
ஒவ்வொரு வகுத்தலும் மூன்று கேள்விகளுக்குப் பதிலளிக்க வேண்டும்:
- கணக்கீடு எந்தத் திசையில் ரவுண்ட் செய்யப்படுகிறது?
- அந்தத் திசையினால் எந்தத் தரப்பினர் பயனடைகிறார்கள்?
- ஒரு தாக்குதல் நடத்துபவர் அந்தச் சாதகத்தைப் பயன்படுத்திக் கொள்ளவோ அல்லது அதிகரிக்கவோ முடியுமா?
பொதுவான கணிதப் பிழைகள் பின்வருமாறு:
மிக விரைவாக வகுத்தல் நீங்கள் பெருக்குவதற்கு முன்பே வகுத்தால், துல்லியத்தை இழப்பீர்கள். உதாரணம்:
(amount / 1e18) * rate. இடைநிலை வகுத்தல் (intermediate division), பெருக்குவதற்கு முன்பே தரவை நீக்கிவிடுகிறது. விதி: எப்போதும் வகுப்பதற்கு முன் பெருக்குங்கள்.இடைநிலை ஓவர்ஃப்ளோக்கள் (Intermediate overflows) இறுதி முடிவு ஒரு
uint256-க்குள் அடங்கினாலும், முதலில் பெருக்குவது ஓவர்ஃப்ளோவை ஏற்படுத்தக்கூடும். முழுத் துல்லியமான பெருக்கல் மற்றும் வகுத்தலை ஒரே படியில் செய்ய OpenZeppelin Math போன்ற ஒரு நூலகத்தைப் (library) பயன்படுத்தவும்.தவறான திசையில் ரவுண்டிங் செய்தல் ரவுண்டிங் என்பது ஒரு பரிந்துரை அல்ல. அது ஒரு பாதுகாப்பு விதி. ஒரு பாதுகாப்பான நெறிமுறை (conservative protocol) இந்தத் தத்துவங்களைப் பின்பற்றுகிறது:
- கடனை (debt) மேல்நோக்கி ரவுண்ட் செய்யவும்.
- செலுத்த வேண்டிய தொகையை (required payments) மேல்நோக்கி ரவுண்ட் செய்யவும்.
- பிணைய மதிப்பை (collateral value) கீழ்நோக்கி ரவுண்ட் செய்யவும்.
- பயனர்களுக்கு வழங்கப்படும் சொத்துக்களை (assets) கீழ்நோக்கி ரவுண்ட் செய்யவும்.
- பயனர்களிடம் வசூலிக்கப்படும் பங்குகளை (shares) மேல்நோக்கி ரவுண்ட் செய்யவும்.
துல்லியமான முடிவைப் பெறுவது சாத்தியமில்லாத போது, மதிப்பை எடுக்க முயற்சிக்கும் தரப்பிற்கு எதிராக ரவுண்ட் செய்யவும்.
பணவீக்கத் தாக்குதல்கள் (Inflation attacks) குறைந்த நீர்மைத்தன்மை (low liquidity) கொண்ட சேமிப்பு அறைகளில் (vaults), தாக்குதல் நடத்துபவர்கள் பரிமாற்ற விகிதங்களை (exchange rates) மாற்றியமைக்க நன்கொடைகளைப் பயன்படுத்தலாம். அவர்கள் பங்குகளை (shares) அதிகரிக்காமல், மொத்த சொத்து எண்ணிக்கையை அதிகரிக்க சொத்துக்களை நன்கொடையாக வழங்குகிறார்கள். இது புதிய டெபாசிட்கள் பூஜ்ஜியப் பங்குகளாக ரவுண்ட் செய்யப்படக் காரணமாகிறது. தணிப்பு (Mitigation): நிலையான ஆரம்ப விகிதத்தை உருவாக்க மெய்நிகர் சொத்துக்கள் (virtual assets) அல்லது பங்குகளைப் பயன்படுத்தவும்.
அதிர்வெண் தாக்குதல்கள் (Frequency attacks) வட்டி ஒவ்வொரு பிளாக்கிலும் (block) கணக்கிடப்பட்டு கீழ்நோக்கி ரவுண்ட் செய்யப்பட்டால், வட்டி பூஜ்ஜியமாகவே இருக்க ஒரு தாக்குதல் நடத்துபவர் தொடர்ந்து வட்டி கணக்கீட்டைத் தூண்டலாம். தணிப்பு (Mitigation): உயர் துல்லியமான குறியீட்டைப் (high-precision index) பயன்படுத்தவும் அல்லது மீதமுள்ள மதிப்பைக் (remainder) அடுத்த கட்டத்திற்கு எடுத்துச் செல்லவும்.
பாதுகாப்பான நிதிப் பொறியியலுக்கு (financial engineering) இவை தேவை:
- தெளிவான அலகுகள் மற்றும் தசம அளவீடுகள் (decimal scales).
- முழுத் துல்லியமான பெருக்கல் மற்றும் வகுத்தல்.
- செயல்பாட்டிற்குத் தேவையானது போன்ற ரவுண்டிங் (Operation-specific rounding).
- மீதமுள்ள மதிப்பைக் கண்காணித்தல் (Remainder tracking).
- Invariant மற்றும் fuzz சோதனை.
ஒரு கணக்கீடு போதுமான அளவு நெருக்கமாக இருக்கிறதா என்று மட்டும் கேட்காதீர்கள். நீக்கப்பட்ட மதிப்பு எங்கே செல்கிறது மற்றும் அதை யார் பெறுகிறார்கள் என்று கேளுங்கள்.
ஆதாரம்: https://dev.to/stablenaira/precision-loss-and-rounding-exploits-in-financial-smart-contracts-4c93