मुख्य सामग्री पर जाएं

Python डेवलपर के लिए इथेरियम का परिचय, भाग 1

Python
web3.py
शुरुआती
मार्क गैरो
8 सितंबर 2020
14 मिनट पढ़ें

तो, आपने इस इथेरियम के बारे में सुना है और इसके बारे में गहराई से जानने के लिए तैयार हैं? यह पोस्ट जल्दी से कुछ ब्लॉकचेन बेसिक्स को कवर करेगी, फिर आपको एक सिम्युलेटेड इथेरियम नोड के साथ इंटरैक्ट कराएगी - ब्लॉक डेटा पढ़ना, खाते का बैलेंस जाँचना, और लेन-देन भेजना। इस दौरान, हम ऐप्स बनाने के पारंपरिक तरीकों और इस नए विकेंद्रीकृत प्रतिमान के बीच के अंतरों को उजागर करेंगे।

(सामान्य) पूर्वापेक्षाएँ

यह पोस्ट डेवलपर्स की एक विस्तृत श्रृंखला के लिए सुलभ होने की आकांक्षा रखती है। इसमें Python टूल्स शामिल होंगे, लेकिन वे केवल विचारों को समझाने का एक माध्यम हैं - यदि आप Python डेवलपर नहीं हैं तो कोई समस्या नहीं है। हालाँकि, मैं आपके पहले से मौजूद ज्ञान के बारे में कुछ धारणाएँ बनाऊँगा, ताकि हम जल्दी से इथेरियम-विशिष्ट बातों पर आगे बढ़ सकें।

धारणाएँ:

  • आप टर्मिनल का उपयोग करना जानते हैं,
  • आपने Python कोड की कुछ पंक्तियाँ लिखी हैं,
  • आपकी मशीन पर Python संस्करण 3.6 या उससे अधिक स्थापित है (एक वर्चुअल वातावरण (opens in a new tab) के उपयोग को दृढ़ता से प्रोत्साहित किया जाता है), और
  • आपने Python के पैकेज इंस्टॉलर pip का उपयोग किया है। फिर से, यदि इनमें से कोई भी बात सही नहीं है, या आप इस लेख में दिए गए कोड को दोहराने की योजना नहीं बना रहे हैं, तो भी आप संभवतः इसे आसानी से समझ सकते हैं।

ब्लॉकचेन, संक्षेप में

इथेरियम का वर्णन करने के कई तरीके हैं, लेकिन इसके मूल में एक ब्लॉकचेन है। ब्लॉकचेन ब्लॉक्स की एक श्रृंखला से बने होते हैं, तो चलिए वहीं से शुरू करते हैं। सरल शब्दों में, इथेरियम ब्लॉकचेन पर प्रत्येक ब्लॉक केवल कुछ मेटाडेटा और लेन-देन की एक सूची है। JSON प्रारूप में, यह कुछ इस तरह दिखता है:

{
   "number": 1234567,
   "hash": "0xabc123...",
   "parentHash": "0xdef456...",
   ...,
   "transactions": [...]
}

प्रत्येक ब्लॉक में उस ब्लॉक का संदर्भ होता है जो उससे पहले आया था; parentHash केवल पिछले ब्लॉक का हैश है।

नोट: इथेरियम निश्चित आकार के मान ("हैश") उत्पन्न करने के लिए हैश फ़ंक्शंस का नियमित उपयोग करता है। हैश इथेरियम में एक महत्वपूर्ण भूमिका निभाते हैं, लेकिन अभी के लिए आप उन्हें सुरक्षित रूप से विशिष्ट आईडी मान सकते हैं।

A diagram depicting a blockchain including the data inside  each block

एक ब्लॉकचेन अनिवार्य रूप से एक लिंक्ड लिस्ट है; प्रत्येक ब्लॉक में पिछले ब्लॉक का संदर्भ होता है।

यह डेटा संरचना कोई नई बात नहीं है, लेकिन नेटवर्क को नियंत्रित करने वाले नियम (यानी, पीयर-टू-पीयर प्रोटोकॉल) नए हैं। कोई केंद्रीय प्राधिकरण नहीं है; नेटवर्क को बनाए रखने के लिए पीयर्स के नेटवर्क को सहयोग करना चाहिए, और यह तय करने के लिए प्रतिस्पर्धा करनी चाहिए कि अगले ब्लॉक में कौन से लेन-देन शामिल किए जाएँ। इसलिए, जब आप किसी मित्र को कुछ पैसे भेजना चाहते हैं, तो आपको उस लेन-देन को नेटवर्क पर प्रसारित करना होगा, फिर उसके आगामी ब्लॉक में शामिल होने की प्रतीक्षा करनी होगी।

ब्लॉकचेन के लिए यह सत्यापित करने का एकमात्र तरीका है कि पैसा वास्तव में एक उपयोगकर्ता से दूसरे उपयोगकर्ता को भेजा गया था, उस ब्लॉकचेन की मूल मुद्रा (यानी, उसके द्वारा बनाई और नियंत्रित की गई) का उपयोग करना है। इथेरियम में, इस मुद्रा को ईथर कहा जाता है, और इथेरियम ब्लॉकचेन में खाते के शेष का एकमात्र आधिकारिक रिकॉर्ड होता है।

एक नया प्रतिमान

इस नए विकेंद्रीकृत टेक स्टैक ने नए डेवलपर टूल्स को जन्म दिया है। ऐसे टूल्स कई प्रोग्रामिंग भाषाओं में मौजूद हैं, लेकिन हम इसे Python के नज़रिए से देखेंगे। फिर से दोहराते हैं: भले ही Python आपकी पसंद की भाषा न हो, फिर भी इसे समझने में ज्यादा परेशानी नहीं होनी चाहिए।

Python डेवलपर्स जो इथेरियम के साथ इंटरैक्ट करना चाहते हैं, वे संभवतः Web3.py (opens in a new tab) का उपयोग करेंगे। Web3.py एक लाइब्रेरी है जो आपके इथेरियम नोड से जुड़ने, और फिर उससे डेटा भेजने और प्राप्त करने के तरीके को बहुत सरल बनाती है।

नोट: "इथेरियम नोड" और "इथेरियम क्लाइंट" का उपयोग एक दूसरे के स्थान पर किया जाता है। दोनों ही मामलों में, यह उस सॉफ़्टवेयर को संदर्भित करता है जिसे इथेरियम नेटवर्क में भाग लेने वाला चलाता है। यह सॉफ़्टवेयर ब्लॉक डेटा पढ़ सकता है, चेन में नए ब्लॉक जोड़े जाने पर अपडेट प्राप्त कर सकता है, नए लेन-देन प्रसारित कर सकता है, और बहुत कुछ कर सकता है। तकनीकी रूप से, क्लाइंट सॉफ़्टवेयर है, और नोड वह कंप्यूटर है जो सॉफ़्टवेयर चला रहा है।

इथेरियम क्लाइंट्स को IPC (opens in a new tab), HTTP, या Websockets द्वारा पहुँच योग्य होने के लिए कॉन्फ़िगर किया जा सकता है, इसलिए Web3.py को इस कॉन्फ़िगरेशन को प्रतिबिंबित करने की आवश्यकता होगी। Web3.py इन कनेक्शन विकल्पों को प्रदाता (providers) के रूप में संदर्भित करता है। आप Web3.py इंस्टेंस को अपने नोड से जोड़ने के लिए तीन प्रदाताओं में से एक को चुनना चाहेंगे।

A diagram showing how web3.py uses IPC to connect your application to an Ethereum node

इथेरियम नोड और Web3.py को एक ही प्रोटोकॉल के माध्यम से संचार करने के लिए कॉन्फ़िगर करें, उदाहरण के लिए, इस आरेख में IPC।

एक बार Web3.py ठीक से कॉन्फ़िगर हो जाने के बाद, आप ब्लॉकचेन के साथ इंटरैक्ट करना शुरू कर सकते हैं। आगे क्या आने वाला है, इसके पूर्वावलोकन के रूप में यहाँ Web3.py के उपयोग के कुछ उदाहरण दिए गए हैं:

# ब्लॉक डेटा पढ़ें:
w3.eth.get_block('latest')

# एक लेन-देन भेजें:
w3.eth.send_transaction({'from': ..., 'to': ..., 'value': ...})

इंस्टॉलेशन

इस वॉकथ्रू में, हम केवल एक Python इंटरप्रेटर के भीतर काम करेंगे। हम कोई निर्देशिका, फ़ाइलें, क्लास या फ़ंक्शन नहीं बनाएँगे।

नोट: नीचे दिए गए उदाहरणों में, $ से शुरू होने वाले कमांड टर्मिनल में चलाए जाने के लिए हैं। ($ टाइप न करें, यह केवल लाइन की शुरुआत को दर्शाता है।)

सबसे पहले, एक्सप्लोर करने के लिए एक उपयोगकर्ता के अनुकूल वातावरण के लिए IPython (opens in a new tab) इंस्टॉल करें। IPython अन्य सुविधाओं के अलावा टैब पूर्णता प्रदान करता है, जिससे यह देखना बहुत आसान हो जाता है कि Web3.py के भीतर क्या संभव है।

pip install ipython

Web3.py को web3 नाम से प्रकाशित किया गया है। इसे इस तरह इंस्टॉल करें:

pip install web3

एक और बात - हम बाद में एक ब्लॉकचेन को सिम्युलेट करने जा रहे हैं, जिसके लिए कुछ और निर्भरताओं की आवश्यकता है। आप उन्हें इसके माध्यम से इंस्टॉल कर सकते हैं:

pip install 'web3[tester]'

आप पूरी तरह से तैयार हैं!

नोट: web3[tester] पैकेज Python 3.10.xx तक काम करता है

एक सैंडबॉक्स स्पिन अप करें

अपने टर्मिनल में ipython चलाकर एक नया Python वातावरण खोलें। यह python चलाने के बराबर है, लेकिन इसमें अधिक सुविधाएँ हैं।

ipython

यह आपके द्वारा चलाए जा रहे Python और IPython के संस्करणों के बारे में कुछ जानकारी प्रिंट करेगा, फिर आपको इनपुट की प्रतीक्षा कर रहा एक प्रॉम्प्ट दिखाई देना चाहिए:

In [1]:

अब आप एक इंटरैक्टिव Python शेल देख रहे हैं। अनिवार्य रूप से, यह खेलने के लिए एक सैंडबॉक्स है। यदि आप यहाँ तक पहुँच गए हैं, तो Web3.py को आयात करने का समय आ गया है:

In [1]: from web3 import Web3

Web3 मॉड्यूल का परिचय

इथेरियम का प्रवेश द्वार होने के अलावा, Web3 (opens in a new tab) मॉड्यूल कुछ सुविधाजनक फ़ंक्शन प्रदान करता है। आइए कुछ का पता लगाएँ।

एक इथेरियम एप्लिकेशन में, आपको आमतौर पर मुद्रा मूल्यवर्ग को बदलने की आवश्यकता होगी। Web3 मॉड्यूल केवल इसके लिए कुछ सहायक विधियाँ प्रदान करता है: 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 है, क्योंकि अक्सर लेन-देन शुल्क को इसी तरह दर्शाया जाता है।

In [2]: Web3.to_wei(1, 'ether')
Out[2]: 1000000000000000000

In [3]: Web3.from_wei(500000000, 'gwei')
Out[3]: Decimal('0.5')

