Cairo एक Rust-प्रेरित (Rust-inspired) भाषा है जो बाइटकोड (bytecode) में संकलित (compile) होती है, जो Cairo Virtual Machine पर चलती है। Cairo वर्चुअल मशीन एक ज़ीरो-नॉलेज वर्चुअल मशीन (ZKVM) है जो किसी भी Cairo प्रोग्राम को निष्पादित (execute) कर सकती है। Solidity के विपरीत, जो केवल स्मार्ट कॉन्ट्रैक्ट्स (smart contracts) के लिए बनाई गई है, Cairo एक सामान्य-उद्देश्य (general-purpose) वाली प्रोग्रामिंग भाषा है जिसे सिद्ध करने योग्य प्रोग्राम (provable programs) बनाने के लिए डिज़ाइन किया गया है।
यह ट्यूटोरियल सीरीज़ Starknet पर स्मार्ट कॉन्ट्रैक्ट्स के लिए Cairo का उपयोग करने पर केंद्रित है। हम यह मानकर नहीं चलते कि आपको Rust या ज़ीरो-नॉलेज प्रूफ़ (zero-knowledge proofs) का पूर्व अनुभव है। हालाँकि, यह ट्यूटोरियल सीरीज़ यह मानकर चलती है कि आपको Solidity का पूर्व अनुभव है। हम उम्मीद करते हैं कि पाठक को ERC-20 और ERC-721 को कोड करना आता है और उसे Uniswap V2 जैसे dApps के काम करने के तरीके की वैचारिक समझ (conceptual idea) है।
Cairo को सावधानीपूर्वक डिज़ाइन किया गया है ताकि Solidity डेवलपर्स इस भाषा को जल्दी सीख सकें, और यह सीरीज़ उनकी समानताओं को उजागर करती है ताकि Solidity डेवलपर्स Solidity से प्राप्त मेंटल मॉडल्स (mental models) का दोबारा उपयोग करके Cairo को जल्दी से समझ सकें।
Cairo के साथ शुरुआत करना
Cairo स्मार्ट कॉन्ट्रैक्ट्स लिखना शुरू करने के लिए, आपको Scarb (Cairo का पैकेज मैनेजर और बिल्ड टूल) और Starknet Foundry (Cairo स्मार्ट कॉन्ट्रैक्ट्स को डेवलप, डिप्लॉय और टेस्ट करने के लिए एक टूलचेन) की आवश्यकता होगी।
इंस्टॉलेशन (Installation)
इन टूल्स को इंस्टॉल करने के लिए, starkup का उपयोग करें, जो स्वचालित रूप से asdf को इंस्टॉल करता है और फिर इसका उपयोग करके एक ही कमांड में Scarb, Starknet Foundry और Cairo कंपाइलर को इंस्टॉल करता है। अपना टर्मिनल खोलें और निम्नलिखित कमांड दर्ज करें:
curl --proto '=https' --tlsv1.2 -sSf https://sh.starkup.dev | sh
इंस्टॉलेशन पूरा होने के बाद, अपने टर्मिनल को रीस्टार्ट करें या रन करें:
source ~/.bashrc # or source ~/.zshrc if using zsh
इंस्टॉलेशन को सत्यापित (Verify) करें:
scarb --version
snforge --version
आपको इसके जैसा आउटपुट दिखाई देना चाहिए:

अपना पहला प्रोजेक्ट बनाना
केवल लोअरकेस (lowercase) अक्षरों और अंडरस्कोर (underscores) के साथ एक खाली डायरेक्टरी बनाएँ (उदा., hello_world)। कैपिटल लेटर्स या डैश (-) से बचें, क्योंकि Scarb पैकेज नामों को snake_case कन्वेंशन का पालन करना चाहिए।
डायरेक्टरी के अंदर नेविगेट करें, फिर रन करें:
scarb init
जब पूछा जाए, तो विकल्पों की सूची में से Starknet Foundry (default) चुनें।

