मुख्य सामग्री पर जाएं
Change page

स्मार्ट अनुबंधों की संरचना

स्मार्ट अनुबंध एक प्रोग्राम है जो इथेरियम पर एक पते (address) पर चलता है। वे डेटा और फ़ंक्शन से बने होते हैं जो लेन-देन प्राप्त होने पर निष्पादित (execute) हो सकते हैं। यहाँ स्मार्ट अनुबंध के घटकों का अवलोकन दिया गया है।

पूर्वापेक्षाएँ

सुनिश्चित करें कि आपने पहले स्मार्ट अनुबंधों के बारे में पढ़ लिया है। यह दस्तावेज़ मानकर चलता है कि आप पहले से ही JavaScript या Python जैसी प्रोग्रामिंग भाषाओं से परिचित हैं।

डेटा

किसी भी अनुबंध डेटा को एक स्थान पर असाइन किया जाना चाहिए: या तो storage या memory में। स्मार्ट अनुबंध में स्टोरेज को संशोधित करना महंगा होता है, इसलिए आपको यह विचार करने की आवश्यकता है कि आपका डेटा कहाँ रहना चाहिए।

स्टोरेज

स्थायी डेटा को स्टोरेज कहा जाता है और इसे स्थिति (state) चर (variables) द्वारा दर्शाया जाता है। ये मान ब्लॉकचेन पर स्थायी रूप से संग्रहीत हो जाते हैं। आपको प्रकार (type) घोषित करने की आवश्यकता है ताकि अनुबंध संकलित (compile) होने पर यह ट्रैक रख सके कि उसे ब्लॉकचेन पर कितने स्टोरेज की आवश्यकता है।

// Solidity उदाहरण
contract SimpleStorage {
    uint storedData; // स्थिति चर
    // ...
}
# Vyper उदाहरण
storedData: int128

यदि आपने पहले से ही ऑब्जेक्ट-ओरिएंटेड भाषाओं में प्रोग्रामिंग की है, तो आप संभवतः अधिकांश प्रकारों से परिचित होंगे। हालाँकि, यदि आप इथेरियम विकास में नए हैं, तो address आपके लिए नया होना चाहिए।

एक address प्रकार एक इथेरियम पता रख सकता है जो 20 बाइट्स या 160 बिट्स के बराबर होता है। यह 0x से शुरू होने वाले हेक्साडेसिमल नोटेशन में वापस आता है।

अन्य प्रकारों में शामिल हैं:

  • बूलियन (boolean)
  • पूर्णांक (integer)
  • फिक्स्ड पॉइंट नंबर
  • फिक्स्ड-साइज़ बाइट एरे
  • डायनेमिकली साइज़्ड बाइट एरे
  • रैशनल और इंटीजर लिटरल्स
  • स्ट्रिंग लिटरल्स
  • हेक्साडेसिमल लिटरल्स
  • एनम्स (enums)

अधिक स्पष्टीकरण के लिए, दस्तावेज़ देखें:

मेमोरी

वे मान जो केवल अनुबंध फ़ंक्शन के निष्पादन के जीवनकाल के लिए संग्रहीत किए जाते हैं, मेमोरी चर (memory variables) कहलाते हैं। चूँकि ये ब्लॉकचेन पर स्थायी रूप से संग्रहीत नहीं होते हैं, इसलिए इनका उपयोग करना बहुत सस्ता होता है।

EVM डेटा (स्टोरेज, मेमोरी और स्टैक) को कैसे संग्रहीत करता है, इसके बारे में Solidity दस्तावेज़ों (opens in a new tab) में अधिक जानें।

पर्यावरण चर (Environment variables)

आपके द्वारा अपने अनुबंध पर परिभाषित किए गए चरों के अलावा, कुछ विशेष वैश्विक चर (global variables) होते हैं। इनका उपयोग मुख्य रूप से ब्लॉकचेन या वर्तमान लेन-देन के बारे में जानकारी प्रदान करने के लिए किया जाता है।

उदाहरण:

प्रॉप (Prop)स्थिति चर (State variable)विवरण
block.timestampuint256वर्तमान ब्लॉक एपॉक टाइमस्टैम्प
msg.senderaddressसंदेश भेजने वाला (वर्तमान कॉल)

फ़ंक्शन

सबसे सरल शब्दों में, फ़ंक्शन आने वाले लेन-देन के जवाब में जानकारी प्राप्त कर सकते हैं या जानकारी सेट कर सकते हैं।

फ़ंक्शन कॉल दो प्रकार के होते हैं:

  • internal – ये EVM कॉल नहीं बनाते हैं
    • आंतरिक फ़ंक्शन और स्थिति चर केवल आंतरिक रूप से एक्सेस किए जा सकते हैं (यानी, वर्तमान अनुबंध या इससे प्राप्त अनुबंधों के भीतर से)
  • external – ये EVM कॉल बनाते हैं
    • बाहरी फ़ंक्शन अनुबंध इंटरफ़ेस का हिस्सा होते हैं, जिसका अर्थ है कि उन्हें अन्य अनुबंधों से और लेन-देन के माध्यम से कॉल किया जा सकता है। एक बाहरी फ़ंक्शन f को आंतरिक रूप से कॉल नहीं किया जा सकता है (यानी, f() काम नहीं करता है, लेकिन this.f() काम करता है)।

