ప్రధాన కంటెంట్‌కి స్కిప్ చేయండి

పరీక్షించడం కోసం సొలిడిటీ స్మార్ట్ కాంట్రాక్ట్‌లను ఎలా మాక్ చేయాలి

Solidity
స్మార్ట్ కాంట్రాక్టులు
పరీక్షించడం
మాకింగ్
మధ్యస్థ
Markus Waas
2 మే, 2020
3 నిమిషం పఠనం

మాక్ ఆబ్జెక్ట్‌లు (opens in a new tab) అనేవి ఆబ్జెక్ట్-ఓరియెంటెడ్ ప్రోగ్రామింగ్‌లో ఒక సాధారణ డిజైన్ ప్యాటర్న్. పాత ఫ్రెంచ్ పదం 'mocquer' నుండి 'ఎగతాళి చేయడం' అనే అర్థంతో వచ్చిన ఇది, 'నిజమైన దాన్ని అనుకరించడం'గా పరిణామం చెందింది, ఇది వాస్తవానికి మనం ప్రోగ్రామింగ్‌లో చేసే పని. దయచేసి మీకు కావాలనుకుంటేనే మీ స్మార్ట్ కాంట్రాక్ట్‌లను ఎగతాళి చేయండి, కానీ మీకు వీలైనప్పుడల్లా వాటిని మాక్ చేయండి. ఇది మీ జీవితాన్ని సులభతరం చేస్తుంది.

మాక్స్‌తో కాంట్రాక్ట్‌లను యూనిట్-టెస్టింగ్ చేయడం

ఒక కాంట్రాక్ట్‌ను మాక్ చేయడం అంటే ఆ కాంట్రాక్ట్ యొక్క రెండవ వెర్షన్‌ను సృష్టించడం, ఇది అసలైన దానికి చాలా పోలి ఉంటుంది, కానీ డెవలపర్ సులభంగా నియంత్రించగల విధంగా ఉంటుంది. మీరు తరచుగా సంక్లిష్టమైన కాంట్రాక్టులతో ముగుస్తారు, అక్కడ మీరు కాంట్రాక్టులోని చిన్న భాగాలను మాత్రమే యూనిట్-టెస్ట్ చేయాలనుకుంటారు. సమస్య ఏమిటంటే, ఈ చిన్న భాగాన్ని పరీక్షించడానికి ఒక నిర్దిష్ట కాంట్రాక్ట్ స్టేట్ అవసరమై, దాన్ని చేరుకోవడం కష్టమైతే ఏం చేయాలి?

కాంట్రాక్ట్‌ను అవసరమైన స్టేట్‌లోకి తీసుకువచ్చే సంక్లిష్టమైన టెస్ట్ సెటప్ లాజిక్‌ను మీరు ప్రతిసారీ వ్రాయవచ్చు లేదా మీరు ఒక మాక్‌ను వ్రాయవచ్చు. ఇన్హెరిటెన్స్‌తో ఒక కాంట్రాక్ట్‌ను మాక్ చేయడం సులభం. అసలు కాంట్రాక్ట్ నుండి ఇన్హెరిట్ అయ్యే రెండవ మాక్ కాంట్రాక్ట్‌ను సృష్టించండి. ఇప్పుడు మీరు మీ మాక్‌కు ఫంక్షన్‌లను ఓవర్‌రైడ్ చేయవచ్చు. ఒక ఉదాహరణతో చూద్దాం.

ఉదాహరణ: ప్రైవేట్ ERC20

మేము ఒక ఉదాహరణ ERC-20 కాంట్రాక్ట్‌ను ఉపయోగిస్తాము, దీనికి ప్రారంభ ప్రైవేట్ సమయం ఉంటుంది. యజమాని ప్రైవేట్ వినియోగదారులను నిర్వహించగలరు మరియు ప్రారంభంలో టోకెన్‌లను స్వీకరించడానికి వారికి మాత్రమే అనుమతి ఉంటుంది. ఒక నిర్దిష్ట సమయం గడిచిన తర్వాత, ప్రతి ఒక్కరూ టోకెన్‌లను ఉపయోగించడానికి అనుమతించబడతారు. మీకు ఆసక్తి ఉంటే, మేము కొత్త OpenZeppelin కాంట్రాక్టులు v3 నుండి _beforeTokenTransfer (opens in a new tab) హుక్‌ను ఉపయోగిస్తున్నాము.

1pragma solidity ^0.6.0;
2
3import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
4import "@openzeppelin/contracts/access/Ownable.sol";
5
6contract PrivateERC20 is ERC20, Ownable {
7 mapping (address => bool) public isPrivateUser;
8 uint256 private publicAfterTime;
9
10 constructor(uint256 privateERC20timeInSec) ERC20("PrivateERC20", "PRIV") public {
11 publicAfterTime = now + privateERC20timeInSec;
12 }
13
14 function addUser(address user) external onlyOwner {
15 isPrivateUser[user] = true;
16 }
17
18 function isPublic() public view returns (bool) {
19 return now >= publicAfterTime;
20 }
21
22 function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {
23 super._beforeTokenTransfer(from, to, amount);
24
25 require(_validRecipient(to), "PrivateERC20: చెల్లని గ్రహీత");
26 }
27
28 function _validRecipient(address to) private view returns (bool) {
29 if (isPublic()) {
30 return true;
31 }
32
33 return isPrivateUser[to];
34 }
35}