यह एक सरल Cairo कॉन्ट्रैक्ट बनाता है जो एक सिंगल balance वैल्यू को स्टोर और अपडेट करता है (Solidity के लिए Foundry के डिफ़ॉल्ट Counter कॉन्ट्रैक्ट के समान)।
प्रोजेक्ट स्ट्रक्चर
जब आप अपने कोड एडिटर में प्रोजेक्ट खोलते हैं, तो आपको निम्नलिखित प्रोजेक्ट स्ट्रक्चर दिखाई देगा:
hello_world/
├── src/
│ └── lib.cairo # Your main contract code
├── tests/
│ └── test_contract.cairo # Test files go here
├── Scarb.toml # Project configuration and dependencies
├── Scarb.lock # Lock file for exact dependency versions
├── snfoundry.toml # Starknet Foundry configuration
└── .gitignore # Git ignore file
src/वह जगह है जहाँ कॉन्ट्रैक्ट फ़ाइलें रहती हैं।lib.cairoमुख्य एंट्री पॉइंट है; डिफ़ॉल्ट रूप से, Scarb बैलेंस को मैनेज करने के लिए एक सरलHelloStarknetकॉन्ट्रैक्ट जेनरेट करता है।tests/में कॉन्ट्रैक्ट की कार्यक्षमता को सत्यापित (verify) करने के लिए टेस्ट फ़ाइलें होती हैं।Scarb.tomlप्रोजेक्ट डिपेंडेंसीज़ (dependencies), Cairo कंपाइलर वर्ज़न, पैकेज मेटाडेटा और बिल्ड सेटिंग्स को परिभाषित करता है (Node.js मेंpackage.jsonया Rust मेंCargo.tomlके समान)। यहीं से आप मैनेज करते हैं कि आपका कॉन्ट्रैक्ट किन लाइब्रेरीज़ का उपयोग करता है।Scarb.lockसटीक डिपेंडेंसी वर्ज़न को रिकॉर्ड करता है।snfoundry.tomlStarknet Foundry सेटिंग्स को कॉन्फ़िगर करता है: RPC एंडपॉइंट्स, अकाउंट कॉन्फ़िगरेशन और टेस्ट निष्पादन (execution) विकल्प। जबकिScarb.tomlआपके प्रोजेक्ट और डिपेंडेंसीज़ को मैनेज करता है,snfoundry.tomlFoundry टूलिंग को कॉन्फ़िगर करता है।
सिंटैक्स हाइलाइटिंग (Syntax highlighting) सेटअप करना
यदि आप VS Code या इसके किसी फ़ोर्क (fork) का उपयोग करते हैं, तो सिंटैक्स हाइलाइटिंग के लिए Cairo 1.0 extension इंस्टॉल करें। एक बार इंस्टॉल हो जाने पर, VS Code .cairo फ़ाइलों को पहचान लेगा और ऑटोकंप्लीट (autocomplete) तथा एरर हाइलाइटिंग जैसी सुविधाएँ प्रदान करेगा। कृपया ध्यान दें कि नकली (fake) VSCode एक्सटेंशन एक आम सोशल इंजीनियरिंग रणनीति है, इसलिए पब्लिशर की दोबारा जाँच अवश्य करें।

Scarb द्वारा जेनरेट किए गए कोड को देखने के लिए src/lib.cairo खोलें। हम अगले अध्याय में इसके सिंटैक्स की व्याख्या करेंगे।

