تخطي إلى المحتوى الرئيسي

استخدام ⁦WebSockets⁩

Alchemy
websockets
الاستعلام
JavaScript
مبتدئ
إيلان هالبرن
1 ديسمبر 2020
6 دقيقة للقراءة

هذا دليل للمبتدئين حول استخدام WebSockets وAlchemy لإجراء طلبات إلى سلسلة الكتل لإيثيريوم.

 (opens in a new tab)WebSockets مقابل HTTP

على عكس HTTP، مع WebSockets، لا تحتاج إلى إجراء طلبات باستمرار عندما تريد معلومات محددة. تحافظ WebSockets على اتصال شبكة لك (إذا تم إجراؤه بشكل صحيح) وتستمع إلى التغييرات.

كما هو الحال مع أي اتصال شبكة، يجب ألا تفترض أن WebSocket سيظل مفتوحًا إلى الأبد دون انقطاع، ولكن التعامل الصحيح مع الاتصالات المقطوعة وإعادة الاتصال يدويًا قد يكون من الصعب إجراؤه بشكل صحيح. جانب سلبي آخر لـ WebSockets هو أنك لا تحصل على رموز حالة HTTP في الاستجابة، بل تحصل فقط على رسالة الخطأ.

يضيف Alchemy Web3 (opens in a new tab) تلقائيًا معالجة لفشل WebSocket وإعادة المحاولة دون الحاجة إلى أي تكوين.

جربها

أسهل طريقة لاختبار WebSockets هي تثبيت أداة سطر أوامر لإجراء طلبات WebSocket مثل wscat (opens in a new tab). باستخدام wscat، يمكنك إرسال الطلبات على النحو التالي:

ملاحظة: إذا كان لديك حساب Alchemy، يمكنك استبدال demo بمفتاح API الخاص بك. سجل للحصول على حساب Alchemy مجاني هنا! (opens in a new tab)

wscat -c wss://eth-mainnet.ws.alchemyapi.io/ws/demo

>  {"jsonrpc":  "2.0", "id": 0, "method":  "eth_gasPrice"}

<  {"jsonrpc":  "2.0", "result":  "0xb2d05e00", "id": 0}

كيفية استخدام WebSockets

للبدء، افتح WebSocket باستخدام عنوان URL لـ WebSocket الخاص بتطبيقك. يمكنك العثور على عنوان URL لـ WebSocket الخاص بتطبيقك عن طريق فتح صفحة التطبيق في لوحة التحكم الخاصة بك (opens in a new tab) والنقر على "عرض المفتاح" (View Key). لاحظ أن عنوان URL لتطبيقك لـ WebSockets يختلف عن عنوان URL الخاص به لطلبات HTTP، ولكن يمكن العثور على كليهما بالنقر على "عرض المفتاح".

Where to find your WebSocket URL in your Alchemy dashboard

يمكن استخدام أي من واجهات برمجة التطبيقات (APIs) المدرجة في مرجع API لـ Alchemy (opens in a new tab) عبر WebSocket. للقيام بذلك، استخدم نفس الحمولة التي سيتم إرسالها كجسم لطلب HTTP POST، ولكن بدلاً من ذلك أرسل تلك الحمولة من خلال WebSocket.

مع Web3

الانتقال إلى WebSockets أثناء استخدام مكتبة عميل مثل Web3 أمر بسيط. ما عليك سوى تمرير عنوان URL لـ WebSocket بدلاً من عنوان HTTP عند إنشاء مثيل لعميل Web3 الخاص بك. على سبيل المثال:

const web3 = new Web3("wss://eth-mainnet.ws.alchemyapi.io/ws/your-api-key")

web3.eth.getBlockNumber().then(console.log) // -> 7946893

API الاشتراك

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

eth_subscribe

ينشئ اشتراكًا جديدًا لأحداث محددة. تعرف على المزيد حول eth_subscribe (opens in a new tab).

