---
title: "స్మార్ట్ కాంట్రాక్ట్ భద్రతా మార్గదర్శకాలు"
description: "మీ డాప్‌ను నిర్మించేటప్పుడు పరిగణించవలసిన భద్రతా మార్గదర్శకాల చెక్‌లిస్ట్"
author: "ట్రైల్ఆఫ్‌బిట్స్"
tags:
  - solidity
  - స్మార్ట్ కాంట్రాక్ట్‌లు
  - భద్రత
skill: intermediate
breadcrumb: "భద్రతా మార్గదర్శకాలు"
lang: te
published: 2020-09-06
source: Building secure contracts
sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/guidelines.md
---

మరింత సురక్షితమైన స్మార్ట్ కాంట్రాక్ట్‌లను నిర్మించడానికి ఈ ఉన్నత-స్థాయి సిఫార్సులను అనుసరించండి.

## డిజైన్ మార్గదర్శకాలు {#design-guidelines}

కోడ్ రాయడానికి ముందే, కాంట్రాక్ట్ డిజైన్ గురించి ముందుగానే చర్చించాలి.

### డాక్యుమెంటేషన్ మరియు స్పెసిఫికేషన్లు {#documentation-and-specifications}

డాక్యుమెంటేషన్‌ను వివిధ స్థాయిలలో రాయవచ్చు మరియు కాంట్రాక్ట్‌లను అమలు చేస్తున్నప్పుడు దాన్ని అప్‌డేట్ చేయాలి:

