Python डेव्हलपरसाठी इथेरियमची ओळख, भाग 1
तर, तुम्ही या इथेरियमबद्दल ऐकले आहे आणि सखोल माहिती जाणून घेण्यासाठी (venture down the rabbit hole) तयार आहात? ही पोस्ट ब्लॉकचेनच्या काही मूलभूत गोष्टींचा थोडक्यात आढावा घेईल, आणि त्यानंतर तुम्हाला सिम्युलेटेड इथेरियम नोडशी संवाद साधायला लावेल – ब्लॉक डेटा वाचणे, खात्यातील शिल्लक तपासणे आणि व्यवहार पाठवणे. या प्रवासात, आम्ही अॅप्स तयार करण्याच्या पारंपारिक पद्धती आणि या नवीन विकेंद्रित पॅराडाइममधील (प्रतिमानातील) फरक अधोरेखित करू.
(सॉफ्ट) पूर्वअटी
ही पोस्ट विविध प्रकारच्या डेव्हलपर्सना समजेल अशी असावी हा यामागील उद्देश आहे. यात Python टूल्सचा समावेश असेल, परंतु ते केवळ कल्पना मांडण्याचे एक माध्यम आहेत – तुम्ही Python डेव्हलपर नसलात तरी काही हरकत नाही. तथापि, तुम्हाला आधीपासूनच काही गोष्टी माहीत आहेत असे मी गृहीत धरेन, जेणेकरून आपण इथेरियम-विशिष्ट भागांकडे वेगाने वळू शकू.
गृहीतके:
- तुम्हाला टर्मिनल वापरता येते,
- तुम्ही Python कोडच्या काही ओळी लिहिल्या आहेत,
- तुमच्या मशीनवर Python आवृत्ती 3.6 किंवा त्यापुढील आवृत्ती स्थापित आहे (व्हर्च्युअल एन्व्हायर्नमेंट (नवीन टॅबमध्ये उघडते) वापरण्याची जोरदार शिफारस केली जाते), आणि
- तुम्ही Python चे पॅकेज इंस्टॉलर
pipवापरले आहे. पुन्हा एकदा, यापैकी काहीही खरे नसल्यास, किंवा या लेखातील कोड पुन्हा तयार करण्याची तुमची योजना नसल्यास, तरीही तुम्ही हे सहजपणे समजून घेऊ शकता.
ब्लॉकचेन, थोडक्यात
इथेरियमचे वर्णन करण्याचे अनेक मार्ग आहेत, परंतु त्याच्या केंद्रस्थानी एक ब्लॉकचेन आहे. ब्लॉकचेन हे ब्लॉक्सच्या मालिकेपासून बनलेले असतात, त्यामुळे आपण तिथून सुरुवात करूया. सोप्या भाषेत सांगायचे तर, इथेरियम ब्लॉकचेनवरील प्रत्येक ब्लॉक म्हणजे फक्त काही मेटाडेटा आणि व्यवहारांची यादी असते. JSON फॉरमॅटमध्ये, ते काहीसे असे दिसते:
{
"number": 1234567,
"hash": "0xabc123...",
"parentHash": "0xdef456...",
...,
"transactions": [...]
}
प्रत्येक ब्लॉकचा त्याच्या आधी आलेल्या ब्लॉकचा संदर्भ असतो; parentHash हा फक्त मागील ब्लॉकचा हॅश असतो.
ब्लॉकचेन ही मूलत: एक लिंक्ड लिस्ट (linked list) असते; प्रत्येक ब्लॉकचा मागील ब्लॉकचा संदर्भ असतो.
ही डेटा रचना काही नवीन नाही, परंतु नेटवर्क नियंत्रित करणारे नियम (म्हणजेच, पीअर-टू-पीअर प्रोटोकॉल) नवीन आहेत. येथे कोणतीही केंद्रीय संस्था नाही; नेटवर्क टिकवून ठेवण्यासाठी पीअर्सच्या नेटवर्कने सहयोग करणे आवश्यक आहे, आणि पुढील ब्लॉकमध्ये कोणते व्यवहार समाविष्ट करायचे हे ठरवण्यासाठी स्पर्धा करणे आवश्यक आहे. त्यामुळे, जेव्हा तुम्हाला एखाद्या मित्राला काही पैसे पाठवायचे असतील, तेव्हा तुम्हाला तो व्यवहार नेटवर्कवर प्रसारित (broadcast) करावा लागेल, आणि नंतर तो आगामी ब्लॉकमध्ये समाविष्ट होण्याची प्रतीक्षा करावी लागेल.
एका वापरकर्त्याकडून दुसऱ्या वापरकर्त्याला खरोखरच पैसे पाठवले गेले आहेत याची पडताळणी करण्याचा ब्लॉकचेनसाठी एकमेव मार्ग म्हणजे त्या ब्लॉकचेनच्या मूळ (म्हणजेच, त्याद्वारे तयार केलेल्या आणि नियंत्रित केलेल्या) चलनाची मदत घेणे. इथेरियममध्ये, या चलनाला इथर म्हणतात, आणि इथेरियम ब्लॉकचेनमध्ये खात्यातील शिल्लक रकमेची एकमेव अधिकृत नोंद असते.
एक नवीन पॅराडाइम
या नवीन विकेंद्रित टेक स्टॅकने नवीन डेव्हलपर टूल्स निर्माण केली आहेत. अशी टूल्स अनेक प्रोग्रामिंग भाषांमध्ये अस्तित्वात आहेत, परंतु आपण Python च्या दृष्टिकोनातून पाहणार आहोत. पुन्हा सांगायचे तर: जरी Python ही तुमची पसंतीची भाषा नसली, तरीही हे समजून घेण्यात फारशी अडचण येऊ नये.
ज्या Python डेव्हलपर्सना इथेरियमशी संवाद साधायचा आहे ते बहुधा Web3.py (नवीन टॅबमध्ये उघडते) वापरतील. Web3.py ही एक लायब्ररी आहे जी तुम्ही इथेरियम नोडशी कनेक्ट होण्याचा, आणि नंतर त्यातून डेटा पाठवण्याचा आणि प्राप्त करण्याचा मार्ग खूप सोपा करते.
इथेरियम क्लायंट्स IPC (नवीन टॅबमध्ये उघडते), HTTP, किंवा Websockets द्वारे पोहोचण्यायोग्य म्हणून कॉन्फिगर केले जाऊ शकतात, त्यामुळे Web3.py ला हे कॉन्फिगरेशन मिरर करावे लागेल. Web3.py या कनेक्शन पर्यायांना प्रदाते (providers) म्हणून संदर्भित करते. Web3.py इन्स्टन्सला तुमच्या नोडशी लिंक करण्यासाठी तुम्हाला तीनपैकी एक प्रदाता निवडायचा असेल.
इथेरियम नोड आणि Web3.py ला एकाच प्रोटोकॉलद्वारे संवाद साधण्यासाठी कॉन्फिगर करा, उदा., या आकृतीमधील IPC.
एकदा Web3.py योग्यरित्या कॉन्फिगर केले की, तुम्ही ब्लॉकचेनशी संवाद साधण्यास सुरुवात करू शकता. पुढे काय येणार आहे याची पूर्वकल्पना म्हणून येथे Web3.py च्या वापराची काही उदाहरणे दिली आहेत:
# ब्लॉक डेटा वाचा:
w3.eth.get_block('latest')
# व्यवहार पाठवा:
w3.eth.send_transaction({'from': ..., 'to': ..., 'value': ...})
इंस्टॉलेशन
या वॉकथ्रूमध्ये, आपण फक्त Python इंटरप्रिटरमध्ये काम करणार आहोत. आपण कोणत्याही डिरेक्टरीज, फाइल्स, क्लासेस किंवा फंक्शन्स तयार करणार नाही.
$ ने सुरू होणाऱ्या कमांड्स टर्मिनलमध्ये चालवल्या जाव्यात असा उद्देश आहे. ($ टाइप करू नका, ते फक्त ओळीची सुरुवात दर्शवते.)प्रथम, एक्सप्लोर करण्यासाठी वापरकर्ता-अनुकूल वातावरणासाठी IPython (नवीन टॅबमध्ये उघडते) इंस्टॉल करा. IPython इतर वैशिष्ट्यांसह टॅब पूर्णता (tab completion) ऑफर करते, ज्यामुळे Web3.py मध्ये काय शक्य आहे हे पाहणे खूप सोपे होते.
pip install ipython
Web3.py हे web3 या नावाने प्रकाशित केले आहे. ते अशा प्रकारे इंस्टॉल करा:
pip install web3
आणखी एक गोष्ट – आपण नंतर ब्लॉकचेनचे सिम्युलेशन करणार आहोत, ज्यासाठी आणखी काही डिपेंडन्सीज आवश्यक आहेत. तुम्ही त्या याद्वारे इंस्टॉल करू शकता:
pip install 'web3[tester]'
तुम्ही सर्व सेट आहात!
टीप: web3[tester] पॅकेज Python 3.10.xx पर्यंत काम करते
सँडबॉक्स सुरू करा
तुमच्या टर्मिनलमध्ये ipython चालवून नवीन Python वातावरण उघडा. हे python चालवण्यासारखेच आहे, परंतु यात अधिक वैशिष्ट्ये (bells and whistles) आहेत.
ipython
हे तुम्ही चालवत असलेल्या Python आणि IPython च्या आवृत्त्यांबद्दल काही माहिती प्रिंट करेल, त्यानंतर तुम्हाला इनपुटची प्रतीक्षा करणारा प्रॉम्प्ट दिसेल:
In [1]:
तुम्ही आता इंटरअॅक्टिव्ह Python शेल पाहत आहात. मूलत:, हे खेळण्यासाठी एक सँडबॉक्स आहे. जर तुम्ही इथपर्यंत पोहोचला असाल, तर आता Web3.py इंपोर्ट करण्याची वेळ आली आहे:
In [1]: from web3 import Web3
Web3 मॉड्यूलची ओळख
इथेरियमचे प्रवेशद्वार असण्याव्यतिरिक्त, Web3 (नवीन टॅबमध्ये उघडते) मॉड्यूल काही सोयीस्कर फंक्शन्स ऑफर करते. आपण त्यापैकी काहींचा शोध घेऊया.
इथेरियम ॲप्लिकेशनमध्ये, तुम्हाला सामान्यतः चलनाची मूल्ये (currency denominations) रूपांतरित करण्याची आवश्यकता असेल. Web3 मॉड्यूल फक्त यासाठी काही हेल्पर पद्धती प्रदान करते: from_wei (नवीन टॅबमध्ये उघडते) आणि to_wei (नवीन टॅबमध्ये उघडते).
टीप: संगणक दशांश गणित हाताळण्यात अत्यंत वाईट असतात. यावर मात करण्यासाठी, डेव्हलपर्स अनेकदा डॉलरची रक्कम सेंट्समध्ये साठवतात. उदाहरणार्थ, $5.99 किंमत असलेली वस्तू डेटाबेसमध्ये 599 म्हणून साठवली जाऊ शकते.
इथरमधील व्यवहार हाताळताना असाच पॅटर्न वापरला जातो. तथापि, दोन दशांश बिंदूंच्या ऐवजी, इथरमध्ये 18 असतात! इथरच्या सर्वात लहान मूल्याला Wei म्हणतात, त्यामुळे व्यवहार पाठवताना हेच मूल्य निर्दिष्ट केले जाते.
1 इथर = 1000000000000000000 Wei
1 Wei = 0.000000000000000001 इथर
काही मूल्ये Wei मध्ये आणि Wei मधून रूपांतरित करण्याचा प्रयत्न करा. लक्षात घ्या की इथर आणि Wei च्या दरम्यान अनेक मूल्यांसाठी नावे आहेत (नवीन टॅबमध्ये उघडते). त्यापैकी एक अधिक परिचित नाव म्हणजे Gwei, कारण व्यवहार शुल्क अनेकदा याच स्वरूपात दर्शवले जाते.
In [2]: Web3.to_wei(1, 'ether')
Out[2]: 1000000000000000000
In [3]: Web3.from_wei(500000000, 'gwei')
Out[3]: Decimal('0.5')
Web3 मॉड्यूलमधील इतर युटिलिटी पद्धतींमध्ये डेटा फॉरमॅट कन्व्हर्टर्स (उदा., toHex (नवीन टॅबमध्ये उघडते)), ॲड्रेस हेल्पर्स (उदा., isAddress (नवीन टॅबमध्ये उघडते)), आणि हॅश फंक्शन्स (उदा., keccak (नवीन टॅबमध्ये उघडते)) यांचा समावेश आहे. यापैकी अनेक या मालिकेच्या पुढील भागात कव्हर केले जातील. सर्व उपलब्ध पद्धती आणि गुणधर्म पाहण्यासाठी, Web3. टाइप करून आणि पूर्णविरामानंतर दोनदा टॅब की दाबून IPython च्या ऑटो-कंप्लीटचा वापर करा.
चेनशी संवाद साधा
सोयीस्कर पद्धती छान आहेत, परंतु आपण ब्लॉकचेनकडे वळूया. पुढची पायरी म्हणजे इथेरियम नोडशी संवाद साधण्यासाठी Web3.py कॉन्फिगर करणे. येथे आपल्याकडे IPC, HTTP, किंवा Websocket प्रदाते वापरण्याचा पर्याय आहे.
आपण या मार्गाने जाणार नाही, परंतु HTTP प्रदाता वापरून संपूर्ण वर्कफ्लोचे उदाहरण काहीसे असे दिसू शकते:
- इथेरियम नोड डाउनलोड करा, उदा., Geth (नवीन टॅबमध्ये उघडते).
- एका टर्मिनल विंडोमध्ये Geth सुरू करा आणि नेटवर्क समक्रमण (sync) होण्याची प्रतीक्षा करा. डीफॉल्ट HTTP पोर्ट
8545आहे, परंतु ते कॉन्फिगर करण्यायोग्य आहे. - Web3.py ला HTTP द्वारे,
localhost:8545वर नोडशी कनेक्ट होण्यास सांगा.w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545')) - नोडशी संवाद साधण्यासाठी
w3इन्स्टन्स वापरा.
हे करण्याचा हा एक “खरा” मार्ग असला तरी, समक्रमण प्रक्रियेला काही तास लागतात आणि जर तुम्हाला फक्त डेव्हलपमेंट वातावरण हवे असेल तर ते अनावश्यक आहे. Web3.py या उद्देशासाठी चौथा प्रदाता, EthereumTesterProvider उघड करते. हा टेस्टर प्रदाता शिथिल परवानग्या आणि खेळण्यासाठी बनावट चलनासह सिम्युलेटेड इथेरियम नोडशी लिंक करतो.
EthereumTesterProvider सिम्युलेटेड नोडशी कनेक्ट होतो आणि जलद डेव्हलपमेंट वातावरणासाठी उपयुक्त आहे.
त्या सिम्युलेटेड नोडला eth-tester (नवीन टॅबमध्ये उघडते) म्हणतात आणि आपण ते pip install web3[tester] कमांडचा भाग म्हणून इंस्टॉल केले आहे. हा टेस्टर प्रदाता वापरण्यासाठी Web3.py कॉन्फिगर करणे इतके सोपे आहे:
In [4]: w3 = Web3(Web3.EthereumTesterProvider())
आता तुम्ही चेन सर्फ करण्यासाठी तयार आहात! लोक असे म्हणत नाहीत. मी ते आत्ताच बनवले. चला एक छोटीशी सफर करूया.
छोटीशी सफर
सर्वात आधी, एक सॅनिटी चेक (sanity check):
In [5]: w3.is_connected()
Out[5]: True
आपण टेस्टर प्रदाता वापरत असल्यामुळे, ही फार मौल्यवान चाचणी नाही, परंतु जर ती अयशस्वी झाली, तर w3 व्हेरिएबल इन्स्टॅन्शिएट करताना तुम्ही काहीतरी चुकीचे टाइप केले असण्याची शक्यता आहे. तुम्ही आतील कंस समाविष्ट केले आहेत का ते पुन्हा तपासा, उदा., Web3.EthereumTesterProvider().
सफर थांबा #1: खाती
सोयीसाठी, टेस्टर प्रदात्याने काही खाती तयार केली आहेत आणि त्यामध्ये आधीच टेस्ट इथर लोड केले आहेत.
प्रथम, आपण त्या खात्यांची यादी पाहूया:
In [6]: w3.eth.accounts
Out[6]: ['0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf',
'0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF',
'0x6813Eb9362372EEF6200f3b1dbC3f819671cBA69', ...]
जर तुम्ही ही कमांड चालवली, तर तुम्हाला 0x ने सुरू होणाऱ्या दहा स्ट्रिंगची यादी दिसेल. प्रत्येक एक सार्वजनिक पत्ता (public address) आहे आणि काही मार्गांनी, चेकिंग खात्यावरील खाते क्रमांकासारखाच आहे. तुम्हाला इथर पाठवू इच्छिणाऱ्या व्यक्तीला तुम्ही हा पत्ता द्याल.
नमूद केल्याप्रमाणे, टेस्टर प्रदात्याने या प्रत्येक खात्यात काही टेस्ट इथर आधीच लोड केले आहेत. पहिल्या खात्यात किती रक्कम आहे ते शोधूया:
In [7]: w3.eth.get_balance(w3.eth.accounts[0])
Out[7]: 1000000000000000000000000
हे खूप शून्य आहेत! तुम्ही बनावट बँकेत हसत हसत जाण्यापूर्वी, चलनाची मूल्ये याबद्दलचा आधीचा धडा आठवा. इथरची मूल्ये सर्वात लहान मूल्य, Wei मध्ये दर्शविली जातात. त्याचे इथरमध्ये रूपांतर करा:
In [8]: w3.from_wei(1000000000000000000000000, 'ether')
Out[8]: Decimal('1000000')
एक दशलक्ष टेस्ट इथर — तरीही वाईट नाही.
सफर थांबा #2: ब्लॉक डेटा
या सिम्युलेटेड ब्लॉकचेनच्या स्थितीवर एक नजर टाकूया:
In [9]: w3.eth.get_block('latest')
Out[9]: AttributeDict({
'number': 0,
'hash': HexBytes('0x9469878...'),
'parentHash': HexBytes('0x0000000...'),
...
'transactions': []
})
ब्लॉकबद्दल बरीच माहिती परत मिळते, परंतु येथे फक्त काही गोष्टी निदर्शनास आणून द्यायच्या आहेत:
- ब्लॉक क्रमांक शून्य आहे — तुम्ही टेस्टर प्रदाता कितीही वेळापूर्वी कॉन्फिगर केला असला तरीही. खऱ्या इथेरियम नेटवर्कच्या विपरीत, जे दर 12 सेकंदांनी नवीन ब्लॉक जोडते, हे सिम्युलेशन तुम्ही त्याला काही काम देईपर्यंत प्रतीक्षा करेल.
transactionsही एक रिकामी यादी आहे, त्याच कारणासाठी: आपण अद्याप काहीही केलेले नाही. हा पहिला ब्लॉक एक रिकामा ब्लॉक आहे, फक्त चेन सुरू करण्यासाठी.- लक्षात घ्या की
parentHashहे फक्त रिकाम्या बाइट्सचा समूह आहे. हे दर्शवते की हा चेन मधील पहिला ब्लॉक आहे, ज्याला उत्पत्ती ब्लॉक (genesis block) म्हणूनही ओळखले जाते.
सफर थांबा #3: व्यवहार
जोपर्यंत एखादा प्रलंबित व्यवहार होत नाही तोपर्यंत आपण ब्लॉक शून्यवर अडकलो आहोत, त्यामुळे आपण एक व्यवहार करूया. एका खात्यातून दुसऱ्या खात्यात काही टेस्ट इथर पाठवा:
In [10]: tx_hash = w3.eth.send_transaction({
'from': w3.eth.accounts[0],
'to': w3.eth.accounts[1],
'value': w3.to_wei(3, 'ether'),
'gas': 21000
})
हा सामान्यतः तो टप्पा असतो जिथे तुमचा व्यवहार नवीन ब्लॉकमध्ये समाविष्ट होण्यासाठी तुम्ही काही सेकंद प्रतीक्षा करता. संपूर्ण प्रक्रिया काहीशी अशी असते:
- व्यवहार सबमिट करा आणि व्यवहार हॅश जतन करून ठेवा. जोपर्यंत व्यवहार असलेला ब्लॉक तयार होऊन प्रसारित होत नाही, तोपर्यंत व्यवहार “प्रलंबित” असतो.
tx_hash = w3.eth.send_transaction({ … }) - व्यवहार ब्लॉकमध्ये समाविष्ट होण्याची प्रतीक्षा करा:
w3.eth.wait_for_transaction_receipt(tx_hash) - ॲप्लिकेशन लॉजिक सुरू ठेवा. यशस्वी व्यवहार पाहण्यासाठी:
w3.eth.get_transaction(tx_hash)
आपले सिम्युलेटेड वातावरण नवीन ब्लॉकमध्ये व्यवहार त्वरित जोडेल, त्यामुळे आपण लगेच व्यवहार पाहू शकतो:
In [11]: w3.eth.get_transaction(tx_hash)
Out[11]: AttributeDict({
'hash': HexBytes('0x15e9fb95dc39...'),
'blockNumber': 1,
'transactionIndex': 0,
'from': '0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf',
'to': '0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF',
'value': 3000000000000000000,
...
})
तुम्हाला येथे काही परिचित तपशील दिसतील: from, to, आणि value फील्ड्स आपल्या send_transaction कॉलच्या इनपुटशी जुळले पाहिजेत. दुसरी आश्वासक गोष्ट म्हणजे हा व्यवहार ब्लॉक क्रमांक 1 मधील पहिला व्यवहार ('transactionIndex': 0) म्हणून समाविष्ट केला गेला.
आपण समाविष्ट असलेल्या दोन खात्यांमधील शिल्लक तपासून या व्यवहाराच्या यशाची सहज पडताळणी करू शकतो. तीन इथर एकाकडून दुसऱ्याकडे गेले पाहिजेत.
In [12]: w3.eth.get_balance(w3.eth.accounts[0])
Out[12]: 999996999979000000000000
In [13]: w3.eth.get_balance(w3.eth.accounts[1])
Out[13]: 1000003000000000000000000
दुसरे खाते चांगले दिसत आहे! शिल्लक 1,000,000 वरून 1,000,003 इथर झाली. पण पहिल्या खात्याचे काय झाले? असे दिसते की त्याने तीन इथरपेक्षा थोडे जास्त गमावले आहेत. अरेरे, जीवनात काहीही मोफत मिळत नाही, आणि इथेरियम सार्वजनिक नेटवर्क वापरण्यासाठी तुम्हाला तुमच्या पीअर्सना त्यांच्या सहाय्यक भूमिकेसाठी मोबदला देणे आवश्यक आहे. व्यवहार सबमिट करणाऱ्या खात्यातून एक लहान व्यवहार शुल्क वजा केले गेले - हे शुल्क म्हणजे बर्न केलेल्या गॅसचे प्रमाण (ETH हस्तांतरणासाठी 21000 युनिट्स गॅस) गुणिले नेटवर्कच्या क्रियाकलापानुसार बदलणारे पायाभूत शुल्क अधिक ब्लॉकमध्ये व्यवहार समाविष्ट करणाऱ्या प्रमाणकाला जाणारी टिप.
गॅस बद्दल अधिक माहिती
आणि श्वास घ्या
आपण बऱ्याच काळापासून हे करत आहोत, त्यामुळे ब्रेक घेण्यासाठी ही एक चांगली जागा वाटते. हा सखोल प्रवास (rabbit hole) पुढेही चालू राहील, आणि आपण या मालिकेच्या भाग दोनमध्ये अन्वेषण करणे सुरू ठेवू. पुढे येणाऱ्या काही संकल्पना: खऱ्या नोडशी कनेक्ट होणे, स्मार्ट कॉन्ट्रॅक्ट्स आणि टोकन्स. काही फॉलो-अप प्रश्न आहेत का? मला कळवा! तुमचा अभिप्राय आपण येथून पुढे कुठे जाणार यावर प्रभाव टाकेल. ट्विटर् (नवीन टॅबमध्ये उघडते) द्वारे विनंत्यांचे स्वागत आहे.


