स्मार्ट कॉन्ट्रॅक्ट भाषा
इथेरियम बद्दल एक उत्तम गोष्ट म्हणजे स्मार्ट कॉन्ट्रॅक्ट्स तुलनेने डेव्हलपर-अनुकूल भाषा वापरून प्रोग्राम केले जाऊ शकतात. जर तुम्हाला Python किंवा कोणत्याही कर्ली-ब्रॅकेट भाषेचा (curly-bracket language) (नवीन टॅबमध्ये उघडते) अनुभव असेल, तर तुम्हाला परिचित सिंटॅक्स असलेली भाषा मिळू शकते.
दोन सर्वात सक्रिय आणि देखभाल केल्या जाणाऱ्या भाषा खालीलप्रमाणे आहेत:
- Solidity
- Vyper
Remix एकात्मिक विकास पर्यावरण (IDE) Solidity आणि Vyper दोन्हीमध्ये कॉन्ट्रॅक्ट्स तयार करण्यासाठी आणि तपासण्यासाठी एक व्यापक विकास पर्यावरण प्रदान करते. कोडिंग सुरू करण्यासाठी ब्राउझरमधील Remix IDE वापरून पहा (नवीन टॅबमध्ये उघडते).
अधिक अनुभवी डेव्हलपर्सना Yul, जी इथरियम व्हर्च्युअल मशीन (EVM) साठी एक मध्यवर्ती भाषा आहे, किंवा Yul+, जे Yul चे एक्स्टेंशन आहे, वापरण्याची इच्छा असू शकते.
जर तुम्ही उत्सुक असाल आणि अजूनही मोठ्या प्रमाणावर विकसित होत असलेल्या नवीन भाषांची चाचणी करण्यात मदत करू इच्छित असाल, तर तुम्ही Fe सोबत प्रयोग करू शकता, जी एक उदयोन्मुख स्मार्ट कॉन्ट्रॅक्ट भाषा आहे आणि सध्या ती तिच्या सुरुवातीच्या टप्प्यात आहे.
पूर्वअटी
प्रोग्रामिंग भाषांचे, विशेषतः JavaScript किंवा Python चे पूर्वज्ञान, तुम्हाला स्मार्ट कॉन्ट्रॅक्ट भाषांमधील फरक समजून घेण्यास मदत करू शकते. भाषांच्या तुलनेत खूप खोलवर जाण्यापूर्वी तुम्ही स्मार्ट कॉन्ट्रॅक्ट्सची संकल्पना समजून घ्यावी अशी आम्ही शिफारस करतो. स्मार्ट कॉन्ट्रॅक्ट्सची ओळख.
Solidity
- स्मार्ट कॉन्ट्रॅक्ट्स लागू करण्यासाठी ऑब्जेक्ट-ओरिएंटेड, उच्च-स्तरीय भाषा.
- कर्ली-ब्रॅकेट भाषा ज्यावर C++ चा सर्वात जास्त प्रभाव पडला आहे.
- स्टॅटिकली टाईप केलेली (व्हेरिएबलचा प्रकार कंपाईल करताना माहित असतो).
- खालील गोष्टींना सपोर्ट करते:
- इनहेरिटन्स (तुम्ही इतर कॉन्ट्रॅक्ट्स वाढवू शकता).
- लायब्ररी (तुम्ही पुन्हा वापरता येण्याजोगा कोड तयार करू शकता जो तुम्ही वेगवेगळ्या कॉन्ट्रॅक्ट्समधून कॉल करू शकता – जसे इतर ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषांमध्ये स्टॅटिक क्लासमधील स्टॅटिक फंक्शन्स).
- गुंतागुंतीचे युजर-डिफाइंड प्रकार.
महत्त्वाच्या लिंक्स
- डॉक्युमेंटेशन (नवीन टॅबमध्ये उघडते)
- Solidity लँग्वेज पोर्टल (नवीन टॅबमध्ये उघडते)
- Solidity बाय एक्झाम्पल (नवीन टॅबमध्ये उघडते)
- GitHub (नवीन टॅबमध्ये उघडते)
- Solidity Gitter चॅटरूम (नवीन टॅबमध्ये उघडते) जी Solidity मॅट्रिक्स चॅटरूम (नवीन टॅबमध्ये उघडते) शी जोडलेली आहे
- चीट शीट (नवीन टॅबमध्ये उघडते)
- 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 ग्रेटेस्ट हिट्स स्मार्ट कॉन्ट्रॅक्ट उदाहरणे (नवीन टॅबमध्ये उघडते)
- ऑसम 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 ने सुरुवात करण्याची शिफारस करतो. जेव्हा तुम्हाला स्मार्ट कॉन्ट्रॅक्ट सुरक्षेच्या सर्वोत्तम पद्धती आणि EVM सोबत काम करण्याच्या विशिष्ट गोष्टींची माहिती होईल, तेव्हाच Yul किंवा Yul+ कडे वळा.
Yul
- इथेरियमसाठी मध्यवर्ती भाषा.
- EVM आणि Ewasm (नवीन टॅबमध्ये उघडते) (इथेरियम फ्लेवर्ड WebAssembly) ला सपोर्ट करते, आणि दोन्ही प्लॅटफॉर्म्सचा वापरण्यायोग्य सामायिक पाया (common denominator) म्हणून डिझाइन केलेली आहे.
- उच्च-स्तरीय ऑप्टिमायझेशन टप्प्यांसाठी एक चांगले लक्ष्य जे EVM आणि Ewasm दोन्ही प्लॅटफॉर्म्सना समान फायदा देऊ शकते.
Yul+
- Yul चे एक लो-लेव्हल, अत्यंत कार्यक्षम एक्स्टेंशन.
- सुरुवातीला ऑप्टिमिस्टिक रोलअप कॉन्ट्रॅक्टसाठी डिझाइन केलेले.
- Yul+ कडे Yul साठी एक प्रायोगिक अपग्रेड प्रस्ताव म्हणून पाहिले जाऊ शकते, जे त्यात नवीन वैशिष्ट्ये जोडते.
महत्त्वाच्या लिंक्स
- Yul डॉक्युमेंटेशन (नवीन टॅबमध्ये उघडते)
- Yul+ डॉक्युमेंटेशन (नवीन टॅबमध्ये उघडते)
- Yul+ परिचयात्मक पोस्ट (नवीन टॅबमध्ये उघडते)
उदाहरण कॉन्ट्रॅक्ट
खालील सोपे उदाहरण पॉवर फंक्शन लागू करते. हे solc --strict-assembly --bin input.yul वापरून कंपाईल केले जाऊ शकते. हे उदाहरण 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 चे उद्दिष्ट आहे.
Yul आणि Yul+ बद्दल उत्तम काय आहे?
- साधी आणि कार्यक्षम लो-लेव्हल भाषा.
- रॉ (raw) EVM च्या खूप जवळ जाण्याची अनुमती देते, जे तुमच्या कॉन्ट्रॅक्ट्सचा गॅस वापर ऑप्टिमाइझ करण्यात मदत करू शकते.
भाषांची तुलना
मूलभूत सिंटॅक्स, कॉन्ट्रॅक्ट जीवनचक्र, इंटरफेसेस, ऑपरेटर्स, डेटा स्ट्रक्चर्स, फंक्शन्स, कंट्रोल फ्लो आणि अधिकच्या तुलनेसाठी Auditless ची ही चीटशीट पहा (नवीन टॅबमध्ये उघडते)