திறன் ஒப்பந்தப் பாதுகாப்பு
திறன் ஒப்பந்தங்கள் மிகவும் நெகிழ்வானவை, மேலும் தொகுதிச்சங்கிலியில் நிலைநிறுத்தப்பட்ட குறியீட்டின் அடிப்படையில் மாற்றவியலாத தர்க்கத்தை இயக்கும் அதே வேளையில், அதிக அளவிலான மதிப்பையும் தரவையும் கட்டுப்படுத்தும் திறன் கொண்டவை. இது மரபுவழி அமைப்புகளை விட பல நன்மைகளை வழங்கும் நம்பிக்கை தேவையில்லாத மற்றும் பரவலாக்கப்பட்ட பயன்பாடுகளின் துடிப்பான சுற்றுச்சூழல் அமைப்பை உருவாக்கியுள்ளது. திறன் ஒப்பந்தங்களில் உள்ள பாதிப்புகளைப் பயன்படுத்தி லாபம் ஈட்ட விரும்பும் தாக்குபவர்களுக்கான வாய்ப்புகளையும் அவை பிரதிபலிக்கின்றன.
எத்திரியம் போன்ற பொதுத் தொகுதிச்சங்கிலிகள், திறன் ஒப்பந்தங்களைப் பாதுகாக்கும் சிக்கலை மேலும் கடினமாக்குகின்றன. நிலைநிறுத்தப்பட்ட ஒப்பந்தக் குறியீட்டைப் பாதுகாப்புப் பிழைகளைச் சரிசெய்ய பொதுவாக மாற்ற முடியாது, அதே நேரத்தில் திறன் ஒப்பந்தங்களிலிருந்து திருடப்பட்ட சொத்துக்களைக் கண்காணிப்பது மிகவும் கடினம் மற்றும் மாற்றவியலாமை காரணமாக பெரும்பாலும் மீட்டெடுக்க முடியாதவை.
புள்ளிவிவரங்கள் மாறுபட்டாலும், திறன் ஒப்பந்தங்களில் உள்ள பாதுகாப்பு குறைபாடுகள் காரணமாக திருடப்பட்ட அல்லது இழந்த மதிப்பின் மொத்த அளவு எளிதாக $1 பில்லியனுக்கும் அதிகமாக இருக்கும் என்று மதிப்பிடப்பட்டுள்ளது. இதில் DAO ஊடுருவல் (opens in a new tab) (3.6 மில்லியன் ETH திருடப்பட்டது, இன்றைய விலையில் இதன் மதிப்பு $1 பில்லியனுக்கும் மேல்), Parity பல்கையெழுத்துப் பணப்பை ஊடுருவல் (opens in a new tab) (ஹேக்கர்களிடம் $30 மில்லியன் இழப்பு), மற்றும் Parity முடக்கப்பட்ட பணப்பைச் சிக்கல் (opens in a new tab) (என்றென்றும் முடக்கப்பட்ட $300 மில்லியனுக்கும் அதிகமான ETH) போன்ற உயர்மட்ட சம்பவங்களும் அடங்கும்.
மேற்கூறிய சிக்கல்கள், பாதுகாப்பான, வலுவான மற்றும் மீள்திறன் கொண்ட திறன் ஒப்பந்தங்களை உருவாக்குவதில் உருவாக்குநர்கள் முயற்சி எடுப்பதை அவசியமாக்குகின்றன. திறன் ஒப்பந்தப் பாதுகாப்பு என்பது ஒரு தீவிரமான விஷயமாகும், மேலும் ஒவ்வொரு உருவாக்குநரும் இதைக் கற்றுக்கொள்வது நல்லது. இந்த வழிகாட்டி எத்திரியம் உருவாக்குநர்களுக்கான பாதுகாப்புக் கருத்தாய்வுகளை உள்ளடக்கும் மற்றும் திறன் ஒப்பந்தப் பாதுகாப்பை மேம்படுத்துவதற்கான ஆதாரங்களை ஆராயும்.
முன்தேவைகள்
பாதுகாப்பு குறித்து அறிவதற்கு முன், திறன் ஒப்பந்த மேம்பாட்டின் அடிப்படைகளை நீங்கள் நன்கு அறிந்திருப்பதை உறுதிசெய்து கொள்ளவும்.
பாதுகாப்பான எத்திரியம் திறன் ஒப்பந்தங்களை உருவாக்குவதற்கான வழிகாட்டுதல்கள்
1. சரியான அணுகல் கட்டுப்பாடுகளை வடிவமைக்கவும்
திறன் ஒப்பந்தங்களில், public அல்லது external எனக் குறிக்கப்பட்ட சார்புகளை (functions) எந்தவொரு வெளிப்புறமாகச் சொந்தமான கணக்குகள் (externally owned accounts - EOAs) அல்லது ஒப்பந்தக் கணக்குகளாலும் அழைக்க முடியும். மற்றவர்கள் உங்கள் ஒப்பந்தத்துடன் தொடர்பு கொள்ள வேண்டுமெனில், சார்புகளுக்கு பொதுவான (public) தெரிவுநிலையைக் குறிப்பிடுவது அவசியமாகும். இருப்பினும், private எனக் குறிக்கப்பட்ட சார்புகளை திறன் ஒப்பந்தத்திற்குள் உள்ள சார்புகளால் மட்டுமே அழைக்க முடியும், வெளிப்புறக் கணக்குகளால் அல்ல. ஒவ்வொரு பிணையம் பங்கேற்பாளருக்கும் ஒப்பந்தச் சார்புகளுக்கான அணுகலை வழங்குவது சிக்கல்களை ஏற்படுத்தலாம், குறிப்பாக எவரும் முக்கியமான செயல்பாடுகளைச் செய்ய முடியும் (எ.கா., புதிய வில்லைகளை அச்சிடுதல்) என்றால்.
திறன் ஒப்பந்தச் சார்புகளின் அங்கீகரிக்கப்படாத பயன்பாட்டைத் தடுக்க, பாதுகாப்பான அணுகல் கட்டுப்பாடுகளைச் செயல்படுத்துவது அவசியமாகும். அணுகல் கட்டுப்பாட்டு வழிமுறைகள், திறன் ஒப்பந்தத்தில் உள்ள சில சார்புகளைப் பயன்படுத்தும் திறனை, ஒப்பந்தத்தை நிர்வகிக்கும் பொறுப்புள்ள கணக்குகள் போன்ற அங்கீகரிக்கப்பட்ட நிறுவனங்களுக்கு மட்டுமே கட்டுப்படுத்துகின்றன. திறன் ஒப்பந்தங்களில் அணுகல் கட்டுப்பாட்டைச் செயல்படுத்த உரிமையாளர் முறை (Ownable pattern) மற்றும் பங்கு அடிப்படையிலான கட்டுப்பாடு (role-based control) ஆகிய இரண்டு முறைகள் பயனுள்ளதாக இருக்கும்:
உரிமையாளர் முறை (Ownable pattern)
உரிமையாளர் முறையில், ஒப்பந்தத்தை உருவாக்கும் செயல்முறையின் போது ஒரு முகவரி ஒப்பந்தத்தின் "உரிமையாளர்" ஆக அமைக்கப்படுகிறது. பாதுகாக்கப்பட்ட சார்புகளுக்கு OnlyOwner மாற்றியமைப்பான் (modifier) ஒதுக்கப்படுகிறது, இது சார்பை இயக்குவதற்கு முன்பு அழைக்கும் முகவரியின் அடையாளத்தை ஒப்பந்தம் அங்கீகரிப்பதை உறுதி செய்கிறது. ஒப்பந்த உரிமையாளரைத் தவிர மற்ற முகவரிகளிலிருந்து பாதுகாக்கப்பட்ட சார்புகளுக்கான அழைப்புகள் எப்போதும் மீளமைக்கப்படும் (revert), இது தேவையற்ற அணுகலைத் தடுக்கிறது.
பங்கு அடிப்படையிலான அணுகல் கட்டுப்பாடு
ஒரு திறன் ஒப்பந்தத்தில் ஒற்றை முகவரியை Owner ஆகப் பதிவு செய்வது மையப்படுத்தலின் அபாயத்தை அறிமுகப்படுத்துகிறது மற்றும் இது ஒற்றை தோல்விப் புள்ளியைக் (single point-of-failure) குறிக்கிறது. உரிமையாளரின் கணக்குத் திறவுகோல்கள் சமரசம் செய்யப்பட்டால், தாக்குபவர்கள் அந்த ஒப்பந்தத்தைத் தாக்கலாம். இதனால்தான் பல நிர்வாகக் கணக்குகளுடன் பங்கு அடிப்படையிலான அணுகல் கட்டுப்பாட்டு முறையைப் பயன்படுத்துவது சிறந்த தேர்வாக இருக்கலாம்.
பங்கு அடிப்படையிலான அணுகல் கட்டுப்பாட்டில், முக்கியமான சார்புகளுக்கான அணுகல் நம்பகமான பங்கேற்பாளர்களின் தொகுப்பிற்கு இடையே விநியோகிக்கப்படுகிறது. எடுத்துக்காட்டாக, ஒரு கணக்கு வில்லைகளை அச்சிடுவதற்குப் பொறுப்பாக இருக்கலாம், அதே சமயம் மற்றொரு கணக்கு மேம்படுத்தல்களைச் செய்யலாம் அல்லது ஒப்பந்தத்தை இடைநிறுத்தலாம். இந்த வழியில் அணுகல் கட்டுப்பாட்டைப் பரவலாக்குவது ஒற்றை தோல்விப் புள்ளிகளை நீக்குகிறது மற்றும் பயனர்களுக்கான நம்பிக்கை அனுமானங்களைக் குறைக்கிறது.
பல்கையெழுத்துப் பணப்பைகளைப் பயன்படுத்துதல்
பாதுகாப்பான அணுகல் கட்டுப்பாட்டைச் செயல்படுத்துவதற்கான மற்றொரு அணுகுமுறை, ஒப்பந்தத்தை நிர்வகிக்க ஒரு பல்கையெழுத்துக் கணக்கைப் பயன்படுத்துவதாகும். வழக்கமான EOA-ஐப் போலல்லாமல், பல்கையெழுத்துக் கணக்குகள் பல நிறுவனங்களுக்குச் சொந்தமானவை மற்றும் பரிவர்த்தனைகளைச் செயல்படுத்த குறைந்தபட்ச எண்ணிக்கையிலான கணக்குகளிலிருந்து (உதாரணமாக 5-இல் 3) கையொப்பங்கள் தேவைப்படுகின்றன.
அணுகல் கட்டுப்பாட்டிற்கு பல்கையெழுத்தைப் பயன்படுத்துவது கூடுதல் பாதுகாப்பு அடுக்கை அறிமுகப்படுத்துகிறது, ஏனெனில் இலக்கு ஒப்பந்தத்தின் மீதான செயல்களுக்கு பல தரப்பினரின் ஒப்புதல் தேவைப்படுகிறது. உரிமையாளர் முறையைப் பயன்படுத்துவது அவசியமானால் இது மிகவும் பயனுள்ளதாக இருக்கும், ஏனெனில் இது தாக்குபவர் அல்லது முரட்டுத்தனமான உட்புற நபர் தீங்கிழைக்கும் நோக்கங்களுக்காக முக்கியமான ஒப்பந்தச் சார்புகளைக் கையாளுவதை மிகவும் கடினமாக்குகிறது.
2. ஒப்பந்தச் செயல்பாடுகளைப் பாதுகாக்க require(), assert(), மற்றும் revert() கூற்றுகளைப் பயன்படுத்தவும்
குறிப்பிட்டுள்ளபடி, உங்கள் திறன் ஒப்பந்தம் தொகுதிச்சங்கிலியில் நிலைநிறுத்தப்பட்டவுடன் எவரும் அதில் உள்ள பொதுவான சார்புகளை அழைக்கலாம். வெளிப்புறக் கணக்குகள் ஒப்பந்தத்துடன் எவ்வாறு தொடர்பு கொள்ளும் என்பதை நீங்கள் முன்கூட்டியே அறிய முடியாது என்பதால், நிலைநிறுத்துவதற்கு முன்பு சிக்கலான செயல்பாடுகளுக்கு எதிராக உள் பாதுகாப்புகளைச் செயல்படுத்துவது சிறந்தது. சில தேவைகளைப் பூர்த்தி செய்யத் தவறினால், விதிவிலக்குகளைத் தூண்டவும், நிலை மாற்றங்களை மீளமைக்கவும் require(), assert(), மற்றும் revert() கூற்றுகளைப் பயன்படுத்துவதன் மூலம் திறன் ஒப்பந்தங்களில் சரியான நடத்தையை நீங்கள் செயல்படுத்தலாம்.
require(): require சார்புகளின் தொடக்கத்தில் வரையறுக்கப்படுகின்றன மற்றும் அழைக்கப்பட்ட சார்பு இயக்கப்படுவதற்கு முன்பு முன்வரையறுக்கப்பட்ட நிபந்தனைகள் பூர்த்தி செய்யப்படுவதை உறுதி செய்கின்றன. ஒரு சார்புடன் தொடர்வதற்கு முன், பயனர் உள்ளீடுகளைச் சரிபார்க்கவும், நிலை மாறிகளைச் சரிபார்க்கவும் அல்லது அழைக்கும் கணக்கின் அடையாளத்தை அங்கீகரிக்கவும் require கூற்றைப் பயன்படுத்தலாம்.
assert(): assert() உள் பிழைகளைக் கண்டறியவும், உங்கள் குறியீட்டில் உள்ள "மாறிலிகளின்" (invariants) மீறல்களைச் சரிபார்க்கவும் பயன்படுத்தப்படுகிறது. மாறிலி என்பது ஒரு ஒப்பந்தத்தின் நிலை பற்றிய தர்க்கரீதியான உறுதிப்பாடாகும், இது அனைத்து சார்பு இயக்கங்களுக்கும் உண்மையாக இருக்க வேண்டும். ஒரு வில்லை ஒப்பந்தத்தின் அதிகபட்ச மொத்த வழங்கல் அல்லது இருப்பு என்பது ஒரு மாறிலிக்கு எடுத்துக்காட்டாகும். assert() ஐப் பயன்படுத்துவது உங்கள் ஒப்பந்தம் ஒருபோதும் பாதிக்கப்படக்கூடிய நிலையை அடையாது என்பதை உறுதி செய்கிறது, அவ்வாறு நடந்தால், நிலை மாறிகளுக்கான அனைத்து மாற்றங்களும் திரும்பப் பெறப்படும்.
revert(): தேவையான நிபந்தனை பூர்த்தி செய்யப்படாவிட்டால் விதிவிலக்கைத் தூண்டும் if-else கூற்றில் revert() ஐப் பயன்படுத்தலாம். கீழே உள்ள மாதிரி ஒப்பந்தம் சார்புகளின் இயக்கத்தைப் பாதுகாக்க revert() ஐப் பயன்படுத்துகிறது:
pragma solidity ^0.8.4;
contract VendingMachine {
address owner;
error Unauthorized();
function buy(uint amount) public payable {
if (amount > msg.value / 2 ether)
revert("Not enough Ether provided.");
// வாங்குதலைச் செய்யவும்.
}
function withdraw() public {
if (msg.sender != owner)
revert Unauthorized();
payable(msg.sender).transfer(address(this).balance);
}
}
3. திறன் ஒப்பந்தங்களைச் சோதித்து குறியீட்டின் சரியான தன்மையைச் சரிபார்க்கவும்
எத்திரியம் மெய்நிகர் இயந்திரத்தில் (Ethereum Virtual Machine) இயங்கும் குறியீட்டின் மாற்றவியலாமை என்பது, மேம்பாட்டு கட்டத்தில் திறன் ஒப்பந்தங்களுக்கு அதிக அளவிலான தர மதிப்பீடு தேவைப்படுகிறது என்பதாகும். உங்கள் ஒப்பந்தத்தை விரிவாகச் சோதிப்பது மற்றும் எதிர்பாராத முடிவுகள் ஏதேனும் உள்ளதா என அதைக் கவனிப்பது பாதுகாப்பை பெரிதும் மேம்படுத்தும் மற்றும் நீண்ட காலத்திற்கு உங்கள் பயனர்களைப் பாதுகாக்கும்.
பயனர்களிடமிருந்து ஒப்பந்தம் பெறும் என எதிர்பார்க்கப்படும் போலித் தரவைப் (mock data) பயன்படுத்தி சிறிய அலகுச் சோதனைகளை (unit tests) எழுதுவது வழக்கமான முறையாகும். சில சார்புகளின் செயல்பாட்டைச் சோதிப்பதற்கும், திறன் ஒப்பந்தம் எதிர்பார்த்தபடி செயல்படுவதை உறுதி செய்வதற்கும் அலகுச் சோதனை சிறந்தது.
துரதிர்ஷ்டவசமாக, தனிமைப்படுத்தப்பட்டுப் பயன்படுத்தப்படும்போது திறன் ஒப்பந்தப் பாதுகாப்பை மேம்படுத்துவதற்கு அலகுச் சோதனை குறைந்த அளவே பயனுள்ளதாக இருக்கும். போலித் தரவுகளுக்கு ஒரு சார்பு சரியாகச் செயல்படுவதை அலகுச் சோதனை நிரூபிக்கலாம், ஆனால் எழுதப்பட்ட சோதனைகளைப் போலவே அலகுச் சோதனைகளும் பயனுள்ளதாக இருக்கும். இது உங்கள் திறன் ஒப்பந்தத்தின் பாதுகாப்பை உடைக்கக்கூடிய தவறவிட்ட விளிம்பு நிலைகள் (edge cases) மற்றும் பாதிப்புகளைக் கண்டறிவதைக் கடினமாக்குகிறது.
நிலையான மற்றும் மாறும் பகுப்பாய்வைப் (static and dynamic analysis) பயன்படுத்திச் செய்யப்படும் பண்பு அடிப்படையிலான சோதனையுடன் அலகுச் சோதனையை இணைப்பதே சிறந்த அணுகுமுறையாகும். நிலையான பகுப்பாய்வு, அடையக்கூடிய நிரல் நிலைகள் மற்றும் இயக்கப் பாதைகளை பகுப்பாய்வு செய்ய கட்டுப்பாட்டு ஓட்ட வரைபடங்கள் (control flow graphs) (opens in a new tab) மற்றும் சுருக்க தொடரியல் மரங்கள் (abstract syntax trees) (opens in a new tab) போன்ற குறைந்த-நிலை பிரதிநிதித்துவங்களை நம்பியுள்ளது. இதற்கிடையில், திறன் ஒப்பந்த ஃபஸ்ஸிங் (smart contract fuzzing) (opens in a new tab) போன்ற மாறும் பகுப்பாய்வு நுட்பங்கள், பாதுகாப்புப் பண்புகளை மீறும் செயல்பாடுகளைக் கண்டறிய சீரற்ற உள்ளீட்டு மதிப்புகளுடன் ஒப்பந்தக் குறியீட்டை இயக்குகின்றன.
திறன் ஒப்பந்தங்களில் பாதுகாப்புப் பண்புகளைச் சரிபார்ப்பதற்கான மற்றொரு நுட்பம் முறைசார் சரிபார்ப்பு ஆகும். வழக்கமான சோதனையைப் போலல்லாமல், முறைசார் சரிபார்ப்பு ஒரு திறன் ஒப்பந்தத்தில் பிழைகள் இல்லை என்பதை உறுதியாக நிரூபிக்க முடியும். விரும்பிய பாதுகாப்புப் பண்புகளைப் படம்பிடிக்கும் முறையான விவரக்குறிப்பை உருவாக்குவதன் மூலமும், ஒப்பந்தங்களின் முறையான மாதிரி இந்த விவரக்குறிப்பைக் கடைப்பிடிக்கிறது என்பதை நிரூபிப்பதன் மூலமும் இது அடையப்படுகிறது.
4. உங்கள் குறியீட்டின் சுயாதீன மதிப்பாய்வைக் கேட்கவும்
உங்கள் ஒப்பந்தத்தைச் சோதித்த பிறகு, ஏதேனும் பாதுகாப்புச் சிக்கல்கள் உள்ளதா என மூலக் குறியீட்டைச் சரிபார்க்க மற்றவர்களிடம் கேட்பது நல்லது. சோதனையானது திறன் ஒப்பந்தத்தில் உள்ள ஒவ்வொரு குறையையும் வெளிப்படுத்தாது, ஆனால் ஒரு சுயாதீன மதிப்பாய்வைப் பெறுவது பாதிப்புகளைக் கண்டறியும் சாத்தியத்தை அதிகரிக்கிறது.
தணிக்கைகள்
திறன் ஒப்பந்தத் தணிக்கையை நியமிப்பது சுயாதீன குறியீட்டு மதிப்பாய்வை நடத்துவதற்கான ஒரு வழியாகும். திறன் ஒப்பந்தங்கள் பாதுகாப்பானவை மற்றும் தரக் குறைபாடுகள் மற்றும் வடிவமைப்புப் பிழைகள் அற்றவை என்பதை உறுதி செய்வதில் தணிக்கையாளர்கள் முக்கியப் பங்கு வகிக்கின்றனர்.
இருப்பினும், தணிக்கைகளை ஒரு சஞ்சீவியாகக் கருதுவதை நீங்கள் தவிர்க்க வேண்டும். திறன் ஒப்பந்தத் தணிக்கைகள் ஒவ்வொரு பிழையையும் பிடிக்காது மற்றும் பெரும்பாலும் கூடுதல் சுற்று மதிப்பாய்வுகளை வழங்க வடிவமைக்கப்பட்டுள்ளன, இது ஆரம்ப மேம்பாடு மற்றும் சோதனையின் போது டெவலப்பர்களால் தவறவிடப்பட்ட சிக்கல்களைக் கண்டறிய உதவும். திறன் ஒப்பந்தத் தணிக்கையின் பலனை அதிகரிக்க, குறியீட்டைச் சரியாக ஆவணப்படுத்துதல் மற்றும் இன்லைன் கருத்துகளைச் சேர்த்தல் போன்ற தணிக்கையாளர்களுடன் பணியாற்றுவதற்கான சிறந்த நடைமுறைகளையும் நீங்கள் பின்பற்ற வேண்டும்.
- திறன் ஒப்பந்தத் தணிக்கைக்கான உதவிக்குறிப்புகள் & தந்திரங்கள் (opens in a new tab) - @tinchoabbate
- உங்கள் தணிக்கையிலிருந்து அதிகப் பலனைப் பெறுங்கள் (opens in a new tab) - Inference
பிழை வெகுமதிகள் (Bug bounties)
பிழை வெகுமதித் திட்டத்தை அமைப்பது வெளிப்புறக் குறியீட்டு மதிப்பாய்வுகளைச் செயல்படுத்துவதற்கான மற்றொரு அணுகுமுறையாகும். பிழை வெகுமதி என்பது ஒரு பயன்பாட்டில் உள்ள பாதிப்புகளைக் கண்டறியும் நபர்களுக்கு (பொதுவாக ஒயிட்ஹாட் ஹேக்கர்கள்) வழங்கப்படும் நிதி வெகுமதியாகும்.
சரியாகப் பயன்படுத்தப்படும்போது, பிழை வெகுமதிகள் ஹேக்கர் சமூகத்தின் உறுப்பினர்களுக்கு முக்கியமான குறைபாடுகளுக்காக உங்கள் குறியீட்டை ஆய்வு செய்வதற்கான ஊக்கத்தை அளிக்கின்றன. எத்திரியத்தில் இயங்கும் அடுக்கு 2 (l2) நெறிமுறையான ஆப்டிமிசம் (opens in a new tab) இல் வரம்பற்ற ஈதரை உருவாக்க தாக்குபவரை அனுமதித்திருக்கும் "எல்லையற்ற பணப் பிழை" (infinite money bug) ஒரு நிஜ வாழ்க்கை எடுத்துக்காட்டாகும். அதிர்ஷ்டவசமாக, ஒரு ஒயிட்ஹாட் ஹேக்கர் குறைபாட்டைக் கண்டுபிடித்து (opens in a new tab) குழுவிற்குத் தெரிவித்தார், இந்தச் செயல்பாட்டில் ஒரு பெரிய தொகையைப் பெற்றார் (opens in a new tab).
ஆபத்தில் உள்ள நிதியின் அளவிற்கு விகிதாசாரமாக பிழை வெகுமதித் திட்டத்தின் செலுத்துதலை அமைப்பது ஒரு பயனுள்ள உத்தியாகும். "அளவிடுதல் பிழை வெகுமதி (scaling bug bounty) (opens in a new tab)" என விவரிக்கப்படும் இந்த அணுகுமுறை, தனிநபர்கள் பாதிப்புகளைச் சுரண்டுவதற்குப் பதிலாகப் பொறுப்புடன் வெளிப்படுத்துவதற்கான நிதி ஊக்கங்களை வழங்குகிறது.
5. திறன் ஒப்பந்த மேம்பாட்டின் போது சிறந்த நடைமுறைகளைப் பின்பற்றவும்
தணிக்கைகள் மற்றும் பிழை வெகுமதிகளின் இருப்பு உயர்தரக் குறியீட்டை எழுதுவதற்கான உங்கள் பொறுப்பை மன்னிக்காது. நல்ல திறன் ஒப்பந்தப் பாதுகாப்பு சரியான வடிவமைப்பு மற்றும் மேம்பாட்டு செயல்முறைகளைப் பின்பற்றுவதில் தொடங்குகிறது:
-
git போன்ற பதிப்புக் கட்டுப்பாட்டு அமைப்பில் (version control system) அனைத்துக் குறியீட்டையும் சேமிக்கவும்
-
அனைத்துக் குறியீட்டு மாற்றங்களையும் இழுப்பு கோரிக்கைகள் (pull requests) மூலம் செய்யவும்
-
இழுப்பு கோரிக்கைகளில் குறைந்தபட்சம் ஒரு சுயாதீன மதிப்பாய்வாளர் இருப்பதை உறுதிசெய்யவும்—நீங்கள் ஒரு திட்டத்தில் தனியாக வேலை செய்கிறீர்கள் என்றால், பிற டெவலப்பர்களைக் கண்டுபிடித்து குறியீட்டு மதிப்பாய்வுகளைப் பரிமாறிக்கொள்ளக் கருதுங்கள்
-
திறன் ஒப்பந்தங்களைச் சோதிக்க, தொகுக்க, நிலைநிறுத்த ஒரு மேம்பாட்டுச் சூழலைப் பயன்படுத்தவும்
-
Cyfrin Aderyn (opens in a new tab), Mythril மற்றும் ஸ்லித்தர் போன்ற அடிப்படைக் குறியீட்டுப் பகுப்பாய்வுக் கருவிகள் மூலம் உங்கள் குறியீட்டை இயக்கவும். ஒவ்வொரு இழுப்பு கோரிக்கையும் இணைக்கப்படுவதற்கு முன்பு இதைச் செய்து, வெளியீட்டில் உள்ள வேறுபாடுகளை ஒப்பிடுவது சிறந்தது
-
உங்கள் குறியீடு பிழைகள் இல்லாமல் தொகுக்கப்படுவதையும், Solidity தொகுப்பான் (compiler) எந்த எச்சரிக்கைகளையும் வெளியிடவில்லை என்பதையும் உறுதிப்படுத்தவும்
-
உங்கள் குறியீட்டைச் சரியாக ஆவணப்படுத்தவும் (NatSpec (opens in a new tab) ஐப் பயன்படுத்தி) மற்றும் ஒப்பந்தக் கட்டமைப்பு பற்றிய விவரங்களை எளிதில் புரிந்துகொள்ளக்கூடிய மொழியில் விவரிக்கவும். இது மற்றவர்கள் உங்கள் குறியீட்டைத் தணிக்கை செய்வதையும் மதிப்பாய்வு செய்வதையும் எளிதாக்கும்.
6. வலுவான பேரிடர் மீட்புத் திட்டங்களைச் செயல்படுத்தவும்
பாதுகாப்பான அணுகல் கட்டுப்பாடுகளை வடிவமைத்தல், சார்பு மாற்றியமைப்பான்களைச் செயல்படுத்துதல் மற்றும் பிற பரிந்துரைகள் திறன் ஒப்பந்தப் பாதுகாப்பை மேம்படுத்தலாம், ஆனால் அவை தீங்கிழைக்கும் சுரண்டல்களின் சாத்தியத்தை நிராகரிக்க முடியாது. பாதுகாப்பான திறன் ஒப்பந்தங்களை உருவாக்குவதற்கு "தோல்விக்குத் தயாராகுதல்" மற்றும் தாக்குதல்களுக்குத் திறம்பட பதிலளிப்பதற்கான மாற்றுத் திட்டம் தேவை. சரியான பேரிடர் மீட்புத் திட்டம் பின்வரும் சில அல்லது அனைத்துக் கூறுகளையும் உள்ளடக்கியிருக்கும்:
ஒப்பந்த மேம்படுத்தல்கள்
எத்திரியம் திறன் ஒப்பந்தங்கள் இயல்பாகவே மாற்றவியலாதவை என்றாலும், மேம்படுத்தல் முறைகளைப் பயன்படுத்துவதன் மூலம் ஓரளவிற்கு மாற்றவியலும் தன்மையை அடைய முடியும். ஒரு முக்கியமான குறைபாடு உங்கள் பழைய ஒப்பந்தத்தைப் பயன்படுத்த முடியாததாக ஆக்கும் மற்றும் புதிய தர்க்கத்தை நிலைநிறுத்துவது மிகவும் சாத்தியமான விருப்பமாக இருக்கும் சந்தர்ப்பங்களில் ஒப்பந்தங்களை மேம்படுத்துவது அவசியமாகும்.
ஒப்பந்த மேம்படுத்தல் வழிமுறைகள் வித்தியாசமாகச் செயல்படுகின்றன, ஆனால் திறன் ஒப்பந்தங்களை மேம்படுத்துவதற்கான மிகவும் பிரபலமான அணுகுமுறைகளில் "பதிலி முறை (proxy pattern)" ஒன்றாகும். பதிலி முறைகள் (opens in a new tab) ஒரு பயன்பாட்டின் நிலை மற்றும் தர்க்கத்தை இரண்டு ஒப்பந்தங்களுக்கு இடையே பிரிக்கின்றன. முதல் ஒப்பந்தம் ('பதிலி ஒப்பந்தம்' என அழைக்கப்படுகிறது) நிலை மாறிகளைச் சேமிக்கிறது (எ.கா., பயனர் இருப்புகள்), அதே சமயம் இரண்டாவது ஒப்பந்தம் ('தர்க்க ஒப்பந்தம்' என அழைக்கப்படுகிறது) ஒப்பந்தச் சார்புகளை இயக்குவதற்கான குறியீட்டைக் கொண்டுள்ளது.
கணக்குகள் பதிலி ஒப்பந்தத்துடன் தொடர்பு கொள்கின்றன, இது delegatecall() (opens in a new tab) குறைந்த-நிலை அழைப்பைப் பயன்படுத்தி அனைத்துச் சார்பு அழைப்புகளையும் தர்க்க ஒப்பந்தத்திற்கு அனுப்புகிறது. வழக்கமான செய்தி அழைப்பைப் போலல்லாமல், தர்க்க ஒப்பந்தத்தின் முகவரியில் இயங்கும் குறியீடு அழைக்கும் ஒப்பந்தத்தின் சூழலில் இயக்கப்படுவதை delegatecall() உறுதி செய்கிறது. இதன் பொருள் தர்க்க ஒப்பந்தம் எப்போதும் பதிலியின் சேமிப்பகத்தில் (அதன் சொந்த சேமிப்பகத்திற்குப் பதிலாக) எழுதும் மற்றும் msg.sender மற்றும் msg.value ஆகியவற்றின் அசல் மதிப்புகள் பாதுகாக்கப்படும்.
தர்க்க ஒப்பந்தத்திற்கு அழைப்புகளை வழங்குவதற்கு அதன் முகவரியை பதிலி ஒப்பந்தத்தின் சேமிப்பகத்தில் சேமிக்க வேண்டும். எனவே, ஒப்பந்தத்தின் தர்க்கத்தை மேம்படுத்துவது என்பது மற்றொரு தர்க்க ஒப்பந்தத்தை நிலைநிறுத்துவது மற்றும் புதிய முகவரியை பதிலி ஒப்பந்தத்தில் சேமிப்பது மட்டுமே. பதிலி ஒப்பந்தத்திற்கான அடுத்தடுத்த அழைப்புகள் தானாகவே புதிய தர்க்க ஒப்பந்தத்திற்கு அனுப்பப்படுவதால், குறியீட்டை உண்மையில் மாற்றியமைக்காமல் ஒப்பந்தத்தை நீங்கள் "மேம்படுத்தியிருப்பீர்கள்".
ஒப்பந்தங்களை மேம்படுத்துவது பற்றி மேலும்.
அவசரகால நிறுத்தங்கள்
குறிப்பிட்டுள்ளபடி, விரிவான தணிக்கை மற்றும் சோதனையானது திறன் ஒப்பந்தத்தில் உள்ள அனைத்துப் பிழைகளையும் கண்டறிய முடியாது. நிலைநிறுத்தப்பட்ட பிறகு உங்கள் குறியீட்டில் பாதிப்பு தோன்றினால், ஒப்பந்த முகவரியில் இயங்கும் குறியீட்டை உங்களால் மாற்ற முடியாது என்பதால் அதைச் சரிசெய்வது சாத்தியமற்றது. மேலும், மேம்படுத்தல் வழிமுறைகளை (எ.கா., பதிலி முறைகள்) செயல்படுத்த நேரம் ஆகலாம் (அவற்றுக்கு பெரும்பாலும் வெவ்வேறு தரப்பினரின் ஒப்புதல் தேவைப்படும்), இது தாக்குபவர்களுக்கு அதிக சேதத்தை ஏற்படுத்த அதிக நேரத்தை மட்டுமே அளிக்கிறது.
ஒப்பந்தத்தில் பாதிக்கப்படக்கூடிய சார்புகளுக்கான அழைப்புகளைத் தடுக்கும் "அவசரகால நிறுத்த" சார்பைச் செயல்படுத்துவதே இறுதி விருப்பமாகும். அவசரகால நிறுத்தங்கள் பொதுவாகப் பின்வரும் கூறுகளைக் கொண்டிருக்கும்:
-
திறன் ஒப்பந்தம் நிறுத்தப்பட்ட நிலையில் உள்ளதா இல்லையா என்பதைக் குறிக்கும் உலகளாவிய பூலியன் மாறி. ஒப்பந்தத்தை அமைக்கும் போது இந்த மாறி
falseஎன அமைக்கப்படும், ஆனால் ஒப்பந்தம் நிறுத்தப்பட்டவுடன்trueஎன மாறும். -
அவற்றின் இயக்கத்தில் பூலியன் மாறியைக் குறிக்கும் சார்புகள். திறன் ஒப்பந்தம் நிறுத்தப்படாதபோது இத்தகைய சார்புகளை அணுக முடியும், மேலும் அவசரகால நிறுத்த அம்சம் தூண்டப்படும்போது அணுக முடியாததாகிவிடும்.
-
அவசரகால நிறுத்தச் சார்புக்கான அணுகலைக் கொண்ட ஒரு நிறுவனம், இது பூலியன் மாறியை
trueஎன அமைக்கிறது. தீங்கிழைக்கும் செயல்களைத் தடுக்க, இந்தச் சார்புக்கான அழைப்புகளை நம்பகமான முகவரிக்கு (எ.கா., ஒப்பந்த உரிமையாளர்) கட்டுப்படுத்தலாம்.
ஒப்பந்தம் அவசரகால நிறுத்தத்தைச் செயல்படுத்தியவுடன், சில சார்புகளை அழைக்க முடியாது. உலகளாவிய மாறியைக் குறிக்கும் மாற்றியமைப்பானில் தேர்ந்தெடுக்கப்பட்ட சார்புகளை மூடுவதன் மூலம் இது அடையப்படுகிறது. ஒப்பந்தங்களில் இந்த முறையைச் செயல்படுத்துவதை விவரிக்கும் ஒரு எடுத்துக்காட்டு (opens in a new tab) கீழே கொடுக்கப்பட்டுள்ளது:
// இந்தக் குறியீடு தொழில்முறையாகத் தணிக்கை செய்யப்படவில்லை, மேலும் பாதுகாப்பு அல்லது சரியான தன்மை குறித்து எந்த வாக்குறுதியும் அளிக்கவில்லை. உங்கள் சொந்த ஆபத்தில் பயன்படுத்தவும்.
contract EmergencyStop {
bool isStopped = false;
modifier stoppedInEmergency {
require(!isStopped);
_;
}
modifier onlyWhenStopped {
require(isStopped);
_;
}
modifier onlyAuthorized {
// msg.sender இன் அங்கீகாரத்தை இங்கே சரிபார்க்கவும்
_;
}
function stopContract() public onlyAuthorized {
isStopped = true;
}
function resumeContract() public onlyAuthorized {
isStopped = false;
}
function deposit() public payable stoppedInEmergency {
// வைப்பு தர்க்கம் இங்கே நடக்கிறது
}
function emergencyWithdraw() public onlyWhenStopped {
// அவசரகால திரும்பப் பெறுதல் இங்கே நடக்கிறது
}
}
இந்த எடுத்துக்காட்டு அவசரகால நிறுத்தங்களின் அடிப்படை அம்சங்களைக் காட்டுகிறது:
-
isStoppedஎன்பது ஒரு பூலியன் ஆகும், இது தொடக்கத்தில்falseஆகவும், ஒப்பந்தம் அவசரகாலப் பயன்முறையில் நுழையும் போதுtrueஆகவும் மதிப்பிடப்படுகிறது. -
சார்பு மாற்றியமைப்பான்களான
onlyWhenStoppedமற்றும்stoppedInEmergencyஆகியவைisStoppedமாறியைச் சரிபார்க்கின்றன. ஒப்பந்தம் பாதிக்கப்படக்கூடியதாக இருக்கும்போது அணுக முடியாததாக இருக்க வேண்டிய சார்புகளைக் கட்டுப்படுத்தstoppedInEmergencyபயன்படுத்தப்படுகிறது (எ.கா.,deposit()). இந்தச் சார்புகளுக்கான அழைப்புகள் வெறுமனே மீளமைக்கப்படும்.
அவசர காலத்தின் போது அழைக்கப்பட வேண்டிய சார்புகளுக்கு onlyWhenStopped பயன்படுத்தப்படுகிறது (எ.கா., emergencyWithdraw()). இத்தகைய சார்புகள் நிலைமையைத் தீர்க்க உதவும், எனவே அவை "கட்டுப்படுத்தப்பட்ட சார்புகள்" பட்டியலிலிருந்து விலக்கப்பட்டுள்ளன.
அவசரகால நிறுத்தச் செயல்பாட்டைப் பயன்படுத்துவது உங்கள் திறன் ஒப்பந்தத்தில் உள்ள தீவிரமான பாதிப்புகளைச் சமாளிக்க ஒரு பயனுள்ள தற்காலிகத் தீர்வை வழங்குகிறது. இருப்பினும், சுயநலக் காரணங்களுக்காக டெவலப்பர்கள் அதைச் செயல்படுத்த மாட்டார்கள் என்று பயனர்கள் நம்ப வேண்டியதன் அவசியத்தை இது அதிகரிக்கிறது. இதற்காக, அவசரகால நிறுத்தத்தின் கட்டுப்பாட்டை சங்கிலிசார் வாக்களிப்பு முறை, நேரப்பூட்டு (timelock) அல்லது பல்கையெழுத்துப் பணப்பையின் ஒப்புதலுக்கு உட்படுத்துவதன் மூலம் பரவலாக்குவது சாத்தியமான தீர்வுகளாகும்.
நிகழ்வு கண்காணிப்பு
திறன் ஒப்பந்தச் சார்புகளுக்கான அழைப்புகளைக் கண்காணிக்கவும், நிலை மாறிகளுக்கான மாற்றங்களைக் கண்காணிக்கவும் நிகழ்வுகள் (opens in a new tab) உங்களை அனுமதிக்கின்றன. எந்தவொரு தரப்பினரும் பாதுகாப்பு-முக்கியமான நடவடிக்கையை எடுக்கும்போதெல்லாம் (எ.கா., நிதியைத் திரும்பப் பெறுதல்) ஒரு நிகழ்வை வெளியிடுமாறு உங்கள் திறன் ஒப்பந்தத்தை நிரலாக்கம் செய்வது சிறந்தது.
நிகழ்வுகளைப் பதிவுசெய்தல் மற்றும் அவற்றைப் புறச்சங்கிலியில் கண்காணிப்பது ஒப்பந்தச் செயல்பாடுகள் பற்றிய நுண்ணறிவுகளை வழங்குகிறது மற்றும் தீங்கிழைக்கும் செயல்களை விரைவாகக் கண்டறிய உதவுகிறது. இதன் பொருள் உங்கள் குழு ஹேக்குகளுக்கு விரைவாகப் பதிலளிக்க முடியும் மற்றும் சார்புகளை இடைநிறுத்துதல் அல்லது மேம்படுத்தலைச் செய்தல் போன்ற பயனர்கள் மீதான தாக்கத்தைத் தணிக்க நடவடிக்கை எடுக்க முடியும்.
யாராவது உங்கள் ஒப்பந்தங்களுடன் தொடர்பு கொள்ளும்போதெல்லாம் தானாகவே விழிப்பூட்டல்களை அனுப்பும் ஆயத்தக் கண்காணிப்புக் கருவியையும் நீங்கள் தேர்வு செய்யலாம். பரிவர்த்தனை அளவு, சார்பு அழைப்புகளின் அதிர்வெண் அல்லது சம்பந்தப்பட்ட குறிப்பிட்ட சார்புகள் போன்ற வெவ்வேறு தூண்டுதல்களின் அடிப்படையில் தனிப்பயன் விழிப்பூட்டல்களை உருவாக்க இந்தக் கருவிகள் உங்களை அனுமதிக்கும். எடுத்துக்காட்டாக, ஒரு பரிவர்த்தனையில் திரும்பப் பெறப்பட்ட தொகை ஒரு குறிப்பிட்ட வரம்பைத் தாண்டும்போது வரும் விழிப்பூட்டலை நீங்கள் நிரலாக்கம் செய்யலாம்.
7. பாதுகாப்பான ஆளுகை அமைப்புகளை வடிவமைக்கவும்
முக்கியத் திறன் ஒப்பந்தங்களின் கட்டுப்பாட்டைச் சமூக உறுப்பினர்களிடம் ஒப்படைப்பதன் மூலம் உங்கள் பயன்பாட்டைப் பரவலாக்க நீங்கள் விரும்பலாம். இந்த நிலையில், திறன் ஒப்பந்த அமைப்பு ஒரு ஆளுகை தொகுதியைக் கொண்டிருக்கும்—இது சங்கிலிசார் ஆளுகை அமைப்பின் மூலம் நிர்வாக நடவடிக்கைகளை அங்கீகரிக்க சமூக உறுப்பினர்களை அனுமதிக்கும் ஒரு வழிமுறையாகும். எடுத்துக்காட்டாக, ஒரு பதிலி ஒப்பந்தத்தை புதிய செயலாக்கத்திற்கு மேம்படுத்துவதற்கான முன்மொழிவு வில்லை வைத்திருப்பவர்களால் வாக்களிக்கப்படலாம்.
பரவலாக்கப்பட்ட ஆளுகை பயனுள்ளதாக இருக்கும், குறிப்பாக இது டெவலப்பர்கள் மற்றும் இறுதிப் பயனர்களின் நலன்களைச் சீரமைக்கிறது. ஆயினும்கூட, திறன் ஒப்பந்த ஆளுகை வழிமுறைகள் தவறாகச் செயல்படுத்தப்பட்டால் புதிய அபாயங்களை அறிமுகப்படுத்தலாம். ஒரு உடனடி கடனை எடுப்பதன் மூலம் தாக்குபவர் மகத்தான வாக்குரிமையைப் பெற்று (வைத்திருக்கும் வில்லைகளின் எண்ணிக்கையில் அளவிடப்படுகிறது) தீங்கிழைக்கும் முன்மொழிவைத் தள்ளுவது ஒரு நம்பத்தகுந்த காட்சியாகும்.
சங்கிலிசார் ஆளுகை தொடர்பான சிக்கல்களைத் தடுப்பதற்கான ஒரு வழி நேரப்பூட்டைப் பயன்படுத்துவதாகும் (opens in a new tab). ஒரு குறிப்பிட்ட அளவு நேரம் கடக்கும் வரை திறன் ஒப்பந்தம் சில செயல்களைச் செய்வதை நேரப்பூட்டு தடுக்கிறது. ஒவ்வொரு வில்லைக்கும் அது எவ்வளவு காலம் பூட்டப்பட்டுள்ளது என்பதன் அடிப்படையில் "வாக்கு எடையை" ஒதுக்குவது அல்லது தற்போதைய தொகுதிக்குப் பதிலாக ஒரு வரலாற்று காலத்தில் (எடுத்துக்காட்டாக, கடந்த காலத்தில் 2-3 தொகுதிகள்) ஒரு முகவரியின் வாக்குரிமையை அளவிடுவது ஆகியவை பிற உத்திகளில் அடங்கும். இரண்டு முறைகளும் சங்கிலிசார் வாக்குகளை மாற்றுவதற்கு வாக்குரிமையை விரைவாகக் குவிக்கும் சாத்தியத்தைக் குறைக்கின்றன.
பகிரப்பட்ட இணைப்புகளில் பாதுகாப்பான ஆளுகை அமைப்புகளை வடிவமைத்தல் (opens in a new tab), DAO-களில் உள்ள வெவ்வேறு வாக்களிப்பு வழிமுறைகள் (opens in a new tab) மற்றும் DeFi-ஐப் பயன்படுத்தும் பொதுவான DAO தாக்குதல் திசையன்கள் (opens in a new tab) பற்றி மேலும் அறியலாம்.
8. குறியீட்டில் உள்ள சிக்கலை குறைந்தபட்சமாகக் குறைக்கவும்
பாரம்பரிய மென்பொருள் டெவலப்பர்கள் KISS ("keep it simple, stupid") கொள்கையை நன்கு அறிவார்கள், இது மென்பொருள் வடிவமைப்பில் தேவையற்ற சிக்கலை அறிமுகப்படுத்துவதற்கு எதிராக அறிவுறுத்துகிறது. இது "சிக்கலான அமைப்புகள் சிக்கலான வழிகளில் தோல்வியடைகின்றன" மற்றும் விலையுயர்ந்த பிழைகளுக்கு அதிக வாய்ப்புள்ளது என்ற நீண்டகால சிந்தனையைப் பின்பற்றுகிறது.
திறன் ஒப்பந்தங்கள் அதிக அளவிலான மதிப்பைக் கட்டுப்படுத்தும் திறன் கொண்டவை என்பதால், திறன் ஒப்பந்தங்களை எழுதும்போது விஷயங்களை எளிமையாக வைத்திருப்பது மிகவும் முக்கியமானது. திறன் ஒப்பந்தங்களை எழுதும்போது எளிமையை அடைவதற்கான ஒரு உதவிக்குறிப்பு, சாத்தியமான இடங்களில் ஓப்பன்செப்பெலின் ஒப்பந்தங்கள் (opens in a new tab) போன்ற ஏற்கனவே உள்ள நிரலகங்களை மீண்டும் பயன்படுத்துவதாகும். இந்த நிரலகங்கள் டெவலப்பர்களால் விரிவாகத் தணிக்கை செய்யப்பட்டு சோதிக்கப்பட்டிருப்பதால், அவற்றைப் பயன்படுத்துவது புதிதாகப் புதிய செயல்பாட்டை எழுதுவதன் மூலம் பிழைகளை அறிமுகப்படுத்தும் வாய்ப்புகளைக் குறைக்கிறது.
சிறிய சார்புகளை எழுதுவதும், பல ஒப்பந்தங்களில் வணிகத் தர்க்கத்தைப் பிரிப்பதன் மூலம் ஒப்பந்தங்களை மட்டுப்படுத்தப்பட்டதாக (modular) வைத்திருப்பதும் மற்றொரு பொதுவான ஆலோசனையாகும். எளிமையான குறியீட்டை எழுதுவது திறன் ஒப்பந்தத்தில் தாக்குதல் மேற்பரப்பைக் குறைப்பது மட்டுமல்லாமல், ஒட்டுமொத்த அமைப்பின் சரியான தன்மையைப் பற்றி நியாயப்படுத்துவதையும் சாத்தியமான வடிவமைப்புப் பிழைகளை முன்கூட்டியே கண்டறிவதையும் எளிதாக்குகிறது.
9. பொதுவான திறன் ஒப்பந்தப் பாதிப்புகளுக்கு எதிராகப் பாதுகாக்கவும்
மறுநுழைவு
EVM ஒத்திசைவை (concurrency) அனுமதிக்காது, அதாவது செய்தி அழைப்பில் ஈடுபட்டுள்ள இரண்டு ஒப்பந்தங்கள் ஒரே நேரத்தில் இயங்க முடியாது. ஒரு வெளிப்புற அழைப்பு, அழைப்பு திரும்பும் வரை அழைக்கும் ஒப்பந்தத்தின் இயக்கம் மற்றும் நினைவகத்தை இடைநிறுத்துகிறது, அந்த நேரத்தில் இயக்கம் சாதாரணமாகத் தொடரும். இந்தச் செயல்முறையை மற்றொரு ஒப்பந்தத்திற்கு கட்டுப்பாட்டு ஓட்டத்தை (control flow) (opens in a new tab) மாற்றுவது என முறையாக விவரிக்கலாம்.
பெரும்பாலும் பாதிப்பில்லாதது என்றாலும், நம்பத்தகாத ஒப்பந்தங்களுக்குக் கட்டுப்பாட்டு ஓட்டத்தை மாற்றுவது மறுநுழைவு போன்ற சிக்கல்களை ஏற்படுத்தலாம். அசல் சார்பு அழைப்பு முடிவதற்குள் தீங்கிழைக்கும் ஒப்பந்தம் பாதிக்கப்படக்கூடிய ஒப்பந்தத்திற்குத் திரும்ப அழைக்கும்போது மறுநுழைவுத் தாக்குதல் ஏற்படுகிறது. இந்த வகையான தாக்குதலை ஒரு எடுத்துக்காட்டுடன் சிறப்பாக விளக்கலாம்.
எவரும் ஈதரை டெபாசிட் செய்யவும் திரும்பப் பெறவும் அனுமதிக்கும் எளிய திறன் ஒப்பந்தத்தை ('Victim') கவனியுங்கள்:
// இந்த ஒப்பந்தம் பாதிக்கப்படக்கூடியது. தயாரிப்பில் பயன்படுத்த வேண்டாம்
contract Victim {
mapping (address => uint256) public balances;
function deposit() external payable {
balances[msg.sender] += msg.value;
}
function withdraw() external {
uint256 amount = balances[msg.sender];
(bool success, ) = msg.sender.call.value(amount)("");
require(success);
balances[msg.sender] = 0;
}
}
இந்த ஒப்பந்தம் பயனர்கள் முன்பு ஒப்பந்தத்தில் டெபாசிட் செய்த ETH-ஐத் திரும்பப் பெற அனுமதிக்க withdraw() சார்பை வெளிப்படுத்துகிறது. திரும்பப் பெறுதலைச் செயலாக்கும்போது, ஒப்பந்தம் பின்வரும் செயல்பாடுகளைச் செய்கிறது:
- பயனரின் ETH இருப்பைச் சரிபார்க்கிறது
- அழைக்கும் முகவரிக்கு நிதியை அனுப்புகிறது
- பயனரிடமிருந்து கூடுதல் திரும்பப் பெறுதல்களைத் தடுத்து, அவர்களின் இருப்பை 0 ஆக மீட்டமைக்கிறது
Victim ஒப்பந்தத்தில் உள்ள withdraw() சார்பு "சரிபார்ப்புகள்-தொடர்புகள்-விளைவுகள் (checks-interactions-effects)" முறையைப் பின்பற்றுகிறது. இது இயக்கத்திற்குத் தேவையான நிபந்தனைகள் பூர்த்தி செய்யப்பட்டுள்ளதா என்பதை சரிபார்க்கிறது (அதாவது, பயனர் நேர்மறையான ETH இருப்பைக் கொண்டுள்ளார்) மற்றும் பரிவர்த்தனையின் விளைவுகளைப் பயன்படுத்துவதற்கு முன்பு (அதாவது, பயனரின் இருப்பைக் குறைத்தல்), அழைப்பாளரின் முகவரிக்கு ETH-ஐ அனுப்புவதன் மூலம் தொடர்பைச் செய்கிறது.
வெளிப்புறமாகச் சொந்தமான கணக்கிலிருந்து (EOA) withdraw() அழைக்கப்பட்டால், சார்பு எதிர்பார்த்தபடி செயல்படுகிறது: msg.sender.call.value() அழைப்பாளருக்கு ETH-ஐ அனுப்புகிறது. இருப்பினும், msg.sender என்பது ஒரு திறன் ஒப்பந்தக் கணக்காக இருந்து withdraw() ஐ அழைத்தால், msg.sender.call.value() ஐப் பயன்படுத்தி நிதியை அனுப்புவது அந்த முகவரியில் சேமிக்கப்பட்டுள்ள குறியீட்டையும் இயங்கத் தூண்டும்.
ஒப்பந்த முகவரியில் நிலைநிறுத்தப்பட்டுள்ள குறியீடு இது என்று கற்பனை செய்து பாருங்கள்:
contract Attacker {
function beginAttack() external payable {
Victim(victim_address).deposit.value(1 ether)();
Victim(victim_address).withdraw();
}
function() external payable {
if (gasleft() > 40000) {
Victim(victim_address).withdraw();
}
}
}
இந்த ஒப்பந்தம் மூன்று விஷயங்களைச் செய்ய வடிவமைக்கப்பட்டுள்ளது:
- மற்றொரு கணக்கிலிருந்து டெபாசிட்டை ஏற்றுக்கொள்வது (தாக்குபவரின் EOA ஆக இருக்கலாம்)
- Victim ஒப்பந்தத்தில் 1 ETH-ஐ டெபாசிட் செய்வது
- திறன் ஒப்பந்தத்தில் சேமிக்கப்பட்டுள்ள 1 ETH-ஐத் திரும்பப் பெறுவது
உள்வரும் msg.sender.call.value இலிருந்து மீதமுள்ள எரிவாயு 40,000-க்கும் அதிகமாக இருந்தால், Victim இல் உள்ள withdraw() ஐ மீண்டும் அழைக்கும் மற்றொரு சார்பை Attacker கொண்டுள்ளது என்பதைத் தவிர, இதில் எந்தத் தவறும் இல்லை. இது withdraw இன் முதல் அழைப்பு முடிவதற்கு முன்பு Victim இல் மீண்டும் நுழைந்து அதிக நிதியைத் திரும்பப் பெறும் திறனை Attacker க்கு அளிக்கிறது. சுழற்சி இதுபோல் தெரிகிறது:
- Attacker's EOA calls `Attacker.beginAttack()` with 1 ETH
- `Attacker.beginAttack()` deposits 1 ETH into `Victim`
- `Attacker` calls `withdraw() in `Victim`
- `Victim` checks `Attacker`’s balance (1 ETH)
- `Victim` sends 1 ETH to `Attacker` (which triggers the default function)
- `Attacker` calls `Victim.withdraw()` again (note that `Victim` hasn’t reduced `Attacker`’s balance from the first withdrawal)
- `Victim` checks `Attacker`’s balance (which is still 1 ETH because it hasn’t applied the effects of the first call)
- `Victim` sends 1 ETH to `Attacker` (which triggers the default function and allows `Attacker` to reenter the `withdraw` function)
- The process repeats until `Attacker` runs out of gas, at which point `msg.sender.call.value` returns without triggering additional withdrawals
- `Victim` finally applies the results of the first transaction (and subsequent ones) to its state, so `Attacker`’s balance is set to 0
சுருக்கம் என்னவென்றால், சார்பு இயக்கம் முடியும் வரை அழைப்பாளரின் இருப்பு 0 ஆக அமைக்கப்படாததால், அடுத்தடுத்த அழைப்புகள் வெற்றியடையும் மற்றும் அழைப்பாளர் தங்கள் இருப்பை பல முறை திரும்பப் பெற அனுமதிக்கும். 2016 DAO ஹேக்கில் (opens in a new tab) நடந்தது போல, ஒரு திறன் ஒப்பந்தத்தின் நிதியை முழுவதுமாக வெளியேற்ற இந்த வகையான தாக்குதலைப் பயன்படுத்தலாம். மறுநுழைவுச் சுரண்டல்களின் பொதுப் பட்டியல்கள் (opens in a new tab) காட்டுவது போல, மறுநுழைவுத் தாக்குதல்கள் இன்றும் திறன் ஒப்பந்தங்களுக்கு ஒரு முக்கியமான சிக்கலாக உள்ளன.
மறுநுழைவுத் தாக்குதல்களை எவ்வாறு தடுப்பது
மறுநுழைவைக் கையாள்வதற்கான ஒரு அணுகுமுறை சரிபார்ப்புகள்-விளைவுகள்-தொடர்புகள் முறையைப் (checks-effects-interactions pattern) (opens in a new tab) பின்பற்றுவதாகும். இந்த முறை சார்புகளின் இயக்கத்தை வரிசைப்படுத்துகிறது, அதாவது இயக்கத்துடன் தொடர்வதற்கு முன் தேவையான சரிபார்ப்புகளைச் செய்யும் குறியீடு முதலில் வரும், அதைத் தொடர்ந்து ஒப்பந்த நிலையைக் கையாளும் குறியீடு வரும், மற்ற ஒப்பந்தங்கள் அல்லது EOA-களுடன் தொடர்பு கொள்ளும் குறியீடு கடைசியாக வரும்.
கீழே காட்டப்பட்டுள்ள Victim ஒப்பந்தத்தின் திருத்தப்பட்ட பதிப்பில் சரிபார்ப்புகள்-விளைவு-தொடர்பு முறை பயன்படுத்தப்படுகிறது:
contract NoLongerAVictim {
function withdraw() external {
uint256 amount = balances[msg.sender];
balances[msg.sender] = 0;
(bool success, ) = msg.sender.call.value(amount)("");
require(success);
}
}
இந்த ஒப்பந்தம் பயனரின் இருப்பில் ஒரு சரிபார்ப்பைச் செய்கிறது, withdraw() சார்பின் விளைவுகளைப் பயன்படுத்துகிறது (பயனரின் இருப்பை 0 ஆக மீட்டமைப்பதன் மூலம்), மற்றும் தொடர்பைச் செய்யத் தொடர்கிறது (பயனரின் முகவரிக்கு ETH-ஐ அனுப்புதல்). இது வெளிப்புற அழைப்பிற்கு முன்பு ஒப்பந்தம் அதன் சேமிப்பகத்தைப் புதுப்பிப்பதை உறுதி செய்கிறது, முதல் தாக்குதலைச் செயல்படுத்திய மறுநுழைவு நிபந்தனையை நீக்குகிறது. Attacker ஒப்பந்தம் இன்னும் NoLongerAVictim க்குத் திரும்ப அழைக்கலாம், ஆனால் balances[msg.sender] 0 ஆக அமைக்கப்பட்டிருப்பதால், கூடுதல் திரும்பப் பெறுதல்கள் பிழையை எறியும்.
மற்றொரு விருப்பம் பரஸ்பர விலக்கு பூட்டைப் (பொதுவாக "mutex" என விவரிக்கப்படுகிறது) பயன்படுத்துவதாகும், இது ஒரு சார்பு அழைப்பு முடியும் வரை ஒப்பந்தத்தின் நிலையின் ஒரு பகுதியைப் பூட்டுகிறது. சார்பு இயங்குவதற்கு முன்பு true என அமைக்கப்பட்டு, அழைப்பு முடிந்ததும் false என மாறும் பூலியன் மாறியைப் பயன்படுத்தி இது செயல்படுத்தப்படுகிறது. கீழே உள்ள எடுத்துக்காட்டில் காணப்படுவது போல, மியூடெக்ஸைப் பயன்படுத்துவது அசல் அழைப்பு இன்னும் செயலாக்கப்படும்போது சுழல்நிலை அழைப்புகளுக்கு (recursive calls) எதிராக ஒரு சார்பைப் பாதுகாக்கிறது, இது மறுநுழைவை திறம்பட நிறுத்துகிறது.
pragma solidity ^0.7.0;
contract MutexPattern {
bool locked = false;
mapping(address => uint256) public balances;
modifier noReentrancy() {
require(!locked, "Blocked from reentrancy.");
locked = true;
_;
locked = false;
}
// இந்தச் செயல்பாடு ஒரு மியூடெக்ஸ் (mutex) மூலம் பாதுகாக்கப்படுகிறது, எனவே `msg.sender.call` உள்ளிருந்து வரும் மறுநுழைவு அழைப்புகளால் மீண்டும் `withdraw` ஐ அழைக்க முடியாது.
// `return` கூற்று `true` என மதிப்பிடப்படுகிறது, ஆனாலும் மாற்றியில் (modifier) உள்ள `locked = false` கூற்றை மதிப்பிடுகிறது
function withdraw(uint _amount) public payable noReentrancy returns(bool) {
require(balances[msg.sender] >= _amount, "No balance to withdraw.");
balances[msg.sender] -= _amount;
(bool success, ) = msg.sender.call{value: _amount}("");
require(success);
return true;
}
}
கணக்குகளுக்கு நிதியை அனுப்பும் "தள்ளு கொடுப்பனவுகள் (push payments)" அமைப்பிற்குப் பதிலாக, திறன் ஒப்பந்தங்களிலிருந்து பயனர்கள் நிதியைத் திரும்பப் பெற வேண்டிய இழுப்பு கொடுப்பனவுகள் (pull payments) (opens in a new tab) அமைப்பையும் நீங்கள் பயன்படுத்தலாம். இது அறியப்படாத முகவரிகளில் கவனக்குறைவாகக் குறியீட்டைத் தூண்டும் சாத்தியத்தை நீக்குகிறது (மேலும் சில சேவை மறுப்புத் தாக்குதல்களையும் (denial-of-service attacks) தடுக்கலாம்).
முழு எண் அளவுமீறல்கள் (Integer underflows and overflows)
ஒரு எண்கணிதச் செயல்பாட்டின் முடிவுகள் ஏற்றுக்கொள்ளக்கூடிய மதிப்புகளின் வரம்பிற்கு வெளியே வரும்போது முழு எண் அளவுமீறல் (integer overflow) ஏற்படுகிறது, இதனால் அது மிகக் குறைந்த பிரதிநிதித்துவ மதிப்பிற்கு "உருளுகிறது (roll over)". எடுத்துக்காட்டாக, ஒரு uint8 2^8-1=255 வரையிலான மதிப்புகளை மட்டுமே சேமிக்க முடியும். 255 ஐ விட அதிக மதிப்புகளை விளைவிக்கும் எண்கணிதச் செயல்பாடுகள் அளவுமீறி uint ஐ 0 ஆக மீட்டமைக்கும், இது ஒரு காரில் உள்ள ஓடோமீட்டர் அதிகபட்ச மைலேஜை (999999) அடைந்தவுடன் 0 ஆக மீட்டமைக்கப்படுவதைப் போன்றது.
முழு எண் கீழ்வழிதல்களும் (Integer underflows) இதே காரணங்களுக்காக நிகழ்கின்றன: ஒரு எண்கணிதச் செயல்பாட்டின் முடிவுகள் ஏற்றுக்கொள்ளக்கூடிய வரம்பிற்குக் கீழே விழுகின்றன. ஒரு uint8 இல் 0 ஐக் குறைக்க நீங்கள் முயற்சித்தீர்கள் என்று வைத்துக்கொள்வோம், இதன் முடிவு அதிகபட்ச பிரதிநிதித்துவ மதிப்பிற்கு (255) உருளும்.
முழு எண் அளவுமீறல்கள் மற்றும் கீழ்வழிதல்கள் இரண்டும் ஒரு ஒப்பந்தத்தின் நிலை மாறிகளில் எதிர்பாராத மாற்றங்களுக்கு வழிவகுக்கும் மற்றும் திட்டமிடப்படாத இயக்கத்தை விளைவிக்கும். தவறான செயல்பாட்டைச் செய்ய ஒரு திறன் ஒப்பந்தத்தில் எண்கணித அளவுமீறலைத் தாக்குபவர் எவ்வாறு பயன்படுத்திக் கொள்ளலாம் என்பதைக் காட்டும் எடுத்துக்காட்டு கீழே கொடுக்கப்பட்டுள்ளது:
pragma solidity ^0.7.6;
// இந்த ஒப்பந்தம் ஒரு நேர பெட்டகமாக செயல்பட வடிவமைக்கப்பட்டுள்ளது.
// பயனர் இந்த ஒப்பந்தத்தில் டெபாசிட் செய்யலாம் ஆனால் குறைந்தது ஒரு வாரத்திற்கு திரும்பப் பெற முடியாது.
// பயனர் 1 வார காத்திருப்பு காலத்திற்கு அப்பாலும் காத்திருப்பு நேரத்தை நீட்டிக்க முடியும்.
/*
1. TimeLock ஐ நிலைநிறுத்தவும்
2. TimeLock இன் முகவரியுடன் Attack ஐ நிலைநிறுத்தவும்
3. 1 ஈதரை அனுப்பி Attack.attack ஐ அழைக்கவும். உங்களால் உடனடியாக
உங்கள் ஈதரைத் திரும்பப் பெற முடியும்.
என்ன நடந்தது?
தாக்குதல் TimeLock.lockTime ஐ அளவுமீறச் செய்தது மற்றும் 1 வார காத்திருப்பு
காலத்திற்கு முன்பே திரும்பப் பெற முடிந்தது.
*/
contract TimeLock {
mapping(address => uint) public balances;
mapping(address => uint) public lockTime;
function deposit() external payable {
balances[msg.sender] += msg.value;
lockTime[msg.sender] = block.timestamp + 1 weeks;
}
function increaseLockTime(uint _secondsToIncrease) public {
lockTime[msg.sender] += _secondsToIncrease;
}
function withdraw() public {
require(balances[msg.sender] > 0, "Insufficient funds");
require(block.timestamp > lockTime[msg.sender], "Lock time not expired");
uint amount = balances[msg.sender];
balances[msg.sender] = 0;
(bool sent, ) = msg.sender.call{value: amount}("");
require(sent, "Failed to send Ether");
}
}
contract Attack {
TimeLock timeLock;
constructor(TimeLock _timeLock) {
timeLock = TimeLock(_timeLock);
}
fallback() external payable {}
function attack() public payable {
timeLock.deposit{value: msg.value}();
/*
t = தற்போதைய பூட்டு நேரம் என்றால், நாம் x ஐக் கண்டறிய வேண்டும், அதாவது
x + t = 2**256 = 0
எனவே x = -t
2**256 = type(uint).max + 1
எனவே x = type(uint).max + 1 - t
*/
timeLock.increaseLockTime(
type(uint).max + 1 - timeLock.lockTime(address(this))
);
timeLock.withdraw();
}
}
முழு எண் கீழ்வழிதல்கள் மற்றும் அளவுமீறல்களை எவ்வாறு தடுப்பது
பதிப்பு 0.8.0 நிலவரப்படி, முழு எண் கீழ்வழிதல்கள் மற்றும் அளவுமீறல்களை விளைவிக்கும் குறியீட்டை Solidity தொகுப்பான் நிராகரிக்கிறது. இருப்பினும், குறைந்த தொகுப்பான் பதிப்பில் தொகுக்கப்பட்ட ஒப்பந்தங்கள் எண்கணிதச் செயல்பாடுகளை உள்ளடக்கிய சார்புகளில் சரிபார்ப்புகளைச் செய்ய வேண்டும் அல்லது கீழ்வழிதல்/அளவுமீறலைச் சரிபார்க்கும் நிரலகத்தைப் (எ.கா., SafeMath (opens in a new tab)) பயன்படுத்த வேண்டும்.
தரவு வழங்கி கையாளுதல் (Oracle manipulation)
தரவு வழங்கிகள் புறச்சங்கிலித் தகவலைப் பெற்று, திறன் ஒப்பந்தங்கள் பயன்படுத்துவதற்காக அதைச் சங்கிலிசார்பாக அனுப்புகின்றன. தரவு வழங்கிகள் மூலம், மூலதனச் சந்தைகள் போன்ற புறச்சங்கிலி அமைப்புகளுடன் இயங்கக்கூடிய திறன் ஒப்பந்தங்களை நீங்கள் வடிவமைக்கலாம், இது அவற்றின் பயன்பாட்டைப் பெரிதும் விரிவுபடுத்துகிறது.
ஆனால் தரவு வழங்கி சிதைக்கப்பட்டு தவறான தகவலைச் சங்கிலிசார்பாக அனுப்பினால், திறன் ஒப்பந்தங்கள் தவறான உள்ளீடுகளின் அடிப்படையில் செயல்படும், இது சிக்கல்களை ஏற்படுத்தலாம். இது "ஆரக்கிள் சிக்கல்" என்பதன் அடிப்படையாகும், இது பிளாக்செயின் ஆரக்கிளிலிருந்து வரும் தகவல் துல்லியமானது, புதுப்பித்தலானது மற்றும் சரியான நேரத்தில் இருப்பதை உறுதி செய்யும் பணியைப் பற்றியது.
ஒரு சொத்தின் உடனடி விலையைப் (spot price) பெற, பரவலாக்கப்பட்ட பரிமாற்றம் போன்ற சங்கிலிசார் தரவு வழங்கியைப் பயன்படுத்துவது தொடர்புடைய பாதுகாப்புக் கவலையாகும். பரவலாக்கப்பட்ட நிதி (DeFi) துறையில் உள்ள கடனளிப்பு தளங்கள், ஒரு பயனர் எவ்வளவு கடன் வாங்க முடியும் என்பதைத் தீர்மானிக்க, பயனரின் பிணையத்தின் மதிப்பைத் தீர்மானிக்க இதை அடிக்கடி செய்கின்றன.
DEX விலைகள் பெரும்பாலும் துல்லியமானவை, சந்தைகளில் சமநிலையை மீட்டெடுக்கும் நடுவர்களால் (arbitrageurs) இது பெரும்பாலும் நிகழ்கிறது. இருப்பினும், அவை கையாளுதலுக்குத் திறந்திருக்கும், குறிப்பாக சங்கிலிசார் தரவு வழங்கி வரலாற்று வர்த்தக முறைகளின் அடிப்படையில் சொத்து விலைகளைக் கணக்கிட்டால் (பொதுவாக இதுவே நடக்கும்).
எடுத்துக்காட்டாக, உங்கள் கடனளிப்பு ஒப்பந்தத்துடன் தொடர்புகொள்வதற்கு முன்பே உடனடி கடனை எடுப்பதன் மூலம் தாக்குபவர் ஒரு சொத்தின் உடனடி விலையைச் செயற்கையாக உயர்த்தலாம். சொத்தின் விலைக்காக DEX-ஐ வினவுவது இயல்பை விட அதிக மதிப்பை வழங்கும் (தாக்குபவரின் பெரிய "வாங்குதல் ஆர்டர்" சொத்துக்கான தேவையைக் குறைப்பதால்), அவர்கள் வேண்டியதை விட அதிகமாகக் கடன் வாங்க அனுமதிக்கிறது. இத்தகைய "உடனடி கடன் தாக்குதல்கள்" DeFi பயன்பாடுகளிடையே விலை தரவு வழங்கிகளைச் சார்ந்திருப்பதைச் சுரண்டுவதற்குப் பயன்படுத்தப்பட்டுள்ளன, இதனால் நெறிமுறைகளுக்கு மில்லியன் கணக்கான நிதிகள் இழக்கப்பட்டுள்ளன.
தரவு வழங்கி கையாளுதலை எவ்வாறு தடுப்பது
தரவு வழங்கி கையாளுதலைத் தவிர்ப்பதற்கான (opens in a new tab) குறைந்தபட்சத் தேவை, ஒற்றை தோல்விப் புள்ளிகளைத் தவிர்க்கப் பல மூலங்களிலிருந்து தகவல்களை வினவும் பரவலாக்கப்பட்ட தரவு வழங்கிப் பிணையத்தைப் பயன்படுத்துவதாகும். பெரும்பாலான சந்தர்ப்பங்களில், பரவலாக்கப்பட்ட தரவு வழங்கிகள் சரியான தகவலைப் புகாரளிக்க தரவு வழங்கி முனைகளை (oracle nodes) ஊக்குவிக்க உள்ளமைக்கப்பட்ட கிரிப்டோபொருளாதார ஊக்கத்தொகைகளைக் கொண்டுள்ளன, இது மையப்படுத்தப்பட்ட தரவு வழங்கிகளை விட அவற்றைப் பாதுகாப்பானதாக்குகிறது.
சொத்து விலைகளுக்காகச் சங்கிலிசார் தரவு வழங்கியை வினவ நீங்கள் திட்டமிட்டால், நேர-எடையுள்ள சராசரி விலை (time-weighted average price - TWAP) வழிமுறையைச் செயல்படுத்தும் ஒன்றைப் பயன்படுத்தக் கருதுங்கள். ஒரு TWAP தரவு வழங்கி (opens in a new tab) இரண்டு வெவ்வேறு நேரங்களில் (நீங்கள் மாற்றியமைக்கலாம்) ஒரு சொத்தின் விலையை வினவுகிறது மற்றும் பெறப்பட்ட சராசரியின் அடிப்படையில் உடனடி விலையைக் கணக்கிடுகிறது. நீண்ட காலங்களைத் தேர்ந்தெடுப்பது விலைக் கையாளுதலுக்கு எதிராக உங்கள் நெறிமுறையைப் பாதுகாக்கிறது, ஏனெனில் சமீபத்தில் செயல்படுத்தப்பட்ட பெரிய ஆர்டர்கள் சொத்து விலைகளைப் பாதிக்க முடியாது.
டெவலப்பர்களுக்கான திறன் ஒப்பந்தப் பாதுகாப்பு ஆதாரங்கள்
திறன் ஒப்பந்தங்களை பகுப்பாய்வு செய்வதற்கும் குறியீட்டின் சரியான தன்மையை சரிபார்ப்பதற்குமான கருவிகள்
-
சோதனைக் கருவிகள் மற்றும் நிரலகங்கள் - திறன் ஒப்பந்தங்களில் அலகு சோதனைகள் (unit tests), நிலையான பகுப்பாய்வு (static analysis) மற்றும் மாறும் பகுப்பாய்வு (dynamic analysis) ஆகியவற்றைச் செய்வதற்கான தொழில்துறை-தரமான கருவிகள் மற்றும் நிரலகங்களின் தொகுப்பு.
-
முறைசார் சரிபார்ப்புக் கருவிகள் - திறன் ஒப்பந்தங்களில் செயல்பாட்டுச் சரியான தன்மையைச் சரிபார்ப்பதற்கும் மாறிலிகளைச் (invariants) சரிபார்ப்பதற்குமான கருவிகள்.
-
திறன் ஒப்பந்தத் தணிக்கை சேவைகள் - எத்திரியம் மேம்பாட்டுத் திட்டங்களுக்குத் திறன் ஒப்பந்தத் தணிக்கை சேவைகளை வழங்கும் நிறுவனங்களின் பட்டியல்.
-
பக் பவுண்டி தளங்கள் - பக் பவுண்டிகளை (bug bounties) ஒருங்கிணைப்பதற்கும், திறன் ஒப்பந்தங்களில் உள்ள முக்கியமான பாதிப்புகளைப் பொறுப்புடன் வெளிப்படுத்துபவர்களுக்கு வெகுமதி அளிப்பதற்குமான தளங்கள்.
-
Fork Checker (opens in a new tab) - கவை செய்யப்பட்ட (forked) ஒப்பந்தம் தொடர்பான கிடைக்கக்கூடிய அனைத்துத் தகவல்களையும் சரிபார்க்கும் ஒரு இலவச ஆன்லைன் கருவி.
-
ABI Encoder (opens in a new tab) - உங்கள் Solidity ஒப்பந்தச் செயல்பாடுகள் மற்றும் ஆக்கி (constructor) வாதங்களை குறியாக்கம் செய்வதற்கான ஒரு இலவச ஆன்லைன் சேவை.
-
Aderyn (opens in a new tab) - Solidity நிலையான பகுப்பாய்வி (Static Analyzer), சந்தேகத்திற்குரிய பாதிப்புகளைக் கண்டறிய சுருக்கமான தொடரியல் மரங்களை (Abstract Syntax Trees - AST) கடந்து சென்று, சிக்கல்களை எளிதாகப் புரிந்துகொள்ளக்கூடிய மார்க்டவுன் வடிவத்தில் அச்சிடுகிறது.
திறன் ஒப்பந்தங்களைக் கண்காணிப்பதற்கான கருவிகள்
- Tenderly Real-Time Alerting (opens in a new tab) - உங்கள் திறன் ஒப்பந்தங்கள் அல்லது பணப்பைகளில் வழக்கத்திற்கு மாறான அல்லது எதிர்பாராத நிகழ்வுகள் நடக்கும்போது நிகழ்நேர அறிவிப்புகளைப் பெறுவதற்கான ஒரு கருவி.
திறன் ஒப்பந்தங்களைப் பாதுகாப்பாக நிர்வகிப்பதற்கான கருவிகள்
-
Safe (opens in a new tab) - எத்திரியத்தில் இயங்கும் திறன் ஒப்பந்தப் பணப்பை, இது ஒரு பரிவர்த்தனை நடப்பதற்கு முன்பு குறைந்தபட்ச எண்ணிக்கையிலான நபர்கள் ஒப்புதல் அளிக்க வேண்டும் (M-of-N).
-
ஓப்பன்செப்பெலின் ஒப்பந்தங்கள் (opens in a new tab) - ஒப்பந்த உரிமை, மேம்படுத்தல்கள், அணுகல் கட்டுப்பாடுகள், ஆளுகை, இடைநிறுத்தும் திறன் மற்றும் பலவற்றை உள்ளடக்கிய நிர்வாக அம்சங்களைச் செயல்படுத்துவதற்கான ஒப்பந்த நிரலகங்கள்.
திறன் ஒப்பந்தத் தணிக்கை சேவைகள்
-
கன்சென்சிஸ் டிலிஜென்ஸ் (ConsenSys Diligence) (opens in a new tab) - தொகுதிச்சங்கிலி சுற்றுச்சூழல் அமைப்பு முழுவதும் உள்ள திட்டங்கள் தங்கள் நெறிமுறைகள் தொடங்குவதற்குத் தயாராக இருப்பதையும் பயனர்களைப் பாதுகாக்கும் வகையில் கட்டமைக்கப்பட்டுள்ளதையும் உறுதிசெய்ய உதவும் திறன் ஒப்பந்தத் தணிக்கை சேவை.
-
CertiK (opens in a new tab) - திறன் ஒப்பந்தங்கள் மற்றும் தொகுதிச்சங்கிலி பிணையங்களில் அதிநவீன முறைசார் சரிபார்ப்புத் தொழில்நுட்பத்தைப் பயன்படுத்துவதில் முன்னோடியாகத் திகழும் தொகுதிச்சங்கிலி பாதுகாப்பு நிறுவனம்.
-
Trail of Bits (opens in a new tab) - ஆபத்தைக் குறைப்பதற்கும் குறியீட்டை வலுப்படுத்துவதற்கும் பாதுகாப்பு ஆராய்ச்சியோடு தாக்குபவரின் மனநிலையையும் இணைக்கும் இணையப் பாதுகாப்பு நிறுவனம்.
-
PeckShield (opens in a new tab) - முழுத் தொகுதிச்சங்கிலி சுற்றுச்சூழல் அமைப்பின் பாதுகாப்பு, தனியுரிமை மற்றும் பயன்பாட்டிற்கான தயாரிப்புகள் மற்றும் சேவைகளை வழங்கும் தொகுதிச்சங்கிலி பாதுகாப்பு நிறுவனம்.
-
QuantStamp (opens in a new tab) - பாதுகாப்பு மற்றும் இடர் மதிப்பீட்டுச் சேவைகள் மூலம் தொகுதிச்சங்கிலி தொழில்நுட்பத்தின் பிரதான தத்தெடுப்பை எளிதாக்கும் தணிக்கை சேவை.
-
ஓப்பன்செப்பெலின் (opens in a new tab) - பகிர்ந்தளிக்கப்பட்ட அமைப்புகளுக்குப் பாதுகாப்புத் தணிக்கைகளை வழங்கும் திறன் ஒப்பந்தப் பாதுகாப்பு நிறுவனம்.
-
Runtime Verification (opens in a new tab) - திறன் ஒப்பந்தங்களின் முறைசார் மாதிரியாக்கம் மற்றும் சரிபார்ப்பில் நிபுணத்துவம் பெற்ற பாதுகாப்பு நிறுவனம்.
-
Hacken (opens in a new tab) - தொகுதிச்சங்கிலி பாதுகாப்பிற்கு 360-பாகை அணுகுமுறையைக் கொண்டுவரும் Web3 இணையப் பாதுகாப்புத் தணிக்கையாளர்.
-
நெதர்மைண்ட் (Nethermind) (opens in a new tab) - எத்திரியம் மற்றும் ஸ்டார்க்நெட் முழுவதும் திறன் ஒப்பந்தங்களின் ஒருமைப்பாட்டையும் பயனர்களின் பாதுகாப்பையும் உறுதிசெய்யும் Solidity மற்றும் Cairo தணிக்கை சேவைகள்.
-
HashEx (opens in a new tab) - கிரிப்டோகரன்சிகளின் பாதுகாப்பை உறுதிசெய்யத் தொகுதிச்சங்கிலி மற்றும் திறன் ஒப்பந்தத் தணிக்கையில் HashEx கவனம் செலுத்துகிறது, மேலும் திறன் ஒப்பந்த மேம்பாடு, ஊடுருவல் சோதனை (penetration testing), தொகுதிச்சங்கிலி ஆலோசனை போன்ற சேவைகளை வழங்குகிறது.
-
Code4rena (opens in a new tab) - திறன் ஒப்பந்தப் பாதுகாப்பு நிபுணர்களைப் பாதிப்புகளைக் கண்டறிய ஊக்குவிக்கும் மற்றும் Web3-ஐ மேலும் பாதுகாப்பானதாக்க உதவும் போட்டித் தணிக்கைத் தளம்.
-
CodeHawks (opens in a new tab) - பாதுகாப்பு ஆராய்ச்சியாளர்களுக்கான திறன் ஒப்பந்தத் தணிக்கைப் போட்டிகளை நடத்தும் போட்டித் தணிக்கைத் தளம்.
-
Cyfrin (opens in a new tab) - தயாரிப்புகள் மற்றும் திறன் ஒப்பந்தத் தணிக்கை சேவைகள் மூலம் கிரிப்டோ பாதுகாப்பை வளர்க்கும் Web3 பாதுகாப்பு அதிகார மையம்.
-
ImmuneBytes (opens in a new tab) - அனுபவம் வாய்ந்த தணிக்கையாளர்களின் குழு மற்றும் சிறந்த கருவிகள் மூலம் தொகுதிச்சங்கிலி அமைப்புகளுக்கான பாதுகாப்புத் தணிக்கைகளை வழங்கும் Web3 பாதுகாப்பு நிறுவனம்.
-
Oxorio (opens in a new tab) - கிரிப்டோ நிறுவனங்கள் மற்றும் பரவலாக்கப்பட்ட நிதி (DeFi) திட்டங்களுக்கான EVM, Solidity, ZK, குறுக்கு-சங்கிலி (Cross-chain) தொழில்நுட்பத்தில் நிபுணத்துவம் பெற்ற திறன் ஒப்பந்தத் தணிக்கைகள் மற்றும் தொகுதிச்சங்கிலி பாதுகாப்பு சேவைகள்.
-
Inference (opens in a new tab) - EVM அடிப்படையிலான தொகுதிச்சங்கிலிகளுக்கான திறன் ஒப்பந்தத் தணிக்கையில் நிபுணத்துவம் பெற்ற பாதுகாப்புத் தணிக்கை நிறுவனம். இதன் நிபுணத்துவத் தணிக்கையாளர்களுக்கு நன்றி, அவர்கள் சாத்தியமான சிக்கல்களைக் கண்டறிந்து, நிலைநிறுத்தத்திற்கு (deployment) முன்பு அவற்றைச் சரிசெய்வதற்கான செயல்முறை தீர்வுகளைப் பரிந்துரைக்கின்றனர்.
பக் பவுண்டி தளங்கள்
-
Immunefi (opens in a new tab) - திறன் ஒப்பந்தங்கள் மற்றும் பரவலாக்கப்பட்ட நிதி (DeFi) திட்டங்களுக்கான பக் பவுண்டி தளம், இதில் பாதுகாப்பு ஆராய்ச்சியாளர்கள் குறியீட்டை மதிப்பாய்வு செய்கிறார்கள், பாதிப்புகளை வெளிப்படுத்துகிறார்கள், பணம் பெறுகிறார்கள் மற்றும் கிரிப்டோவை பாதுகாப்பானதாக்குகிறார்கள்.
-
HackerOne (opens in a new tab) - ஊடுருவல் சோதனையாளர்கள் மற்றும் இணையப் பாதுகாப்பு ஆராய்ச்சியாளர்களுடன் வணிகங்களை இணைக்கும் பாதிப்பு ஒருங்கிணைப்பு மற்றும் பக் பவுண்டி தளம்.
-
HackenProof (opens in a new tab) - கிரிப்டோ திட்டங்களுக்கான (DeFi, திறன் ஒப்பந்தங்கள், பணப்பைகள், CEX மற்றும் பல) நிபுணத்துவ பக் பவுண்டி தளம், இதில் பாதுகாப்பு வல்லுநர்கள் ட்ரையேஜ் (triage) சேவைகளை வழங்குகிறார்கள் மற்றும் ஆராய்ச்சியாளர்கள் தொடர்புடைய, சரிபார்க்கப்பட்ட பிழை அறிக்கைகளுக்குப் பணம் பெறுகிறார்கள்.
-
Sherlock (opens in a new tab) - திறன் ஒப்பந்தப் பாதுகாப்பிற்கான Web3-இல் உள்ள அண்டர்ரைட்டர் (Underwriter), தொடர்புடைய பிழைகளுக்கு நியாயமான முறையில் பணம் வழங்கப்படுவதை உறுதிசெய்யத் திறன் ஒப்பந்தங்கள் மூலம் நிர்வகிக்கப்படும் தணிக்கையாளர்களுக்கான பேஅவுட்களைக் (payouts) கொண்டுள்ளது.
-
CodeHawks (opens in a new tab) - தணிக்கையாளர்கள் பாதுகாப்புப் போட்டிகள் மற்றும் சவால்களில் பங்கேற்கும், மற்றும் (விரைவில்) அவர்களின் சொந்தத் தனிப்பட்ட தணிக்கைகளிலும் பங்கேற்கும் போட்டி பக் பவுண்டி தளம்.
அறியப்பட்ட திறன் ஒப்பந்தப் பாதிப்புகள் மற்றும் சுரண்டல்களின் வெளியீடுகள்
-
கன்சென்சிஸ்: அறியப்பட்ட திறன் ஒப்பந்தத் தாக்குதல்கள் (opens in a new tab) - பெரும்பாலான நிகழ்வுகளுக்கான மாதிரி குறியீட்டுடன், மிக முக்கியமான ஒப்பந்தப் பாதிப்புகளின் தொடக்கநிலையாளர்களுக்கான எளிமையான விளக்கம்.
-
SWC பதிவேடு (opens in a new tab) - எத்திரியம் திறன் ஒப்பந்தங்களுக்குப் பொருந்தும் பொதுவான பலவீனக் கணக்கீட்டு (Common Weakness Enumeration - CWE) உருப்படிகளின் தொகுக்கப்பட்ட பட்டியல்.
-
Rekt (opens in a new tab) - விரிவான பிந்தைய பகுப்பாய்வு (post-mortem) அறிக்கைகளுடன், உயர்மட்ட கிரிப்டோ ஹேக்குகள் மற்றும் சுரண்டல்களின் தொடர்ந்து புதுப்பிக்கப்படும் வெளியீடு.
திறன் ஒப்பந்தப் பாதுகாப்பைக் கற்றுக்கொள்வதற்கான சவால்கள்
-
Awesome BlockSec CTF (opens in a new tab) - தொகுதிச்சங்கிலி பாதுகாப்புப் போர் விளையாட்டுகள் (wargames), சவால்கள் மற்றும் Capture The Flag (opens in a new tab) போட்டிகள் மற்றும் தீர்வு எழுத்துக்களின் தொகுக்கப்பட்ட பட்டியல்.
-
Damn Vulnerable DeFi (opens in a new tab) - பரவலாக்கப்பட்ட நிதி (DeFi) திறன் ஒப்பந்தங்களின் தாக்குதல் பாதுகாப்பைக் கற்றுக்கொள்வதற்கும், பிழை வேட்டை மற்றும் பாதுகாப்புத் தணிக்கையில் திறன்களை வளர்ப்பதற்குமான போர் விளையாட்டு.
-
Ethernaut (opens in a new tab) - Web3/Solidity அடிப்படையிலான போர் விளையாட்டு, இதில் ஒவ்வொரு நிலையும் 'ஹேக்' செய்யப்பட வேண்டிய ஒரு திறன் ஒப்பந்தமாகும்.
-
HackenProof x HackTheBox (opens in a new tab) - ஒரு கற்பனை சாகசத்தில் அமைக்கப்பட்ட திறன் ஒப்பந்த ஹேக்கிங் சவால். சவாலை வெற்றிகரமாக முடிப்பது ஒரு தனிப்பட்ட பக் பவுண்டி திட்டத்திற்கான அணுகலையும் வழங்குகிறது.
திறன் ஒப்பந்தங்களைப் பாதுகாப்பதற்கான சிறந்த நடைமுறைகள்
-
கன்சென்சிஸ்: எத்திரியம் திறன் ஒப்பந்தப் பாதுகாப்புச் சிறந்த நடைமுறைகள் (opens in a new tab) - எத்திரியம் திறன் ஒப்பந்தங்களைப் பாதுகாப்பதற்கான வழிகாட்டுதல்களின் விரிவான பட்டியல்.
-
Nascent: எளிய பாதுகாப்புக் கருவித்தொகுப்பு (opens in a new tab) - திறன் ஒப்பந்த மேம்பாட்டிற்கான நடைமுறைப் பாதுகாப்பு மைய வழிகாட்டிகள் மற்றும் சரிபார்ப்புப் பட்டியல்களின் தொகுப்பு.
-
Solidity வடிவங்கள் (opens in a new tab) - திறன் ஒப்பந்த நிரலாக்க மொழியான Solidity-க்கான பாதுகாப்பான வடிவங்கள் மற்றும் சிறந்த நடைமுறைகளின் பயனுள்ள தொகுப்பு.
-
Solidity ஆவணங்கள்: பாதுகாப்புக் கருத்தாய்வுகள் (opens in a new tab) - Solidity மூலம் பாதுகாப்பான திறன் ஒப்பந்தங்களை எழுதுவதற்கான வழிகாட்டுதல்கள்.
-
திறன் ஒப்பந்தப் பாதுகாப்புச் சரிபார்ப்புத் தரம் (opens in a new tab) - டெவலப்பர்கள், வடிவமைப்பாளர்கள், பாதுகாப்பு மதிப்பாய்வாளர்கள் மற்றும் விற்பனையாளர்களுக்கான திறன் ஒப்பந்தங்களின் பாதுகாப்பைத் தரப்படுத்த உருவாக்கப்பட்ட பதினான்கு பகுதி சரிபார்ப்புப் பட்டியல்.
-
திறன் ஒப்பந்தப் பாதுகாப்பு மற்றும் தணிக்கையைக் கற்றுக்கொள்ளுங்கள் (opens in a new tab) - தங்கள் பாதுகாப்புச் சிறந்த நடைமுறைகளை மேம்படுத்திப் பாதுகாப்பு ஆராய்ச்சியாளர்களாக மாற விரும்பும் திறன் ஒப்பந்த டெவலப்பர்களுக்காக உருவாக்கப்பட்ட இறுதித் திறன் ஒப்பந்தப் பாதுகாப்பு மற்றும் தணிக்கைப் பாடநெறி.
திறன் ஒப்பந்தப் பாதுகாப்பு குறித்த பயிற்சிகள்
-
திறன் ஒப்பந்தப் பிழைகளைக் கண்டறிய ஸ்லித்தரை (Slither) எவ்வாறு பயன்படுத்துவது
-
திறன் ஒப்பந்தப் பிழைகளைக் கண்டறிய மேண்டிகோரை (Manticore) எவ்வாறு பயன்படுத்துவது
-
உங்கள் வில்லை ஒப்பந்தத்தை தன்னிச்சையான வில்லைகளுடன் பாதுகாப்பாக ஒருங்கிணைப்பது எப்படி
-
Cyfrin Updraft - திறன் ஒப்பந்தப் பாதுகாப்பு மற்றும் தணிக்கை முழுப் பாடநெறி (opens in a new tab)