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

सॉलिडिटी से अन्य अनुबंधों के साथ इंटरैक्ट करें

स्मार्ट अनुबंध
Solidity
Remix
परिनियोजित करना
कम्पोज़ेबिलिटी
उन्नत
jdourlens
5 अप्रैल 2020
4 मिनट का पठन

पिछले ट्यूटोरियल में हमने बहुत कुछ सीखा अपना पहला स्मार्ट अनुबंध कैसे परिनियोजित करें और इसमें कुछ सुविधाएँ जोड़ें जैसे मॉडिफ़ायर के साथ एक्सेस नियंत्रित करें (opens in a new tab) या सॉलिडिटी में त्रुटि संभालना (opens in a new tab)। इस ट्यूटोरियल में हम सीखेंगे कि किसी मौजूदा अनुबंध से स्मार्ट अनुबंध कैसे परिनियोजित करें और उसके साथ कैसे इंटरैक्ट करें।

हम एक अनुबंध बनाएंगे जो किसी को भी इसके लिए एक फ़ैक्टरी बनाकर अपना Counter स्मार्ट अनुबंध रखने में सक्षम बनाता है, इसका नाम CounterFactory होगा। सबसे पहले, यहाँ हमारे शुरुआती Counter स्मार्ट अनुबंध का कोड है:

ध्यान दें कि हमने फ़ैक्टरी के पते और अनुबंध के मालिक के पते का ट्रैक रखने के लिए अनुबंध कोड को थोड़ा संशोधित किया है। जब आप किसी अन्य अनुबंध से अनुबंध कोड को कॉल करते हैं, तो msg.sender हमारे अनुबंध फ़ैक्टरी के पते को संदर्भित करेगा। यह समझने के लिए वास्तव में एक महत्वपूर्ण बिंदु है क्योंकि अन्य अनुबंधों के साथ इंटरैक्ट करने के लिए एक अनुबंध का उपयोग करना एक आम बात है। इसलिए आपको जटिल मामलों में इस बात का ध्यान रखना चाहिए कि प्रेषक कौन है।

इसके लिए हमने एक onlyFactory मॉडिफ़ायर भी जोड़ा है जो यह सुनिश्चित करता है कि स्टेट चेंजिंग फ़ंक्शन को केवल फ़ैक्टरी द्वारा ही कॉल किया जा सकता है जो मूल कॉलर को एक पैरामीटर के रूप में पास करेगा।

हमारे नए CounterFactory के अंदर जो अन्य सभी काउंटरों का प्रबंधन करेगा, हम एक मैपिंग जोड़ेंगे जो एक मालिक को उसके काउंटर अनुबंध के पते से जोड़ेगा:

mapping(address => Counter) _counters;

एथेरियम में, मैपिंग जावास्क्रिप्ट में ऑब्जेक्ट के बराबर हैं, वे टाइप A की कुंजी को टाइप B के मान पर मैप करने में सक्षम करते हैं। इस मामले में हम एक मालिक के पते को उसके काउंटर के इंस्टेंस के साथ मैप करते हैं।

किसी के लिए एक नया काउंटर इंस्टैंशिएट करना कुछ इस तरह दिखेगा:

  function createCounter() public {
      require (_counters[msg.sender] == Counter(0));
      _counters[msg.sender] = new Counter(msg.sender);
  }

हम पहले जांचते हैं कि क्या व्यक्ति के पास पहले से ही एक काउंटर है। यदि उसके पास कोई काउंटर नहीं है, तो हम Counter कंस्ट्रक्टर को उसका पता पास करके एक नया काउंटर इंस्टैंशिएट करते हैं और नए बनाए गए इंस्टेंस को मैपिंग को असाइन करते हैं।

किसी विशिष्ट काउंटर की गिनती प्राप्त करने के लिए यह इस तरह दिखेगा:

function getCount(address account) public view returns (uint256) {
    require (_counters[account] != Counter(0));
    return (_counters[account].getCount());
}

function getMyCount() public view returns (uint256) {
    return (getCount(msg.sender));
}

पहला फ़ंक्शन जांचता है कि दिए गए पते के लिए काउंटर अनुबंध मौजूद है या नहीं और फिर इंस्टेंस से getCount विधि को कॉल करता है। दूसरा फ़ंक्शन: getMyCount बस msg.sender को सीधे getCount फ़ंक्शन में पास करने का एक छोटा तरीका है।

increment फ़ंक्शन काफी समान है, लेकिन मूल लेनदेन प्रेषक को Counter अनुबंध में पास करता है:

function increment() public {
      require (_counters[msg.sender] != Counter(0));
      Counter(_counters[msg.sender]).increment(msg.sender);
  }

ध्यान दें कि यदि बहुत बार कॉल किया जाता है, तो हमारा काउंटर संभवतः ओवरफ़्लो का शिकार हो सकता है। इस संभावित मामले से बचाने के लिए आपको जितना संभव हो सके सेफमैथ लाइब्रेरी (opens in a new tab) का उपयोग करना चाहिए।

हमारे अनुबंध को परिनियोजित करने के लिए, आपको CounterFactory और Counter दोनों का कोड प्रदान करना होगा। उदाहरण के लिए रीमिक्स में परिनियोजित करते समय आपको काउंटरफैक्ट्री का चयन करना होगा।

यहाँ पूरा कोड है:

संकलन के बाद, रीमिक्स परिनियोजन अनुभाग में आप परिनियोजित की जाने वाली फ़ैक्टरी का चयन करेंगे:

रीमिक्स में परिनियोजित की जाने वाली फ़ैक्टरी का चयन करना

फिर आप अपनी अनुबंध फ़ैक्टरी के साथ खेल सकते हैं और मान को बदलते हुए देख सकते हैं। यदि आप किसी भिन्न पते से स्मार्ट अनुबंध को कॉल करना चाहते हैं तो आपको रीमिक्स के खाता चयन में पता बदलना होगा।

पेज का अंतिम अपडेट: 3 मार्च 2026

क्या यह ट्यूटोरियल उपयोगी था?