Web3 मॉड्यूल पर अन्य उपयोगिता विधियों में डेटा प्रारूप कनवर्टर (उदा., toHex (opens in a new tab)), पता सहायक (उदा., isAddress (opens in a new tab)), और हैश फ़ंक्शन (उदा., keccak (opens in a new tab)) शामिल हैं। इनमें से कई को श्रृंखला में बाद में कवर किया जाएगा। सभी उपलब्ध विधियों और गुणों को देखने के लिए, Web3 टाइप करके और अवधि के बाद दो बार टैब कुंजी दबाकर IPython के ऑटो-कम्प्लीट का उपयोग करें।

चेन से बात करें

सुविधा विधियाँ बहुत अच्छी हैं, लेकिन चलिए ब्लॉकचेन पर आगे बढ़ते हैं। अगला कदम Web3.py को एक इथेरियम नोड के साथ संचार करने के लिए कॉन्फ़िगर करना है। यहाँ हमारे पास IPC, HTTP, या Websocket प्रदाताओं का उपयोग करने का विकल्प है।

हम इस रास्ते पर नहीं जाएँगे, लेकिन HTTP प्रदाता का उपयोग करने वाले एक संपूर्ण वर्कफ़्लो का उदाहरण कुछ इस तरह दिख सकता है:

  • एक इथेरियम नोड डाउनलोड करें, उदा., Geth (opens in a new tab)
  • एक टर्मिनल विंडो में Geth शुरू करें और नेटवर्क को सिंकिंग करने के लिए इसकी प्रतीक्षा करें। डिफ़ॉल्ट HTTP पोर्ट 8545 है, लेकिन इसे कॉन्फ़िगर किया जा सकता है।
  • Web3.py को localhost:8545 पर HTTP के माध्यम से नोड से जुड़ने के लिए कहें। w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))
  • नोड के साथ इंटरैक्ट करने के लिए w3 इंस्टेंस का उपयोग करें।

हालाँकि यह इसे करने का एक "वास्तविक" तरीका है, सिंकिंग प्रक्रिया में घंटों लगते हैं और यदि आप केवल एक विकास वातावरण चाहते हैं तो यह अनावश्यक है। Web3.py इस उद्देश्य के लिए एक चौथा प्रदाता, EthereumTesterProvider उजागर करता है। यह टेस्टर प्रदाता एक सिम्युलेटेड इथेरियम नोड से जुड़ता है जिसमें आरामदेह अनुमतियाँ और खेलने के लिए नकली मुद्रा होती है।

A diagram showing the EthereumTesterProvider linking your web3.py application to a simulated Ethereum node

EthereumTesterProvider एक सिम्युलेटेड नोड से जुड़ता है और त्वरित विकास वातावरण के लिए उपयोगी है।

उस सिम्युलेटेड नोड को eth-tester (opens in a new tab) कहा जाता है और हमने इसे pip install web3[tester] कमांड के हिस्से के रूप में इंस्टॉल किया है। इस टेस्टर प्रदाता का उपयोग करने के लिए Web3.py को कॉन्फ़िगर करना इतना आसान है:

In [4]: w3 = Web3(Web3.EthereumTesterProvider())

अब आप चेन को सर्फ करने के लिए तैयार हैं! यह ऐसी बात नहीं है जो लोग कहते हैं। मैंने बस इसे बना दिया। आइए एक त्वरित दौरा करें।

त्वरित दौरा

सबसे पहले, एक बुनियादी जाँच:

In [5]: w3.is_connected()
Out[5]: True

चूँकि हम टेस्टर प्रदाता का उपयोग कर रहे हैं, यह बहुत मूल्यवान परीक्षण नहीं है, लेकिन यदि यह विफल हो जाता है, तो संभावना है कि आपने w3 चर को इंस्टेंटिएट करते समय कुछ गलत टाइप किया है। दोबारा जाँचें कि आपने आंतरिक कोष्ठक शामिल किए हैं, यानी, Web3.EthereumTesterProvider()

टूर स्टॉप #1: खाते

सुविधा के लिए, टेस्टर प्रदाता ने कुछ खाते बनाए और उन्हें टेस्ट ईथर के साथ प्रीलोड किया।

