முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்

ஸ்மார்ட் ஒப்பந்தப் பாதுகாப்பு வழிகாட்டுதல்கள்

Solidity
ஸ்மார்ட் ஒப்பந்தங்கள்
பாதுகாப்பு
இடைநிலையாளர்
Trailofbits
6 செப்டம்பர், 2020
4 நிமிட வாசிப்பு

மிகவும் பாதுகாப்பான ஸ்மார்ட் ஒப்பந்தங்களை உருவாக்க இந்த உயர்மட்டப் பரிந்துரைகளைப் பின்பற்றவும்.

வடிவமைப்பு வழிகாட்டுதல்கள்

எந்தவொரு குறியீட்டையும் எழுதுவதற்கு முன்பாகவே, ஒப்பந்தத்தின் வடிவமைப்பு குறித்து முன்கூட்டியே விவாதிக்கப்பட வேண்டும்.

ஆவணமாக்கல் மற்றும் விவரக்குறிப்புகள்

ஆவணங்களை வெவ்வேறு நிலைகளில் எழுதலாம், மேலும் ஒப்பந்தங்களைச் செயல்படுத்தும்போது அவை புதுப்பிக்கப்பட வேண்டும்:

  • கணினியின் எளிய ஆங்கில விளக்கம், ஒப்பந்தங்கள் என்ன செய்கின்றன என்பதையும் குறியீட்டுத் தளத்தின் மீதான ஏதேனும் அனுமானங்களையும் விவரிக்கிறது.
  • திட்ட மற்றும் கட்டமைப்பு வரைபடங்கள், ஒப்பந்தப் பரிமாற்றங்கள் மற்றும் கணினியின் நிலை இயந்திரம் (state machine) உட்பட. இந்தத் திட்டங்களை உருவாக்க Slither printers (opens in a new tab) உதவலாம்.
  • முழுமையான குறியீட்டு ஆவணமாக்கல், Solidity-க்கு Natspec format (opens in a new tab)-ஐப் பயன்படுத்தலாம்.

ஆன்செயின் மற்றும் ஆஃப்செயின் கணக்கீடு

  • உங்களால் முடிந்தவரை அதிக குறியீட்டை ஆஃப்செயினில் (offchain) வைத்திருக்கவும். ஆன்செயின் (onchain) அடுக்கைச் சிறியதாக வைத்திருக்கவும். ஆன்செயினில் சரிபார்ப்பது எளிதாக இருக்கும் வகையில், ஆஃப்செயினில் உள்ள குறியீட்டைக் கொண்டு தரவை முன்கூட்டியே செயலாக்கவும். உங்களுக்கு வரிசைப்படுத்தப்பட்ட பட்டியல் தேவையா? பட்டியலை ஆஃப்செயினில் வரிசைப்படுத்தி, பின்னர் ஆன்செயினில் அதன் வரிசையை மட்டும் சரிபார்க்கவும்.

மேம்படுத்தும் திறன்