- **సిస్టమ్ యొక్క సాధారణ ఆంగ్ల వివరణ**, కాంట్రాక్ట్‌లు ఏమి చేస్తాయో మరియు కోడ్‌బేస్‌పై ఏవైనా అంచనాలను వివరిస్తుంది.
- **స్కీమా మరియు ఆర్కిటెక్చరల్ రేఖాచిత్రాలు**, కాంట్రాక్ట్ పరస్పర చర్యలు మరియు సిస్టమ్ యొక్క స్థితి యంత్రాన్ని కలుపుకుని. ఈ స్కీమాలను రూపొందించడంలో [స్లిదర్ ప్రింటర్‌లు](https://github.com/crytic/slither/wiki/Printer-documentation) సహాయపడతాయి.
- **సమగ్ర కోడ్ డాక్యుమెంటేషన్**, Solidity కోసం [NatSpec ఫార్మాట్](https://docs.soliditylang.org/en/develop/natspec-format.html)ను ఉపయోగించవచ్చు.

### ఆన్‌చైన్ వర్సెస్ ఆఫ్‌చైన్ కంప్యూటేషన్ {#onchain-vs-offchain-computation}

- **వీలైనంత ఎక్కువ కోడ్‌ను ఆఫ్‌చైన్‌లో ఉంచండి.** ఆన్‌చైన్ లేయర్‌ను చిన్నదిగా ఉంచండి. ఆన్‌చైన్‌లో ధృవీకరణ సులభంగా ఉండేలా ఆఫ్‌చైన్ కోడ్‌తో డేటాను ముందుగా ప్రాసెస్ చేయండి. మీకు ఆర్డర్ చేసిన జాబితా కావాలా? జాబితాను ఆఫ్‌చైన్‌లో క్రమబద్ధీకరించండి, ఆపై ఆన్‌చైన్‌లో దాని క్రమాన్ని మాత్రమే తనిఖీ చేయండి.

### అప్‌గ్రేడబిలిటీ {#upgradeability}

మేము [మా బ్లాగ్‌పోస్ట్‌](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/)లో వివిధ అప్‌గ్రేడబిలిటీ పరిష్కారాలను చర్చించాము. ఏదైనా కోడ్ రాయడానికి ముందు అప్‌గ్రేడబిలిటీకి మద్దతు ఇవ్వాలా వద్దా అనే దానిపై ఉద్దేశపూర్వక ఎంపిక చేసుకోండి. ఈ నిర్ణయం మీరు మీ కోడ్‌ను ఎలా నిర్మిస్తారనే దానిపై ప్రభావం చూపుతుంది. సాధారణంగా, మేము వీటిని సిఫార్సు చేస్తున్నాము:

- **అప్‌గ్రేడబిలిటీ కంటే [కాంట్రాక్ట్ మైగ్రేషన్](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/)కు ప్రాధాన్యత ఇవ్వడం.** మైగ్రేషన్ సిస్టమ్‌లు అప్‌గ్రేడ్ చేయగల వాటి వలె అనేక ప్రయోజనాలను కలిగి ఉంటాయి, కానీ వాటి లోపాలు లేకుండా ఉంటాయి.
- **delegatecallproxy ప్యాటర్న్ కంటే డేటా సెపరేషన్ ప్యాటర్న్‌ను ఉపయోగించడం.** మీ ప్రాజెక్ట్ స్పష్టమైన అబ్‌స్ట్రాక్షన్ సెపరేషన్‌ను కలిగి ఉంటే, డేటా సెపరేషన్‌ను ఉపయోగించి అప్‌గ్రేడ్ చేయడానికి కొన్ని సర్దుబాట్లు మాత్రమే అవసరం. delegatecallproxyకి EVM నైపుణ్యం అవసరం మరియు ఇది చాలా తప్పులకు దారితీసే అవకాశం ఉంది.
- **డిప్లాయ్‌మెంట్‌కు ముందు మైగ్రేషన్/అప్‌గ్రేడ్ విధానాన్ని డాక్యుమెంట్ చేయండి.** మీరు ఎలాంటి మార్గదర్శకాలు లేకుండా ఒత్తిడిలో స్పందించాల్సి వస్తే, మీరు తప్పులు చేస్తారు. అనుసరించాల్సిన విధానాన్ని ముందుగానే రాయండి. ఇందులో ఇవి ఉండాలి:
  - కొత్త కాంట్రాక్ట్‌లను ప్రారంభించే కాల్‌లు
  - కీలు ఎక్కడ నిల్వ చేయబడ్డాయి మరియు వాటిని ఎలా యాక్సెస్ చేయాలి
  - డిప్లాయ్‌మెంట్‌ను ఎలా తనిఖీ చేయాలి! పోస్ట్-డిప్లాయ్‌మెంట్ స్క్రిప్ట్‌ను అభివృద్ధి చేయండి మరియు పరీక్షించండి.

## అమలు మార్గదర్శకాలు {#implementation-guidelines}

**సరళత కోసం ప్రయత్నించండి.** ఎల్లప్పుడూ మీ ప్రయోజనానికి సరిపోయే సరళమైన పరిష్కారాన్ని ఉపయోగించండి. మీ బృందంలోని ఏ సభ్యుడైనా మీ పరిష్కారాన్ని అర్థం చేసుకోగలగాలి.

### ఫంక్షన్ కూర్పు {#function-composition}

మీ కోడ్‌బేస్ యొక్క ఆర్కిటెక్చర్ మీ కోడ్‌ను సమీక్షించడానికి సులభంగా ఉండేలా చేయాలి. దాని ఖచ్చితత్వం గురించి తార్కికంగా ఆలోచించే సామర్థ్యాన్ని తగ్గించే ఆర్కిటెక్చరల్ ఎంపికలను నివారించండి.

- బహుళ కాంట్రాక్ట్‌ల ద్వారా లేదా ఒకే విధమైన ఫంక్షన్‌లను (ఉదాహరణకు, ప్రామాణీకరణ, అంకగణితం, ...) ఒకచోట చేర్చడం ద్వారా **మీ సిస్టమ్ యొక్క లాజిక్‌ను విభజించండి**.
- **స్పష్టమైన ప్రయోజనంతో చిన్న ఫంక్షన్‌లను రాయండి.** ఇది సులభమైన సమీక్షను సులభతరం చేస్తుంది మరియు వ్యక్తిగత భాగాల పరీక్షను అనుమతిస్తుంది.

### ఇన్‌హెరిటెన్స్ {#inheritance}

- **ఇన్‌హెరిటెన్స్‌ను నిర్వహించదగినదిగా ఉంచండి.** లాజిక్‌ను విభజించడానికి ఇన్‌హెరిటెన్స్‌ను ఉపయోగించాలి, అయితే, మీ ప్రాజెక్ట్ ఇన్‌హెరిటెన్స్ ట్రీ యొక్క లోతు మరియు వెడల్పును తగ్గించాలని లక్ష్యంగా పెట్టుకోవాలి.
- **కాంట్రాక్ట్‌ల క్రమానుగత శ్రేణిని తనిఖీ చేయడానికి స్లిదర్ యొక్క [ఇన్‌హెరిటెన్స్ ప్రింటర్‌](https://github.com/crytic/slither/wiki/Printer-documentation#inheritance-graph)ను ఉపయోగించండి.** ఇన్‌హెరిటెన్స్ ప్రింటర్ క్రమానుగత శ్రేణి పరిమాణాన్ని సమీక్షించడంలో మీకు సహాయపడుతుంది.

### ఈవెంట్‌లు {#events}

- **అన్ని కీలకమైన ఆపరేషన్లను లాగ్ చేయండి.** అభివృద్ధి సమయంలో కాంట్రాక్ట్‌ను డీబగ్ చేయడానికి మరియు డిప్లాయ్‌మెంట్ తర్వాత దాన్ని పర్యవేక్షించడానికి ఈవెంట్‌లు సహాయపడతాయి.

### తెలిసిన ఆపదలను నివారించండి {#avoid-known-pitfalls}

- **అత్యంత సాధారణ భద్రతా సమస్యల గురించి తెలుసుకోండి.** [Ethernaut CTF](https://ethernaut.openzeppelin.com/), [Capture the Ether](https://capturetheether.com/), లేదా [Not so smart contracts](https://github.com/crytic/not-so-smart-contracts/) వంటి సాధారణ సమస్యల గురించి తెలుసుకోవడానికి అనేక ఆన్‌లైన్ వనరులు ఉన్నాయి.
- **[Solidity డాక్యుమెంటేషన్](https://docs.soliditylang.org/en/latest/)లోని హెచ్చరికల విభాగాల గురించి తెలుసుకోండి.** హెచ్చరికల విభాగాలు భాష యొక్క స్పష్టంగా తెలియని ప్రవర్తన గురించి మీకు తెలియజేస్తాయి.

### డిపెండెన్సీలు {#dependencies}

- **బాగా పరీక్షించబడిన లైబ్రరీలను ఉపయోగించండి.** బాగా పరీక్షించబడిన లైబ్రరీల నుండి కోడ్‌ను దిగుమతి చేసుకోవడం వలన మీరు బగ్‌లతో కూడిన కోడ్‌ను రాసే అవకాశం తగ్గుతుంది. మీరు ERC-20 కాంట్రాక్ట్‌ను రాయాలనుకుంటే, [ఓపెన్‌జెప్పెలిన్](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20)ను ఉపయోగించండి.
- **డిపెండెన్సీ మేనేజర్‌ను ఉపయోగించండి; కోడ్‌ను కాపీ-పేస్ట్ చేయడం నివారించండి.** మీరు బాహ్య మూలంపై ఆధారపడితే, మీరు దానిని అసలు మూలంతో అప్‌డేట్‌గా ఉంచాలి.

### పరీక్ష మరియు ధృవీకరణ {#testing-and-verification}

- **సమగ్ర యూనిట్-టెస్ట్‌లను రాయండి.** అధిక-నాణ్యత సాఫ్ట్‌వేర్‌ను నిర్మించడానికి విస్తృతమైన టెస్ట్ సూట్ కీలకం.
- **[స్లిదర్](https://github.com/crytic/slither), [ఎకిడ్నా](https://github.com/crytic/echidna) మరియు [మాంటికోర్](https://github.com/trailofbits/manticore) కస్టమ్ చెక్‌లు మరియు ప్రాపర్టీలను రాయండి.** ఆటోమేటెడ్ సాధనాలు మీ కాంట్రాక్ట్ సురక్షితంగా ఉందని నిర్ధారించడంలో సహాయపడతాయి. సమర్థవంతమైన చెక్‌లు మరియు ప్రాపర్టీలను ఎలా రాయాలో తెలుసుకోవడానికి ఈ గైడ్ యొక్క మిగిలిన భాగాన్ని సమీక్షించండి.
- **[crytic.io](https://crytic.io/)ను ఉపయోగించండి.** Crytic GitHubతో అనుసంధానించబడుతుంది, ప్రైవేట్ స్లిదర్ డిటెక్టర్‌లకు యాక్సెస్‌ను అందిస్తుంది మరియు ఎకిడ్నా నుండి కస్టమ్ ప్రాపర్టీ చెక్‌లను రన్ చేస్తుంది.

### Solidity {#solidity}

- **0.4 మరియు 0.6 కంటే Solidity 0.5కి ప్రాధాన్యత ఇవ్వండి.** మా అభిప్రాయం ప్రకారం, Solidity 0.5 మరింత సురక్షితమైనది మరియు 0.4 కంటే మెరుగైన అంతర్నిర్మిత పద్ధతులను కలిగి ఉంది. Solidity 0.6 ఉత్పత్తికి చాలా అస్థిరమైనదిగా నిరూపించబడింది మరియు పరిపక్వం చెందడానికి సమయం పడుతుంది.
- **కంపైల్ చేయడానికి స్థిరమైన విడుదలను ఉపయోగించండి; హెచ్చరికల కోసం తనిఖీ చేయడానికి తాజా విడుదలను ఉపయోగించండి.** తాజా కంపైలర్ వెర్షన్‌తో మీ కోడ్‌లో ఎలాంటి సమస్యలు నివేదించబడలేదని తనిఖీ చేయండి. అయితే, Solidity వేగవంతమైన విడుదల చక్రాన్ని కలిగి ఉంది మరియు కంపైలర్ బగ్‌ల చరిత్రను కలిగి ఉంది, కాబట్టి మేము డిప్లాయ్‌మెంట్ కోసం తాజా వెర్షన్‌ను సిఫార్సు చేయము (స్లిదర్ యొక్క [solc వెర్షన్ సిఫార్సు](https://github.com/crytic/slither/wiki/Detector-Documentation#recommendation-33) చూడండి).
- **ఇన్‌లైన్ అసెంబ్లీని ఉపయోగించవద్దు.** అసెంబ్లీకి EVM నైపుణ్యం అవసరం. మీరు ఎల్లో పేపర్‌పై _పట్టు సాధించకపోతే_ EVM కోడ్‌ను రాయకండి.

## డిప్లాయ్‌మెంట్ మార్గదర్శకాలు {#deployment-guidelines}

కాంట్రాక్ట్ అభివృద్ధి చేయబడి మరియు డిప్లాయ్ చేయబడిన తర్వాత:

- **మీ కాంట్రాక్ట్‌లను పర్యవేక్షించండి.** లాగ్‌లను గమనించండి మరియు కాంట్రాక్ట్ లేదా వాలెట్ రాజీపడిన సందర్భంలో స్పందించడానికి సిద్ధంగా ఉండండి.
- **[blockchain-security-contacts](https://github.com/crytic/blockchain-security-contacts)కి మీ సంప్రదింపు సమాచారాన్ని జోడించండి.** ఏదైనా భద్రతా లోపం కనుగొనబడితే మూడవ పక్షాలు మిమ్మల్ని సంప్రదించడానికి ఈ జాబితా సహాయపడుతుంది.
- **ప్రత్యేక హక్కులున్న వినియోగదారుల వాలెట్‌లను సురక్షితం చేయండి.** మీరు హార్డ్‌వేర్ వాలెట్‌లలో కీలను నిల్వ చేస్తే మా [ఉత్తమ పద్ధతులను](https://blog.trailofbits.com/2018/11/27/10-rules-for-the-secure-use-of-cryptocurrency-hardware-wallets/) అనుసరించండి.
- **సంఘటన ప్రతిస్పందన ప్రణాళికను కలిగి ఉండండి.** మీ స్మార్ట్ కాంట్రాక్ట్‌లు రాజీపడే అవకాశం ఉందని పరిగణించండి. మీ కాంట్రాక్ట్‌లు బగ్‌లు లేకుండా ఉన్నప్పటికీ, దాడి చేసే వ్యక్తి కాంట్రాక్ట్ యజమాని కీల నియంత్రణను తీసుకోవచ్చు.