Web3 और DApp विकास की मूल बातें · पाठ

संग्रहण बनाम मेमोरी

डेटा स्थान

पाठ 3, कुल 4 में से13 चरण

संग्रहण बनाम मेमोरी, CoddyKit पर Web3 और DApp विकास की मूल बातें का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Web3 और DApp विकास की मूल बातें सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Web3 और DApp विकास की मूल बातें पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

डेटा स्थान महत्वपूर्ण क्यों है

Solidity में रेफ़रेंस प्रकारों के लिए डेटा स्थान बताना आवश्यक है। तीन स्थान हैं: storage, memory और calldata।

सही स्थान चुनने से स्थायित्व, परिवर्तनीयता और सबसे महत्वपूर्ण रूप से गैस लागत प्रभावित होती है।

Storage

Storage कॉन्ट्रैक्ट की स्थायी ऑन-चेन स्थिति है। स्टेट चर यहाँ रहते हैं और स्टोरेज में लिखना सबसे महँगा ऑपरेशन है।

स्टोरेज में मौजूद डेटा लेन-देन के बीच बना रहता है।

<code>contract Bank {
    uint256 public total; // lives in storage forever

    function add(uint256 v) public {
        total += v; // writes to storage (expensive)
    }
}</code>

Memory

Memory एक अस्थायी कार्य-स्थान है, जो केवल फ़ंक्शन कॉल के दौरान मौजूद रहता है। यह स्टोरेज से बहुत सस्ता होता है और फ़ंक्शन के लौटने पर साफ़ कर दिया जाता है।

मध्यवर्ती गणनाओं और ऐसे डेटा के लिए memory का उपयोग करें जिसे आपको स्थायी रूप से रखने की आवश्यकता नहीं है।

<code>function build() public pure returns (uint[] memory) {
    uint[] memory temp = new uint[](3);
    temp[0] = 1;
    temp[1] = 2;
    return temp; // discarded after call
}</code>

Calldata

Calldata एक केवल-पठन, अपरिवर्तनीय स्थान है, जिसमें external कॉल के फ़ंक्शन तर्क होते हैं। यह सबसे सस्ता विकल्प है, क्योंकि कोई प्रतिलिपि नहीं बनाई जाती।

ऐसे फ़ंक्शन पैरामीटरों के लिए इसका उपयोग करें जिन्हें आपको केवल पढ़ना है।

<code>function sum(uint[] calldata values) external pure returns (uint total) {
    for (uint i = 0; i < values.length; i++) {
        total += values[i];
    }
}</code>

स्टेट की ओर Storage Pointer

किसी फ़ंक्शन के भीतर स्थानीय storage चर मौजूदा स्टेट की ओर संकेत करने वाला पॉइंटर होता है। इसमें बदलाव करने पर कॉन्ट्रैक्ट का वास्तविक स्टोरेज बदल जाता है।

<code>struct User { uint balance; }
mapping(address => User) users;

function credit() public {
    User storage u = users[msg.sender];
    u.balance += 100; // updates real state
}</code>

स्टेट की Memory Copy

यदि आप इसके बजाय स्टेट को किसी memory चर में लोड करते हैं, तो आपको एक स्वतंत्र प्रतिलिपि मिलती है। प्रतिलिपि में किए गए बदलाव कॉन्ट्रैक्ट के स्टोरेज को अपडेट नहीं करते।

शुरुआती शिक्षार्थियों के लिए यह बग का एक सामान्य स्रोत है।

<code>function noEffect() public view returns (uint) {
    User memory u = users[msg.sender];
    u.balance += 100; // only the copy changes
    return u.balance;  // storage is untouched
}</code>

गैस लागत की तुलना

सबसे सस्ते से सबसे महँगे तक लागत का क्रम:

  • calldata - केवल-पठन बाहरी तर्क, कोई प्रतिलिपि नहीं
  • memory - अस्थायी, RAM में प्रतिलिपि बनाई जाती है
  • storage - स्थायी ऑन-चेन डेटा, लिखना बहुत महँगा

नए स्टोरेज में लिखना (शून्य से गैर-शून्य) EVM के सबसे महँगे ऑपरेशनों में से एक है।