வெவ்வேறு மேம்படுத்தும் திறன் தீர்வுகள் குறித்து எங்கள் வலைப்பதிவில் (opens in a new tab) விவாதித்துள்ளோம். எந்தவொரு குறியீட்டையும் எழுதுவதற்கு முன்பு, மேம்படுத்தும் திறனை ஆதரிப்பதா இல்லையா என்பதைத் திட்டமிட்டு முடிவு செய்யுங்கள். இந்த முடிவு உங்கள் குறியீட்டை எவ்வாறு கட்டமைக்கிறீர்கள் என்பதைப் பாதிக்கும். பொதுவாக, நாங்கள் பரிந்துரைப்பது:

  • மேம்படுத்தும் திறனை விட ஒப்பந்த இடம்பெயர்வுக்கு (opens in a new tab) முன்னுரிமை அளித்தல். இடம்பெயர்வு அமைப்புகள் மேம்படுத்தக்கூடிய அமைப்புகளின் பல நன்மைகளைக் கொண்டுள்ளன, ஆனால் அவற்றின் குறைபாடுகள் இல்லாமல்.
  • delegatecallproxy முறைக்கு பதிலாக தரவுப் பிரிப்பு (data separation) முறையைப் பயன்படுத்துதல். உங்கள் திட்டத்தில் தெளிவான சுருக்கப் பிரிப்பு (abstraction separation) இருந்தால், தரவுப் பிரிப்பைப் பயன்படுத்தி மேம்படுத்துவதற்குச் சில மாற்றங்கள் மட்டுமே தேவைப்படும். delegatecallproxy-க்கு EVM நிபுணத்துவம் தேவை மற்றும் இது அதிக பிழைகள் ஏற்பட வாய்ப்புள்ளது.
  • வரிசைப்படுத்தலுக்கு (deployment) முன் இடம்பெயர்வு/மேம்படுத்தல் செயல்முறையை ஆவணப்படுத்தவும். எந்த வழிகாட்டுதலும் இல்லாமல் மன அழுத்தத்தின் கீழ் நீங்கள் செயல்பட வேண்டியிருந்தால், நீங்கள் தவறுகளைச் செய்வீர்கள். பின்பற்ற வேண்டிய செயல்முறையை முன்கூட்டியே எழுதவும். இதில் பின்வருவன அடங்கியிருக்க வேண்டும்:
    • புதிய ஒப்பந்தங்களைத் தொடங்கும் அழைப்புகள் (calls)
    • திறவுகோல்கள் (keys) எங்கே சேமிக்கப்பட்டுள்ளன மற்றும் அவற்றை எவ்வாறு அணுகுவது
    • வரிசைப்படுத்தலை எவ்வாறு சரிபார்ப்பது! வரிசைப்படுத்தலுக்குப் பிந்தைய ஸ்கிரிப்டை உருவாக்கிச் சோதிக்கவும்.

செயல்படுத்தல் வழிகாட்டுதல்கள்

எளிமைக்காக முயற்சி செய்யுங்கள். உங்கள் நோக்கத்திற்குப் பொருந்தக்கூடிய எளிமையான தீர்வை எப்போதும் பயன்படுத்தவும். உங்கள் குழுவில் உள்ள எந்தவொரு உறுப்பினரும் உங்கள் தீர்வைப் புரிந்துகொள்ள முடியும்.

செயல்பாட்டுக் கட்டமைப்பு

உங்கள் குறியீட்டுத் தளத்தின் கட்டமைப்பு உங்கள் குறியீட்டை மதிப்பாய்வு செய்வதை எளிதாக்க வேண்டும். அதன் சரியான தன்மையைப் பற்றிப் பகுத்தறியும் திறனைக் குறைக்கும் கட்டமைப்புத் தேர்வுகளைத் தவிர்க்கவும்.

  • உங்கள் கணினியின் தர்க்கத்தைப் பிரிக்கவும், பல ஒப்பந்தங்கள் மூலமாகவோ அல்லது ஒத்த செயல்பாடுகளை ஒன்றாகத் தொகுப்பதன் மூலமாகவோ (எடுத்துக்காட்டாக, அங்கீகாரம், எண்கணிதம், ...).
  • தெளிவான நோக்கத்துடன் சிறிய செயல்பாடுகளை எழுதவும். இது எளிதான மதிப்பாய்வை எளிதாக்கும் மற்றும் தனிப்பட்ட கூறுகளைச் சோதிக்க அனுமதிக்கும்.

மரபுரிமை (Inheritance)

  • மரபுரிமையை நிர்வகிக்கக்கூடியதாக வைத்திருக்கவும். தர்க்கத்தைப் பிரிக்க மரபுரிமை பயன்படுத்தப்பட வேண்டும், இருப்பினும், உங்கள் திட்டம் மரபுரிமை மரத்தின் ஆழத்தையும் அகலத்தையும் குறைப்பதை நோக்கமாகக் கொண்டிருக்க வேண்டும்.
  • ஒப்பந்தங்களின் படிநிலையைச் சரிபார்க்க Slither-இன் inheritance printer (opens in a new tab)-ஐப் பயன்படுத்தவும். படிநிலையின் அளவை மதிப்பாய்வு செய்ய inheritance printer உங்களுக்கு உதவும்.