वे public या private भी हो सकते हैं

  • public फ़ंक्शन को अनुबंध के भीतर से आंतरिक रूप से या संदेशों के माध्यम से बाहरी रूप से कॉल किया जा सकता है
  • private फ़ंक्शन केवल उस अनुबंध के लिए दृश्यमान होते हैं जिसमें वे परिभाषित होते हैं और प्राप्त (derived) अनुबंधों में नहीं

फ़ंक्शन और स्थिति चर दोनों को सार्वजनिक (public) या निजी (private) बनाया जा सकता है

यहाँ अनुबंध पर स्थिति चर को अपडेट करने के लिए एक फ़ंक्शन दिया गया है:

// Solidity उदाहरण
function update_name(string value) public {
    dapp_name = value;
}
  • string प्रकार का पैरामीटर value फ़ंक्शन में पास किया जाता है: update_name
  • इसे public घोषित किया गया है, जिसका अर्थ है कि कोई भी इसे एक्सेस कर सकता है
  • इसे view घोषित नहीं किया गया है, इसलिए यह अनुबंध की स्थिति को संशोधित कर सकता है

व्यू (View) फ़ंक्शन

ये फ़ंक्शन अनुबंध के डेटा की स्थिति को संशोधित न करने का वादा करते हैं। सामान्य उदाहरण "गेटर (getter)" फ़ंक्शन हैं - उदाहरण के लिए आप इसका उपयोग उपयोगकर्ता का बैलेंस प्राप्त करने के लिए कर सकते हैं।

// Solidity उदाहरण
function balanceOf(address _owner) public view returns (uint256 _balance) {
    return ownerPizzaCount[_owner];
}
dappName: public(string)

@view
@public
def readName() -> string:
  return dappName

स्थिति को संशोधित करना क्या माना जाता है:

  1. स्थिति चरों में लिखना।
  2. घटनाएँ उत्सर्जित (emit) करना (opens in a new tab)
  3. अन्य अनुबंध बनाना (opens in a new tab)
  4. selfdestruct का उपयोग करना।
  5. कॉल के माध्यम से ईथर भेजना।
  6. किसी भी ऐसे फ़ंक्शन को कॉल करना जिसे view या pure के रूप में चिह्नित नहीं किया गया है।
  7. लो-लेवल कॉल का उपयोग करना।
  8. इनलाइन असेंबली का उपयोग करना जिसमें कुछ ओपकोड (opcodes) होते हैं।

कंस्ट्रक्टर फ़ंक्शन

constructor फ़ंक्शन केवल एक बार निष्पादित होते हैं जब अनुबंध पहली बार तैनात किया जाता है। कई क्लास-आधारित प्रोग्रामिंग भाषाओं में constructor की तरह, ये फ़ंक्शन अक्सर स्थिति चरों को उनके निर्दिष्ट मानों पर इनिशियलाइज़ करते हैं।

# Vyper उदाहरण

@external
def __init__(_beneficiary: address, _bidding_time: uint256):
    self.beneficiary = _beneficiary
    self.auctionStart = block.timestamp
    self.auctionEnd = self.auctionStart + _bidding_time

अंतर्निहित (Built-in) फ़ंक्शन

आपके द्वारा अपने अनुबंध पर परिभाषित किए गए चरों और फ़ंक्शन के अलावा, कुछ विशेष अंतर्निहित फ़ंक्शन होते हैं। सबसे स्पष्ट उदाहरण है:

  • address.send() – Solidity
  • send(address) – Vyper

ये अनुबंधों को अन्य खातों में ETH भेजने की अनुमति देते हैं।

फ़ंक्शन लिखना

आपके फ़ंक्शन को आवश्यकता है:

  • पैरामीटर चर और प्रकार (यदि यह पैरामीटर स्वीकार करता है)
  • आंतरिक/बाहरी (internal/external) की घोषणा
  • शुद्ध/दृश्य/देय (pure/view/payable) की घोषणा
  • रिटर्न प्रकार (यदि यह कोई मान लौटाता है)

एक पूर्ण अनुबंध कुछ इस तरह दिख सकता है। यहाँ constructor फ़ंक्शन dapp_name चर के लिए एक प्रारंभिक मान प्रदान करता है।

घटनाएँ और लॉग

घटनाएँ आपके स्मार्ट अनुबंध को आपके फ्रंटएंड या अन्य सब्सक्राइबिंग एप्लिकेशन के साथ संवाद करने में सक्षम बनाती हैं। एक बार जब कोई लेन-देन मान्य हो जाता है और ब्लॉक में जुड़ जाता है, तो स्मार्ट अनुबंध घटनाएँ उत्सर्जित कर सकते हैं और जानकारी लॉग कर सकते हैं, जिसे फ्रंटएंड फिर प्रोसेस और उपयोग कर सकता है।

एनोटेट किए गए उदाहरण

ये Solidity में लिखे गए कुछ उदाहरण हैं। यदि आप कोड के साथ प्रयोग करना चाहते हैं, तो आप Remix (opens in a new tab) में उनके साथ इंटरैक्ट कर सकते हैं।

हैलो वर्ल्ड

टोकन

अद्वितीय डिजिटल संपत्ति

आगे की पढ़ाई

स्मार्ट अनुबंधों के अधिक पूर्ण अवलोकन के लिए Solidity और Vyper के दस्तावेज़ देखें: