एक पाइथन डेवलपर के लिए एथेरियम का परिचय, भाग 1
तो, आपने इस एथेरियम चीज़ के बारे में सुना है और रैबिट होल में उतरने के लिए तैयार हैं? यह पोस्ट जल्दी से कुछ ब्लॉकचेन मूल बातें कवर करेगी, फिर आपको एक सिम्युलेटेड एथेरियम नोड के साथ इंटरैक्ट कराएगी - ब्लॉक डेटा पढ़ना, खाता शेष की जांच करना और लेनदेन भेजना। इस दौरान, हम ऐप्स बनाने के पारंपरिक तरीकों और इस नए विकेंद्रीकृत प्रतिमान के बीच के अंतरों पर प्रकाश डालेंगे।
(सॉफ्ट) पूर्वापेक्षाएँ
यह पोस्ट डेवलपर्स की एक विस्तृत श्रृंखला के लिए सुलभ होने की आकांक्षा रखती है। पाइथन उपकरण शामिल होंगे, लेकिन वे सिर्फ विचारों के लिए एक माध्यम हैं - कोई समस्या नहीं है अगर आप पाइथन डेवलपर नहीं हैं। हालाँकि, मैं बस कुछ धारणाएँ बना रहा हूँ कि आप पहले से क्या जानते हैं, ताकि हम जल्दी से एथेरियम-विशिष्ट बिट्स पर आगे बढ़ सकें।
धारणाएँ:
- आप एक टर्मिनल में काम कर सकते हैं,
- आपने पाइथन कोड की कुछ पंक्तियाँ लिखी हैं,
- पाइथन संस्करण 3.6 या उच्चतर आपकी मशीन पर स्थापित है (वर्चुअल वातावरण (opens in a new tab) का उपयोग दृढ़ता से प्रोत्साहित किया जाता है), और
- आपने
pip, पाइथन के पैकेज इंस्टॉलर का उपयोग किया है। फिर से, यदि इनमें से कोई भी असत्य है, या आप इस लेख में कोड को पुन: पेश करने की योजना नहीं बनाते हैं, तो भी आप शायद ठीक से अनुसरण कर सकते हैं।
ब्लॉकचेन, संक्षेप में
एथेरियम का वर्णन करने के कई तरीके हैं, लेकिन इसके केंद्र में एक ब्लॉकचेन है। ब्लॉकचेन ब्लॉकों की एक श्रृंखला से बने होते हैं, तो चलिए वहीं से शुरू करते हैं। सरल शब्दों में, एथेरियम ब्लॉकचेन पर प्रत्येक ब्लॉक केवल कुछ मेटाडेटा और लेनदेन की एक सूची है। JSON प्रारूप में, यह कुछ इस तरह दिखता है:
1{2 "number": 1234567,3 "hash": "0xabc123...",4 "parentHash": "0xdef456...",5 ...,6 "transactions": [...]7}प्रत्येक ब्लॉक में उससे पहले आए ब्लॉक का एक संदर्भ होता है; parentHash केवल पिछले ब्लॉक का हैश है।
एक ब्लॉकचेन अनिवार्य रूप से एक लिंक्ड सूची है; प्रत्येक ब्लॉक में पिछले ब्लॉक का एक संदर्भ होता है।
यह डेटा संरचना कोई नई बात नहीं है, लेकिन नेटवर्क को नियंत्रित करने वाले नियम (यानी, पीयर-टू-पीयर प्रोटोकॉल) हैं। कोई केंद्रीय प्राधिकरण नहीं है; साथियों के नेटवर्क को नेटवर्क को बनाए रखने के लिए सहयोग करना चाहिए, और यह तय करने के लिए प्रतिस्पर्धा करनी चाहिए कि अगले ब्लॉक में कौन से लेनदेन शामिल किए जाएं। तो, जब आप किसी दोस्त को कुछ पैसे भेजना चाहते हैं, तो आपको उस लेनदेन को नेटवर्क पर प्रसारित करना होगा, फिर उसके आगामी ब्लॉक में शामिल होने की प्रतीक्षा करनी होगी।
ब्लॉकचेन के लिए यह सत्यापित करने का एकमात्र तरीका है कि वास्तव में एक उपयोगकर्ता से दूसरे को पैसा भेजा गया था, उस ब्लॉकचेन के लिए एक मूल मुद्रा (यानी, उस ब्लॉकचेन द्वारा बनाई और शासित) का उपयोग करना है। एथेरियम में, इस मुद्रा को ईथर कहा जाता है, और एथेरियम ब्लॉकचेन में खाता शेष का एकमात्र आधिकारिक रिकॉर्ड होता है।
एक नया प्रतिमान
इस नए विकेंद्रीकृत टेक स्टैक ने नए डेवलपर उपकरण बनाए हैं। ऐसे उपकरण कई प्रोग्रामिंग भाषाओं में मौजूद हैं, लेकिन हम पाइथन के दृष्टिकोण से देखेंगे। फिर से दोहराएँ: भले ही पाइथन आपकी पसंद की भाषा न हो, लेकिन साथ में चलना बहुत मुश्किल नहीं होना चाहिए।
पाइथन डेवलपर्स जो एथेरियम के साथ इंटरैक्ट करना चाहते हैं, वे वेब3.पीवाई (opens in a new tab) का उपयोग करने की संभावना रखते हैं। वेब3.पीवाई एक लाइब्रेरी है जो आपके एथेरियम नोड से कनेक्ट होने, फिर उससे डेटा भेजने और प्राप्त करने के तरीके को बहुत सरल बनाती है।
एथेरियम क्लाइंट को आईपीसी (opens in a new tab), HTTP, या वेबसॉकेट द्वारा पहुंच योग्य होने के लिए कॉन्फ़िगर किया जा सकता है, इसलिए वेब3.पीवाई को इस कॉन्फ़िगरेशन को प्रतिबिंबित करने की आवश्यकता होगी। वेब3.पीवाई इन कनेक्शन विकल्पों को प्रदाता के रूप में संदर्भित करता है। आप अपने नोड के साथ वेब3.पीवाई इंस्टेंस को लिंक करने के लिए तीन प्रदाताओं में से एक को चुनना चाहेंगे।
एथेरियम नोड और वेब3.पीवाई को एक ही प्रोटोकॉल के माध्यम से संचार करने के लिए कॉन्फ़िगर करें, जैसे, इस आरेख में आईपीसी।
एक बार जब वेब3.पीवाई ठीक से कॉन्फ़िगर हो जाता है, तो आप ब्लॉकचेन के साथ इंटरैक्ट करना शुरू कर सकते हैं। यहाँ आने वाले समय के पूर्वावलोकन के रूप में वेब3.पीवाई उपयोग के कुछ उदाहरण दिए गए हैं:
1# ब्लॉक डेटा पढ़ें:2w3.eth.get_block('latest')3
4# एक लेनदेन भेजें:5w3.eth.send_transaction({'from': ..., 'to': ..., 'value': ...})इंस्टॉलेशन
इस वॉकथ्रू में, हम सिर्फ एक पाइथन इंटरप्रेटर के भीतर काम करेंगे। हम कोई भी डायरेक्टरी, फाइलें, क्लास या फंक्शन नहीं बनाएंगे।
$ से शुरू होने वाले कमांड टर्मिनल में चलाए जाने के लिए हैं। ($ टाइप न करें, यह केवल लाइन की शुरुआत का प्रतीक है।)सबसे पहले, एक्सप्लोर करने के लिए एक उपयोगकर्ता-अनुकूल वातावरण के लिए IPython (opens in a new tab) इंस्टॉल करें। IPython अन्य सुविधाओं के अलावा, टैब पूर्णता प्रदान करता है, जिससे यह देखना बहुत आसान हो जाता है कि वेब3.पीवाई के भीतर क्या संभव है।
pip install ipythonवेब3.पीवाई को web3 नाम से प्रकाशित किया गया है। इसे इस तरह स्थापित करें:
pip install web3एक और बात – हम बाद में एक ब्लॉकचेन का अनुकरण करने जा रहे हैं, जिसके लिए कुछ और निर्भरताएँ की आवश्यकता है। आप उन्हें इसके माध्यम से इंस्टॉल कर सकते हैं:
pip install 'web3[tester]'आप जाने के लिए पूरी तरह तैयार हैं!
नोट: web3[tester] पैकेज पाइथन 3.10.xx तक काम करता है
एक सैंडबॉक्स शुरू करें
अपने टर्मिनल में ipython चलाकर एक नया पाइथन वातावरण खोलें। यह python चलाने के तुलनीय है, लेकिन अधिक आकर्षक सुविधाओं के साथ आता है।
ipythonयह आपके द्वारा चलाए जा रहे पाइथन और आईपाइथन के संस्करणों के बारे में कुछ जानकारी प्रिंट करेगा, फिर आपको इनपुट की प्रतीक्षा में एक प्रॉम्प्ट देखना चाहिए:
1In [1]:अब आप एक इंटरैक्टिव पाइथन शेल देख रहे हैं। अनिवार्य रूप से, यह खेलने के लिए एक सैंडबॉक्स है। यदि आप यहां तक पहुंच गए हैं, तो वेब3.पीवाई को आयात करने का समय आ गया है:
1In [1]: from web3 import Web3वेब3 मॉड्यूल का परिचय
एथेरियम का प्रवेश द्वार होने के अलावा, वेब3 (opens in a new tab) मॉड्यूल कुछ सुविधा फ़ंक्शन प्रदान करता है। आइए कुछ का पता लगाएं।
एथेरियम एप्लिकेशन में, आपको आमतौर पर मुद्रा मूल्यवर्ग को बदलने की आवश्यकता होगी। वेब3 मॉड्यूल सिर्फ इसके लिए कुछ सहायक विधियाँ प्रदान करता है: from_wei (opens in a new tab) और to_wei (opens in a new tab)।
नोट: कंप्यूटर दशमलव गणित को संभालने में कुख्यात रूप से खराब हैं। इससे बचने के लिए, डेवलपर्स अक्सर डॉलर की राशि को सेंट में संग्रहीत करते हैं। उदाहरण के लिए, $5.99 की कीमत वाली किसी वस्तु को डेटाबेस में 599 के रूप में संग्रहीत किया जा सकता है।
ईथर में लेनदेन को संभालते समय एक समान पैटर्न का उपयोग किया जाता है। हालाँकि, दो दशमलव बिंदुओं के बजाय, ईथर में 18 होते हैं! ईथर के सबसे छोटे मूल्यवर्ग को wei कहा जाता है, इसलिए लेनदेन भेजते समय यही मान निर्दिष्ट किया जाता है।
1 ईथर = 1000000000000000000 wei
1 wei = 0.000000000000000001 ईथर
कुछ मानों को wei में और उससे बदलने का प्रयास करें। ध्यान दें कि ईथर और wei के बीच कई मूल्यवर्गों के नाम हैं (opens in a new tab)। उनमें से एक बेहतर ज्ञात gwei है, क्योंकि यह अक्सर लेनदेन शुल्क का प्रतिनिधित्व करता है।
1In [2]: Web3.to_wei(1, 'ether')2Out[2]: 10000000000000000003
4In [3]: Web3.from_wei(500000000, 'gwei')5Out[3]: Decimal('0.5')वेब3 मॉड्यूल पर अन्य उपयोगिता विधियों में डेटा प्रारूप कन्वर्टर्स (उदाहरण के लिए, toHex (opens in a new tab)), पता सहायक (उदाहरण के लिए, isAddress (opens in a new tab)), और हैश फ़ंक्शन (उदाहरण के लिए, keccak (opens in a new tab)) शामिल हैं। इनमें से कई को श्रृंखला में बाद में कवर किया जाएगा। सभी उपलब्ध विधियों और गुणों को देखने के लिए, Web3 टाइप करके IPython के ऑटो-कम्प्लीट का उपयोग करें। और अवधि के बाद टैब कुंजी को दो बार दबाएं।
श्रृंखला से बात करें
सुविधा विधियाँ प्यारी हैं, लेकिन चलिए ब्लॉकचेन पर आगे बढ़ते हैं। अगला कदम एक एथेरियम नोड के साथ संचार करने के लिए वेब3.पीवाई को कॉन्फ़िगर करना है। यहां हमारे पास आईपीसी, HTTP, या वेबसॉकेट प्रदाताओं का उपयोग करने का विकल्प है।
हम इस रास्ते पर नहीं जाएंगे, लेकिन HTTP प्रदाता का उपयोग करके एक पूर्ण वर्कफ़्लो का एक उदाहरण कुछ इस तरह दिख सकता है:
- एक एथेरियम नोड डाउनलोड करें, उदा., गेथ (opens in a new tab)।
- एक टर्मिनल विंडो में गेथ शुरू करें और नेटवर्क को सिंक करने की प्रतीक्षा करें। डिफ़ॉल्ट HTTP पोर्ट
8545है, लेकिन यह विन्यास योग्य है। localhost:8545पर HTTP के माध्यम से नोड से कनेक्ट करने के लिए वेब3.पीवाई को बताएं।w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))- नोड के साथ इंटरैक्ट करने के लिए
w3इंस्टेंस का उपयोग करें।
हालांकि यह इसे करने का एक "वास्तविक" तरीका है, सिंकिंग प्रक्रिया में घंटों लगते हैं और यदि आप केवल एक विकास वातावरण चाहते हैं तो यह अनावश्यक है। वेब3.पीवाई इस उद्देश्य के लिए एक चौथा प्रदाता प्रदान करता है, EthereumTesterProvider। यह टेस्टर प्रदाता एक सिम्युलेटेड एथेरियम नोड से लिंक करता है जिसमें खेलने के लिए आराम की अनुमतियाँ और नकली मुद्रा होती है।
EthereumTesterProvider एक सिम्युलेटेड नोड से कनेक्ट होता है और त्वरित विकास वातावरण के लिए आसान है।
उस सिम्युलेटेड नोड को eth-tester (opens in a new tab) कहा जाता है और हमने इसे pip install web3[tester] कमांड के हिस्से के रूप में इंस्टॉल किया है। इस टेस्टर प्रदाता का उपयोग करने के लिए वेब3.पीवाई को कॉन्फ़िगर करना उतना ही सरल है जितना कि:
1In [4]: w3 = Web3(Web3.EthereumTesterProvider())अब आप चेन सर्फ करने के लिए तैयार हैं! ऐसा लोग नहीं कहते हैं। मैंने बस इसे बना दिया। आइए एक त्वरित दौरा करें।
त्वरित दौरा
सबसे पहली बात, एक सामान्य जांच:
1In [5]: w3.is_connected()2Out[5]: Trueचूंकि हम टेस्टर प्रदाता का उपयोग कर रहे हैं, यह बहुत मूल्यवान परीक्षण नहीं है, लेकिन अगर यह विफल हो जाता है, तो संभावना है कि आपने w3 वैरिएबल को इंस्टेंटियेट करते समय कुछ गलत टाइप किया है। दोहरी जांच करें कि आपने आंतरिक कोष्ठक शामिल किया है, यानी, Web3.EthereumTesterProvider()।
टूर स्टॉप #1: खाते
एक सुविधा के रूप में, टेस्टर प्रदाता ने कुछ खाते बनाए और उन्हें परीक्षण ईथर के साथ प्रीलोड किया।
सबसे पहले, आइए उन खातों की सूची देखें:
1In [6]: w3.eth.accounts2Out[6]: ['0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf',3 '0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF',4 '0x6813Eb9362372EEF6200f3b1dbC3f819671cBA69', ...]यदि आप यह कमांड चलाते हैं, तो आपको 0x से शुरू होने वाले दस स्ट्रिंग्स की एक सूची देखनी चाहिए। प्रत्येक एक सार्वजनिक पता है और कुछ मायनों में, एक चेकिंग खाते पर खाता संख्या के समान है। आप यह पता किसी ऐसे व्यक्ति को प्रदान करेंगे जो आपको ईथर भेजना चाहता था।
जैसा कि उल्लेख किया गया है, टेस्टर प्रदाता ने इन प्रत्येक खातों को कुछ परीक्षण ईथर के साथ प्रीलोड किया है। आइए जानें कि पहले खाते में कितना है:
1In [7]: w3.eth.get_balance(w3.eth.accounts[0])2Out[7]: 1000000000000000000000000यह बहुत सारे शून्य हैं! नकली बैंक तक हंसते हुए जाने से पहले, पहले से मुद्रा मूल्यवर्ग के बारे में उस सबक को याद करें। ईथर मान सबसे छोटे मूल्यवर्ग, wei में दर्शाए जाते हैं। उसे ईथर में बदलें:
1In [8]: w3.from_wei(1000000000000000000000000, 'ether')2Out[8]: Decimal('1000000')एक मिलियन परीक्षण ईथर - अभी भी बहुत बुरा नहीं है।
टूर स्टॉप #2: ब्लॉक डेटा
आइए इस सिम्युलेटेड ब्लॉकचेन की स्थिति पर एक नज़र डालें:
1In [9]: w3.eth.get_block('latest')2Out[9]: AttributeDict({3 'number': 0,4 'hash': HexBytes('0x9469878...'),5 'parentHash': HexBytes('0x0000000...'),6 ...7 'transactions': []8})एक ब्लॉक के बारे में बहुत सारी जानकारी वापस आती है, लेकिन यहाँ इंगित करने के लिए बस कुछ बातें हैं:
- ब्लॉक नंबर शून्य है - चाहे आपने कितने समय पहले टेस्टर प्रदाता को कॉन्फ़िगर किया हो। वास्तविक एथेरियम नेटवर्क के विपरीत, जो हर 12 सेकंड में एक नया ब्लॉक जोड़ता है, यह सिमुलेशन तब तक इंतजार करेगा जब तक आप इसे कुछ काम नहीं देते।
transactionsएक खाली सूची है, उसी कारण से: हमने अभी तक कुछ नहीं किया है। यह पहला ब्लॉक एक खाली ब्लॉक है, बस श्रृंखला को शुरू करने के लिए।- ध्यान दें कि
parentHashकेवल खाली बाइट्स का एक गुच्छा है। यह दर्शाता है कि यह श्रृंखला का पहला ब्लॉक है, जिसे जेनेसिस ब्लॉक भी कहा जाता है।
टूर स्टॉप #3: लेनदेन
हम ब्लॉक शून्य पर अटके हुए हैं जब तक कि कोई लंबित लेनदेन न हो, तो चलिए एक देते हैं। एक खाते से दूसरे खाते में कुछ परीक्षण ईथर भेजें:
1In [10]: tx_hash = w3.eth.send_transaction({2 'from': w3.eth.accounts[0],3 'to': w3.eth.accounts[1],4 'value': w3.to_wei(3, 'ether'),5 'gas': 210006})यह आमतौर पर वह बिंदु है जहां आप अपने लेनदेन को एक नए ब्लॉक में शामिल होने के लिए कई सेकंड तक प्रतीक्षा करते हैं। पूरी प्रक्रिया कुछ इस तरह होती है:
- एक लेनदेन जमा करें और लेनदेन हैश को पकड़ कर रखें। जब तक लेनदेन वाले ब्लॉक को बनाया और प्रसारित नहीं किया जाता, तब तक लेनदेन "लंबित" है।
tx_hash = w3.eth.send_transaction({ …})` - लेनदेन को एक ब्लॉक में शामिल किए जाने की प्रतीक्षा करें:
w3.eth.wait_for_transaction_receipt(tx_hash) - एप्लिकेशन लॉजिक जारी रखें। सफल लेनदेन देखने के लिए:
w3.eth.get_transaction(tx_hash)
हमारा सिम्युलेटेड वातावरण तुरंत एक नए ब्लॉक में लेनदेन जोड़ देगा, इसलिए हम तुरंत लेनदेन देख सकते हैं:
1In [11]: w3.eth.get_transaction(tx_hash)2Out[11]: AttributeDict({3 'hash': HexBytes('0x15e9fb95dc39...'),4 'blockNumber': 1,5 'transactionIndex': 0,6 'from': '0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf',7 'to': '0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF',8 'value': 3000000000000000000,9 ...10})आपको यहाँ कुछ परिचित विवरण दिखाई देंगे: from, to, और value फ़ील्ड हमारे send_transaction कॉल के इनपुट से मेल खाना चाहिए। दूसरी आश्वस्त करने वाली बात यह है कि यह लेनदेन ब्लॉक नंबर 1 के भीतर पहले लेनदेन ('transactionIndex': 0) के रूप में शामिल किया गया था।
हम शामिल दो खातों के शेष राशि की जांच करके इस लेनदेन की सफलता को आसानी से सत्यापित कर सकते हैं। तीन ईथर को एक से दूसरे में जाना चाहिए था।
1In [12]: w3.eth.get_balance(w3.eth.accounts[0])2Out[12]: 9999969999790000000000003
4In [13]: w3.eth.get_balance(w3.eth.accounts[1])5Out[13]: 1000003000000000000000000बाद वाला अच्छा लग रहा है! शेष राशि 1,000,000 से 1,000,003 ईथर हो गई। लेकिन पहले खाते का क्या हुआ? ऐसा लगता है कि इसने तीन ईथर से थोड़ा अधिक खो दिया है। अफसोस, जीवन में कुछ भी मुफ्त नहीं है, और एथेरियम सार्वजनिक नेटवर्क का उपयोग करने के लिए आपको अपने साथियों को उनकी सहायक भूमिका के लिए क्षतिपूर्ति करने की आवश्यकता है। लेनदेन जमा करने वाले खाते से एक छोटा लेनदेन शुल्क काटा गया था - यह शुल्क गैस की जली हुई मात्रा (ETH हस्तांतरण के लिए 21000 यूनिट गैस) को एक आधार शुल्क से गुणा किया जाता है जो नेटवर्क गतिविधि के अनुसार बदलता है और एक टिप जो उस सत्यापनकर्ता को जाता है जो लेनदेन को एक ब्लॉक में शामिल करता है।
गैस पर और अधिक
और साँस लें
हम थोड़ी देर से इस पर हैं, इसलिए यह ब्रेक लेने के लिए किसी भी जगह की तरह एक अच्छी जगह लगती है। रैबिट होल जारी है, और हम इस श्रृंखला के भाग दो में अन्वेषण जारी रखेंगे। आने वाली कुछ अवधारणाएँ: एक वास्तविक नोड से जुड़ना, स्मार्ट अनुबंध और टोकन। क्या आपके पास कोई अनुवर्ती प्रश्न हैं? मुझे बताएं! आपकी प्रतिक्रिया प्रभावित करेगी कि हम यहां से कहां जाते हैं। ट्विटर (opens in a new tab) के माध्यम से अनुरोधों का स्वागत है।
पेज का अंतिम अपडेट: 3 मार्च 2026