अपने कॉन्ट्रैक्ट को कंपाइल करने के लिए, रन करें:
scarb build
यह आपके Cairo कोड को कंपाइल करता है और target/ डायरेक्टरी में कंपाइल्ड कॉन्ट्रैक्ट फ़ाइलें जेनरेट करता है। इन्हीं फ़ाइलों को आप Starknet पर डिप्लॉय (deploy) करेंगे।
इसके बाद आप प्रोजेक्ट को इसके साथ टेस्ट कर सकते हैं:
scarb test
Solidity के समान Cairo के कॉन्सेप्ट्स
Cairo स्मार्ट कॉन्ट्रैक्ट्स में “storage variables” (स्टोरेज वेरिएबल्स) का कॉन्सेप्ट होता है जो उन डेटा प्रकारों का समर्थन करता है जिनसे Solidity डेवलपर्स परिचित हैं, जैसे कि integers, strings, mappings, arrays, booleans, आदि।
निम्नलिखित कॉन्सेप्ट्स के Solidity में 1-1 या लगभग 1-1 एनालॉग (समान रूप) हैं:
- स्टोरेज वेरिएबल्स और स्टोरेज स्लॉट्स
- इवेंट्स (events) एमिट करना
- पब्लिक, इंटरनल और व्यू फंक्शन्स (public, internal, and view functions)
- require स्टेटमेंट्स
msg.sender,block.timestamp, औरblock.number- कंस्ट्रक्टर (constructor)
- एक्सटर्नल फंक्शन्स डिक्लेयर (declare) करने के लिए इंटरफ़ेस
- कॉन्ट्रैक्ट्स अन्य कॉन्ट्रैक्ट्स को कॉल कर सकते हैं और उन्हें कॉल करने का तरीका जानने के लिए ABI का उपयोग कर सकते हैं
- कॉन्ट्रैक्ट्स अन्य कॉन्ट्रैक्ट्स बना सकते हैं
- स्पैम को हतोत्साहित (disincentivize) करने के लिए ट्रांज़ेक्शन में “गैस” (gas) खर्च होती है
- OpenZeppelin इस भाषा के लिए वास्तव में “स्टैंडर्ड लाइब्रेरी” (standard library) के रूप में कार्य करता है
Solidity से प्रमुख अंतर
Solidity की तुलना में Cairo कॉन्ट्रैक्ट्स में निम्नलिखित क्षमताएं और/या अंतर हैं:
- Cairo इन-मेमोरी हैशमैप्स (in-memory hashmaps) को सपोर्ट करता है (Solidity केवल स्टोरेज मैपिंग को सपोर्ट करता है)
- Solidity के इन-मेमोरी एरेज़ (in-memory arrays) को डिक्लेयर करते समय उनका एक निश्चित आकार होना चाहिए, लेकिन Cairo में यह प्रतिबंध नहीं है
- Cairo में अधिक एक्सप्रेसिव कंट्रोल फ्लो सिंटैक्स है जो इसे Rust से विरासत में मिला है (जैसे कि पैटर्न मैचिंग)
- Rust की तरह, Cairo ऑब्जेक्ट-ओरिएंटेड नहीं है और इसलिए इनहेरिटेंस (inheritance) का समर्थन नहीं करता है। हालाँकि, Cairo कोड को एक साथ जोड़ने (compose) के अन्य तरीके प्रदान करता है
- Solidity कॉन्ट्रैक्ट्स प्रॉक्सी पैटर्न (proxy patterns) के माध्यम से अपग्रेड होते हैं; हालाँकि, Cairo कॉन्ट्रैक्ट्स अपने स्टोरेज को बरकरार रखते हुए अपने बाइटकोड (bytecode) को अपग्रेड कर सकते हैं
- Cairo में कोई “नेटिव टोकन” (native token) नहीं है और इसलिए कोई
msg.valueनहीं है। डिफ़ॉल्ट रूप से, गैस का भुगतान STRK टोकन का उपयोग करके किया जाता है, जो एक ERC-20 टोकन है। आप टोकन को यहाँ एक्सप्लोरर पर देख सकते हैं। - Starknet के प्रोटोकॉल में अकाउंट एब्स्ट्रैक्शन (account abstraction) इन-बिल्ट है, इसलिए “Externally Owned Address (EOA)” जैसी कोई चीज़ नहीं होती है
EVM-कम्पैटिबल चेंस (EVM compatible chains) से आने वाले डेवलपर्स के लिए अंतिम बिंदु थोड़ी भ्रम पैदा कर सकता है, लेकिन चिंता न करें, हम बाद में इसका बहुत विस्तार से अध्ययन करेंगे।
Starknet पर अकाउंट बनाना
Starknet पर अकाउंट बनाने के जीवनचक्र (lifecycle) को समझने के लिए, आप Ready (पूर्व में Argent) या Braavos वॉलेट का उपयोग करके एक वॉलेट बना सकते हैं। नीचे दिया गया वीडियो ब्राउज़र एक्सटेंशन का उपयोग करके Ready वॉलेट बनाने की प्रक्रिया को दर्शाता है।
वॉलेट इंस्टॉल करने के बाद, ध्यान दें कि यह डिफ़ॉल्ट रूप से mainnet पर सेट होता है। इस ट्यूटोरियल के लिए, अपने Ready वॉलेट के शीर्ष पर स्थित नेटवर्क चयनकर्ता (network selector) पर क्लिक करके और “Sepolia” को चुनकर Sepolia टेस्टनेट पर स्विच करें। फिर नीचे दिए गए वीडियो में दिखाई गई प्रक्रिया का पालन करते हुए Sepolia पर एक नया अकाउंट बनाएँ:
इसके बाद, अपना वॉलेट एड्रेस कॉपी करें और इसे Starknet ब्लॉक एक्सप्लोरर में पेस्ट करें। आप Starkscan या Voyager किसी एक का भी उपयोग कर सकते हैं। सुनिश्चित करें कि एक्सप्लोरर को भी Sepolia टेस्टनेट पर स्विच किया गया है (पेज के ऊपरी दाएँ कोने में)।
चूंकि यह बिना किसी ट्रांज़ेक्शन हिस्ट्री (transaction history) के साथ एक नया बनाया गया वॉलेट है, इसलिए एक्सप्लोरर अभी तक कोई परिणाम प्रदर्शित नहीं करेगा।

