स्मार्ट अनुबंध भाषाएं
इथेरियम के बारे में एक बेहतरीन बात यह है कि स्मार्ट अनुबंधों को अपेक्षाकृत डेवलपर-अनुकूल भाषाओं का उपयोग करके प्रोग्राम किया जा सकता है। यदि आपको Python या किसी कर्ली-ब्रैकेट भाषा (नए टैब में खुलता है) का अनुभव है, तो आप परिचित सिंटैक्स वाली भाषा पा सकते हैं।
दो सबसे सक्रिय और मेंटेन की जाने वाली भाषाएं हैं:
- Solidity
- Vyper
Remix एकीकृत विकास वातावरण (आईडीई) Solidity और Vyper दोनों में अनुबंध बनाने और परीक्षण करने के लिए एक व्यापक विकास वातावरण प्रदान करता है। कोडिंग शुरू करने के लिए इन-ब्राउज़र Remix आईडीई आज़माएं (नए टैब में खुलता है)।
अधिक अनुभवी डेवलपर Yul का भी उपयोग करना चाह सकते हैं, जो इथेरियम वर्चुअल मशीन (EVM) के लिए एक मध्यवर्ती (intermediate) भाषा है, या Yul+, जो Yul का एक एक्सटेंशन है।
यदि आप उत्सुक हैं और नई भाषाओं का परीक्षण करने में मदद करना पसंद करते हैं जो अभी भी भारी विकास के अधीन हैं, तो आप Fe के साथ प्रयोग कर सकते हैं, जो एक उभरती हुई स्मार्ट अनुबंध भाषा है और वर्तमान में अभी भी अपने शुरुआती चरण में है।
पूर्वापेक्षाएँ
प्रोग्रामिंग भाषाओं, विशेष रूप से JavaScript या Python का पूर्व ज्ञान, आपको स्मार्ट अनुबंध भाषाओं में अंतर को समझने में मदद कर सकता है। हम यह भी सलाह देते हैं कि भाषा की तुलना में बहुत गहराई तक जाने से पहले आप स्मार्ट अनुबंधों को एक अवधारणा के रूप में समझें। स्मार्ट अनुबंधों का परिचय।
Solidity
- स्मार्ट अनुबंधों को लागू करने के लिए ऑब्जेक्ट-ओरिएंटेड, उच्च-स्तरीय भाषा।
- कर्ली-ब्रैकेट भाषा जो C++ से सबसे अधिक गहराई से प्रभावित हुई है।
- स्टैटिकली टाइप्ड (वेरिएबल का प्रकार कंपाइल समय पर ज्ञात होता है)।
- समर्थन करता है:
- इनहेरिटेंस (आप अन्य अनुबंधों का विस्तार कर सकते हैं)।
- लाइब्रेरी (आप पुन: प्रयोज्य (reusable) कोड बना सकते हैं जिसे आप विभिन्न अनुबंधों से कॉल कर सकते हैं - जैसे अन्य ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाओं में एक स्टैटिक क्लास में स्टैटिक फ़ंक्शन)।
- जटिल उपयोगकर्ता-परिभाषित प्रकार (Complex user-defined types)।
महत्वपूर्ण लिंक
- दस्तावेज़ीकरण (नए टैब में खुलता है)
- Solidity भाषा पोर्टल (नए टैब में खुलता है)
- Solidity उदाहरणों के साथ (नए टैब में खुलता है)
- GitHub (नए टैब में खुलता है)
- Solidity Gitter चैटरूम (नए टैब में खुलता है) जो Solidity Matrix चैटरूम (नए टैब में खुलता है) से जुड़ा है
- चीट शीट (नए टैब में खुलता है)
- Solidity ब्लॉग (नए टैब में खुलता है)
- Solidity ट्विटर (नए टैब में खुलता है)
उदाहरण अनुबंध
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0;
contract Coin {
// कीवर्ड "public" वेरिएबल्स को
// अन्य अनुबंधों से सुलभ बनाता है
address public minter;
mapping (address => uint) public balances;
// इवेंट्स क्लाइंट्स को विशिष्ट
// आपके द्वारा घोषित अनुबंध परिवर्तनों पर प्रतिक्रिया करने की अनुमति देते हैं
event Sent(address from, address to, uint amount);
// कंस्ट्रक्टर कोड केवल तभी चलता है जब अनुबंध
// बनाया जाता है
constructor() {
minter = msg.sender;
}
// किसी पते पर नए बनाए गए सिक्कों की एक राशि भेजता है
// इसे केवल अनुबंध निर्माता द्वारा ही कॉल किया जा सकता है
function mint(address receiver, uint amount) public {
require(msg.sender == minter);
require(amount < 1e60);
balances[receiver] += amount;
}
// मौजूदा सिक्कों की एक राशि भेजता है
// किसी भी कॉलर से किसी पते पर
function send(address receiver, uint amount) public {
require(amount <= balances[msg.sender], "Insufficient balance.");
balances[msg.sender] -= amount;
balances[receiver] += amount;
emit Sent(msg.sender, receiver, amount);
}
}
यह उदाहरण आपको इस बात का अंदाज़ा देगा कि Solidity अनुबंध का सिंटैक्स कैसा होता है। फ़ंक्शन और वेरिएबल के अधिक विस्तृत विवरण के लिए, दस्तावेज़ देखें (नए टैब में खुलता है)।
Vyper
- पायथोनिक (Pythonic) प्रोग्रामिंग भाषा
- स्ट्रॉन्ग टाइपिंग
- छोटा और समझने योग्य कंपाइलर कोड
- कुशल बाइटकोड जनरेशन
- अनुबंधों को अधिक सुरक्षित और ऑडिट करने में आसान बनाने के उद्देश्य से जानबूझकर Solidity की तुलना में कम विशेषताएं हैं। Vyper इनका समर्थन नहीं करता है:
- मॉडिफायर (Modifiers)
- इनहेरिटेंस (Inheritance)
- इनलाइन असेंबली (Inline assembly)
- फ़ंक्शन ओवरलोडिंग (Function overloading)
- ऑपरेटर ओवरलोडिंग (Operator overloading)
- रिकर्सिव कॉलिंग (Recursive calling)
- अनंत-लंबाई वाले लूप (Infinite-length loops)
- बाइनरी फिक्स्ड पॉइंट (Binary fixed points)
v0.4.0 के बाद से, Vyper एक मॉड्यूल सिस्टम (नए टैब में खुलता है) का समर्थन करता है। कोड का पुन: उपयोग क्लास इनहेरिटेंस के बजाय कंपोज़िशन के माध्यम से प्राप्त किया जाता है।
अधिक जानकारी के लिए, Vyper का तर्क (rationale) पढ़ें (नए टैब में खुलता है)।
महत्वपूर्ण लिंक
- दस्तावेज़ीकरण (नए टैब में खुलता है)
- Vyper उदाहरणों के साथ (नए टैब में खुलता है)
- उदाहरणों के साथ और अधिक Vyper (नए टैब में खुलता है)
- GitHub (नए टैब में खुलता है)
- Vyper कम्युनिटी डिस्कॉर्ड चैट (नए टैब में खुलता है)
- चीट शीट (नए टैब में खुलता है)
- Vyper के लिए स्मार्ट अनुबंध विकास फ्रेमवर्क और टूल
- VyperPunk - Vyper स्मार्ट अनुबंधों को सुरक्षित करना और हैक करना सीखें (नए टैब में खुलता है)
- विकास के लिए Vyper हब (नए टैब में खुलता है)
- Vyper के सबसे बेहतरीन स्मार्ट अनुबंध उदाहरण (नए टैब में खुलता है)
- Awesome Vyper क्यूरेटेड संसाधन (नए टैब में खुलता है)
उदाहरण
# खुली नीलामी
# नीलामी पैरामीटर
# लाभार्थी को सबसे ऊंची बोली लगाने वाले से पैसा मिलता है
beneficiary: public(address)
auctionStart: public(uint256)
auctionEnd: public(uint256)
# नीलामी की वर्तमान स्थिति
highestBidder: public(address)
highestBid: public(uint256)
# अंत में true पर सेट किया जाता है, किसी भी बदलाव की अनुमति नहीं देता है
ended: public(bool)
# रिफंड की गई बोलियों का ट्रैक रखें ताकि हम विथड्रॉ पैटर्न का पालन कर सकें
pendingReturns: public(HashMap[address, uint256])
# `_bidding_time` के साथ एक साधारण नीलामी बनाएं
# सेकंड का बोली समय, जो कि
# लाभार्थी पते `_beneficiary` की ओर से है।
@deploy
def __init__(_beneficiary: address, _bidding_time: uint256):
self.beneficiary = _beneficiary
self.auctionStart = block.timestamp
self.auctionEnd = self.auctionStart + _bidding_time
# भेजे गए मूल्य के साथ नीलामी में बोली लगाएं
# जो इस लेन-देन के साथ भेजा गया है।
# मूल्य केवल तभी वापस किया जाएगा जब
# नीलामी नहीं जीती जाती है।
@external
@payable
def bid():
# जांचें कि क्या बोली लगाने की अवधि समाप्त हो गई है।
assert block.timestamp < self.auctionEnd
# जांचें कि क्या बोली पर्याप्त रूप से अधिक है
assert msg.value > self.highestBid
# पिछले सबसे ऊंची बोली लगाने वाले के लिए रिफंड को ट्रैक करें
self.pendingReturns[self.highestBidder] += self.highestBid
# नई सबसे ऊंची बोली को ट्रैक करें
self.highestBidder = msg.sender
self.highestBid = msg.value
# पहले रिफंड की गई बोली निकालें। विथड्रॉ पैटर्न का
# उपयोग यहां सुरक्षा समस्या से बचने के लिए किया जाता है। यदि रिफंड सीधे
# bid() के हिस्से के रूप में भेजे जाते, तो एक दुर्भावनापूर्ण बोली लगाने वाला अनुबंध
# उन रिफंड को रोक सकता था और इस प्रकार नई उच्च बोलियों को आने से रोक सकता था।
@external
def withdraw():
pending_amount: uint256 = self.pendingReturns[msg.sender]
self.pendingReturns[msg.sender] = 0
send(msg.sender, pending_amount)
# नीलामी समाप्त करें और सबसे ऊंची बोली
# लाभार्थी को भेजें।
@external
def endAuction():
# उन फ़ंक्शंस को संरचित करना एक अच्छा दिशानिर्देश है जो
# अन्य अनुबंधों के साथ इंटरैक्ट करते हैं (यानी, वे फ़ंक्शंस को कॉल करते हैं या ईथर भेजते हैं)
# तीन चरणों में:
# 1. शर्तों की जांच करना
# 2. क्रियाएं करना (संभावित रूप से शर्तों को बदलना)
# 3. अन्य अनुबंधों के साथ इंटरैक्ट करना
# यदि इन चरणों को मिला दिया जाता है, तो दूसरा अनुबंध
# वर्तमान अनुबंध में वापस कॉल कर सकता है और स्थिति को संशोधित कर सकता है या
# प्रभावों (ईथर भुगतान) को कई बार निष्पादित करने का कारण बन सकता है।
# यदि आंतरिक रूप से कॉल किए गए फ़ंक्शंस में बाहरी
# अनुबंधों के साथ इंटरैक्शन शामिल है, तो उन्हें भी बाहरी
# अनुबंधों के साथ इंटरैक्शन माना जाना चाहिए।
# 1. शर्तें
# जांचें कि क्या नीलामी का अंतिम समय आ गया है
assert block.timestamp >= self.auctionEnd
# जांचें कि क्या यह फ़ंक्शन पहले ही कॉल किया जा चुका है
assert not self.ended
# 2. प्रभाव
self.ended = True
# 3. इंटरैक्शन
send(self.beneficiary, self.highestBid)
यह उदाहरण आपको इस बात का अंदाज़ा देगा कि Vyper अनुबंध का सिंटैक्स कैसा होता है। फ़ंक्शन और वेरिएबल के अधिक विस्तृत विवरण के लिए, दस्तावेज़ देखें (नए टैब में खुलता है)।
Yul और Yul+
यदि आप इथेरियम में नए हैं और अभी तक स्मार्ट अनुबंध भाषाओं के साथ कोई कोडिंग नहीं की है, तो हम Solidity या Vyper के साथ शुरुआत करने की सलाह देते हैं। Yul या Yul+ को तभी देखें जब आप स्मार्ट अनुबंध सुरक्षा सर्वोत्तम प्रथाओं और EVM के साथ काम करने की बारीकियों से परिचित हो जाएं।
Yul
- इथेरियम के लिए मध्यवर्ती (Intermediate) भाषा।
- EVM और Ewasm (नए टैब में खुलता है) (एक इथेरियम फ्लेवर्ड WebAssembly) का समर्थन करता है, और इसे दोनों प्लेटफ़ॉर्म के एक उपयोगी सामान्य हर (common denominator) के रूप में डिज़ाइन किया गया है।
- उच्च-स्तरीय अनुकूलन (optimisation) चरणों के लिए अच्छा लक्ष्य जो EVM और Ewasm दोनों प्लेटफ़ॉर्म को समान रूप से लाभान्वित कर सकता है।
Yul+
- Yul का एक निम्न-स्तरीय, अत्यधिक कुशल एक्सटेंशन।
- शुरुआत में एक ऑप्टिमिस्टिक रोलअप अनुबंध के लिए डिज़ाइन किया गया था।
- Yul+ को Yul के लिए एक प्रयोगात्मक अपग्रेड प्रस्ताव के रूप में देखा जा सकता है, जो इसमें नई सुविधाएँ जोड़ता है।
महत्वपूर्ण लिंक
- Yul दस्तावेज़ीकरण (नए टैब में खुलता है)
- Yul+ दस्तावेज़ीकरण (नए टैब में खुलता है)
- Yul+ परिचय पोस्ट (नए टैब में खुलता है)
उदाहरण अनुबंध
निम्नलिखित सरल उदाहरण एक पावर फ़ंक्शन लागू करता है। इसे solc --strict-assembly --bin input.yul का उपयोग करके संकलित (compile) किया जा सकता है। उदाहरण को input.yul फ़ाइल में संग्रहीत किया जाना चाहिए।
{
function power(base, exponent) -> result
{
switch exponent
case 0 { result := 1 }
case 1 { result := base }
default
{
result := power(mul(base, base), div(exponent, 2))
if mod(exponent, 2) { result := mul(base, result) }
}
}
let res := power(calldataload(0), calldataload(32))
mstore(0, res)
return(0, 32)
}
यदि आप पहले से ही स्मार्ट अनुबंधों के साथ अच्छी तरह से अनुभवी हैं, तो Yul में एक पूर्ण ERC-20 कार्यान्वयन यहाँ (नए टैब में खुलता है) पाया जा सकता है।
Fe
- इथेरियम वर्चुअल मशीन (EVM) के लिए स्टैटिकली टाइप्ड भाषा।
- Python और Rust से प्रेरित।
- इसका उद्देश्य सीखना आसान होना है -- यहां तक कि उन डेवलपर्स के लिए भी जो इथेरियम इकोसिस्टम में नए हैं।
- Fe का विकास अभी भी अपने शुरुआती चरण में है, भाषा का अल्फा रिलीज़ जनवरी 2021 में हुआ था।
महत्वपूर्ण लिंक
- GitHub (नए टैब में खुलता है)
- Fe की घोषणा (नए टैब में खुलता है)
- Fe 2021 रोडमैप (नए टैब में खुलता है)
- Fe डिस्कॉर्ड चैट (नए टैब में खुलता है)
- Fe ट्विटर (नए टैब में खुलता है)
उदाहरण अनुबंध
निम्नलिखित Fe में लागू किया गया एक सरल अनुबंध है।
type BookMsg = bytes[100]
contract GuestBook:
pub guest_book: map<address, BookMsg>
event Signed:
book_msg: BookMsg
pub def sign(book_msg: BookMsg):
self.guest_book[msg.sender] = book_msg
emit Signed(book_msg=book_msg)
pub def get_msg(addr: address) -> BookMsg:
return self.guest_book[addr].to_mem()
कैसे चुनें
किसी भी अन्य प्रोग्रामिंग भाषा की तरह, यह मुख्य रूप से सही काम के लिए सही टूल चुनने के साथ-साथ व्यक्तिगत प्राथमिकताओं के बारे में है।
यदि आपने अभी तक किसी भी भाषा की कोशिश नहीं की है, तो यहां कुछ बातों पर विचार किया जाना चाहिए:
Solidity के बारे में क्या बढ़िया है?
- यदि आप एक शुरुआती हैं, तो वहां कई ट्यूटोरियल और सीखने के उपकरण मौजूद हैं। इसके बारे में कोडिंग करके सीखें अनुभाग में अधिक देखें।
- अच्छे डेवलपर टूल उपलब्ध हैं।
- Solidity का एक बड़ा डेवलपर समुदाय है, जिसका अर्थ है कि आपको अपने सवालों के जवाब बहुत जल्दी मिलने की संभावना है।
Vyper के बारे में क्या बढ़िया है?
- उन Python डेवलपर्स के लिए शुरुआत करने का शानदार तरीका जो स्मार्ट अनुबंध लिखना चाहते हैं।
- Vyper में कम संख्या में विशेषताएं हैं जो इसे विचारों की त्वरित प्रोटोटाइपिंग के लिए बहुत अच्छा बनाती हैं।
- Vyper का उद्देश्य ऑडिट करने में आसान और अधिकतम मानव-पठनीय (human-readable) होना है।
Yul और Yul+ के बारे में क्या बढ़िया है?
- सरल और कार्यात्मक निम्न-स्तरीय भाषा।
- रॉ (raw) EVM के बहुत करीब जाने की अनुमति देता है, जो आपके अनुबंधों के गैस उपयोग को अनुकूलित (optimize) करने में मदद कर सकता है।
भाषाओं की तुलना
बुनियादी सिंटैक्स, अनुबंध जीवनचक्र, इंटरफेस, ऑपरेटर, डेटा संरचनाओं, फ़ंक्शन, नियंत्रण प्रवाह (control flow), और बहुत कुछ की तुलना के लिए Auditless द्वारा इस चीटशीट (नए टैब में खुलता है) को देखें।