ایک Python ڈیولپر کا ایتھیریم سے تعارف، حصہ ۱
تو، آپ نے اس ایتھیریم کے بارے میں سنا ہے اور اس کی گہرائیوں میں جانے کے لیے تیار ہیں؟ یہ پوسٹ تیزی سے کچھ بلاک چین کی بنیادی باتوں کا احاطہ کرے گی، پھر آپ کو ایک نقلی ایتھیریم نوڈ کے ساتھ تعامل کرنے کے قابل بنائے گی – بلاک کا ڈیٹا پڑھنا، اکاؤنٹ کے بیلنس چیک کرنا، اور ٹرانزیکشنز بھیجنا۔ اس دوران، ہم ایپس بنانے کے روایتی طریقوں اور اس نئے لامركزی نمونے کے درمیان فرق کو نمایاں کریں گے۔
(نرم) پیشگی شرائط
یہ پوسٹ ڈیولپرز کی ایک وسیع رینج کے لیے قابل رسائی ہونے کی خواہش رکھتی ہے۔ اس میں Python ٹولز شامل ہوں گے، لیکن وہ صرف خیالات کو سمجھانے کا ایک ذریعہ ہیں – اگر آپ Python ڈیولپر نہیں ہیں تو کوئی مسئلہ نہیں۔ تاہم، میں آپ کے پہلے سے موجود علم کے بارے میں صرف چند مفروضے قائم کروں گا، تاکہ ہم تیزی سے ایتھیریم سے متعلقہ حصوں کی طرف بڑھ سکیں۔
مفروضے:
- آپ ٹرمینل کا استعمال جانتے ہیں،
- آپ نے Python کوڈ کی چند لائنیں لکھی ہیں،
- آپ کی مشین پر Python کا ورژن 3.6 یا اس سے زیادہ انسٹال ہے (ایک ورچوئل انوائرنمنٹ (opens in a new tab) کے استعمال کی سختی سے حوصلہ افزائی کی جاتی ہے)، اور
- آپ نے
pipاستعمال کیا ہے، جو کہ Python کا پیکیج انسٹالر ہے۔ ایک بار پھر، اگر ان میں سے کوئی بھی بات درست نہیں ہے، یا آپ اس مضمون میں موجود کوڈ کو دوبارہ چلانے کا ارادہ نہیں رکھتے، تب بھی آپ ممکنہ طور پر اسے بخوبی سمجھ سکیں گے۔
بلاک چینز، مختصراً
ایتھیریم کو بیان کرنے کے کئی طریقے ہیں، لیکن اس کے مرکز میں ایک بلاک چین ہے۔ بلاک چینز بلاکس کے ایک سلسلے سے بنی ہوتی ہیں، تو آئیے وہیں سے شروع کرتے ہیں۔ آسان ترین الفاظ میں، ایتھیریم بلاک چین پر ہر بلاک صرف کچھ میٹا ڈیٹا اور ٹرانزیکشنز کی ایک فہرست ہوتا ہے۔ JSON فارمیٹ میں، یہ کچھ اس طرح لگتا ہے:
{
"number": 1234567,
"hash": "0xabc123...",
"parentHash": "0xdef456...",
...,
"transactions": [...]
}
ہر بلاک میں اس سے پہلے آنے والے بلاک کا حوالہ ہوتا ہے؛ parentHash محض پچھلے بلاک کا ہیش ہے۔
ایک بلاک چین بنیادی طور پر ایک لنکڈ لسٹ (linked list) ہے؛ ہر بلاک میں پچھلے بلاک کا حوالہ ہوتا ہے۔
یہ ڈیٹا اسٹرکچر کوئی نئی چیز نہیں ہے، لیکن وہ اصول (یعنی پیئر ٹو پیئر پروٹوکول) جو نیٹ ورک کو کنٹرول کرتے ہیں، وہ نئے ہیں۔ کوئی مرکزی اتھارٹی نہیں ہے؛ نیٹ ورک کو برقرار رکھنے کے لیے پیئرز کے نیٹ ورک کو آپس میں تعاون کرنا پڑتا ہے، اور یہ فیصلہ کرنے کے لیے مقابلہ کرنا پڑتا ہے کہ اگلے بلاک میں کن ٹرانزیکشنز کو شامل کیا جائے۔ لہذا، جب آپ کسی دوست کو کچھ رقم بھیجنا چاہتے ہیں، تو آپ کو اس ٹرانزیکشن کو نیٹ ورک پر نشر کرنا ہوگا، اور پھر اس کے آنے والے بلاک میں شامل ہونے کا انتظار کرنا ہوگا۔
بلاک چین کے لیے یہ تصدیق کرنے کا واحد طریقہ کہ رقم واقعی ایک صارف سے دوسرے صارف کو بھیجی گئی تھی، یہ ہے کہ اس بلاک چین کی مقامی کرنسی (یعنی اسی کے ذریعے بنائی اور کنٹرول کی گئی) استعمال کی جائے۔ ایتھیریم میں، اس کرنسی کو ایتھر کہا جاتا ہے، اور ایتھیریم بلاک چین میں اکاؤنٹ کے بیلنس کا واحد سرکاری ریکارڈ موجود ہوتا ہے۔
ایک نیا نمونہ
اس نئے لامركزی ٹیک اسٹیک نے نئے ڈیولپر ٹولز کو جنم دیا ہے۔ ایسے ٹولز کئی پروگرامنگ زبانوں میں موجود ہیں، لیکن ہم اسے Python کے نقطہ نظر سے دیکھیں گے۔ دوبارہ بتاتے چلیں: یہاں تک کہ اگر Python آپ کی پسندیدہ زبان نہیں ہے، تب بھی آپ کو اسے سمجھنے میں زیادہ پریشانی نہیں ہونی چاہیے۔
Python ڈیولپرز جو ایتھیریم کے ساتھ تعامل کرنا چاہتے ہیں، وہ ممکنہ طور پر Web3.py (opens in a new tab) کا انتخاب کریں گے۔ Web3.py ایک لائبریری ہے جو آپ کے ایتھیریم نوڈ سے جڑنے، اور پھر اس سے ڈیٹا بھیجنے اور وصول کرنے کے طریقے کو بہت آسان بناتی ہے۔
ایتھیریم کلائنٹس کو اس طرح کنفیگر کیا جا سکتا ہے کہ ان تک IPC (opens in a new tab)، HTTP، یا Websockets کے ذریعے رسائی حاصل کی جا سکے، لہذا Web3.py کو اس کنفیگریشن کی عکس بندی کرنے کی ضرورت ہوگی۔ Web3.py ان کنکشن کے اختیارات کو پرووائیڈرز کہتا ہے۔ آپ Web3.py انسٹینس کو اپنے نوڈ کے ساتھ جوڑنے کے لیے ان تینوں پرووائیڈرز میں سے کسی ایک کا انتخاب کرنا چاہیں گے۔
ایتھیریم نوڈ اور 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 ether = 1000000000000000000 wei1 wei = 0.000000000000000001 etherکچھ قدروں کو 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 کو بتائیں کہ وہ HTTP کے ذریعے،
localhost:8545پر نوڈ سے جڑے۔w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545')) - نوڈ کے ساتھ تعامل کرنے کے لیے
w3انسٹینس کا استعمال کریں۔
اگرچہ یہ کام کرنے کا ایک "حقیقی" طریقہ ہے، لیکن ہم آہنگی کے عمل میں گھنٹوں لگتے ہیں اور اگر آپ صرف ایک ڈیولپمنٹ ماحول چاہتے ہیں تو یہ غیر ضروری ہے۔ Web3.py اس مقصد کے لیے ایک چوتھا پرووائیڈر، EthereumTesterProvider پیش کرتا ہے۔ یہ ٹیسٹر پرووائیڈر ایک نقلی ایتھیریم نوڈ سے جڑتا ہے جس میں نرم اجازتیں اور کھیلنے کے لیے نقلی کرنسی ہوتی ہے۔
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()۔
دورے کا پہلا پڑاؤ: اکاؤنٹس
سہولت کے طور پر، ٹیسٹر پرووائیڈر نے کچھ اکاؤنٹس بنائے اور ان میں پہلے سے ٹیسٹ ایتھر لوڈ کر دیا۔
سب سے پہلے، آئیے ان اکاؤنٹس کی فہرست دیکھتے ہیں:
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')
ایک ملین ٹیسٹ ایتھر — پھر بھی برا نہیں ہے۔
دورے کا دوسرا پڑاؤ: بلاک کا ڈیٹا
آئیے اس نقلی بلاک چین کی حالت پر ایک نظر ڈالتے ہیں:
In [9]: w3.eth.get_block('latest')
Out[9]: AttributeDict({
'number': 0,
'hash': HexBytes('0x9469878...'),
'parentHash': HexBytes('0x0000000...'),
...
'transactions': []
})
ایک بلاک کے بارے میں بہت سی معلومات واپس آتی ہیں، لیکن یہاں صرف چند چیزوں کی نشاندہی کرنی ہے:
- بلاک نمبر صفر ہے — اس سے کوئی فرق نہیں پڑتا کہ آپ نے ٹیسٹر پرووائیڈر کو کتنی دیر پہلے کنفیگر کیا تھا۔ اصلی ایتھیریم نیٹ ورک کے برعکس، جو ہر 12 سیکنڈ میں ایک نیا بلاک شامل کرتا ہے، یہ نقل اس وقت تک انتظار کرے گی جب تک کہ آپ اسے کرنے کے لیے کوئی کام نہ دیں۔
transactionsایک خالی فہرست ہے، اسی وجہ سے: ہم نے ابھی تک کچھ نہیں کیا ہے۔ یہ پہلا بلاک ایک خالی بلاک ہے، صرف چین کو شروع کرنے کے لیے۔- غور کریں کہ
parentHashصرف خالی بائٹس کا ایک مجموعہ ہے۔ یہ اس بات کی نشاندہی کرتا ہے کہ یہ چین کا پہلا بلاک ہے، جسے ابتدائی بلاک بھی کہا جاتا ہے۔
دورے کا تیسرا پڑاؤ: ٹرانزیکشنز
ہم بلاک صفر پر اس وقت تک پھنسے ہوئے ہیں جب تک کہ کوئی زیرِ التوا لین دین نہ ہو، تو آئیے اسے ایک دیتے ہیں۔ ایک اکاؤنٹ سے دوسرے اکاؤنٹ میں کچھ ٹیسٹ ایتھر بھیجیں:
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 یونٹس) کو ایک بنیادی فیس سے ضرب دے کر نکالی جاتی ہے جو نیٹ ورک کی سرگرمی کے لحاظ سے مختلف ہوتی ہے، اس کے علاوہ ایک ٹپ جو اس توثیق کار کو جاتی ہے جو ٹرانزیکشن کو بلاک میں شامل کرتا ہے۔
گیس کے بارے میں مزید
اور سانس لیں
ہم کافی دیر سے یہ کر رہے ہیں، لہذا یہ وقفہ لینے کے لیے ایک اچھی جگہ معلوم ہوتی ہے۔ یہ گہرائیوں کا سفر جاری ہے، اور ہم اس سیریز کے دوسرے حصے میں کھوج جاری رکھیں گے۔ آنے والے کچھ تصورات: ایک حقیقی نوڈ سے جڑنا، اسمارٹ کانٹریکٹس، اور ٹوکنز۔ کیا آپ کے مزید سوالات ہیں؟ مجھے بتائیں! آپ کی رائے اس بات پر اثر انداز ہوگی کہ ہم یہاں سے کہاں جاتے ہیں۔ ٹوئٹر (opens in a new tab) کے ذریعے درخواستوں کا خیرمقدم ہے۔


