Solana प्रोग्रामिंग भाषा
मुख्य Solana प्रोग्रामिंग भाषा Rust है, लेकिन C, C++, और यहाँ तक कि Python भी समर्थित हैं।
Solana कोडिंग भाषा Rust, C, और C++ का उपयोग एक समान तरीके से करती है। हम बाद के सेक्शन में Python पर चर्चा करेंगे।
Rust एक compiled भाषा है। यदि आप अपने कंप्यूटर पर Rust को compile करते हैं, तो यह अंततः LLVM-IR (low level virtual machine intermediate representation) में बदल जाएगा, और LLVM इसे उस bytecode में बदल देता है जो आपकी मशीन (x86, arm64, आदि) पर चल सकता है।
Solana में, यह क्रम कुछ इस प्रकार दिखता है: 1) Rust को LLVM-IR में compile करें, फिर BPF (Berkeley Packet Filter) में और bytecode को ब्लॉकचेन पर स्टोर करें। 2) वैलिडेटर्स (validators) BPF को उनके हार्डवेयर के अनुकूल instruction set में JIT compile (just in time compile) करते हैं, आमतौर पर यह x86 होता है, लेकिन arm64 एक अन्य सामान्य टारगेट हो सकता है।
आप पूछेंगे, Packet Filter? Solana प्रोग्रामिंग भाषा का इंटरनेट पैकेट्स से क्या लेना-देना है?
यह वास्तव में Solana की ओर से एक चतुर डिज़ाइन विकल्प है।
User space बनाम kernel space
Linux में kernel space और user space की अवधारणा होती है। यदि आप कोई फ़ाइल खोलना चाहते हैं या कोई अन्य प्रोसेस शुरू करना चाहते हैं, तो आपके executable को ऐसा करने के लिए ऑपरेटिंग सिस्टम (operating system) से पूछना होगा। मान लीजिए कि आप एक फ़ाइल खोलने और प्रत्येक सम (even) लाइन को प्रिंट करने के लिए एक python स्क्रिप्ट लिखते हैं। फ़ाइल के bytecode की वास्तविक लोडिंग kernel space में होती है, लेकिन एक बार जब bytecode स्क्रिप्ट को दे दिया जाता है, तो ASCII में इंटरप्रिटेशन (interpretation) और यह निर्धारित करना कि लाइन नंबर सम है या विषम, user space में होता है।
यह एब्स्ट्रैक्शन (abstraction) कई कारणों से मौजूद है, लेकिन एक स्पष्ट कारण सुरक्षा (security) है। हर यूज़र या executable को मनमानी फ़ाइलें खोलने या निष्पादित (execute) करने में सक्षम नहीं होना चाहिए। ऑपरेटिंग सिस्टम यह निर्धारित करता है कि किन “APIs” की अनुमति है। (वैसे, फ़ाइल खोलने के लिए “API” को ऑपरेटिंग सिस्टम की भाषा में तकनीकी रूप से “system call” कहा जाता है)।
इसी तरह, प्रोग्राम और executables को आने वाले इंटरनेट पैकेट्स को मनमाने ढंग से एक्सेस करने की अनुमति नहीं दी जानी चाहिए। उन्हें डिफ़ॉल्ट रूप से पैकेट्स को देखने के लिए ऑपरेटिंग सिस्टम से अनुमति मांगने के लिए system calls करनी चाहिए, जिन्हें केवल kernel space से ही एक्सेस किया जा सकता है।
यहाँ एक महत्वपूर्ण कॉन्सेप्ट पर जोर दिया जाना चाहिए: user space और kernel space के बीच आगे-पीछे ट्रांज़िशन (transitioning) करना आमतौर पर धीमा होता है।
यदि आप आने वाले इंटरनेट पैकेट्स को फ़िल्टर कर रहे हैं, तो यह user space और kernel space के बीच बहुत सारे जंप्स (jumps) हैं। ज़रा kernel space से user space में हर आने वाले पैकेट को कॉपी करने की कल्पना करें। यह बहुत अधिक ओवरहेड (overhead) पैदा करेगा।
यही कारण है कि BPF का आविष्कार किया गया था। इस जंपिंग से बचने के लिए आप kernel space के अंदर executables को रन कर सकते हैं।
लेकिन यदि आप kernel विशेषाधिकार (privileges) होने के बारे में कुछ भी जानते हैं, तो आप जानते हैं कि यह बेहद खतरनाक है! यदि कोई बग (bug) है तो kernel (ऑपरेटिंग सिस्टम) पर नियंत्रण होने से कंप्यूटर क्रैश हो सकता है। इससे भी बुरी बात यह है कि यदि कोई दुर्भावनापूर्ण कोड (malicious code) execute हो जाता है, तो नुकसान असीमित होता है।
बेशक, BPF के डिज़ाइनरों ने इस बारे में सोचा था। BPF कोड execute होने से पहले, इसे यह सुनिश्चित करने के लिए वैलिडेट (validate) किया जाता है कि यह एक निश्चित समय के लिए चले, यानी इसे टर्मिनेट (terminate) होना ही चाहिए, यह केवल एक निर्धारित मेमोरी क्षेत्र तक ही पहुंच सकता है, और अन्य उपयुक्त प्रतिबंधों का पालन करता है।
एक अतिरिक्त बात के रूप में, अपने आविष्कार के बाद से, BPF ने पैकेट्स को फ़िल्टर करने के अलावा भी अपने उपयोग का विस्तार किया है, लेकिन इसका नाम वही रह गया है।
Solana भाषा BPF का उपयोग क्यों करती है
BPF प्रोग्राम्स को सुरक्षित बनाने के लिए किए गए मौजूदा रिसर्च का लाभ उठाकर, Solana स्मार्ट कॉन्ट्रैक्ट्स (smart contracts) को वहां रन कर सकता है जहां वे सबसे तेज़ चलते हैं — kernel के अंदर! अगर आप इस बारे में सोचें तो यह काफी उल्लेखनीय है। आप ऐसे अनट्रस्टेड (untrusted) स्मार्ट कॉन्ट्रैक्ट्स को रन कर सकते हैं जिन्हें किसी के भी द्वारा ऑपरेटिंग सिस्टम के सबसे संवेदनशील (लेकिन कुशल) हिस्से — ऑपरेटिंग सिस्टम kernel — में लिखा गया हो। इस क्षेत्र में हुए दशकों के रिसर्च और निवेश का लाभ उठाकर Solana को एक शानदार परफॉरमेंस बूस्ट (performance boost) मिलता है।
BPF मशीन इंस्ट्रक्शन्स (machine instructions) नहीं है; यह अभी भी bytecode का अपना एक सेट है। हालाँकि, इसे विभिन्न प्रकार के CPU architectures के लिए JIT compile किया जा सकता है।
वापस Rust, C, और C++ पर
इन तीन प्रोग्रामिंग भाषाओं को लंबे समय से LLVM द्वारा समर्थित किया गया है। यह एक और ऐसा क्षेत्र है जहां Solana दशकों के निवेश का लाभ उठा सकता है (हां, दशकों के संदर्भ में तकनीक की बात करना अजीब है, लेकिन LLVM 2003 में आया था)।
आप C या C++ का उपयोग Solana प्रोग्रामिंग भाषा के रूप में कर सकते हैं, लेकिन आपको टूलिंग (tooling) के साथ बहुत कम सपोर्ट मिलेगा। आमतौर पर यह अनुशंसा की जाती है कि आप Rust का उपयोग करें, भले ही आप C या C++ के विशेषज्ञ हों। यदि आप पहले से ही C++ में पारंगत हैं तो Rust को सीखना आसान होगा।
Solana को प्रोग्राम करने के लिए आपको कितनी Rust जानने की आवश्यकता है?
बहुत ज़्यादा नहीं, लेकिन फिर भी इसके लिए कुछ अध्ययन की आवश्यकता होती है। Rust कोई ऐसी भाषा नहीं है जिसे आप केवल “google करके सीख लें।” उदाहरण के लिए, मान लें कि आप Java या Scala बैकग्राउंड से होने के बावजूद Ruby में प्रोग्रामिंग कर रहे हैं। उस स्थिति में, आप आसानी से google से समतुल्य (equivalent) प्रोग्रामिंग पैटर्न के लिए पूछ सकते हैं (आपका कोड मुहावरेदार (idiomatic) नहीं लग सकता है, लेकिन यह पठनीय और कार्यात्मक होगा)। यदि (या जब) आप Stack Overflow से कोड कॉपी और पेस्ट करते हैं, तब भी आपको इस बात का अच्छा ज्ञान (intuition) होगा कि कोड क्या कर रहा है।
हालाँकि, यदि आप Rust के साथ ऐसा करते हैं, तो आपको कुछ निराशाजनक बाधाओं का सामना करना पड़ेगा। Rust में ऐसे सिंटैक्स (syntax) हैं जिन्हें खोजना कठिन है (सर्च इंजन में “#” को खोजने का प्रयास करें), और इसमें ऐसे कॉन्सेप्ट्स हैं जो अन्य प्रोग्रामिंग भाषाओं में नहीं पाए जाते हैं।
Rust एक विशाल भाषा है। हालाँकि, आपको केवल इसके एक सबसेट (subset) को जानने की आवश्यकता है। हमारा Solana डेवलपमेंट कोर्स Solana के साथ-साथ Rust भी सिखाता है ताकि आप केवल Rust के उन हिस्सों पर ध्यान केंद्रित करें जिनकी आपको आवश्यकता है।
Solana, Python का उपयोग कैसे कर सकता है
Rust, C, या C++ को BPF में compile करना सीधा (straightforward) है। Python के साथ, यह काफी अलग है; Python, स्पष्ट रूप से, एक इंटरप्रिटेड (interpreted) भाषा है, न कि ऐसी भाषा जिसे LLVM के साथ compile किया जा सके।
सरल शब्दों में कहें तो, Python को Rust में transpile किया जाता है, और फिर सब कुछ ऊपर बताए गए अनुसार ही व्यवहार करता है।
यदि आप सटीक वर्कफ़्लो (workflow) चाहते हैं, तो इसे seahorse-lang github पर विज़ुअल रूप से डॉक्यूमेंट किया गया है।
Solana प्रोग्राम आमतौर पर रॉ (raw) Rust में नहीं लिखे जाते हैं; अधिकांश डेवलपर्स Anchor Framework का उपयोग करते हैं। इसलिए, हालाँकि Seahorse काफी टिपिकल ट्रांसपिलेशन (transpilation) करता है, लेकिन यह प्लान की गई फ्रेमवर्क समानताओं का भी लाभ उठा रहा है।
Seahorse Framework काफी हद तक Anchor Framework को मॉडल करता है ताकि Python कोड का अनुवाद ऐसे Rust कोड में किया जा सके जो काफी हद तक उस तरीके को मॉडल करता है जिस तरह से इसे Anchor फ्रेमवर्क में लिखा जाएगा।
ध्यान दें कि यह प्रोजेक्ट अभी बीटा (beta) वर्ज़न में है।
क्या Solana Solidity का उपयोग करता है?
हाँ, Solidity में Solana एप्लिकेशन लिखना संभव है लेकिन यह कुछ हद तक प्रयोगात्मक (experimental) है। solang solidity compiler को Solidity से BPF में compile करने के लिए सपोर्ट प्रदान करने हेतु बनाया गया था।
Solana क्लाइंट प्रोग्रामिंग भाषा
खुद Solana client, वह प्रोग्राम जो नोड्स पर चलता है और जो ब्लॉकचेन को शक्ति प्रदान करता है, प्रोग्राम्स (स्मार्ट कॉन्ट्रैक्ट्स) के विपरीत, Rust में लिखा गया है। वर्तमान में Jump Crypto द्वारा Solana क्लाइंट का एक री-इम्प्लीमेंटेशन, firedancer प्रगति पर है, जो पूरी तरह से C में लिखा गया है।
परिशिष्ट (Addendum): Rust BPF को SBF में माइग्रेट कर रहा है।
अक्टूबर 2022 से, Solana ने BPF से SBF (Solana binary format) में माइग्रेट करना शुरू कर दिया है। इस लेख को लिखे जाने के समय तक, इस बदलाव पर डॉक्यूमेंटेशन काफी कम है, लेकिन इससे अधिकांश डेवलपर्स प्रभावित नहीं होंगे। यदि आपका बिल्ड टूल (build tool) BPF में compile करने के लिए कॉन्फ़िगर किया गया है, तो आपको एक डेप्रिकेशन वार्निंग (deprecation warning) मिलेगी, लेकिन सब कुछ पहले की तरह ही चलेगा। बस अपने बिल्ड फ़्लैग्स (build flags) को बदल दें।
RareSkills से और जानें
Ethereum डेवलपमेंट में महारत हासिल करना चाहते हैं? हमारा Solidity Bootcamp देखें।
संसाधन (Resources)
https://www.kernel.org/doc/html/latest/bpf/instruction-set.html
https://docs.rs/solana_rbpf/latest/solana_rbpf/ebpf/index.html
https://www.youtube.com/watch?v=5jQvuPWpzcE
https://ebpf.io/what-is-ebpf/
https://www.youtube.com/watch?v=Q8eY67hDvkc
मूल रूप से 1 दिसंबर, 2022 को प्रकाशित