لایهی شبکه
آخرین ویرایش: @sipbikardi(opens in a new tab), ۱۳ تیر ۱۴۰۳
اتریوم یک شبکه همتا به همتا با هزاران گره است که باید بتوانند با استفاده از پروتکل های استاندارد شده با یکدیگر ارتباط برقرار کنند. "لایه شبکه" پشته ای از پروتکل ها است که به آن گره ها اجازه می دهد یکدیگر را پیدا کنند و اطلاعات را مبادله کنند. این شامل اطلاعات "شایعه" (ارتباطات یک به چند) در شبکه و همچنین تعویض درخواست ها و پاسخ ها بین گره های خاص (ارتباط یک به یک) است. هر گره برای اطمینان از ارسال و دریافت اطلاعات صحیح باید به قوانین شبکه خاصی پایبند باشد.
نرمافزار کلاینت دارای دو بخش است (کلینتهای اجرا و کلاینتهای اجماع) که هر کدام دارای پشته شبکه مجزای خود هستند. علاوه بر برقراری ارتباط با سایر گرههای اتریوم، کلاینتهای اجرا و اجماع باید با یکدیگر ارتباط برقرار کنند. در این صفحه توضیح مقدماتی در مورد پروتکل هایی که این ارتباط را فعال می کنند ارائه می دهد.
کلاینت های اجرا تراکنش ها را از طریق شبکه همتا به همتای لایه اجرا شایع می کنند. این امر نیاز به ارتباط رمزگذاری شده بین همتایان تایید شده دارد. هنگامی که یک اعتبارسنج برای پیشنهاد یک بلوک انتخاب می شود، تراکنش ها از مخزن تراکنش های محلی گره از طریق یک اتصال RPC محلی به کلاینت های اجماع منتقل می شوند که در بلوک های بیکن بسته بندی می شوند. کلاینت های اجماع سپس بلوک های بیکن را در شبکه p2p خود شایع می کنند. این به دو شبکه p2p جداگانه نیاز دارد: یکی اتصال کلاینت های اجرا برای شایعات تراکنش و دیگری اتصال کلاینت های اجماع برای شایعات بلوک.
موارد مورد نیاز
مقداری دانش درباره گره ها و کلاینت ihd اتریوم برای درک این صفحه مفید خواهد بود.
لایه اجرا
پروتکل های شبکه لایه اجرا به دو پشته تقسیم می شوند:
پشته اکتشاف: بر روی UDP ساخته شده است و به یک گره جدید اجازه می دهد همتاهایی را برای اتصال پیدا کند
پشته DevP2P: در بالای TCP قرار می گیرد و گره ها را قادر به تبادل اطلاعات می کند
هر دو پشته به صورت موازی کار می کنند. پشته اکتشاف، شرکتکنندگان جدید شبکه را به شبکه تغذیه میکند و پشته DevP2P تعاملات آنها را فعال میکند.
اکتشاف
اکتشاف فرآیند یافتن گره های دیگر در شبکه است. این بوت استرپ با استفاده از مجموعه کوچکی از بوتنودها انجام می شود (گره هایی که آدرس آنها هاردکد(opens in a new tab) در کلاینت است تا بتوان آنها را فورا پیدا کرد و کلاینت را به همتایان متصل کرد). این بوتنودها فقط برای معرفی یک گره جدید به مجموعهای از همتایان وجود دارند - این تنها هدف آنهاست، آنها در کارهای عادی کلاینت مانند همگامسازی زنجیره شرکت نمیکنند و تنها در اولین باری که کلاینت چرخانده میشود، استفاده میشوند.
پروتکل مورد استفاده برای تعاملات گره-بوتنود یک شکل تغییر یافته از Kademlia(opens in a new tab) است که از جدول هش توزیع شده(opens in a new tab) برای به اشتراک گذاری لیست گره ها استفاده می کند. هر گره دارای نسخه ای از این جدول است که حاوی اطلاعات مورد نیاز برای اتصال به نزدیکترین همتایان خود است. این "نزدیک" بار جغرافیایی ندارد - بلکه در فاصله با شباهت شناسه گره تعریف می شود. جدول هر گره به عنوان یک ویژگی امنیتی به طور منظم به روز می شود. به عنوان مثال، در Discv5(opens in a new tab)، گرههای پروتکل اکتشاف همچنین میتوانند «تبلیغاتی» را ارسال کنند که پروتکلهای فرعی را که کلاینت پشتیبانی میکند، نمایش میدهد و به همتایان اجازه میدهد در مورد پروتکلهایی که هر دو میتوانند برای برقراری ارتباط استفاده کنند، مذاکره کنند.
اکتشاف با یک بازی پینگ پنگ شروع می شود. یک پینگ پنگ موفق، گره جدید را به یک بوت نود "پیوند" می کند. پیام اولیه ای که به بوت نود از وجود گره جدیدی که وارد شبکه می شود هشدار می دهد PING
است. این PING
شامل اطلاعات هش شده در مورد گره جدید، بوت نود و یک مهر زمان انقضا است. بوتنود PING
را دریافت میکند و یک PONG
حاوی هش PING
برمیگرداند. اگر هشهای PING
و PONG
مطابقت داشته باشند، ارتباط بین گره جدید و بوتنود تأیید میشود و گفته میشود که آنها "متصل" شدهاند.
پس از اتصال، گره جدید می تواند یک درخواست FIND-NEIGHBOURS
را به بوت نود ارسال کند. داده های بازگردانده شده توسط بوت نود شامل لیستی از همتایان است که گره جدید می تواند به آنها متصل شود. اگر گرهها متصل نباشند، درخواست FIND-NEIGHBOURS
با شکست مواجه میشود، بنابراین گره جدید نمیتواند وارد شبکه شود.
هنگامی که گره جدید لیستی از همسایگان را از بوت نود دریافت می کند، مبادله PING-PONG را با هر یک از آنها آغاز می کند. پینگپنگهای موفق، گره جدید را با همسایگانش پیوند میدهند و تبادل پیام را ممکن میسازند.
1start client --> connect to bootnode --> bond to bootnode --> find neighbours --> bond to neighbours
کلاینت های اجرا در حال حاضر از پروتکل اکتشاف Discv4(opens in a new tab) استفاده می کنند و تلاش فعالی برای انتقال به پروتکل Discv5(opens in a new tab) وجود دارد.
ENR: رکوردهای گره اتریوم
این رکورد گره اتریوم (ENR) یک شی است که شامل سه عنصر اساسی است: یک امضا (هش از محتویات رکورد ساخته شده بر اساس برخی از طرح های هویت توافق شده)، یک شماره دنباله ای که تغییرات را در رکورد ردیابی می کند، و یک لیست دلخواه از جفت های کلیدهای ارزش. این یک فرمت مقاوم در برابر آینده است که امکان تبادل آسان اطلاعات شناسایی بین همتایان جدید را فراهم می کند و فرمت آدرس شبکه ترجیحی برای گره های اتریوم است.
چرا اکتشاف بر اساس UDP ساخته شده است؟
UDP هیچ گونه بررسی خطا، ارسال مجدد بسته های ناموفق، یا باز و بسته شدن پویا اتصالات را پشتیبانی نمی کند - در عوض، صرف نظر از اینکه آیا با موفقیت دریافت شده است یا خیر، فقط یک جریان مداوم از اطلاعات را به سمت یک هدف شلیک می کند. این عملکرد حداقلی همچنین به هزینه حداقلی تبدیل می شود و این نوع اتصال را بسیار سریع می کند. برای اکتشاف، جایی که یک گره به سادگی میخواهد حضور خود را نشان دهد تا پس از آن یک ارتباط رسمی با همتا برقرار کند، UDP کافی است. با این حال، برای بقیه پشته شبکه، UDP برای هدف امورات مناسب نیست. تبادل اطلاعات بین گرهها بسیار پیچیده است و بنابراین به پروتکل کاملتری نیاز دارد که بتواند از ارسال مجدد، بررسی خطا و غیره پشتیبانی کند. سربار اضافی مرتبط با TCP ارزش عملکرد اضافی را دارد. بنابراین، اکثر پشته P2P روی TCP عمل می کند.
DevP2P
DevP2P خودش مجموعه کاملی از پروتکلهایی است که اتریوم برای ایجاد و نگهداری شبکه همتا به همتا پیادهسازی میکند. پس از ورود گره های جدید به شبکه، تعاملات آنها توسط پروتکل هایی در پشته DevP2P(opens in a new tab) کنترل می شود. همه اینها در بالای TCP قرار دارند و شامل پروتکل انتقال RLPx، پروتکل سیمی و چندین پروتکل فرعی هستند. پروتکل RLPx(opens in a new tab) پروتکلی است که بر شروع، احراز هویت و حفظ نشست ها بین گره ها حاکم است. RLPx پیام ها را با استفاده از RLP (پیشوند طول بازگشتی) رمزگذاری می کند که یک روش بسیار کارآمد برای رمزگذاری داده ها در یک ساختار حداقلی برای ارسال بین گره ها است.
یک جلسه RLPx بین دو گره با یک ارتباط گیری رمزنگاری اولیه آغاز می شود. این مرحله شامل ارسال یک پیام احراز هویت توسط گره است که سپس توسط همتا تایید می شود. در تأیید موفقیت آمیز، همتا یک پیام تأیید اعتبار برای بازگشت به گره آغازگر تولید می کند. این یک فرآیند تبادل کلید است که گره ها را قادر می سازد به صورت خصوصی و ایمن با هم ارتباط برقرار کنند. یک ارتباط گیری رمزنگاری شده موفق، سپس هر دو گره را تحریک می کند تا پیام "سلام" را به یکدیگر "روی سیم" ارسال کنند. پروتکل سیمی با تبادل موفقیت آمیز پیام های سلام آغاز می شود.
پیام های سلام شامل موارد زیر است:
- نسخه پروتکل
- شناسه کلاینت
- پورت
- شناسه گره
- لیستی از پروتکل های فرعی پشتیبانی شده
این اطلاعات مورد نیاز برای یک تعامل موفق است زیرا مشخص می کند که چه قابلیت هایی بین هر دو گره به اشتراک گذاشته می شود و ارتباطات را پیکربندی می کند. یک فرآیند مذاکره پروتکل فرعی وجود دارد که در آن لیست های پروتکل های فرعی پشتیبانی شده توسط هر گره با هم مقایسه می شوند و مواردی که برای هر دو گره مشترک هستند می توانند در نشست استفاده شوند.
همراه با پیام های سلام، پروتکل سیم همچنین می تواند یک پیام "قطع اتصال" ارسال کند که به همتایان هشدار می دهد که اتصال بسته خواهد شد. پروتکل سیمی همچنین شامل پیام های PING و PONG است که به صورت دوره ای برای باز نگه داشتن یک جلسه ارسال می شوند. بنابراین مبادلات پروتکل RLPx و سیمی پایههای ارتباط بین گرهها را ایجاد میکنند و داربستی را برای اطلاعات مفیدی که طبق یک پروتکل فرعی خاص مبادله میشوند فراهم میکنند.
پروتکل های فرعی
پروتکل سیمی
هنگامی که همتاها متصل می شوند و یک نشست RLPx شروع می شود، پروتکل سیمی نحوه ارتباط همتاها را مشخص می کند. در ابتدا، پروتکل سیمی سه وظیفه اصلی را تعریف کرد: همگام سازی زنجیره ای، انتشار بلوک و تبادل تراکنش. با این حال، هنگامی که اتریوم به اثبات سهام روی آورد، انتشار بلوک و همگام سازی زنجیره بخشی از لایه اجماع شد. مبادله تراکنش هنوز در اختیار کلاینت اجرا است. تبادل تراکنش به مبادله تراکنش های معلق بین گره ها اشاره دارد تا سازندگان بلوک بتوانند برخی از آنها را برای گنجاندن در بلوک بعدی انتخاب کنند. اطلاعات دقیق درباره این وظایف اینجا(opens in a new tab) موجود است. کلاینت هایی که از این پروتکل های فرعی پشتیبانی می کنند، آنها را از طریق JSON-RPC در معرض دید قرار می دهند.
les (پروتکل فرعی سبک اتریوم)
این یک پروتکل حداقلی برای همگام سازی کلاینت های سبک است. به طور سنتی این پروتکل به ندرت مورد استفاده قرار میگرفت زیرا گرههای کامل برای ارائه دادهها به کلاینت های سبک بدون ایجاد انگیزه مورد نیاز هستند. رفتار پیشفرض کلاینتهای اجرا این است که دادههای کلاینت سبک را روی les ارائه نمیکنند. اطلاعات بیشتر در les جزئیات فنی(opens in a new tab) موجود است.
Snap
پروتکل snap(opens in a new tab) یک برنامه افزودنی اختیاری است که به همتایان اجازه میدهد تا تصاویر لحظه ای از وضعیتهای اخیر را مبادله کنند، و به همتایان اجازه میدهد تا دادههای حساب و ذخیرهسازی را بدون نیاز به دانلود گرههای میانی درخل مرکل تأیید کنند.
Wit (پروتکل شاهد)
پروتکل شاهد(opens in a new tab) یک برنامه افزودنی اختیاری است که تبادل شاهدان حالت را بین همتایان امکانپذیر میکند و به همگامسازی کلاینت ها با نوک زنجیره کمک میکند.
Whisper
Whisper پروتکلی بود که هدف آن ارسال پیام ایمن بین همتایان بدون نوشتن هیچ گونه اطلاعاتی در بلاکچین بود. بخشی از پروتکل سیم DevP2P بود اما اکنون منسوخ شده است. دیگر پروژه های مرتبط(opens in a new tab) با اهداف مشابه وجود دارند.
لایه اجماع
کلاینت های اجماع در یک شبکه همتا به همتا جداگانه با مشخصات متفاوت شرکت می کنند. کلاینت های اجماع باید در شیوع بلوک شرکت کنند تا بتوانند بلوکهای جدید را از همتایان دریافت کنند و زمانی که نوبت به پیشنهاد بلوک رسید، آنها را پخش کنند. مشابه لایه اجرا، ابتدا به یک پروتکل اکتشاف نیاز است تا یک گره بتواند همتایان را پیدا کند و نشست های امنی را برای تبادل بلوک ها، گواهی ها و غیره ایجاد کند.
اکتشاف
مشابه کلاینت های اجرا، کلاینت های اجماع از discv5(opens in a new tab) روی UDP برای یافتن همتایان استفاده می کنند. پیادهسازی لایه اجماع discv5 با اجرای کلاینتهای اجرا تنها از این جهت متفاوت است که شامل مبدّلی است که discv5 را به پشته libP2P(opens in a new tab) متصل میکند و DevP2P را منسوخ میکند. جلسههای RLPx لایه اجرا به نفع ارتباطگیری کانال ضد-نویز libP2P منسوخ شده است.
ENRها
ENR برای گره های اجماع شامل کلید عمومی گره، آدرس IP، پورت های UDP و TCP و دو فیلد خاص اجماع است: فیلد بیتی زیرشبکه گواهی و کلید eth2
. مورد اول یافتن همتایان شرکت کننده در زیرشبکه های شایعات گویای گواهی را برای گره ها آسان تر می کند. کلید eth2
نیز حاوی اطلاعاتی در مورد اینکه گره از کدام نسخه فورک اتریوم استفاده می کند، اطمینان حاصل می کند که همتایان به اتریوم مناسب متصل هستند.
libP2P
پشته libP2P از تمام ارتباطات پس از اکتشاف پشتیبانی می کند. کلاینت ها می توانند شماره گیری کرده و به IPv4 و/یا IPv6 همانطور که در ENR آنها تعریف شده است گوش دهند. پروتکل های لایه libP2P را می توان به دو حوزه شایعات و درخواست/پاسخ تقسیم کرد.
شایعات
دامنه شایعات شامل تمام اطلاعاتی است که باید به سرعت در سراسر شبکه پخش شود. این شامل بلوک های بیکن، اثبات ها، امضاها، خروج و جریمه شدن است. این با استفاده از libP2P gossipsub v1 منتقل میشود و متکی به ابردادههای مختلفی است که به صورت محلی در هر گره ذخیره میشوند، از جمله حداکثر اندازه محمولههای شایعات برای دریافت و ارسال. اطلاعات دقیق در مورد دامنه شایعات اینجا(opens in a new tab) موجود است.
درخواست-پاسخ
دامنه درخواست-پاسخ شامل پروتکل هایی برای کلاینت هایی است که اطلاعات خاصی را از همتایان خود درخواست می کنند. به عنوان مثال میتوان به درخواست بلوکهای بیکن خاص با هشهای ریشه خاص یا در محدودهای از اسلاتها اشاره کرد. پاسخ ها همیشه به صورت بایت های رمزگذاری شده SSZ فشرده شده برگردانده می شوند.
چرا کلاینت اجماع SSZ را به RLP ترجیح می دهد؟
SSZ مخفف سریال سازی ساده است. از افست های ثابتی استفاده می کند که رمزگشایی بخش های جداگانه یک پیام رمزگذاری شده را بدون نیاز به رمزگشایی کل ساختار آسان می کند، که برای کلاینت اجماع بسیار مفید است زیرا می تواند به طور موثر بخش های خاصی از اطلاعات را از پیام های رمزگذاری شده بگیرد. همچنین به طور خاص برای ادغام با پروتکلهای مرکل، با افزایش کارایی مرتبط برای Merkleization طراحی شده است. از آنجایی که همه هش ها در لایه اجماع ریشه های مرکل هستند، این باعث بهبود قابل توجهی می شود. SSZ همچنین نمایش منحصر به فرد اعداد را تضمین می کند.
اتصال کلاینت های اجرا و اجماع
کلاینت های اجماع و اجرا به صورت موازی اجرا می شوند. آنها باید به هم متصل شوند تا کلاینت اجماع بتواند دستورالعمل هایی را برای کلاینت اجرا ارائه دهد و کلاینت اجرا بتواند بسته هایی از تراکنش ها را به کلاینت اجماع ارسال کند تا در بلوک های بیکن گنجانده شوند. ارتباط بین دو کلاینت را می توان با استفاده از یک اتصال RPC محلی به دست آورد. یک API معروف به 'Engine-API'(opens in a new tab) دستورالعمل های ارسال شده بین دو کلاینت را تعریف می کند. از آنجایی که هر دو کلاینت پشت یک هویت شبکه قرار دارند، یک ENR (رکورد گره اتریوم) به اشتراک می گذارند که حاوی یک کلید جداگانه برای هر کلاینت (کلید eth1 و کلید eth2) است.
خلاصه ای از جریان کنترل در زیر نشان داده شده است، همراه با پشته شبکه مربوطه در پرانتز.
وقتی کلاینت اجماع یک تولیدکننده بلوک نیست:
- کلاینت اجماع یک بلوک را از طریق پروتکل شایعات بلوک دریافت می کند (p2p اجماع)
- کلاینت اجماع بلوک را از قبل تأیید می کند، یعنی اطمینان حاصل می کند که از یک فرستنده معتبر با متادیتا صحیح رسیده است
- تراکنش های موجود در بلوک به عنوان یک پیلود اجرا (اتصال RPC محلی) به لایه اجرا ارسال می شوند
- لایه اجرا تراکنش ها را اجرا می کند و وضعیت موجود در هدر بلوک را تأیید می کند (یعنی تطابق هش ها را بررسی می کند)
- لایه اجرا داده های اعتبارسنج را به لایه اجماع برمی گرداند، بلوک هم الان به عنوان تایید شده در نظر گرفته می شود (اتصال RPC محلی)
- لایه اجماع، بلوک را به سر بلاکچین خود اضافه می کند و آن را تأیید می کند، تأیید را از طریق شبکه پخش می کند (p2p اجماع)
وقتی کلاینت اجماع یک تولید کننده بلوک است:
- کلاینت اجماع اطلاعیه دریافت می کند که تولید کننده بلوک بعدی است (p2p اجماع)
- لایه اجماع روش
ایجاد بلوک
را در کلاینت اجرا فرا می خواند (RPC محلی) - لایه اجرا به مخزن تراکنش که توسط پروتکل شایعات تراکنش پر شده است دسترسی دارد (p2p اجرا)
- کلاینت اجرا تراکنش ها را در یک بلوک بسته بندی می کند، تراکنش ها را اجرا می کند و یک هش بلوک ایجاد می کند
- کلاینت اجماع تراکنش ها و هش بلوک را از کلاینت اجرا می گیرد و به بلوک بیکن اضافه می کند (RPC محلی)
- کلاینت اجماع بلوک را از طریق پروتکل شایعات بلوک پخش می کند (p2p اجماع)
- سایر کلاینت ها بلوک پیشنهادی را از طریق پروتکل شایعات بلوک دریافت می کنند و همانطور که در بالا توضیح داده شد اعتبارسنجی می کنند (p2p اجماع)
هنگامی که بلوک توسط اعتبارسنج های کافی تأیید شد، به سر زنجیره اضافه می شود، تنظیم می شود و در نهایت نهایی می شود.
شماتیک لایه شبکه برای مشتریان اجماع و اجرا، از ethresear.ch(opens in a new tab)
اطلاعات بیشتر
DevP2P(opens in a new tab) LibP2p(opens in a new tab) مشخصات شبکه لایه اجماع(opens in a new tab) kademlia به discv5(opens in a new tab) مقاله kademlia(opens in a new tab) معرفی p2p اتریوم(opens in a new tab) رابطه eth1/eth2(opens in a new tab) ویدیوی مرج و جزئیات کلاینت eth2(opens in a new tab)