बाहरी फ़ंक्शनों के लिए calldata को प्राथमिकता दें

ऐसे external फ़ंक्शनों के लिए जिनके ऐरे या संरचना वाले पैरामीटर केवल पढ़े जाते हैं, अनावश्यक प्रतिलिपि से बचने और गैस बचाने के लिए memory के बजाय calldata का उपयोग करें।

<code>// Cheaper: no copy is made
function process(bytes calldata data) external {
    // read data directly
}</code>

डिफ़ॉल्ट कहाँ लागू होते हैं

स्टेट चर हमेशा storage होते हैं। रेफ़रेंस प्रकार के फ़ंक्शन पैरामीटर और स्थानीय चरों के लिए स्थान स्पष्ट रूप से घोषित करना आवश्यक है। वैल्यू प्रकार और मैपिंग सदस्य अपने-आप स्टोरेज के नियमों का पालन करते हैं।

स्थानीय मैपिंग हमेशा storage होनी चाहिए - वे memory में नहीं रह सकतीं।

<code>// mapping locals must be storage
function f() public {
    // mapping(...) memory m;  // ERROR
}</code>

स्टोरेज रीड को कैश करना

गैस अनुकूलन का एक तरीका: यदि आप उसी स्टोरेज चर को कई बार पढ़ते हैं, तो उसे एक बार स्थानीय memory में कॉपी कर लें। हर स्टोरेज रीड (SLOAD) में गैस खर्च होती है।

<code>function loop() public view returns (uint) {
    uint cached = total; // one SLOAD
    uint acc;
    for (uint i = 0; i < 10; i++) {
        acc += cached; // reads memory, cheap
    }
    return acc;
}</code>

Memory लौटाना

नए ऐरे या संरचनाएँ बनाने और लौटाने वाले फ़ंक्शन लौटाए जाने वाले मान के लिए memory का उपयोग करते हैं, क्योंकि स्टोरेज को वैल्यू के रूप में लौटाया नहीं जा सकता और calldata केवल इनपुट के लिए है।

<code>function pair(uint a, uint b) public pure returns (uint[] memory) {
    uint[] memory out = new uint[](2);
    out[0] = a;
    out[1] = b;
    return out;
}</code>

त्वरित जाँच

डेटा स्थानों की अपनी समझ जाँचें।

पुनरावलोकन

आपने सीखा कि Solidity के डेटा स्थान कैसे काम करते हैं:

  • storage - स्थायी, ऑन-चेन, लिखने में सबसे महँगा
  • memory - अस्थायी कार्य-स्थान, प्रतिलिपि बनाई जाती है, कॉल के बाद साफ़ हो जाता है
  • calldata - केवल-पठन बाहरी तर्क, सबसे सस्ता, कोई प्रतिलिपि नहीं

स्टेट बदलने के लिए storage रेफ़रेंस, अस्थायी कार्य के लिए memory और गैस बचाने के लिए केवल-पठन बाहरी इनपुट के लिए calldata का उपयोग करें।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Web3 और DApp विकास की मूल बातें सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
29
पाठ
105

अक्सर पूछे जाने वाले प्रश्न

क्या “संग्रहण बनाम मेमोरी” पाठ निःशुल्क है?

हाँ — Web3 और DApp विकास की मूल बातें अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “संग्रहण बनाम मेमोरी” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Web3 और DApp विकास की मूल बातें पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“संग्रहण बनाम मेमोरी” में मैं क्या सीखूँगा?

डेटा स्थान आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Web3 और DApp विकास की मूल बातें का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Web3 और DApp विकास की मूल बातें शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Web3 और DApp विकास की मूल बातें शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“संग्रहण बनाम मेमोरी” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Web3 और DApp विकास की मूल बातें पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Web3 और DApp विकास की मूल बातें पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. वैल्यू प्रकार
  2. रेफ़रेंस प्रकार
  3. संग्रहण बनाम मेमोरी
  4. कॉन्स्टेंट और इम्यूटेबल
← Web3 और DApp विकास की मूल बातें पर वापस जाएँ