ट्रांज़ेक्शन शुरू करने के लिए, हमें गैस फीस कवर करने के लिए STRK टोकन की आवश्यकता है। Starknet Faucet पर जाएँ, अपना वॉलेट एड्रेस पेस्ट करें और टेस्टनेट टोकन का अनुरोध करें।
अकाउंट इनिशियलाइज़ (Initialize) करने का तरीका 1: एक ट्रांज़ेक्शन भेजें
Starknet अकाउंट को उसका पहला ट्रांज़ेक्शन भेजकर इनिशियलाइज़ किया जाता है। Ethereum के विपरीत, जहाँ Externally Owned Accounts (EOAs) बिना ऑन-चेन कॉन्ट्रैक्ट कोड के केवल सरल पब्लिक-प्राइवेट की पेयर (public-private key pairs) के रूप में मौजूद होते हैं, Starknet अकाउंट्स स्मार्ट कॉन्ट्रैक्ट्स होते हैं। हालाँकि, जब आप अपना वॉलेट एड्रेस जेनरेट करते हैं तो ये अकाउंट कॉन्ट्रैक्ट डिफ़ॉल्ट रूप से डिप्लॉय नहीं होते हैं। उन्हें डिप्लॉय करने का एक तरीका अपना पहला ट्रांज़ेक्शन भेजना है। उस समय, Starknet स्वचालित रूप से अकाउंट कॉन्ट्रैक्ट को डिप्लॉय करता है और एक ही चरण में आपके ट्रांज़ेक्शन को निष्पादित करता है।
आइए इसे शुरू करने के लिए वॉलेट से 1 STRK स्वयं को भेजें:
अब, अपना एड्रेस एक्सप्लोरर सर्च में फिर से पेस्ट करें। आप देखेंगे कि आपके वॉलेट एड्रेस पर एक कॉन्ट्रैक्ट डिप्लॉय किया गया है। इस पहले ट्रांज़ेक्शन ने स्वचालित रूप से आपके अकाउंट कॉन्ट्रैक्ट को डिप्लॉय कर दिया, जैसा कि नीचे दी गई छवि में दिखाया गया है:

अकाउंट इनिशियलाइज़ करने का तरीका 2: स्मार्ट वॉलेट को सीधे डिप्लॉय करें
वैकल्पिक रूप से, आप अकाउंट कॉन्ट्रैक्ट को सीधे डिप्लॉय कर सकते हैं। अपने वॉलेट में STRK टोकन प्राप्त करने के बाद, आपको अकाउंट कॉन्ट्रैक्ट को डिप्लॉय करने का विकल्प दिखाई देगा। नीचे दिया गया Ready का GIF इसे mainnet पर दिखाता है (Sepolia के लिए भी प्रक्रिया समान है):

Starknet में EOAs नहीं होते हैं
Starknet में, कोई EOAs नहीं होते हैं। हर एड्रेस में बाइटकोड और स्टोरेज होता है।
तो फिर हम एक स्मार्ट कॉन्ट्रैक्ट (जैसे कि एक DeFi ऐप) और “हमारे फंड्स” रखने के उद्देश्य से बनाए गए कॉन्ट्रैक्ट के बीच अंतर कैसे कर सकते हैं?
जो कॉन्ट्रैक्ट्स वॉलेट के रूप में काम करने के लिए बनाए गए हैं, उन्हें एक विशेष ट्रेट (interface) को लागू करना अनिवार्य है जिसे SNIP-6 के रूप में जाना जाता है। हम इसके बारे में बाद के ट्यूटोरियल में विस्तार से चर्चा करेंगे, लेकिन अभी के लिए यह कहना पर्याप्त है कि SNIP-6 कॉन्ट्रैक्ट को __execute__ फंक्शन लागू करना चाहिए, जिसके माध्यम से यह यूज़र से निर्देश प्राप्त करता है।
यहाँ मुख्य अंतर बताया गया है:
Ethereum में, एक प्राइवेट की (private key) का उपयोग Ethereum एड्रेस को निकालने (derive) के लिए किया जाता है, जिसे अन्य स्मार्ट कॉन्ट्रैक्ट्स एक अकाउंट के रूप में संदर्भित कर सकते हैं।
Starknet में, प्राइवेट कीज़ (private keys) एड्रेस में नहीं बदलती हैं। बल्कि, उनका उपयोग __execute__ कमांड को कॉल करते समय ऑथेंटिकेशन (authentication) के लिए किया जाता है।
यह Ethereum और Starknet के बीच एक और महत्वपूर्ण अंतर है। Ethereum में, रनटाइम (runtime) वॉलेट के ट्रांज़ेक्शन के क्रिप्टोग्राफ़िक सिग्नेचर (cryptographic signature) को मान्य करता है। Starknet में, __execute__ फंक्शन वाला वॉलेट किसी भी ऑथेंटिकेशन विधि का उपयोग कर सकता है जिसे वह चाहता है — इसका मतलब है कि Starknet बिना किसी हार्ड फ़ोर्क (hard fork) के पासकीज़ (passkeys) और क्वांटम-सिक्योर क्रिप्टोग्राफ़ी ऑथेंटिकेशन विधियों जैसी सुविधाओं का समर्थन कर सकता है। इसके लिए केवल वांछित क्रिप्टोग्राफ़िक एल्गोरिथम का समर्थन करने के लिए स्मार्ट कॉन्ट्रैक्ट अकाउंट को प्रोग्राम करने की आवश्यकता होती है।
आपके वॉलेट में दिखाया गया “Starknet address” स्मार्ट कॉन्ट्रैक्ट एड्रेस होता है (यदि कॉन्ट्रैक्ट अभी तक मौजूद नहीं है तो इसे “काउण्टरफ़ैक्चुअल एड्रेस” कहा जाता है)। जब वॉलेट ऐप (आपके डिवाइस पर मौजूद ऑफ़-चेन सॉफ़्टवेयर) आपका सीड फ़्रेज़ (seed phrase) जेनरेट करता है, तो यह एक प्राइवेट की निकालता है और भविष्यवाणी करता है कि कॉन्ट्रैक्ट बाद में कहाँ डिप्लॉय किया जाएगा। वॉलेट सुविधा के लिए इस पूर्वानुमानित (predicted) एड्रेस को आपके “एड्रेस” के रूप में प्रदर्शित करता है, भले ही जब तक आप इसे इनिशियलाइज़ नहीं करते तब तक कॉन्ट्रैक्ट ऑन-चेन मौजूद नहीं होता है।
आपके “वॉलेट” (ऑफ़-चेन सॉफ़्टवेयर) के लिए Starknet पर किसी भी चीज़ का “स्वामित्व (own)” रखना संभव नहीं है। Ethereum के विपरीत जहाँ सिग्नेचर्स सीधे स्वामित्व (ownership) साबित करते हैं, Starknet को एसेट्स रखने के लिए एक ऑन-चेन स्मार्ट कॉन्ट्रैक्ट की आवश्यकता होती है। आपका वॉलेट ऐप केवल ऐसे सिग्नेचर्स बनाता है जिन्हें आपका ऑन-चेन वॉलेट कॉन्ट्रैक्ट ट्रांज़ेक्शन को निष्पादित करने से पहले (जैसे कि टोकन भेजना या अन्य कॉन्ट्रैक्ट्स को कॉल करना) सत्यापित (verify) करता है। हम इस कॉन्सेप्ट को अकाउंट एब्स्ट्रैक्शन (account abstraction) वाले बाद के अध्याय में अधिक विस्तार से जानेंगे।
पुराने Cairo वर्ज़न्स से सावधान रहें
लिखते समय, वर्तमान Cairo वर्ज़न 2.13.1 है। ध्यान रहे कि इंटरनेट सर्च और LLM क्वेरीज़ अक्सर Cairo 1.x या पुराने वर्ज़न्स (0.x) के लिए लिखा गया कोड प्रदान करते हैं, जो Cairo 2.x के साथ असंगत (incompatible) हैं। वर्ज़न्स के बीच सिंटैक्स काफी बदल गया है, इसलिए पुराने वर्ज़न्स का कोड काम नहीं करेगा। कोड उदाहरणों को कॉपी करते समय हमेशा Cairo वर्ज़न की जाँच करें।
अगर आप फँस जाते हैं तो प्रॉम्प्टिंग तकनीकें (Prompting techniques)
ब्लॉकचेन के लिए डिज़ाइन की गई अन्य भाषाओं की तरह, Cairo की वेब पर उपस्थिति JavaScript या Python जैसी भाषाओं जितनी व्यापक नहीं है।
- कंपाइलेशन (compilation) की समस्याओं को ठीक करने के लिए, पूछें कि Rust में इस समस्या को कैसे हल किया जाए। आपके सामने आने वाली 80% कंपाइलेशन समस्याएँ संभवतः वैसी ही कंपाइलेशन समस्याएँ होंगी जैसे कि आपने कोड को Rust में लिखा हो।
- Scarb, Rust के cargo के बहुत समान है। यदि आपको Scarb के साथ समस्याओं का सामना करना पड़ता है, तो प्रासंगिक समाधान खोजने की संभावनाओं को बढ़ाने के लिए Scarb के बजाय “cargo” के साथ अपने एरर मेसेज को इंटरनेट पर खोजें।
अगले अध्याय में, हम अपना पहला Cairo प्रोग्राम लिखेंगे।
यह लेख Cairo Programming on Starknet पर एक ट्यूटोरियल सीरीज़ का हिस्सा है