స్మార్ట్ కాంట్రాక్ట్ భద్రత
స్మార్ట్ కాంట్రాక్ట్లు చాలా అనువైనవి, మరియు బ్లాక్చైన్లో డిప్లాయ్ చేయబడిన కోడ్ ఆధారంగా మార్చలేని లాజిక్ను రన్ చేస్తూనే, పెద్ద మొత్తంలో విలువ మరియు డేటాను నియంత్రించగల సామర్థ్యాన్ని కలిగి ఉంటాయి. ఇది పాత సిస్టమ్ల కంటే అనేక ప్రయోజనాలను అందించే విశ్వాస రహిత మరియు వికేంద్రీకృత అప్లికేషన్ల యొక్క శక్తివంతమైన పర్యావరణ వ్యవస్థను సృష్టించింది. స్మార్ట్ కాంట్రాక్ట్లలోని దుర్బలత్వాలను ఉపయోగించుకుని లాభం పొందాలని చూస్తున్న దాడి చేసేవారికి ఇవి అవకాశాలను కూడా సూచిస్తాయి.
ఎథీరియం వంటి పబ్లిక్ బ్లాక్చైన్లు, స్మార్ట్ కాంట్రాక్ట్లను సురక్షితం చేసే సమస్యను మరింత క్లిష్టతరం చేస్తాయి. భద్రతా లోపాలను సరిచేయడానికి డిప్లాయ్ చేయబడిన కాంట్రాక్ట్ కోడ్ సాధారణంగా మార్చబడదు, అయితే స్మార్ట్ కాంట్రాక్ట్ల నుండి దొంగిలించబడిన ఆస్తులను ట్రాక్ చేయడం చాలా కష్టం మరియు మార్చలేనితనం కారణంగా వాటిని తిరిగి పొందడం దాదాపు అసాధ్యం.
గణాంకాలు మారుతూ ఉన్నప్పటికీ, స్మార్ట్ కాంట్రాక్ట్లలోని భద్రతా లోపాల కారణంగా దొంగిలించబడిన లేదా కోల్పోయిన మొత్తం విలువ సులభంగా $1 బిలియన్ కంటే ఎక్కువగా ఉంటుందని అంచనా వేయబడింది. ఇందులో DAO హ్యాక్ (opens in a new tab) (3.6M ETH దొంగిలించబడింది, నేటి ధరలలో దీని విలువ $1B కంటే ఎక్కువ), Parity మల్టీసిగ్ వాలెట్ హ్యాక్ (opens in a new tab) (హ్యాకర్ల వల్ల $30M నష్టం), మరియు Parity ఫ్రోజెన్ వాలెట్ సమస్య (opens in a new tab) (ETH లో $300M కంటే ఎక్కువ శాశ్వతంగా లాక్ చేయబడింది) వంటి ఉన్నత-స్థాయి సంఘటనలు ఉన్నాయి.
పైన పేర్కొన్న సమస్యలు డెవలపర్లు సురక్షితమైన, పటిష్టమైన మరియు స్థితిస్థాపకమైన స్మార్ట్ కాంట్రాక్ట్లను రూపొందించడంలో కృషి చేయడం అత్యవసరం చేస్తాయి. స్మార్ట్ కాంట్రాక్ట్ భద్రత అనేది ఒక తీవ్రమైన విషయం, మరియు ప్రతి డెవలపర్ దీనిని నేర్చుకోవడం చాలా మంచిది. ఈ గైడ్ ఎథీరియం డెవలపర్ల కోసం భద్రతా పరిగణనలను కవర్ చేస్తుంది మరియు స్మార్ట్ కాంట్రాక్ట్ భద్రతను మెరుగుపరచడానికి వనరులను అన్వేషిస్తుంది.
ముందస్తు అవసరాలు
భద్రత గురించి తెలుసుకునే ముందు, స్మార్ట్ కాంట్రాక్ట్ డెవలప్మెంట్ ప్రాథమిక అంశాలపై మీకు అవగాహన ఉందని నిర్ధారించుకోండి.
సురక్షితమైన ఎథీరియం స్మార్ట్ కాంట్రాక్ట్లను నిర్మించడానికి మార్గదర్శకాలు
1. సరైన యాక్సెస్ నియంత్రణలను రూపొందించండి
స్మార్ట్ కాంట్రాక్ట్లలో, public లేదా external అని గుర్తించబడిన ఫంక్షన్లను ఏదైనా బాహ్య యాజమాన్య ఖాతాలు (EOAలు) లేదా కాంట్రాక్ట్ ఖాతాలు పిలవవచ్చు. ఇతరులు మీ కాంట్రాక్ట్తో ఇంటరాక్ట్ అవ్వాలని మీరు కోరుకుంటే ఫంక్షన్ల కోసం పబ్లిక్ విజిబిలిటీని పేర్కొనడం అవసరం. అయితే private అని గుర్తించబడిన ఫంక్షన్లను స్మార్ట్ కాంట్రాక్ట్లోని ఫంక్షన్లు మాత్రమే పిలవగలవు మరియు బాహ్య ఖాతాలు కాదు. ప్రతి నెట్వర్క్ పాల్గొనేవారికి కాంట్రాక్ట్ ఫంక్షన్లకు యాక్సెస్ ఇవ్వడం సమస్యలను కలిగిస్తుంది, ప్రత్యేకించి ఎవరైనా సున్నితమైన కార్యకలాపాలను (ఉదా., కొత్త టోకెన్లను ముద్రించడం) చేయగలరని దీని అర్థం అయితే.
స్మార్ట్ కాంట్రాక్ట్ ఫంక్షన్ల అనధికార వినియోగాన్ని నిరోధించడానికి, సురక్షితమైన యాక్సెస్ నియంత్రణలను అమలు చేయడం అవసరం. యాక్సెస్ నియంత్రణ యంత్రాంగాలు స్మార్ట్ కాంట్రాక్ట్లోని నిర్దిష్ట ఫంక్షన్లను ఉపయోగించగల సామర్థ్యాన్ని కాంట్రాక్ట్ను నిర్వహించడానికి బాధ్యత వహించే ఖాతాల వంటి ఆమోదించబడిన ఎంటిటీలకు పరిమితం చేస్తాయి. స్మార్ట్ కాంట్రాక్ట్లలో యాక్సెస్ నియంత్రణను అమలు చేయడానికి ఓనబుల్ ప్యాటర్న్ (Ownable pattern) మరియు పాత్ర-ఆధారిత నియంత్రణ (role-based control) అనేవి రెండు ఉపయోగకరమైన ప్యాటర్న్లు:
ఓనబుల్ ప్యాటర్న్ (Ownable pattern)
ఓనబుల్ ప్యాటర్న్లో, కాంట్రాక్ట్-సృష్టి ప్రక్రియలో ఒక చిరునామా కాంట్రాక్ట్ యొక్క "యజమాని"గా సెట్ చేయబడుతుంది. రక్షిత ఫంక్షన్లకు OnlyOwner మాడిఫైయర్ కేటాయించబడుతుంది, ఇది ఫంక్షన్ను అమలు చేయడానికి ముందు కాలింగ్ చిరునామా యొక్క గుర్తింపును కాంట్రాక్ట్ ప్రామాణీకరిస్తుందని నిర్ధారిస్తుంది. కాంట్రాక్ట్ యజమాని కాకుండా ఇతర చిరునామాల నుండి రక్షిత ఫంక్షన్లకు చేసే కాల్లు ఎల్లప్పుడూ రివర్ట్ అవుతాయి, అవాంఛిత యాక్సెస్ను నిరోధిస్తాయి.
పాత్ర-ఆధారిత యాక్సెస్ నియంత్రణ
స్మార్ట్ కాంట్రాక్ట్లో ఒకే చిరునామాను Owner గా నమోదు చేయడం కేంద్రీకరణ ప్రమాదాన్ని పరిచయం చేస్తుంది మరియు వైఫల్యానికి ఒకే బిందువును సూచిస్తుంది. యజమాని ఖాతా కీలు రాజీపడితే, దాడి చేసేవారు స్వంత కాంట్రాక్ట్పై దాడి చేయవచ్చు. బహుళ పరిపాలనా ఖాతాలతో పాత్ర-ఆధారిత యాక్సెస్ నియంత్రణ ప్యాటర్న్ను ఉపయోగించడం మంచి ఎంపిక కావడానికి ఇదే కారణం.
పాత్ర-ఆధారిత యాక్సెస్ నియంత్రణలో, సున్నితమైన ఫంక్షన్లకు యాక్సెస్ విశ్వసనీయ పాల్గొనేవారి సమితి మధ్య పంపిణీ చేయబడుతుంది. ఉదాహరణకు, ఒక ఖాతా టోకెన్లను ముద్రించడం బాధ్యత వహించవచ్చు, మరొక ఖాతా అప్గ్రేడ్లను చేస్తుంది లేదా కాంట్రాక్ట్ను పాజ్ చేస్తుంది. ఈ విధంగా యాక్సెస్ నియంత్రణను వికేంద్రీకృత చేయడం వైఫల్యం యొక్క ఒకే బిందువులను తొలగిస్తుంది మరియు వినియోగదారుల కోసం విశ్వాస ఉపకల్పనలు తగ్గిస్తుంది.
బహుళ-సంతకం వాలెట్లను ఉపయోగించడం
సురక్షితమైన యాక్సెస్ నియంత్రణను అమలు చేయడానికి మరొక విధానం కాంట్రాక్ట్ను నిర్వహించడానికి బహుళ-సంతకం ఖాతాను ఉపయోగించడం. సాధారణ 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. స్మార్ట్ కాంట్రాక్ట్లను పరీక్షించండి మరియు కోడ్ ఖచ్చితత్వాన్ని ధృవీకరించండి
ఎథీరియం వర్చువల్ మెషీన్లో నడుస్తున్న కోడ్ యొక్క మార్చలేనితనం అంటే అభివృద్ధి దశలో స్మార్ట్ కాంట్రాక్ట్లకు అధిక స్థాయి నాణ్యత అంచనా అవసరం. మీ కాంట్రాక్ట్ను విస్తృతంగా పరీక్షించడం మరియు ఏవైనా ఊహించని ఫలితాల కోసం దానిని గమనించడం భద్రతను చాలా మెరుగుపరుస్తుంది మరియు దీర్ఘకాలంలో మీ వినియోగదారులను రక్షిస్తుంది.
వినియోగదారుల నుండి కాంట్రాక్ట్ స్వీకరిస్తుందని ఆశించే మాక్ డేటాను ఉపయోగించి చిన్న యూనిట్ పరీక్షలను వ్రాయడం సాధారణ పద్ధతి. నిర్దిష్ట ఫంక్షన్ల కార్యాచరణను పరీక్షించడానికి మరియు స్మార్ట్ కాంట్రాక్ట్ ఆశించిన విధంగా పనిచేస్తుందని నిర్ధారించడానికి యూనిట్ టెస్టింగ్ మంచిది.
దురదృష్టవశాత్తూ, ఒంటరిగా ఉపయోగించినప్పుడు స్మార్ట్ కాంట్రాక్ట్ భద్రతను మెరుగుపరచడానికి యూనిట్ టెస్టింగ్ తక్కువ ప్రభావవంతంగా ఉంటుంది. మాక్ డేటా కోసం ఫంక్షన్ సరిగ్గా అమలు అవుతుందని యూనిట్ పరీక్ష నిరూపించవచ్చు, కానీ వ్రాసిన పరీక్షల వలె మాత్రమే యూనిట్ పరీక్షలు ప్రభావవంతంగా ఉంటాయి. ఇది మీ స్మార్ట్ కాంట్రాక్ట్ భద్రతను విచ్ఛిన్నం చేసే తప్పిపోయిన ఎడ్జ్ కేసులు మరియు దుర్బలత్వాలను గుర్తించడం కష్టతరం చేస్తుంది.
స్టాటిక్ మరియు డైనమిక్ విశ్లేషణ ఉపయోగించి నిర్వహించబడే ప్రాపర్టీ-ఆధారిత పరీక్షతో యూనిట్ టెస్టింగ్ను కలపడం మెరుగైన విధానం. చేరుకోగల ప్రోగ్రామ్ స్థితులు మరియు అమలు మార్గాలను విశ్లేషించడానికి స్టాటిక్ విశ్లేషణ కంట్రోల్ ఫ్లో గ్రాఫ్లు (opens in a new tab) మరియు అబ్స్ట్రాక్ట్ సింటాక్స్ ట్రీస్ (opens in a new tab) వంటి తక్కువ-స్థాయి ప్రాతినిధ్యాలపై ఆధారపడుతుంది. ఇంతలో, స్మార్ట్ కాంట్రాక్ట్ ఫజ్జింగ్ (opens in a new tab) వంటి డైనమిక్ విశ్లేషణ పద్ధతులు, భద్రతా లక్షణాలను ఉల్లంఘించే కార్యకలాపాలను గుర్తించడానికి యాదృచ్ఛిక ఇన్పుట్ విలువల ద్వారా కాంట్రాక్ట్ కోడ్ను అమలు చేస్తాయి.
స్మార్ట్ కాంట్రాక్ట్లలో భద్రతా లక్షణాలను ధృవీకరించడానికి నియత ధృవీకరణ మరొక సాంకేతికత. సాధారణ పరీక్ష వలె కాకుండా, నియత ధృవీకరణ స్మార్ట్ కాంట్రాక్ట్లో లోపాలు లేవని నిశ్చయంగా నిరూపించగలదు. కావలసిన భద్రతా లక్షణాలను సంగ్రహించే అధికారిక స్పెసిఫికేషన్ను సృష్టించడం మరియు కాంట్రాక్ట్ల అధికారిక నమూనా ఈ స్పెసిఫికేషన్కు కట్టుబడి ఉందని నిరూపించడం ద్వారా ఇది సాధించబడుతుంది.
4. మీ కోడ్ యొక్క స్వతంత్ర సమీక్ష కోసం అడగండి
మీ కాంట్రాక్ట్ను పరీక్షించిన తర్వాత, ఏవైనా భద్రతా సమస్యల కోసం సోర్స్ కోడ్ను తనిఖీ చేయమని ఇతరులను అడగడం మంచిది. పరీక్ష స్మార్ట్ కాంట్రాక్ట్లోని ప్రతి లోపాన్ని వెలికితీయదు, కానీ స్వతంత్ర సమీక్షను పొందడం వలన దుర్బలత్వాలను గుర్తించే అవకాశం పెరుగుతుంది.
ఆడిట్లు
స్మార్ట్ కాంట్రాక్ట్ ఆడిట్ను నియమించడం అనేది స్వతంత్ర కోడ్ సమీక్షను నిర్వహించడానికి ఒక మార్గం. స్మార్ట్ కాంట్రాక్ట్లు సురక్షితంగా ఉన్నాయని మరియు నాణ్యతా లోపాలు మరియు డిజైన్ లోపాలు లేకుండా ఉన్నాయని నిర్ధారించడంలో ఆడిటర్లు ముఖ్యమైన పాత్ర పోషిస్తారు.
అయినప్పటికీ, మీరు ఆడిట్లను అన్ని సమస్యలకు పరిష్కారంగా (silver bullet) పరిగణించకుండా ఉండాలి. స్మార్ట్ కాంట్రాక్ట్ ఆడిట్లు ప్రతి బగ్ను పట్టుకోలేవు మరియు ఎక్కువగా అదనపు రౌండ్ సమీక్షలను అందించడానికి రూపొందించబడ్డాయి, ఇది ప్రారంభ అభివృద్ధి మరియు పరీక్ష సమయంలో డెవలపర్లు కోల్పోయిన సమస్యలను గుర్తించడంలో సహాయపడుతుంది. స్మార్ట్ కాంట్రాక్ట్ ఆడిట్ ప్రయోజనాన్ని పెంచడానికి, కోడ్ను సరిగ్గా డాక్యుమెంట్ చేయడం మరియు ఇన్లైన్ వ్యాఖ్యలను జోడించడం వంటి ఆడిటర్లతో కలిసి పనిచేయడానికి మీరు ఉత్తమ పద్ధతులను కూడా అనుసరించాలి.
- స్మార్ట్ కాంట్రాక్ట్ ఆడిటింగ్ చిట్కాలు & ట్రిక్స్ (opens in a new tab) - @tinchoabbate
- మీ ఆడిట్ నుండి అత్యధిక ప్రయోజనం పొందండి (opens in a new tab) - Inference
బగ్ బౌంటీలు
బగ్ బౌంటీ ప్రోగ్రామ్ను సెటప్ చేయడం బాహ్య కోడ్ సమీక్షలను అమలు చేయడానికి మరొక విధానం. బగ్ బౌంటీ అనేది అప్లికేషన్లో దుర్బలత్వాలను కనుగొన్న వ్యక్తులకు (సాధారణంగా వైట్హాట్ హ్యాకర్లు) ఇవ్వబడే ఆర్థిక ప్రతిఫలం.
సరిగ్గా ఉపయోగించినప్పుడు, బగ్ బౌంటీలు హ్యాకర్ కమ్యూనిటీ సభ్యులకు క్లిష్టమైన లోపాల కోసం మీ కోడ్ను తనిఖీ చేయడానికి ప్రోత్సాహాన్ని ఇస్తాయి. ఎథీరియంలో నడుస్తున్న లేయర్ 2 (l2) ప్రోటోకాల్ అయిన Optimism (opens in a new tab)లో అపరిమితమైన ఈథర్ను సృష్టించడానికి దాడి చేసే వ్యక్తిని అనుమతించే "అనంతమైన డబ్బు బగ్ (infinite money bug)" ఒక నిజ జీవిత ఉదాహరణ. అదృష్టవశాత్తూ, ఒక వైట్హాట్ హ్యాకర్ లోపాన్ని కనుగొన్నాడు (opens in a new tab) మరియు బృందానికి తెలియజేశాడు, ఈ ప్రక్రియలో పెద్ద చెల్లింపును పొందాడు (opens in a new tab).
ప్రమాదంలో ఉన్న నిధుల మొత్తానికి అనులోమానుపాతంలో బగ్ బౌంటీ ప్రోగ్రామ్ యొక్క చెల్లింపును సెట్ చేయడం ఒక ఉపయోగకరమైన వ్యూహం. "స్కేలింగ్ బగ్ బౌంటీ (opens in a new tab)"గా వర్ణించబడిన ఈ విధానం, దుర్బలత్వాలను దోపిడీ చేయడానికి బదులుగా బాధ్యతాయుతంగా బహిర్గతం చేయడానికి వ్యక్తులకు ఆర్థిక ప్రోత్సాహకాలను అందిస్తుంది.
5. స్మార్ట్ కాంట్రాక్ట్ అభివృద్ధి సమయంలో ఉత్తమ పద్ధతులను అనుసరించండి
ఆడిట్లు మరియు బగ్ బౌంటీల ఉనికి అధిక-నాణ్యత కోడ్ను వ్రాయవలసిన మీ బాధ్యతను మినహాయించదు. మంచి స్మార్ట్ కాంట్రాక్ట్ భద్రత సరైన డిజైన్ మరియు అభివృద్ధి ప్రక్రియలను అనుసరించడంతో ప్రారంభమవుతుంది:
-
git వంటి వెర్షన్ కంట్రోల్ సిస్టమ్లో మొత్తం కోడ్ను నిల్వ చేయండి
-
పుల్ అభ్యర్థనల (pull requests) ద్వారా అన్ని కోడ్ సవరణలను చేయండి
-
పుల్ అభ్యర్థనలకు కనీసం ఒక స్వతంత్ర సమీక్షకుడు ఉన్నారని నిర్ధారించుకోండి—మీరు ప్రాజెక్ట్లో ఒంటరిగా పని చేస్తుంటే, ఇతర డెవలపర్లను కనుగొనడం మరియు కోడ్ సమీక్షలను మార్పిడి చేసుకోవడం గురించి ఆలోచించండి
-
స్మార్ట్ కాంట్రాక్ట్లను పరీక్షించడానికి, కంపైలింగ్ చేయడానికి, డిప్లాయ్మెంట్ చేయడానికి అభివృద్ధి వాతావరణాన్ని ఉపయోగించండి
-
Cyfrin Aderyn (opens in a new tab), Mythril మరియు స్లిదర్ వంటి ప్రాథమిక కోడ్ విశ్లేషణ సాధనాల ద్వారా మీ కోడ్ను రన్ చేయండి. ఆదర్శవంతంగా, ప్రతి పుల్ అభ్యర్థన విలీనం కావడానికి ముందు మీరు దీన్ని చేయాలి మరియు అవుట్పుట్లోని తేడాలను సరిపోల్చాలి
-
మీ కోడ్ లోపాలు లేకుండా కంపైల్ అవుతుందని మరియు Solidity కంపైలర్ ఎటువంటి హెచ్చరికలను విడుదల చేయదని నిర్ధారించుకోండి
-
మీ కోడ్ను సరిగ్గా డాక్యుమెంట్ చేయండి (NatSpec (opens in a new tab) ఉపయోగించి) మరియు కాంట్రాక్ట్ ఆర్కిటెక్చర్ గురించిన వివరాలను సులభంగా అర్థం చేసుకోగల భాషలో వివరించండి. ఇది ఇతరులు మీ కోడ్ను ఆడిట్ చేయడం మరియు సమీక్షించడం సులభతరం చేస్తుంది.
6. పటిష్టమైన విపత్తు పునరుద్ధరణ ప్రణాళికలను అమలు చేయండి
సురక్షితమైన యాక్సెస్ నియంత్రణలను రూపొందించడం, ఫంక్షన్ మాడిఫైయర్లను అమలు చేయడం మరియు ఇతర సూచనలు స్మార్ట్ కాంట్రాక్ట్ భద్రతను మెరుగుపరుస్తాయి, అయితే అవి హానికరమైన దోపిడీల అవకాశాన్ని తోసిపుచ్చలేవు. సురక్షితమైన స్మార్ట్ కాంట్రాక్ట్లను నిర్మించడానికి "వైఫల్యానికి సిద్ధపడటం" మరియు దాడులకు సమర్థవంతంగా ప్రతిస్పందించడానికి ఫాల్బ్యాక్ ప్లాన్ను కలిగి ఉండటం అవసరం. సరైన విపత్తు పునరుద్ధరణ ప్రణాళిక కింది భాగాలలో కొన్ని లేదా అన్నింటినీ పొందుపరుస్తుంది:
కాంట్రాక్ట్ అప్గ్రేడ్లు
ఎథీరియం స్మార్ట్ కాంట్రాక్ట్లు అప్రమేయంగా మార్చలేనివి అయినప్పటికీ, అప్గ్రేడ్ ప్యాటర్న్లను ఉపయోగించడం ద్వారా కొంత మేర మార్పును సాధించడం సాధ్యమవుతుంది. క్లిష్టమైన లోపం మీ పాత కాంట్రాక్ట్ను నిరుపయోగంగా మార్చినప్పుడు మరియు కొత్త లాజిక్ను డిప్లాయ్మెంట్ చేయడం అత్యంత ఆచరణీయమైన ఎంపిక అయిన సందర్భాల్లో కాంట్రాక్ట్లను అప్గ్రేడ్ చేయడం అవసరం.
కాంట్రాక్ట్ అప్గ్రేడ్ యంత్రాంగాలు భిన్నంగా పనిచేస్తాయి, అయితే స్మార్ట్ కాంట్రాక్ట్లను అప్గ్రేడ్ చేయడానికి "ప్రాక్సీ ప్యాటర్న్" అనేది అత్యంత ప్రజాదరణ పొందిన విధానాలలో ఒకటి. ప్రాక్సీ ప్యాటర్న్లు (opens in a new tab) అప్లికేషన్ యొక్క స్థితి మరియు లాజిక్ను రెండు కాంట్రాక్ట్ల మధ్య విభజిస్తాయి. మొదటి కాంట్రాక్ట్ ('ప్రతినిధి కాంట్రాక్ట్' అని పిలుస్తారు) స్థితి వేరియబుల్స్ను (ఉదా., వినియోగదారు బ్యాలెన్స్లు) నిల్వ చేస్తుంది, అయితే రెండవ కాంట్రాక్ట్ ('లాజిక్ కాంట్రాక్ట్' అని పిలుస్తారు) కాంట్రాక్ట్ ఫంక్షన్లను అమలు చేయడానికి కోడ్ను కలిగి ఉంటుంది.
ఖాతాలు ప్రతినిధి కాంట్రాక్ట్తో ఇంటరాక్ట్ అవుతాయి, ఇది delegatecall() (opens in a new tab) తక్కువ-స్థాయి కాల్ని ఉపయోగించి అన్ని ఫంక్షన్ కాల్లను లాజిక్ కాంట్రాక్ట్కు పంపుతుంది. సాధారణ సందేశ పిలుపు వలె కాకుండా, లాజిక్ కాంట్రాక్ట్ చిరునామా వద్ద నడుస్తున్న కోడ్ కాలింగ్ కాంట్రాక్ట్ సందర్భంలో అమలు చేయబడుతుందని delegatecall() నిర్ధారిస్తుంది. దీని అర్థం లాజిక్ కాంట్రాక్ట్ ఎల్లప్పుడూ ప్రాక్సీ నిల్వకు (దాని స్వంత నిల్వకు బదులుగా) వ్రాస్తుంది మరియు msg.sender మరియు msg.value యొక్క అసలు విలువలు భద్రపరచబడతాయి.
లాజిక్ కాంట్రాక్ట్కు కాల్లను అప్పగించడానికి దాని చిరునామాను ప్రతినిధి కాంట్రాక్ట్ నిల్వలో నిల్వ చేయడం అవసరం. అందువల్ల, కాంట్రాక్ట్ లాజిక్ను అప్గ్రేడ్ చేయడం అనేది మరొక లాజిక్ కాంట్రాక్ట్ను డిప్లాయ్మెంట్ చేయడం మరియు కొత్త చిరునామాను ప్రతినిధి కాంట్రాక్ట్లో నిల్వ చేయడం మాత్రమే. ప్రతినిధి కాంట్రాక్ట్కు తదుపరి కాల్లు స్వయంచాలకంగా కొత్త లాజిక్ కాంట్రాక్ట్కు మళ్లించబడతాయి కాబట్టి, మీరు కోడ్ను వాస్తవంగా సవరించకుండానే కాంట్రాక్ట్ను "అప్గ్రేడ్" చేసి ఉంటారు.
కాంట్రాక్ట్లను అప్గ్రేడ్ చేయడం గురించి మరింత.
అత్యవసర నిలుపుదలలు
పేర్కొన్నట్లుగా, విస్తృతమైన ఆడిటింగ్ మరియు పరీక్ష స్మార్ట్ కాంట్రాక్ట్లోని అన్ని బగ్లను కనుగొనలేవు. డిప్లాయ్మెంట్ తర్వాత మీ కోడ్లో దుర్బలత్వం కనిపిస్తే, కాంట్రాక్ట్ చిరునామా వద్ద నడుస్తున్న కోడ్ను మీరు మార్చలేరు కాబట్టి దాన్ని ప్యాచ్ చేయడం అసాధ్యం. అలాగే, అప్గ్రేడ్ యంత్రాంగాలు (ఉదా., ప్రాక్సీ ప్యాటర్న్లు) అమలు చేయడానికి సమయం పట్టవచ్చు (వాటికి తరచుగా వివిధ పార్టీల నుండి ఆమోదం అవసరం), ఇది దాడి చేసేవారికి మరింత నష్టం కలిగించడానికి ఎక్కువ సమయం ఇస్తుంది.
కాంట్రాక్ట్లోని హాని కలిగించే ఫంక్షన్లకు కాల్లను నిరోధించే "అత్యవసర నిలుపుదల (emergency stop)" ఫంక్షన్ను అమలు చేయడం అణు ఎంపిక (nuclear option). అత్యవసర నిలుపుదలలు సాధారణంగా కింది భాగాలను కలిగి ఉంటాయి:
-
స్మార్ట్ కాంట్రాక్ట్ ఆగిపోయిన స్థితిలో ఉందో లేదో సూచించే గ్లోబల్ బూలియన్ వేరియబుల్. కాంట్రాక్ట్ను సెటప్ చేస్తున్నప్పుడు ఈ వేరియబుల్
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మరియుstoppedInEmergencyisStoppedవేరియబుల్ను తనిఖీ చేస్తాయి. కాంట్రాక్ట్ హాని కలిగించే స్థితిలో ఉన్నప్పుడు యాక్సెస్ చేయలేని ఫంక్షన్లను నియంత్రించడానికిstoppedInEmergencyఉపయోగించబడుతుంది (ఉదా.,deposit()). ఈ ఫంక్షన్లకు కాల్లు కేవలం రివర్ట్ అవుతాయి.
అత్యవసర సమయంలో పిలవబడే ఫంక్షన్ల కోసం onlyWhenStopped ఉపయోగించబడుతుంది (ఉదా., emergencyWithdraw()). అటువంటి ఫంక్షన్లు పరిస్థితిని పరిష్కరించడంలో సహాయపడతాయి, కాబట్టి వాటిని "నియంత్రిత ఫంక్షన్ల" జాబితా నుండి మినహాయించారు.
అత్యవసర నిలుపుదల కార్యాచరణను ఉపయోగించడం మీ స్మార్ట్ కాంట్రాక్ట్లోని తీవ్రమైన దుర్బలత్వాలను ఎదుర్కోవటానికి సమర్థవంతమైన తాత్కాలిక పరిష్కారాన్ని అందిస్తుంది. అయినప్పటికీ, స్వార్థ ప్రయోజనాల కోసం డెవలపర్లు దీన్ని సక్రియం చేయరని వినియోగదారులు విశ్వసించాల్సిన అవసరాన్ని ఇది పెంచుతుంది. ఈ క్రమంలో, ఆన్చైన్ ఓటింగ్ యంత్రాంగం, టైమ్లాక్ లేదా మల్టీసిగ్ వాలెట్ నుండి ఆమోదానికి లోబడి అత్యవసర నిలుపుదల నియంత్రణను వికేంద్రీకృత చేయడం సాధ్యమైన పరిష్కారాలు.
ఈవెంట్ పర్యవేక్షణ
స్మార్ట్ కాంట్రాక్ట్ ఫంక్షన్లకు కాల్లను ట్రాక్ చేయడానికి మరియు స్థితి వేరియబుల్స్లో మార్పులను పర్యవేక్షించడానికి ఈవెంట్లు (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 ("కీప్ ఇట్ సింపుల్, స్టూపిడ్") సూత్రం గురించి తెలుసు, ఇది సాఫ్ట్వేర్ డిజైన్లో అనవసరమైన సంక్లిష్టతను ప్రవేశపెట్టవద్దని సలహా ఇస్తుంది. ఇది "సంక్లిష్ట వ్యవస్థలు సంక్లిష్ట మార్గాల్లో విఫలమవుతాయి" మరియు ఖరీదైన లోపాలకు ఎక్కువగా గురవుతాయి అనే దీర్ఘకాల ఆలోచనను అనుసరిస్తుంది.
స్మార్ట్ కాంట్రాక్ట్లు పెద్ద మొత్తంలో విలువను నియంత్రించే అవకాశం ఉన్నందున, స్మార్ట్ కాంట్రాక్ట్లను వ్రాసేటప్పుడు విషయాలను సరళంగా ఉంచడం చాలా ముఖ్యం. స్మార్ట్ కాంట్రాక్ట్లను వ్రాసేటప్పుడు సరళతను సాధించడానికి ఒక చిట్కా ఏమిటంటే, సాధ్యమైన చోట ఓపెన్జెప్పెలిన్ కాంట్రాక్ట్ల (opens in a new tab) వంటి ఇప్పటికే ఉన్న లైబ్రరీలను తిరిగి ఉపయోగించడం. ఈ లైబ్రరీలు డెవలపర్లచే విస్తృతంగా ఆడిట్ చేయబడినవి మరియు పరీక్షించబడినవి కాబట్టి, వాటిని ఉపయోగించడం ద్వారా మొదటి నుండి కొత్త కార్యాచరణను వ్రాయడం ద్వారా బగ్లను ప్రవేశపెట్టే అవకాశాలను తగ్గిస్తుంది.
మరొక సాధారణ సలహా ఏమిటంటే, చిన్న ఫంక్షన్లను వ్రాయడం మరియు బహుళ కాంట్రాక్ట్లలో వ్యాపార లాజిక్ను విభజించడం ద్వారా కాంట్రాక్ట్లను మాడ్యులర్గా ఉంచడం. సరళమైన కోడ్ను వ్రాయడం స్మార్ట్ కాంట్రాక్ట్లో దాడి ఉపరితలాన్ని తగ్గించడమే కాకుండా, మొత్తం సిస్టమ్ యొక్క ఖచ్చితత్వం గురించి తార్కికంగా ఆలోచించడం మరియు సాధ్యమయ్యే డిజైన్ లోపాలను ముందుగానే గుర్తించడం సులభతరం చేస్తుంది.
9. సాధారణ స్మార్ట్ కాంట్రాక్ట్ దుర్బలత్వాల నుండి రక్షించండి
రీఎంట్రెన్సీ
EVM ఏకకాలికతను (concurrency) అనుమతించదు, అంటే సందేశ పిలుపులో పాల్గొన్న రెండు కాంట్రాక్ట్లు ఏకకాలంలో అమలు కావు. బాహ్య కాల్ తిరిగి వచ్చే వరకు కాలింగ్ కాంట్రాక్ట్ అమలు మరియు మెమరీని పాజ్ చేస్తుంది, ఆ సమయంలో అమలు సాధారణంగా కొనసాగుతుంది. ఈ ప్రక్రియను అధికారికంగా మరొక కాంట్రాక్ట్కు కంట్రోల్ ఫ్లో (opens in a new tab) బదిలీ చేయడం అని వర్ణించవచ్చు.
ఎక్కువగా హానిచేయనిది అయినప్పటికీ, విశ్వసించని కాంట్రాక్ట్లకు కంట్రోల్ ఫ్లోను బదిలీ చేయడం రీఎంట్రెన్సీ వంటి సమస్యలను కలిగిస్తుంది. అసలు ఫంక్షన్ ఇన్వొకేషన్ పూర్తి కావడానికి ముందే హానికరమైన కాంట్రాక్ట్ హాని కలిగించే కాంట్రాక్ట్లోకి తిరిగి కాల్ చేసినప్పుడు రీఎంట్రెన్సీ దాడి జరుగుతుంది. ఈ రకమైన దాడిని ఉదాహరణతో ఉత్తమంగా వివరించవచ్చు.
ఎవరైనా ఈథర్ను డిపాజిట్ చేయడానికి మరియు ఉపసంహరించుకోవడానికి అనుమతించే సాధారణ స్మార్ట్ కాంట్రాక్ట్ ('బాధితుడు')ని పరిగణించండి:
// ఈ కాంట్రాక్ట్ హాని కలిగించేది. ప్రొడక్షన్లో ఉపయోగించవద్దు
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 హ్యాక్ (opens in a new tab)లో జరిగినట్లుగా, స్మార్ట్ కాంట్రాక్ట్ నిధులను హరించడానికి ఈ రకమైన దాడిని ఉపయోగించవచ్చు. రీఎంట్రెన్సీ దోపిడీల పబ్లిక్ లిస్టింగ్లు (opens in a new tab) చూపుతున్నట్లుగా, ఈ రోజు స్మార్ట్ కాంట్రాక్ట్లకు రీఎంట్రెన్సీ దాడులు ఇప్పటికీ క్లిష్టమైన సమస్య.
రీఎంట్రెన్సీ దాడులను ఎలా నిరోధించాలి
రీఎంట్రెన్సీని ఎదుర్కోవటానికి ఒక విధానం తనిఖీలు-ప్రభావాలు-పరస్పర చర్యల ప్యాటర్న్ను (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కి సెట్ చేయబడినందున, అదనపు ఉపసంహరణలు లోపాన్ని చూపుతాయి.
మరొక ఎంపిక మ్యూచువల్ ఎక్స్క్లూజన్ లాక్ (సాధారణంగా "మ్యూటెక్స్" అని వర్ణించబడుతుంది) ఉపయోగించడం, ఇది ఫంక్షన్ ఇన్వొకేషన్ పూర్తయ్యే వరకు కాంట్రాక్ట్ స్థితిలో కొంత భాగాన్ని లాక్ చేస్తుంది. ఫంక్షన్ అమలు కావడానికి ముందు trueకి సెట్ చేయబడిన మరియు ఇన్వొకేషన్ పూర్తయిన తర్వాత falseకి తిరిగి వచ్చే బూలియన్ వేరియబుల్ని ఉపయోగించి ఇది అమలు చేయబడుతుంది. దిగువ ఉదాహరణలో చూసినట్లుగా, మ్యూటెక్స్ను ఉపయోగించడం వలన అసలు ఇన్వొకేషన్ ఇంకా ప్రాసెస్ అవుతున్నప్పుడు పునరావృత కాల్ల నుండి ఫంక్షన్ను రక్షిస్తుంది, రీఎంట్రెన్సీని సమర్థవంతంగా ఆపుతుంది.
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;
}
// ఈ ఫంక్షన్ మ్యూటెక్స్ ద్వారా రక్షించబడింది, కాబట్టి `msg.sender.call` లోపలి నుండి వచ్చే రీఎంట్రెంట్ కాల్స్ మళ్లీ `withdraw`ని కాల్ చేయలేవు.
// `return` స్టేట్మెంట్ `true`గా మూల్యాంకనం చేయబడుతుంది కానీ ఇప్పటికీ మాడిఫైయర్లోని `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) సిస్టమ్ను కూడా మీరు ఉపయోగించవచ్చు. ఇది తెలియని చిరునామాల వద్ద అనుకోకుండా కోడ్ను ట్రిగ్గర్ చేసే అవకాశాన్ని తొలగిస్తుంది (మరియు నిర్దిష్ట డినైయల్-ఆఫ్-సర్వీస్ దాడులను కూడా నిరోధించవచ్చు).
పూర్ణాంక అండర్ఫ్లోలు మరియు ఓవర్ఫ్లోలు
అంకగణిత ఆపరేషన్ ఫలితాలు ఆమోదయోగ్యమైన విలువల పరిధికి వెలుపల పడిపోయినప్పుడు పూర్ణాంక ఓవర్ఫ్లో సంభవిస్తుంది, దీని వలన అది ప్రాతినిధ్యం వహించగల అత్యల్ప విలువకు "రోల్ ఓవర్" అవుతుంది. ఉదాహరణకు, uint8 2^8-1=255 వరకు మాత్రమే విలువలను నిల్వ చేయగలదు. కారులోని ఓడోమీటర్ గరిష్ట మైలేజీని (999999) చేరుకున్న తర్వాత 0కి ఎలా రీసెట్ అవుతుందో అదే విధంగా, 255 కంటే ఎక్కువ విలువలకు దారితీసే అంకగణిత కార్యకలాపాలు ఓవర్ఫ్లో అవుతాయి మరియు uintని 0కి రీసెట్ చేస్తాయి.
పూర్ణాంక అండర్ఫ్లోలు ఇలాంటి కారణాల వల్ల జరుగుతాయి: అంకగణిత ఆపరేషన్ ఫలితాలు ఆమోదయోగ్యమైన పరిధి కంటే తక్కువగా ఉంటాయి. మీరు uint8లో 0ని తగ్గించడానికి ప్రయత్నించారని అనుకుందాం, ఫలితం గరిష్టంగా ప్రాతినిధ్యం వహించగల విలువకు (255) రోల్ ఓవర్ అవుతుంది.
పూర్ణాంక ఓవర్ఫ్లోలు మరియు అండర్ఫ్లోలు రెండూ కాంట్రాక్ట్ స్థితి వేరియబుల్స్లో ఊహించని మార్పులకు దారితీయవచ్చు మరియు ప్రణాళిక లేని అమలుకు దారితీయవచ్చు. చెల్లని ఆపరేషన్ చేయడానికి స్మార్ట్ కాంట్రాక్ట్లో అంకగణిత ఓవర్ఫ్లోను దాడి చేసే వ్యక్తి ఎలా ఉపయోగించుకోగలడో చూపే ఉదాహరణ క్రింద ఉంది:
pragma solidity ^0.7.6;
// ఈ కాంట్రాక్ట్ టైమ్ వాల్ట్గా పనిచేయడానికి రూపొందించబడింది.
// వినియోగదారు ఈ కాంట్రాక్ట్లో డిపాజిట్ చేయవచ్చు కానీ కనీసం ఒక వారం పాటు ఉపసంహరించుకోలేరు.
// వినియోగదారు 1 వారం నిరీక్షణ వ్యవధికి మించి నిరీక్షణ సమయాన్ని కూడా పొడిగించవచ్చు.
/*
1. TimeLock డిప్లాయ్మెంట్ చేయండి
2. TimeLock చిరునామాతో Attack డిప్లాయ్మెంట్ చేయండి
3. 1 ఈథర్ పంపుతూ 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 (opens in a new tab)) ఉపయోగించాలి.
ఆరకిల్ మానిప్యులేషన్
ఆరకిల్స్ ఆఫ్చైన్ సమాచారాన్ని సేకరిస్తాయి మరియు స్మార్ట్ కాంట్రాక్ట్లు ఉపయోగించడానికి దానిని ఆన్చైన్కు పంపుతాయి. ఆరకిల్స్తో, మీరు క్యాపిటల్ మార్కెట్ల వంటి ఆఫ్చైన్ సిస్టమ్లతో ఇంటర్ఆపరేట్ చేసే స్మార్ట్ కాంట్రాక్ట్లను రూపొందించవచ్చు, వాటి అప్లికేషన్ను బాగా విస్తరించవచ్చు.
కానీ ఆరకిల్ పాడైపోయి, ఆన్చైన్లో తప్పు సమాచారాన్ని పంపితే, స్మార్ట్ కాంట్రాక్ట్లు తప్పు ఇన్పుట్ల ఆధారంగా అమలు చేయబడతాయి, ఇది సమస్యలను కలిగిస్తుంది. ఇది "ఆరకిల్ సమస్య" యొక్క ఆధారం, ఇది బ్లాక్చెయిన్ ఒరాకిల్ నుండి సమాచారం ఖచ్చితమైనది, తాజాది మరియు సమయానుకూలమైనది అని నిర్ధారించుకునే పనికి సంబంధించినది.
సంబంధిత భద్రతా ఆందోళన ఏమిటంటే, ఆస్తికి స్పాట్ ధరను పొందడానికి వికేంద్రీకృత ఎక్స్ఛేంజ్ వంటి ఆన్చైన్ ఆరకిల్ను ఉపయోగించడం. వికేంద్రీకృత ఫైనాన్స్ (DeFi) పరిశ్రమలోని రుణ ప్లాట్ఫారమ్లు వినియోగదారు ఎంత రుణం తీసుకోగలరో నిర్ణయించడానికి వారి తాకట్టు విలువను నిర్ణయించడానికి తరచుగా దీన్ని చేస్తాయి.
DEX ధరలు తరచుగా ఖచ్చితమైనవి, మార్కెట్లలో సమానత్వాన్ని పునరుద్ధరించే ఆర్బిట్రేజర్ల కారణంగా ఇది ఎక్కువగా జరుగుతుంది. అయినప్పటికీ, అవి మానిప్యులేషన్కు గురయ్యే అవకాశం ఉంది, ప్రత్యేకించి ఆన్చైన్ ఆరకిల్ చారిత్రక ట్రేడింగ్ ప్యాటర్న్ల ఆధారంగా ఆస్తి ధరలను గణిస్తే (సాధారణంగా జరిగే విధంగా).
ఉదాహరణకు, దాడి చేసే వ్యక్తి మీ రుణ కాంట్రాక్ట్తో ఇంటరాక్ట్ అయ్యే ముందు తక్షణ రుణం తీసుకోవడం ద్వారా ఆస్తి యొక్క స్పాట్ ధరను కృత్రిమంగా పెంచవచ్చు. ఆస్తి ధర కోసం DEXని ప్రశ్నించడం సాధారణం కంటే ఎక్కువ విలువను అందిస్తుంది (దాడి చేసేవారి పెద్ద "కొనుగోలు ఆర్డర్" ఆస్తికి డిమాండ్ను వక్రీకరించడం వల్ల), వారు చేయవలసిన దానికంటే ఎక్కువ రుణం తీసుకోవడానికి వీలు కల్పిస్తుంది. DeFi అప్లికేషన్లలో ధర ఆరకిల్స్పై ఆధారపడటాన్ని దోపిడీ చేయడానికి ఇటువంటి "ఫ్లాష్ లోన్ దాడులు" ఉపయోగించబడ్డాయి, దీని వలన ప్రోటోకాల్లు మిలియన్ల కొద్దీ నిధులను కోల్పోయాయి.
ఆరకిల్ మానిప్యులేషన్ను ఎలా నిరోధించాలి
ఆరకిల్ మానిప్యులేషన్ను నివారించడానికి (opens in a new tab) కనీస అవసరం ఏమిటంటే, వైఫల్యం యొక్క ఒకే బిందువులను నివారించడానికి బహుళ మూలాల నుండి సమాచారాన్ని ప్రశ్నించే వికేంద్రీకృత ఆరకిల్ నెట్వర్క్ను ఉపయోగించడం. చాలా సందర్భాలలో, వికేంద్రీకృత ఆరకిల్స్ సరైన సమాచారాన్ని నివేదించడానికి ఆరకిల్ నోడ్లను ప్రోత్సహించడానికి అంతర్నిర్మిత క్రిప్టోఎకనామిక్ ప్రోత్సాహకాలను కలిగి ఉంటాయి, ఇవి కేంద్రీకృత ఆరకిల్స్ కంటే వాటిని మరింత సురక్షితంగా చేస్తాయి.
మీరు ఆస్తి ధరల కోసం ఆన్చైన్ ఆరకిల్ను ప్రశ్నించాలని ప్లాన్ చేస్తే, సమయ-వెయిటెడ్ సగటు ధర (TWAP) యంత్రాంగాన్ని అమలు చేసే దాన్ని ఉపయోగించడాన్ని పరిగణించండి. TWAP ఆరకిల్ (opens in a new tab) రెండు వేర్వేరు సమయాల్లో (మీరు సవరించవచ్చు) ఆస్తి ధరను ప్రశ్నిస్తుంది మరియు పొందిన సగటు ఆధారంగా స్పాట్ ధరను గణిస్తుంది. ఎక్కువ సమయ వ్యవధిని ఎంచుకోవడం వలన మీ ప్రోటోకాల్ ధర మానిప్యులేషన్ నుండి రక్షించబడుతుంది, ఎందుకంటే ఇటీవల అమలు చేయబడిన పెద్ద ఆర్డర్లు ఆస్తి ధరలను ప్రభావితం చేయలేవు.
డెవలపర్ల కోసం స్మార్ట్ కాంట్రాక్ట్ భద్రతా వనరులు
స్మార్ట్ కాంట్రాక్ట్లను విశ్లేషించడానికి మరియు కోడ్ ఖచ్చితత్వాన్ని ధృవీకరించడానికి సాధనాలు
-
టెస్టింగ్ సాధనాలు మరియు లైబ్రరీలు - స్మార్ట్ కాంట్రాక్ట్లపై యూనిట్ పరీక్షలు, స్టాటిక్ విశ్లేషణ మరియు డైనమిక్ విశ్లేషణ చేయడానికి పరిశ్రమ-ప్రామాణిక సాధనాలు మరియు లైబ్రరీల సేకరణ.
-
నియత ధృవీకరణ సాధనాలు - స్మార్ట్ కాంట్రాక్ట్లలో ఫంక్షనల్ ఖచ్చితత్వాన్ని ధృవీకరించడానికి మరియు ఇన్వేరియంట్లను తనిఖీ చేయడానికి సాధనాలు.
-
స్మార్ట్ కాంట్రాక్ట్ ఆడిటింగ్ సేవలు - ఎథీరియం డెవలప్మెంట్ ప్రాజెక్ట్ల కోసం స్మార్ట్ కాంట్రాక్ట్ ఆడిటింగ్ సేవలను అందించే సంస్థల జాబితా.
-
బగ్ బౌంటీ ప్లాట్ఫారమ్లు - బగ్ బౌంటీలను సమన్వయం చేయడానికి మరియు స్మార్ట్ కాంట్రాక్ట్లలోని క్లిష్టమైన దుర్బలత్వాలను బాధ్యతాయుతంగా బహిర్గతం చేసినందుకు ప్రతిఫలం ఇవ్వడానికి ప్లాట్ఫారమ్లు.
-
ఫోర్క్ చెకర్ (opens in a new tab) - ఫోర్క్ చేయబడిన కాంట్రాక్ట్కు సంబంధించిన అందుబాటులో ఉన్న మొత్తం సమాచారాన్ని తనిఖీ చేయడానికి ఉచిత ఆన్లైన్ సాధనం.
-
ABI ఎన్కోడర్ (opens in a new tab) - మీ Solidity కాంట్రాక్ట్ ఫంక్షన్లు మరియు కన్స్ట్రక్టర్ ఆర్గ్యుమెంట్లను ఎన్కోడ్ చేయడానికి ఉచిత ఆన్లైన్ సేవ.
-
Aderyn (opens in a new tab) - Solidity స్టాటిక్ ఎనలైజర్, అనుమానిత దుర్బలత్వాలను గుర్తించడానికి అబ్స్ట్రాక్ట్ సింటాక్స్ ట్రీస్ (AST) ద్వారా ప్రయాణించి, సులభంగా చదవగలిగే మార్క్డౌన్ ఆకృతిలో సమస్యలను ప్రింట్ చేస్తుంది.
స్మార్ట్ కాంట్రాక్ట్లను పర్యవేక్షించడానికి సాధనాలు
- Tenderly రియల్-టైమ్ అలర్టింగ్ (opens in a new tab) - మీ స్మార్ట్ కాంట్రాక్ట్లు లేదా వాలెట్లలో అసాధారణమైన లేదా ఊహించని ఈవెంట్లు జరిగినప్పుడు నిజ-సమయ నోటిఫికేషన్లను పొందడానికి ఒక సాధనం.
స్మార్ట్ కాంట్రాక్ట్ల సురక్షిత నిర్వహణ కోసం సాధనాలు
-
Safe (opens in a new tab) - ఎథీరియంపై నడుస్తున్న స్మార్ట్ కాంట్రాక్ట్ వాలెట్, ఇది లావాదేవీ జరగడానికి ముందు కనీస సంఖ్యలో వ్యక్తులు ఆమోదించడం అవసరం (M-of-N).
-
ఓపెన్జెప్పెలిన్ కాంట్రాక్ట్లు (opens in a new tab) - కాంట్రాక్ట్ యాజమాన్యం, అప్గ్రేడ్లు, యాక్సెస్ నియంత్రణలు, పరిపాలన, పాజ్ చేయగల సామర్థ్యం మరియు మరిన్నింటితో సహా పరిపాలనా లక్షణాలను అమలు చేయడానికి కాంట్రాక్ట్ లైబ్రరీలు.
స్మార్ట్ కాంట్రాక్ట్ ఆడిటింగ్ సేవలు
-
ConsenSys డిలిజెన్స్ (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) - పంపిణీ చేయబడిన సిస్టమ్ల కోసం భద్రతా ఆడిట్లను అందించే స్మార్ట్ కాంట్రాక్ట్ భద్రతా సంస్థ.
-
రన్టైమ్ వెరిఫికేషన్ (opens in a new tab) - స్మార్ట్ కాంట్రాక్ట్ల ఫార్మల్ మోడలింగ్ మరియు ధృవీకరణలో నైపుణ్యం కలిగిన భద్రతా సంస్థ.
-
Hacken (opens in a new tab) - బ్లాక్చైన్ భద్రతకు 360-డిగ్రీల విధానాన్ని తీసుకువచ్చే Web3 సైబర్ సెక్యూరిటీ ఆడిటర్.
-
నెథర్మైండ్ (opens in a new tab) - Solidity మరియు Cairo ఆడిటింగ్ సేవలు, ఎథీరియం మరియు Starknet అంతటా స్మార్ట్ కాంట్రాక్ట్ల సమగ్రతను మరియు వినియోగదారుల భద్రతను నిర్ధారిస్తాయి.
-
HashEx (opens in a new tab) - క్రిప్టోకరెన్సీల భద్రతను నిర్ధారించడానికి HashEx బ్లాక్చైన్ మరియు స్మార్ట్ కాంట్రాక్ట్ ఆడిటింగ్పై దృష్టి పెడుతుంది, స్మార్ట్ కాంట్రాక్ట్ డెవలప్మెంట్, పెనెట్రేషన్ టెస్టింగ్, బ్లాక్చైన్ కన్సల్టింగ్ వంటి సేవలను అందిస్తుంది.
-
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, క్రాస్-చైన్ టెక్లో నైపుణ్యంతో స్మార్ట్ కాంట్రాక్ట్ ఆడిట్లు మరియు బ్లాక్చైన్ భద్రతా సేవలు.
-
Inference (opens in a new tab) - EVM-ఆధారిత బ్లాక్చైన్ల కోసం స్మార్ట్ కాంట్రాక్ట్ ఆడిటింగ్లో ప్రత్యేకత కలిగిన భద్రతా ఆడిటింగ్ సంస్థ. దీని నిపుణులైన ఆడిటర్ల కారణంగా వారు సంభావ్య సమస్యలను గుర్తిస్తారు మరియు డిప్లాయ్మెంట్కు ముందే వాటిని పరిష్కరించడానికి చర్య తీసుకోగల పరిష్కారాలను సూచిస్తారు.
బగ్ బౌంటీ ప్లాట్ఫారమ్లు
-
Immunefi (opens in a new tab) - స్మార్ట్ కాంట్రాక్ట్లు మరియు DeFi ప్రాజెక్ట్ల కోసం బగ్ బౌంటీ ప్లాట్ఫారమ్, ఇక్కడ భద్రతా పరిశోధకులు కోడ్ను సమీక్షిస్తారు, దుర్బలత్వాలను బహిర్గతం చేస్తారు, డబ్బు పొందుతారు మరియు క్రిప్టోను సురక్షితంగా చేస్తారు.
-
HackerOne (opens in a new tab) - వ్యాపారాలను పెనెట్రేషన్ టెస్టర్లు మరియు సైబర్ సెక్యూరిటీ పరిశోధకులతో అనుసంధానించే దుర్బలత్వ సమన్వయం మరియు బగ్ బౌంటీ ప్లాట్ఫారమ్.
-
HackenProof (opens in a new tab) - క్రిప్టో ప్రాజెక్ట్ల (DeFi, స్మార్ట్ కాంట్రాక్ట్లు, వాలెట్లు, CEX మరియు మరిన్ని) కోసం నిపుణులైన బగ్ బౌంటీ ప్లాట్ఫారమ్, ఇక్కడ భద్రతా నిపుణులు ట్రియేజ్ సేవలను అందిస్తారు మరియు పరిశోధకులు సంబంధిత, ధృవీకరించబడిన బగ్ నివేదికల కోసం డబ్బు పొందుతారు.
-
Sherlock (opens in a new tab) - స్మార్ట్ కాంట్రాక్ట్ భద్రత కోసం Web3లో అండర్ రైటర్, సంబంధిత బగ్లకు న్యాయంగా చెల్లించబడుతుందని నిర్ధారించడానికి స్మార్ట్ కాంట్రాక్ట్ల ద్వారా నిర్వహించబడే ఆడిటర్ల చెల్లింపులతో.
-
CodeHawks (opens in a new tab) - ఆడిటర్లు భద్రతా పోటీలు మరియు సవాళ్లలో పాల్గొనే పోటీ బగ్ బౌంటీ ప్లాట్ఫారమ్, మరియు (త్వరలో) వారి స్వంత ప్రైవేట్ ఆడిట్లలో పాల్గొంటారు.
తెలిసిన స్మార్ట్ కాంట్రాక్ట్ దుర్బలత్వాలు మరియు దోపిడీల ప్రచురణలు
-
ConsenSys: స్మార్ట్ కాంట్రాక్ట్ తెలిసిన దాడులు (opens in a new tab) - చాలా సందర్భాలలో నమూనా కోడ్తో పాటు, అత్యంత ముఖ్యమైన కాంట్రాక్ట్ దుర్బలత్వాల గురించి ప్రారంభకులకు అనుకూలమైన వివరణ.
-
SWC రిజిస్ట్రీ (opens in a new tab) - ఎథీరియం స్మార్ట్ కాంట్రాక్ట్లకు వర్తించే కామన్ వీక్నెస్ ఎన్యుమరేషన్ (CWE) అంశాల క్యూరేటెడ్ జాబితా.
-
Rekt (opens in a new tab) - వివరణాత్మక పోస్ట్-మార్టం నివేదికలతో పాటు, హై-ప్రొఫైల్ క్రిప్టో హ్యాక్లు మరియు దోపిడీల గురించి క్రమం తప్పకుండా నవీకరించబడే ప్రచురణ.
స్మార్ట్ కాంట్రాక్ట్ భద్రతను నేర్చుకోవడానికి సవాళ్లు
-
ఆసమ్ బ్లాక్సెక్ CTF (opens in a new tab) - బ్లాక్చైన్ భద్రతా వార్గేమ్లు, సవాళ్లు మరియు క్యాప్చర్ ది ఫ్లాగ్ (opens in a new tab) పోటీలు మరియు పరిష్కార రైటప్ల క్యూరేటెడ్ జాబితా.
-
డామ్ వల్నరబుల్ DeFi (opens in a new tab) - DeFi స్మార్ట్ కాంట్రాక్ట్ల అఫెన్సివ్ భద్రతను నేర్చుకోవడానికి మరియు బగ్-హంటింగ్ మరియు సెక్యూరిటీ ఆడిటింగ్లో నైపుణ్యాలను పెంపొందించుకోవడానికి వార్గేమ్.
-
Ethernaut (opens in a new tab) - Web3/Solidity-ఆధారిత వార్గేమ్, ఇక్కడ ప్రతి స్థాయి 'హ్యాక్' చేయాల్సిన స్మార్ట్ కాంట్రాక్ట్.
-
HackenProof x HackTheBox (opens in a new tab) - ఫాంటసీ అడ్వెంచర్లో సెట్ చేయబడిన స్మార్ట్ కాంట్రాక్ట్ హ్యాకింగ్ ఛాలెంజ్. ఛాలెంజ్ను విజయవంతంగా పూర్తి చేయడం ద్వారా ప్రైవేట్ బగ్ బౌంటీ ప్రోగ్రామ్కు యాక్సెస్ కూడా లభిస్తుంది.
స్మార్ట్ కాంట్రాక్ట్లను సురక్షితం చేయడానికి ఉత్తమ పద్ధతులు
-
ConsenSys: ఎథీరియం స్మార్ట్ కాంట్రాక్ట్ భద్రత ఉత్తమ పద్ధతులు (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) - తమ భద్రతా ఉత్తమ పద్ధతులను మెరుగుపరచుకోవాలని మరియు భద్రతా పరిశోధకులుగా మారాలని చూస్తున్న స్మార్ట్ కాంట్రాక్ట్ డెవలపర్ల కోసం సృష్టించబడిన అంతిమ స్మార్ట్ కాంట్రాక్ట్ భద్రత మరియు ఆడిటింగ్ కోర్సు.
స్మార్ట్ కాంట్రాక్ట్ భద్రతపై ట్యుటోరియల్స్
-
స్మార్ట్ కాంట్రాక్ట్ బగ్లను కనుగొనడానికి స్లిదర్ను ఎలా ఉపయోగించాలి
-
స్మార్ట్ కాంట్రాక్ట్ బగ్లను కనుగొనడానికి మాంటికోర్ను ఎలా ఉపయోగించాలి
-
మీ టోకెన్ కాంట్రాక్ట్ను ఏకపక్ష టోకెన్లతో సురక్షితంగా ఎలా అనుసంధానించాలి
-
Cyfrin Updraft - స్మార్ట్ కాంట్రాక్ట్ల భద్రత మరియు ఆడిటింగ్ పూర్తి కోర్సు (opens in a new tab)