المعلمات

  1. أنواع الاشتراك
  2. معلمات اختيارية

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

المخرجات

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

أحداث الاشتراك

أثناء تنشيط الاشتراك، ستتلقى أحداثًا عبارة عن كائنات تحتوي على الحقول التالية:

  • jsonrpc: دائمًا "2.0"
  • method: دائمًا "eth_subscription"
  • params: كائن يحتوي على الحقول التالية:
    • subscription: معرف الاشتراك الذي تم إرجاعه بواسطة استدعاء eth_subscribe الذي أنشأ هذا الاشتراك.
    • result: كائن تختلف محتوياته بناءً على نوع الاشتراك.

أنواع الاشتراك

  1. alchemy_newFullPendingTransactions

يُرجع معلومات المعاملة لجميع المعاملات التي تمت إضافتها إلى حالة الانتظار. يشترك نوع الاشتراك هذا في المعاملات المعلقة، على غرار استدعاء Web3 القياسي web3.eth.subscribe("pendingTransactions")، ولكنه يختلف في أنه يصدر معلومات المعاملة الكاملة بدلاً من مجرد تجزئات المعاملة.

مثال:

  1. newHeads

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

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

مثال:

  1. logs

يصدر السجلات التي تعد جزءًا من الكتل المضافة حديثًا والتي تتطابق مع معايير التصفية المحددة.

عند حدوث إعادة التنظيم للسلسلة، سيتم إصدار السجلات التي تعد جزءًا من الكتل الموجودة على السلسلة القديمة مرة أخرى مع تعيين الخاصية removed إلى true. علاوة على ذلك، يتم إصدار السجلات التي تعد جزءًا من الكتل الموجودة على السلسلة الجديدة، مما يعني أنه من الممكن رؤية سجلات لنفس المعاملة عدة مرات في حالة إعادة التنظيم.

المعلمات

  1. كائن يحتوي على الحقول التالية:
    • address (اختياري): إما سلسلة نصية تمثل عنوانًا أو مصفوفة من هذه السلاسل النصية.
      • سيتم إصدار السجلات التي تم إنشاؤها من أحد هذه العناوين فقط.
    • topics: مصفوفة من محددات المواضيع.
      • كل محدد موضوع هو إما null، أو سلسلة نصية تمثل موضوعًا، أو مصفوفة من السلاسل النصية.
      • كل موضع في المصفوفة ليس null يقيد السجلات الصادرة بتلك التي تحتوي على أحد المواضيع المحددة في ذلك الموضع فقط.

بعض الأمثلة على مواصفات المواضيع:

  • []: يُسمح بأي مواضيع.
  • [A]: A في الموضع الأول (وأي شيء بعده).
  • [null, B]: أي شيء في الموضع الأول وB في الموضع الثاني (وأي شيء بعده).
  • [A, B]: A في الموضع الأول وB في الموضع الثاني (وأي شيء بعده).
  • [[A, B], [A, B]]: (A أو B) في الموضع الأول و(A أو B) في الموضع الثاني (وأي شيء بعده).

مثال:

eth_unsubscribe

يلغي اشتراكًا حاليًا بحيث لا يتم إرسال أي أحداث أخرى.

المعلمات

  1. معرف الاشتراك، كما تم إرجاعه مسبقًا من استدعاء eth_subscribe.

المخرجات

true إذا تم إلغاء الاشتراك بنجاح، أو false إذا لم يكن هناك اشتراك بالمعرف المحدد.

مثال:

الطلب

curl https://eth-mainnet.alchemyapi.io/v2/your-api-key
-X POST
-H "Content-Type: application/json"
-d '{"id": 1, "method": "eth_unsubscribe", "params": ["0x9cef478923ff08bf67fde6c64013158d"]}'

النتيجة

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": true
}

سجل مع Alchemy (opens in a new tab) مجانًا، واطلع على وثائقنا (opens in a new tab)، وللحصول على أحدث الأخبار، تابعنا على تويتر (opens in a new tab).