ఇప్పుడు దానిని మాక్ చేద్దాం.

1pragma solidity ^0.6.0;
2import "../PrivateERC20.sol";
3
4contract PrivateERC20Mock is PrivateERC20 {
5 bool isPublicConfig;
6
7 constructor() public PrivateERC20(0) {}
8
9 function setIsPublic(bool isPublic) external {
10 isPublicConfig = isPublic;
11 }
12
13 function isPublic() public view returns (bool) {
14 return isPublicConfig;
15 }
16}

మీకు కింది దోష సందేశాలలో ఒకటి వస్తుంది:

  • PrivateERC20Mock.sol: TypeError: Overriding function is missing "override" specifier.
  • PrivateERC20.sol: TypeError: Trying to override non-virtual function. Did you forget to add "virtual"?.

మనం కొత్త 0.6 సొలిడిటీ వెర్షన్‌ను ఉపయోగిస్తున్నందున, ఓవర్‌రైడ్ చేయగల ఫంక్షన్‌ల కోసం virtual కీవర్డ్‌ను మరియు ఓవర్‌రైడ్ చేస్తున్న ఫంక్షన్ కోసం overrideను జోడించాలి. కాబట్టి ఆ రెండింటినీ isPublic ఫంక్షన్‌లకు జోడిద్దాం.

ఇప్పుడు మీ యూనిట్ టెస్టులలో, మీరు బదులుగా PrivateERC20Mockని ఉపయోగించవచ్చు. మీరు ప్రైవేట్ వినియోగ సమయంలో ప్రవర్తనను పరీక్షించాలనుకున్నప్పుడు, setIsPublic(false) ఉపయోగించండి మరియు అదేవిధంగా పబ్లిక్ వినియోగ సమయాన్ని పరీక్షించడానికి setIsPublic(true)ని ఉపయోగించండి. అయితే మన ఉదాహరణలో, సమయాలను తదనుగుణంగా మార్చడానికి మనం టైమ్ హెల్పర్‌లను (opens in a new tab) కూడా ఉపయోగించవచ్చు. అయితే ఇప్పుడు మాకింగ్ యొక్క ఆలోచన స్పష్టంగా ఉండాలి మరియు సమయాన్ని కేవలం ముందుకు జరపడం అంత సులభం కాని సందర్భాలను మీరు ఊహించగలరు.

అనేక కాంట్రాక్టులను మాక్ చేయడం

ప్రతి ఒక్క మాక్ కోసం మీరు మరొక కాంట్రాక్ట్‌ను సృష్టించవలసి వస్తే అది గందరగోళంగా మారవచ్చు. ఇది మీకు ఇబ్బందిగా అనిపిస్తే, మీరు మాక్‌కాంట్రాక్ట్ (opens in a new tab) లైబ్రరీని చూడవచ్చు. ఇది కాంట్రాక్ట్‌ల ప్రవర్తనలను అప్పటికప్పుడు ఓవర్‌రైడ్ చేయడానికి మరియు మార్చడానికి మిమ్మల్ని అనుమతిస్తుంది. అయితే, ఇది మరొక కాంట్రాక్ట్‌కు కాల్స్‌ను మాక్ చేయడానికి మాత్రమే పనిచేస్తుంది, కాబట్టి ఇది మన ఉదాహరణకు పనిచేయదు.

మాకింగ్ మరింత శక్తివంతంగా ఉంటుంది

మాకింగ్ యొక్క శక్తులు అంతటితో ముగియవు.

  • ఫంక్షన్‌లను జోడించడం: ఒక నిర్దిష్ట ఫంక్షన్‌ను ఓవర్‌రైడ్ చేయడం మాత్రమే కాదు, అదనపు ఫంక్షన్‌లను జోడించడం కూడా ఉపయోగకరంగా ఉంటుంది. టోకెన్‌లకు ఒక మంచి ఉదాహరణ, అదనంగా ఒక mint ఫంక్షన్‌ను కలిగి ఉండటం. ఇది ఏ వినియోగదారుడైనా ఉచితంగా కొత్త టోకెన్‌లను పొందడానికి అనుమతిస్తుంది.
  • టెస్టునెట్‌లలో వాడకం: మీరు మీ డాప్‌తో పాటు టెస్టునెట్‌లలో మీ కాంట్రాక్టులను డిప్లాయ్ చేసి, పరీక్షించేటప్పుడు, మాక్ చేసిన వెర్షన్‌ను ఉపయోగించడాన్ని పరిగణించండి. మీకు నిజంగా అవసరమైతే తప్ప ఫంక్షన్‌లను ఓవర్‌రైడ్ చేయడం మానుకోండి. అంతిమంగా, మీరు నిజమైన లాజిక్‌ను పరీక్షించాలనుకుంటున్నారు. కానీ ఉదాహరణకు, ఒక రీసెట్ ఫంక్షన్‌ను జోడించడం ఉపయోగకరంగా ఉంటుంది, ఇది కాంట్రాక్ట్ స్టేట్‌ను ప్రారంభానికి రీసెట్ చేస్తుంది, కొత్త డిప్లాయ్‌మెంట్ అవసరం లేదు. సహజంగానే మీరు ఒక Mainnet కాంట్రాక్ట్‌లో దానిని కలిగి ఉండాలని కోరుకోరు.

పేజీ చివరి అప్‌డేట్: 3 మార్చి, 2026

ఈ ట్యుటోరియల్ ఉపయోగపడిందా?