सबसे पहले, आइए उन खातों की एक सूची देखें:

In [6]: w3.eth.accounts
Out[6]: ['0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf',
 '0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF',
 '0x6813Eb9362372EEF6200f3b1dbC3f819671cBA69', ...]

यदि आप इस कमांड को चलाते हैं, तो आपको 0x से शुरू होने वाले दस स्ट्रिंग्स की एक सूची दिखाई देनी चाहिए। प्रत्येक एक सार्वजनिक पता है और कुछ मायनों में, चेकिंग खाते के खाता संख्या के समान है। आप यह पता किसी ऐसे व्यक्ति को प्रदान करेंगे जो आपको ईथर भेजना चाहता है।

जैसा कि उल्लेख किया गया है, टेस्टर प्रदाता ने इनमें से प्रत्येक खाते को कुछ टेस्ट ईथर के साथ प्रीलोड किया है। आइए पता करें कि पहले खाते में कितना है:

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 केवल खाली बाइट्स का एक समूह है। यह दर्शाता है कि यह चेन का पहला ब्लॉक है, जिसे जेनेसिस ब्लॉक के रूप में भी जाना जाता है।

टूर स्टॉप #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
})

यह आमतौर पर वह बिंदु होता है जहाँ आप अपने लेन-देन के एक नए ब्लॉक में शामिल होने के लिए कई सेकंड तक प्रतीक्षा करेंगे। पूरी प्रक्रिया कुछ इस तरह होती है:

  1. एक लेन-देन सबमिट करें और लेनदेन हैश को पकड़ कर रखें। जब तक लेन-देन वाला ब्लॉक बनाया और प्रसारित नहीं किया जाता है, तब तक लेन-देन "लंबित" रहता है। tx_hash = w3.eth.send_transaction({ … })
  2. लेन-देन के एक ब्लॉक में शामिल होने की प्रतीक्षा करें: w3.eth.wait_for_transaction_receipt(tx_hash)
  3. एप्लिकेशन लॉजिक जारी रखें। सफल लेन-देन देखने के लिए: w3.eth.get_transaction(tx_hash)

हमारा सिम्युलेटेड वातावरण लेन-देन को तुरंत एक नए ब्लॉक में जोड़ देगा, ताकि हम तुरंत लेन-देन देख सकें:

आप यहाँ कुछ परिचित विवरण देखेंगे: 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 इकाइयाँ) को एक आधार शुल्क से गुणा किया जाता है जो नेटवर्क गतिविधि के अनुसार भिन्न होता है और साथ ही एक टिप जो उस सत्यापक को जाती है जो लेन-देन को एक ब्लॉक में शामिल करता है।

गैस के बारे में अधिक जानकारी

नोट: सार्वजनिक नेटवर्क पर, नेटवर्क की माँग और आप कितनी जल्दी लेन-देन को संसाधित करना चाहते हैं, इसके आधार पर लेन-देन शुल्क परिवर्तनशील होते हैं। यदि आप इस बात में रुचि रखते हैं कि शुल्क की गणना कैसे की जाती है, तो लेन-देन को एक ब्लॉक में कैसे शामिल किया जाता है पर मेरी पिछली पोस्ट देखें।

और साँस लें

हम कुछ समय से यह कर रहे हैं, इसलिए ब्रेक लेने के लिए यह एक अच्छी जगह लगती है। गहराई में जाने का सिलसिला जारी है, और हम इस श्रृंखला के भाग दो में खोज जारी रखेंगे। आने वाली कुछ अवधारणाएँ: एक वास्तविक नोड से जुड़ना, स्मार्ट कॉन्ट्रैक्ट्स, और टोकन। क्या आपके पास अनुवर्ती प्रश्न हैं? मुझे बताएँ! आपकी प्रतिक्रिया प्रभावित करेगी कि हम यहाँ से कहाँ जाते हैं। ट्विटर (opens in a new tab) के माध्यम से अनुरोधों का स्वागत है।