நிகழ்வுகள் (Events)

  • அனைத்து முக்கியமான செயல்பாடுகளையும் பதிவு செய்யவும். மேம்பாட்டின் போது ஒப்பந்தத்தைப் பிழைத்திருத்தம் (debug) செய்யவும், வரிசைப்படுத்திய பின் அதைக் கண்காணிக்கவும் நிகழ்வுகள் உதவும்.

அறியப்பட்ட ஆபத்துகளைத் தவிர்க்கவும்

  • மிகவும் பொதுவான பாதுகாப்புச் சிக்கல்களைப் பற்றி அறிந்திருங்கள். Ethernaut CTF (opens in a new tab), Capture the Ether (opens in a new tab) அல்லது Not so smart contracts (opens in a new tab) போன்ற பொதுவான சிக்கல்களைப் பற்றி அறிய பல ஆன்லைன் ஆதாரங்கள் உள்ளன.
  • Solidity ஆவணத்தில் (opens in a new tab) உள்ள எச்சரிக்கைப் பிரிவுகளைப் பற்றி அறிந்திருங்கள். எச்சரிக்கைப் பிரிவுகள் மொழியின் வெளிப்படையற்ற நடத்தை பற்றி உங்களுக்குத் தெரிவிக்கும்.

சார்புகள் (Dependencies)

  • நன்கு சோதிக்கப்பட்ட நூலகங்களைப் (libraries) பயன்படுத்தவும். நன்கு சோதிக்கப்பட்ட நூலகங்களிலிருந்து குறியீட்டை இறக்குமதி செய்வது, நீங்கள் பிழையான குறியீட்டை எழுதுவதற்கான வாய்ப்பைக் குறைக்கும். நீங்கள் ஒரு ERC20 ஒப்பந்தத்தை எழுத விரும்பினால், OpenZeppelin (opens in a new tab)-ஐப் பயன்படுத்தவும்.
  • சார்பு மேலாளரைப் (dependency manager) பயன்படுத்தவும்; குறியீட்டை நகலெடுத்து ஒட்டுவதைத் தவிர்க்கவும். நீங்கள் ஒரு வெளிப்புற மூலத்தை நம்பியிருந்தால், அசல் மூலத்துடன் அதை நீங்கள் புதுப்பித்த நிலையில் வைத்திருக்க வேண்டும்.

சோதனை மற்றும் சரிபார்ப்பு

  • முழுமையான யூனிட்-சோதனைகளை (unit-tests) எழுதவும். உயர்தர மென்பொருளை உருவாக்க ஒரு விரிவான சோதனைத் தொகுப்பு முக்கியமானது.
  • Slither (opens in a new tab), Echidna (opens in a new tab) மற்றும் Manticore (opens in a new tab) தனிப்பயன் சரிபார்ப்புகள் மற்றும் பண்புகளை எழுதவும். உங்கள் ஒப்பந்தம் பாதுகாப்பானது என்பதை உறுதிப்படுத்த தானியங்கு கருவிகள் உதவும். திறமையான சரிபார்ப்புகள் மற்றும் பண்புகளை எவ்வாறு எழுதுவது என்பதை அறிய இந்த வழிகாட்டியின் மீதமுள்ள பகுதியை மதிப்பாய்வு செய்யவும்.
  • crytic.io (opens in a new tab)-ஐப் பயன்படுத்தவும். Crytic GitHub உடன் ஒருங்கிணைக்கிறது, தனிப்பட்ட Slither கண்டறிதல்களுக்கான அணுகலை வழங்குகிறது மற்றும் Echidna-விலிருந்து தனிப்பயன் பண்புச் சரிபார்ப்புகளை இயக்குகிறது.

