---
title: "⁦مقدمة مطور ⁦Python⁩ إلى إيثيريوم، الجزء الأول⁩"
description: "⁦مقدمة لتطوير إيثيريوم، مفيدة بشكل خاص لمن لديهم معرفة بلغة البرمجة ⁦Python⁩⁩"
author: "مارك غارو"
lang: ar
tags:
  - python
  - web3.py
skill: beginner
breadcrumb: "⁦إيثيريوم مع ⁦Python⁩⁩"
published: 2020-09-08
source: Snake charmers
sourceUrl: https://snakecharmers.ethereum.org/a-developers-guide-to-ethereum-pt-1/
---

إذن، لقد سمعت عن إيثيريوم هذا وأنت مستعد للغوص في تفاصيله؟ سيغطي هذا المنشور بسرعة بعض أساسيات سلسلة الكتل، ثم يجعلك تتفاعل مع عقدة إيثيريوم محاكاة – قراءة بيانات الكتلة، والتحقق من أرصدة الحسابات، وإرسال المعاملات. على طول الطريق، سنسلط الضوء على الاختلافات بين الطرق التقليدية لبناء التطبيقات وهذا النموذج اللامركزي الجديد.

## المتطلبات الأساسية (المرنة) {#soft-prerequisites}

يطمح هذا المنشور إلى أن يكون في متناول مجموعة واسعة من المطورين. سيتم استخدام [أدوات <span dir="ltr">Python</span>](/developers/docs/programming-languages/python/)، لكنها مجرد وسيلة لتوصيل الأفكار – لا توجد مشكلة إذا لم تكن مطور <span dir="ltr">Python</span>. ومع ذلك، سأضع بعض الافتراضات حول ما تعرفه بالفعل، حتى نتمكن من الانتقال بسرعة إلى الأجزاء الخاصة بإيثيريوم.

الافتراضات:

- يمكنك التعامل مع الوحدة الطرفية (terminal)،
- لقد كتبت بضعة أسطر من كود <span dir="ltr">Python</span>،
- تم تثبيت <span dir="ltr">Python</span> الإصدار <span dir="ltr">3.6</span> أو أحدث على جهازك (يُنصح بشدة باستخدام [بيئة افتراضية](https://realpython.com/effective-python-environment/#virtual-environments))، و
- لقد استخدمت `pip`، وهو مثبت حزم <span dir="ltr">Python</span>.
  مرة أخرى، إذا كان أي من هذه الافتراضات غير صحيح، أو كنت لا تخطط لإعادة إنتاج الكود في هذه المقالة، فمن المحتمل أنك لا تزال قادرًا على المتابعة بشكل جيد.

## سلاسل الكتل، باختصار {#blockchains-briefly}

هناك العديد من الطرق لوصف إيثيريوم، ولكن في جوهره توجد سلسلة الكتل. تتكون سلاسل الكتل من سلسلة من الكتل، لذا لنبدأ من هناك. بعبارات بسيطة، كل كتلة على سلسلة كتل إيثيريوم هي مجرد بعض بيانات وصفية وقائمة من المعاملات. بتنسيق <span dir="ltr">JSON</span>، يبدو هذا كالتالي:

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

تحتوي كل [كتلة](/developers/docs/blocks/) على إشارة إلى الكتلة التي سبقتها؛ `parentHash` هو ببساطة تجزئة الكتلة السابقة.

<FeaturedText>ملاحظة: يستخدم إيثيريوم بانتظام <a href="https://wikipedia.org/wiki/Hash_function">دوال التجزئة</a> لإنتاج قيم ذات حجم ثابت ("تجزئات"). تلعب التجزئات دورًا مهمًا في إيثيريوم، ولكن يمكنك التفكير فيها بأمان كمعرفات فريدة في الوقت الحالي.</FeaturedText>

![A diagram depicting a blockchain including the data inside  each block](./blockchain-diagram.png)

_سلسلة الكتل هي في الأساس قائمة مرتبطة؛ كل كتلة لها إشارة إلى الكتلة السابقة._

بنية البيانات هذه ليست جديدة، لكن القواعد (أي بروتوكولات نظير إلى نظير) التي تحكم الشبكة هي الجديدة. لا توجد سلطة مركزية؛ يجب أن تتعاون شبكة النظراء للحفاظ على الشبكة، وتتنافس لتحديد المعاملات التي سيتم تضمينها في الكتلة التالية. لذلك، عندما تريد إرسال بعض الأموال إلى صديق، ستحتاج إلى بث تلك المعاملة إلى الشبكة، ثم الانتظار حتى يتم تضمينها في كتلة قادمة.

الطريقة الوحيدة لسلسلة الكتل للتحقق من أن الأموال قد أُرسلت حقًا من مستخدم إلى آخر هي استخدام عملة أصلية (أي تم إنشاؤها وإدارتها بواسطة) سلسلة الكتل تلك. في إيثيريوم، تسمى هذه العملة إيثر، وتحتوي سلسلة كتل إيثيريوم على السجل الرسمي الوحيد لأرصدة الحسابات.

## نموذج جديد {#a-new-paradigm}

أنتجت هذه الحزمة التقنية اللامركزية الجديدة أدوات مطورين جديدة. توجد مثل هذه الأدوات في العديد من لغات البرمجة، لكننا سننظر من خلال عدسة <span dir="ltr">Python</span>. للتأكيد: حتى لو لم تكن <span dir="ltr">Python</span> هي لغتك المفضلة، فلن يكون من الصعب المتابعة.

من المرجح أن يلجأ مطورو <span dir="ltr">Python</span> الذين يرغبون في التفاعل مع إيثيريوم إلى [<span dir="ltr">Web3.py</span>](https://web3py.readthedocs.io/). <span dir="ltr">Web3.py</span> هي مكتبة تبسط بشكل كبير طريقة اتصالك بعقدة إيثيريوم، ثم إرسال واستقبال البيانات منها.

<FeaturedText>ملاحظة: يتم استخدام "عقدة إيثيريوم" و"عميل إيثيريوم" بالتبادل. في كلتا الحالتين، يشير ذلك إلى البرنامج الذي يقوم بتشغيله أحد المشاركين في شبكة إيثيريوم. يمكن لهذا البرنامج قراءة بيانات الكتلة، وتلقي التحديثات عند إضافة كتل جديدة إلى السلسلة، وبث معاملات جديدة، والمزيد. من الناحية الفنية، العميل هو البرنامج، والعقدة هي الكمبيوتر الذي يقوم بتشغيل البرنامج.</FeaturedText>

يمكن تكوين [عملاء إيثيريوم](/developers/docs/nodes-and-clients/) ليكونوا قابلين للوصول عن طريق [<span dir="ltr">IPC</span>](https://wikipedia.org/wiki/Inter-process_communication) أو <span dir="ltr">HTTP</span> أو <span dir="ltr">Websockets</span>، لذلك ستحتاج <span dir="ltr">Web3.py</span> إلى عكس هذا التكوين. تشير <span dir="ltr">Web3.py</span> إلى خيارات الاتصال هذه باسم **المزودين (providers)**. ستحتاج إلى اختيار أحد المزودين الثلاثة لربط مثيل <span dir="ltr">Web3.py</span> بعقدتك.

![A diagram showing how web3.py uses IPC to connect your application to an Ethereum node](./web3py-and-nodes.png)

_قم بتكوين عقدة إيثيريوم و<span dir="ltr">Web3.py</span> للتواصل عبر نفس البروتوكول، على سبيل المثال، <span dir="ltr">IPC</span> في هذا المخطط._

بمجرد تكوين <span dir="ltr">Web3.py</span> بشكل صحيح، يمكنك البدء في التفاعل مع سلسلة الكتل. إليك بعض الأمثلة على استخدام <span dir="ltr">Web3.py</span> كمعاينة لما سيأتي:

```python
# قراءة بيانات الكتلة:
w3.eth.get_block('latest')

# إرسال معاملة:
w3.eth.send_transaction({'from': ..., 'to': ..., 'value': ...})
```

## التثبيت {#installation}

في هذه الجولة التفصيلية، سنعمل فقط داخل مترجم <span dir="ltr">Python</span>. لن نقوم بإنشاء أي أدلة أو ملفات أو فئات أو دوال.

<FeaturedText>ملاحظة: في الأمثلة أدناه، الأوامر التي تبدأ بـ `$` مخصصة للتشغيل في الوحدة الطرفية. (لا تكتب `$`، فهو يشير فقط إلى بداية السطر.)</FeaturedText>

أولاً، قم بتثبيت [<span dir="ltr">IPython</span>](https://ipython.org/) للحصول على بيئة سهلة الاستخدام للاستكشاف فيها. يوفر <span dir="ltr">IPython</span> إكمال علامة التبويب (tab completion)، من بين ميزات أخرى، مما يسهل كثيرًا رؤية ما هو ممكن داخل <span dir="ltr">Web3.py</span>.

```bash
pip install ipython
```

يتم نشر <span dir="ltr">Web3.py</span> تحت اسم `web3`. قم بتثبيته كالتالي:

```bash
pip install web3
```

شيء آخر – سنقوم بمحاكاة سلسلة الكتل لاحقًا، مما يتطلب بعض التبعيات الإضافية. يمكنك تثبيتها عبر:

```bash
pip install 'web3[tester]'
```

أنت جاهز تمامًا للبدء!

ملاحظة: تعمل حزمة `web3[tester]` حتى إصدار <span dir="ltr">Python 3.10.xx</span>

## تشغيل بيئة اختبار (sandbox) {#spin-up-a-sandbox}

افتح بيئة <span dir="ltr">Python</span> جديدة عن طريق تشغيل `ipython` في الوحدة الطرفية الخاصة بك. هذا مشابه لتشغيل `python`، ولكنه يأتي مع المزيد من الميزات والإضافات.

```bash
ipython
```

سيؤدي هذا إلى طباعة بعض المعلومات حول إصدارات <span dir="ltr">Python</span> و<span dir="ltr">IPython</span> التي تقوم بتشغيلها، ثم يجب أن ترى موجهًا ينتظر الإدخال:

```python
In [1]:
```

أنت تنظر إلى صدفة <span dir="ltr">Python</span> تفاعلية الآن. في الأساس، إنها بيئة اختبار للعب فيها. إذا وصلت إلى هذا الحد، فقد حان الوقت لاستيراد <span dir="ltr">Web3.py</span>:

```python
In [1]: from web3 import Web3
```

## تقديم وحدة Web3 {#introducing-the-web3-module}

إلى جانب كونها بوابة إلى إيثيريوم، تقدم وحدة [<span dir="ltr">Web3</span>](https://web3py.readthedocs.io/en/stable/overview.html#base-api) بعض دوال المساعدة المريحة. دعنا نستكشف بعضها.

في تطبيق إيثيريوم، ستحتاج عادةً إلى تحويل فئات العملات. توفر وحدة <span dir="ltr">Web3</span> طريقتين مساعدتين لهذا الغرض فقط: [<span dir="ltr">from_wei</span>](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.from_wei) و[<span dir="ltr">to_wei</span>](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.to_wei).

<FeaturedText>
ملاحظة: أجهزة الكمبيوتر سيئة السمعة في التعامل مع الرياضيات العشرية. للتغلب على هذا، غالبًا ما يقوم المطورون بتخزين المبالغ بالدولار بالسنتات. على سبيل المثال، قد يتم تخزين عنصر بسعر <span dir="ltr">$5.99</span> في قاعدة البيانات كـ <span dir="ltr">599</span>.

يتم استخدام نمط مشابه عند التعامل مع المعاملات بـ <b>إيثر</b>. ومع ذلك، بدلاً من نقطتين عشريتين، يحتوي إيثر على <span dir="ltr">18</span>! تسمى أصغر فئة من إيثر <b><span dir="ltr">Wei</span></b>، لذلك هذه هي القيمة المحددة عند إرسال المعاملات.

<span dir="ltr">1 ether = 1000000000000000000 wei</span>

<span dir="ltr">1 wei = 0.000000000000000001 ether</span>

</FeaturedText>

حاول تحويل بعض القيم من وإلى <span dir="ltr">Wei</span>. لاحظ أن [هناك أسماء للعديد من الفئات](https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations) بين إيثر و<span dir="ltr">Wei</span>. من أشهرها **<span dir="ltr">Gwei</span>**، حيث يتم تمثيل رسوم المعاملة بها غالبًا.

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

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

تتضمن طرق الأدوات المساعدة الأخرى في وحدة <span dir="ltr">Web3</span> محولات تنسيق البيانات (مثل [`toHex`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.toHex))، ومساعدات العناوين (مثل [`isAddress`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.isAddress))، ودوال التجزئة (مثل [`keccak`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.keccak)). سيتم تغطية العديد من هذه لاحقًا في السلسلة. لعرض جميع الطرق والخصائص المتاحة، استخدم الإكمال التلقائي لـ <span dir="ltr">IPython</span> عن طريق كتابة `Web3`. والضغط على مفتاح الجدولة (tab) مرتين بعد النقطة.

## التحدث إلى السلسلة {#talk-to-the-chain}

طرق المساعدة المريحة رائعة، لكن دعنا ننتقل إلى سلسلة الكتل. الخطوة التالية هي تكوين <span dir="ltr">Web3.py</span> للتواصل مع عقدة إيثيريوم. هنا لدينا خيار استخدام مزودي <span dir="ltr">IPC</span> أو <span dir="ltr">HTTP</span> أو <span dir="ltr">Websocket</span>.

لن نسلك هذا المسار، ولكن قد يبدو مثال سير العمل الكامل باستخدام مزود <span dir="ltr">HTTP</span> كالتالي:

- قم بتنزيل عقدة إيثيريوم، على سبيل المثال، [جو إيثريوم (geth)](https://geth.ethereum.org/).
- ابدأ تشغيل <span dir="ltr">Geth</span> في نافذة طرفية واحدة وانتظر حتى تتم المزامنة مع الشبكة. منفذ <span dir="ltr">HTTP</span> الافتراضي هو `8545`، ولكنه قابل للتكوين.
- أخبر <span dir="ltr">Web3.py</span> بالاتصال بالعقدة عبر <span dir="ltr">HTTP</span>، على `localhost:8545`.
  `w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))`
- استخدم مثيل `w3` للتفاعل مع العقدة.

في حين أن هذه إحدى الطرق "الحقيقية" للقيام بذلك، فإن عملية المزامنة تستغرق ساعات وهي غير ضرورية إذا كنت تريد فقط بيئة تطوير. تكشف <span dir="ltr">Web3.py</span> عن مزود رابع لهذا الغرض، وهو **<span dir="ltr">EthereumTesterProvider</span>**. يرتبط مزود الاختبار هذا بعقدة إيثيريوم محاكاة بأذونات مريحة وعملة مزيفة للعب بها.

![A diagram showing the EthereumTesterProvider linking your web3.py application to a simulated Ethereum node](./ethereumtesterprovider.png)

_يتصل <span dir="ltr">EthereumTesterProvider</span> بعقدة محاكاة وهو مفيد لبيئات التطوير السريعة._

تسمى تلك العقدة المحاكاة [<span dir="ltr">eth-tester</span>](https://github.com/ethereum/eth-tester) وقمنا بتثبيتها كجزء من أمر `pip install web3[tester]`. تكوين <span dir="ltr">Web3.py</span> لاستخدام مزود الاختبار هذا بسيط كالتالي:

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

الآن أنت مستعد لتصفح السلسلة! هذا ليس شيئًا يقوله الناس. لقد اختلقت ذلك للتو. لنأخذ جولة سريعة.

## الجولة السريعة {#the-quick-tour}

أولاً وقبل كل شيء، فحص السلامة:

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

نظرًا لأننا نستخدم مزود الاختبار، فهذا ليس اختبارًا ذا قيمة كبيرة، ولكن إذا فشل، فمن المحتمل أنك كتبت شيئًا خاطئًا عند إنشاء متغير `w3`. تحقق مرة أخرى من أنك قمت بتضمين الأقواس الداخلية، أي `Web3.EthereumTesterProvider()`.

## محطة الجولة رقم 1: [الحسابات](/developers/docs/accounts/) {#tour-stop-1-accounts}

للراحة، قام مزود الاختبار بإنشاء بعض الحسابات وتحميلها مسبقًا بإيثر اختباري.

أولاً، لنرى قائمة بتلك الحسابات:

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

إذا قمت بتشغيل هذا الأمر، يجب أن ترى قائمة بعشر سلاسل نصية تبدأ بـ `0x`. كل منها عبارة عن **عنوان عام** وهو، في بعض النواحي، مشابه لرقم الحساب في الحساب الجاري. ستقدم هذا العنوان لشخص يريد إرسال إيثر إليك.

كما ذكرنا، قام مزود الاختبار بتحميل كل من هذه الحسابات مسبقًا ببعض الإيثر الاختباري. لنكتشف مقدار ما يوجد في الحساب الأول:

```python
In [7]: w3.eth.get_balance(w3.eth.accounts[0])
Out[7]: 1000000000000000000000000
```

هذا الكثير من الأصفار! قبل أن تذهب ضاحكًا طوال الطريق إلى البنك المزيف، تذكر هذا الدرس حول فئات العملات من قبل. يتم تمثيل قيم إيثر بأصغر فئة، <span dir="ltr">Wei</span>. قم بتحويل ذلك إلى إيثر:

```python
In [8]: w3.from_wei(1000000000000000000000000, 'ether')
Out[8]: Decimal('1000000')
```

مليون إيثر اختباري — لا يزال ليس سيئًا للغاية.

## محطة الجولة رقم 2: بيانات الكتلة {#tour-stop-2-block-data}

لنلقِ نظرة خاطفة على حالة سلسلة الكتل المحاكاة هذه:

```python
In [9]: w3.eth.get_block('latest')
Out[9]: AttributeDict({
   'number': 0,
   'hash': HexBytes('0x9469878...'),
   'parentHash': HexBytes('0x0000000...'),
   ...
   'transactions': []
})
```

يتم إرجاع الكثير من المعلومات حول الكتلة، ولكن هناك بعض الأشياء التي يجب الإشارة إليها هنا:

- رقم الكتلة هو صفر — بغض النظر عن المدة التي قمت فيها بتكوين مزود الاختبار. على عكس شبكة إيثيريوم الحقيقية، التي تضيف كتلة جديدة كل <span dir="ltr">12</span> ثانية، سينتظر هذا المحاكي حتى تعطيه بعض العمل للقيام به.
- `transactions` هي قائمة فارغة، لنفس السبب: لم نفعل أي شيء بعد. هذه الكتلة الأولى هي **كتلة فارغة**، فقط لبدء السلسلة.
- لاحظ أن `parentHash` هو مجرد مجموعة من البايتات الفارغة. هذا يدل على أنها الكتلة الأولى في السلسلة، والمعروفة أيضًا باسم **كتلة التكوين**.

## محطة الجولة رقم 3: [المعاملات](/developers/docs/transactions/) {#tour-stop-3-transactions}

نحن عالقون في الكتلة صفر حتى تكون هناك معاملة معلقة، لذا دعنا نعطيها واحدة. أرسل بضعة إيثر اختباري من حساب إلى آخر:

```python
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)`

ستضيف بيئتنا المحاكاة المعاملة في كتلة جديدة على الفور، حتى نتمكن من عرض المعاملة فورًا:

```python
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` الخاص بنا. الجزء الآخر المطمئن هو أن هذه المعاملة تم تضمينها كأول معاملة (`'transactionIndex': 0`) داخل الكتلة رقم <span dir="ltr">1</span>.

يمكننا أيضًا التحقق بسهولة من نجاح هذه المعاملة عن طريق التحقق من أرصدة الحسابين المعنيين. يجب أن يكون قد تم نقل ثلاثة إيثر من أحدهما إلى الآخر.

```python
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
```

الأخير يبدو جيدًا! ارتفع الرصيد من <span dir="ltr">1,000,000</span> إلى <span dir="ltr">1,000,003</span> إيثر. ولكن ماذا حدث للحساب الأول؟ يبدو أنه فقد أكثر بقليل من ثلاثة إيثر. للأسف، لا شيء في الحياة مجاني، واستخدام شبكة إيثيريوم العامة يتطلب منك تعويض أقرانك عن دورهم الداعم. تم خصم رسوم معاملة صغيرة من الحساب الذي أرسل المعاملة - هذه الرسوم هي كمية الغاز المحترق (<span dir="ltr">21,000</span> وحدة غاز لتحويل <span dir="ltr">ETH</span>) مضروبة في الرسم الأساسي الذي يختلف وفقًا لنشاط الشبكة بالإضافة إلى إكرامية تذهب إلى المُدَقِّق الذي يضمن المعاملة في كتلة.

المزيد عن [الغاز](/developers/docs/gas/#post-london)

<FeaturedText>ملاحظة: على الشبكة العامة، رسوم المعاملة متغيرة بناءً على طلب الشبكة ومدى السرعة التي ترغب في معالجة المعاملة بها. إذا كنت مهتمًا بتفصيل كيفية حساب الرسوم، فراجع منشوري السابق حول <a href="https://medium.com/ethereum-grid/ethereum-101-how-are-transactions-included-in-a-block-9ae5f491853f">كيفية تضمين المعاملات في كتلة</a>.</FeaturedText>

## وخذ نفسًا {#and-breathe}

لقد كنا نفعل هذا لفترة من الوقت، لذا يبدو هذا مكانًا جيدًا كأي مكان آخر لأخذ استراحة. تستمر التفاصيل العميقة، وسنواصل الاستكشاف في الجزء الثاني من هذه السلسلة. بعض المفاهيم القادمة: الاتصال بعقدة حقيقية، والعقود الذكية، والرموز المميزة. هل لديك أسئلة متابعة؟ أعلمني! ستؤثر ملاحظاتك على وجهتنا من هنا. نرحب بالطلبات عبر [تويتر](https://twitter.com/wolovim).