Solidity

  • 0.4 மற்றும் 0.6-ஐ விட Solidity 0.5-க்கு முன்னுரிமை அளிக்கவும். எங்கள் கருத்தில், Solidity 0.5 மிகவும் பாதுகாப்பானது மற்றும் 0.4-ஐ விடச் சிறந்த உள்ளமைக்கப்பட்ட நடைமுறைகளைக் கொண்டுள்ளது. Solidity 0.6 உற்பத்திக்கான நிலைத்தன்மையற்றது என நிரூபிக்கப்பட்டுள்ளது மற்றும் முதிர்ச்சியடைய நேரம் தேவை.
  • தொகுக்க (compile) நிலையான வெளியீட்டைப் பயன்படுத்தவும்; எச்சரிக்கைகளைச் சரிபார்க்கச் சமீபத்திய வெளியீட்டைப் பயன்படுத்தவும். சமீபத்திய கம்பைலர் பதிப்பில் உங்கள் குறியீட்டில் எந்தச் சிக்கல்களும் பதிவாகவில்லை என்பதைச் சரிபார்க்கவும். இருப்பினும், Solidity வேகமான வெளியீட்டுச் சுழற்சியைக் கொண்டுள்ளது மற்றும் கம்பைலர் பிழைகளின் வரலாற்றைக் கொண்டுள்ளது, எனவே வரிசைப்படுத்தலுக்குச் சமீபத்திய பதிப்பை நாங்கள் பரிந்துரைக்கவில்லை (Slither-இன் solc version recommendation (opens in a new tab)-ஐப் பார்க்கவும்).
  • இன்லைன் அசெம்பிளியைப் (inline assembly) பயன்படுத்த வேண்டாம். அசெம்பிளிக்கு EVM நிபுணத்துவம் தேவை. நீங்கள் மஞ்சள் தாளை (yellow paper) முழுமையாகக் கற்கவில்லை என்றால் EVM குறியீட்டை எழுத வேண்டாம்.

வரிசைப்படுத்தல் வழிகாட்டுதல்கள்

ஒப்பந்தம் உருவாக்கப்பட்டு வரிசைப்படுத்தப்பட்டவுடன்:

  • உங்கள் ஒப்பந்தங்களைக் கண்காணிக்கவும். பதிவுகளைப் (logs) பார்க்கவும், ஒப்பந்தம் அல்லது வாலட் சமரசம் செய்யப்பட்டால் செயல்படத் தயாராக இருக்கவும்.
  • உங்கள் தொடர்புத் தகவலை blockchain-security-contacts (opens in a new tab)-இல் சேர்க்கவும். பாதுகாப்புப் பிழை கண்டறியப்பட்டால் மூன்றாம் தரப்பினர் உங்களைத் தொடர்புகொள்ள இந்தப் பட்டியல் உதவுகிறது.
  • சிறப்புரிமை பெற்ற பயனர்களின் வாலட்களைப் பாதுகாக்கவும். வன்பொருள் வாலட்களில் (hardware wallets) திறவுகோல்களைச் சேமித்தால், எங்கள் சிறந்த நடைமுறைகளைப் (opens in a new tab) பின்பற்றவும்.
  • நிகழ்வுக்கான எதிர்வினைத் திட்டத்தை (response to incident plan) வைத்திருக்கவும். உங்கள் ஸ்மார்ட் ஒப்பந்தங்கள் சமரசம் செய்யப்படலாம் என்பதைக் கருத்தில் கொள்ளவும். உங்கள் ஒப்பந்தங்களில் பிழைகள் இல்லாவிட்டாலும், தாக்குபவர் ஒப்பந்த உரிமையாளரின் திறவுகோல்களைக் கட்டுப்படுத்தலாம்.

பக்கம் கடைசியாகப் புதுப்பிக்கப்பட்டது: 3 மார்ச், 2026

இந்த வழிகாட்டி பயனுள்ளதாக இருந்ததா?