» آرشیو اخبار » رول آپ های آپتیمیستیک چه نقشی در شبکه دارند؟
رول آپ های آپتیمیستیک

رول آپ های آپتیمیستیک چه نقشی در شبکه دارند؟

2 مهر 1401 7

به گزارش واحد ترجمه گذارنیوز، رول آپ های آپتیمیستیک (Optimistic Rollups) پروتکل‌های لایه ۲ (L2) هستند که برای افزایش توان عملیاتی لایه پایه‌ی اتریوم طراحی شده‌اند. آنها محاسبات را در شبکه اصلی اتریوم با پردازش تراکنش‌های خارج از شبکه (off-chain) کاهش می‌دهند و پیشرفت‌های قابل توجهی در سرعت پردازش ارائه می‌کنند. برخلاف سایر راه‌حل‌های مقیاس‌پذیری مانند شبکه‌های جانبی، رول آپ‌ های آپتیمیستیک با انتشار نتایج تراکنش‌ها به صورت آنچین (on-chain) یا روی شبکه پلاسما که تراکنش‌های اتریوم را با اثبات تقلب (fraud proof) تأیید می‌کنند، امنیت را با استفاده از شبکه اصلی یا Mainnet تامین می‌کنند. با این حال رول آپ های آپتیمیستیک داده‌های تراکنش را در جای دیگری ذخیره می‌کنند.

از آنجایی که محاسبات در اتریوم کُند و پرهزینه‌ است، رول آپ های آپتیمیستیک می‌توانند 10 تا 100 برابر در مقیاس پذیری موثر باشند. رول آپ های آپتیمیستیک همچنین تراکنش‌ها را به عنوان کال دیتا (calldata) در اتریوم ثبت می‌کنند و هزینه‌های گس را برای کاربران کاهش می‌دهند.

منظور از رول آپ های آپتیمیستیک چیست؟

رول آپ های آپتیمیستیک، رویکردی برای مقیاس‌پذیری اتریوم است که شامل انجام محاسبات و ذخیره‌سازی به صورت آفچین(off-chain) است. رول آپ های آپتیمیستیک تراکنش‌ها را خارج از اتریوم اجرا می‌کنند اما داده‌های تراکنش‌ها را به عنوان کال دیتا به شبکه اصلی ارسال می‌کنند.

تبلیغات جام جهانی قطر

اپراتورهای calldata ، چندین تراکنش آفچین را قبل از ارسال به اتریوم در دسته‌های بزرگ با هم دسته‌بندی می‌کنند. این رویکرد باعث می‌شود هزینه‌های ثابت در چندین تراکنش در هر دسته توزیع شود و هزینه‌های نهایی برای کاربران کاهش یابد. calldata همچنین از تکنیک‌های فشرده سازی برای کاهش حجم داده‌های ارسال شده روی شبکه اتریوم استفاده می‌کنند.

همانطور که از نام آن پیدا است، این رول آپ‌ها تراکنش‌ها را خوش بینانه (optimistic به معنی خوش بینانه) در نظر می‌گیرند. زیرا تراکنش‌های آفچین را معتبر دانسته و مدارک مهمی را برای دسته‌های تراکنش‌های ارسال‌شده در شبکه منتشر نمی‌کنند. این امر رول آپ های آپتیمیستیک را از رول آپ های با دانش صفر (zk rollups) جدا می‌کند که اثبات اعتبار را برای تراکنش‌های آفچین منتشر می‌کنند.

رول آپ های آپتیمیستیک

در عوض، رول آپ های آپتیمیستیک برای شناسایی مواردی که تراکنش‌ها به درستی محاسبه نشده‌اند، به یک طرح اثبات تقلب متکی هستند. پس از ارسال رول آپ به شبکه اتریوم، یک بازه زمانی (به نام دوره چالش یا challenge period) وجود دارد که در طی آن هر کسی می‌تواند با محاسبه اثبات تقلب، نتایج یک تراکنش رول آپ را به چالش بکشد.

اگر اثبات تقلب با موفقیت انجام شود، پروتکل رول آپ تراکنش را مجدداً اجرا می‌کند و وضعیت رول آپ (حالت رول آپ یا rollup state) را متناسب با آن به‌روزرسانی می‌کند. اثر دیگر اثبات تقلب موفق این است که سیکوئنسر (sequencer) مسئول گنجاندن تراکنش نادرست در یک بلاک جریمه دریافت می‌کند.

اگر رول آپ بدون چالش باقی بماند (یعنی همه تراکنش‌ها به درستی اجرا شوند) پس از سپری شدن دوره چالش، معتبر تلقی می‌شود و در شبکه اتریوم پذیرفته می‌شود. سایرین می‌توانند بر روی یک بلاکِ رول آپِ تایید نشده با یک شرط خاص ادامه دهند و آن هم این است که نتایج تراکنش‌ها در صورتی که بر اساس تراکنش نادرست قبلی منتشر شده باشد، معکوس خواهند شد.

رول آپ های آپتیمیستیک چگونه با اتریوم در تعامل هستند؟

رول آپ های آپتیمیستیک راه ‌حل‌های مقیاس ‌پذیری آفچین هستند که برای عملکرد بهتر اتریوم ساخته شده‌اند. هر رول آپ آپتیمیستیک توسط مجموعه‌ای از قراردادهای هوشمند مستقر در شبکه اتریوم مدیریت می‌شود. رول آپ های آپتیمیستیک تراکنش‌ها را خارج از شبکه اصلی اتریوم پردازش می‌کنند اما تراکنش‌های آفچین (به صورت دسته‌ای) را به صورت یک قرارداد رول آپ آنچین پردازش می‌کنند. ثبت این داده‌های تراکنش مانند داده‌های بلاک چین اتریوم تغییرناپذیر است و “شبکه رول آپ های آپتیمیستیک” را تشکیل می‌دهد.

معماری یک رول آپ آپتیمیستیک شامل بخش‌های زیر است:

قراردادهای آنچین: عملکرد رول آپ های آپتیمیستیک توسط قراردادهای هوشمندی که روی بلاک چین اتریوم اجرا می‌شوند کنترل می‌شود. این شامل قراردادهایی می‌شود که بلاک‌های رول آپ را ذخیره می‌کنند و سپرده‌های کاربران را ردیابی می‌کنند. از این نظر اتریوم به عنوان لایه پایه یا “لایه 1” برای رول آپ های آپتیمیستیک عمل می‌کند.

ماشین مجازی آفچین (VM): اگرچه قراردادها پروتکل رول آپ های آپتیمیستیک را بر روی اتریوم اجرا می‌کنند، پروتکل جمع‌آوری محاسبات و ذخیره‌سازی حالت (state storage) را روی ماشین مجازی دیگری جدا از ماشین مجازی اتریوم انجام می‌دهد. ماشین مجازی آفچین مفهومی است که برنامه‌ها روی آن قرار دارند و تغییرات حالت روی آن اجرا می‌شود که به عنوان لایه بالایی یا “لایه 2″ برای یک رول آپ آپتیمیستیک عمل می‌کند.

از آنجایی که رول آپ ها آپتیمیستیک برای اجرای برنامه‌های نوشته شده یا کامپایل شده برای EVM طراحی شده‌اند، VM آفچین دارای بسیاری از مشخصات طراحی EVM است. علاوه بر این، اثبات تقلبی که آنچین محاسبه شده است به شبکه اتریوم اجازه می‌دهد تا اعتبار تغییرات حالتِ محاسبه شده در VM آفچین را تایید کند.

رول آپ ها آپتیمیستیک به عنوان ” راه‌حل‌های مقیاس‌پذیری ترکیبی ” توصیف می‌شوند. زیرا در حالی که به عنوان پروتکل‌های جداگانه وجود دارند، ویژگی‌های امنیتی آن‌ها از اتریوم مشتق شده‌اند. اتریوم صحت محاسبات آفچین رول آپ و در دسترس بودن داده‌های مربوط به محاسبات را تضمین می‌کند. این امر باعث می‌شود که رول آپ ها آپتیمیستیک نسبت به پروتکل‌های مقیاس‌ پذیری کاملا آفچین (مثلاً شبکه‌های جانبی) که برای امنیت به اتریوم متکی نیستند، ایمن‌تر باشد.

رول آپ های آپتیمیستیک در چه مواردی به پروتکل اصلی اتریوم متکی هستند؟

در دسترس بودن داده‌ها

همانطور که گفته شد، رول آپ های آپتیمیستیک داده‌های تراکنش را به عنوان calldata به شبکه اتریوم ارسال می‌کنند. از آنجایی که اجرای رول آپ آپتیمیستیک بر اساس تراکنش‌های ارسال شده است، هر کسی می‌تواند از این اطلاعات (که بر روی لایه پایه اتریوم قرار دارند) برای اجرای وضعیت رول آپ و تأیید صحت تغییرات حالت استفاده کند.

با داشتن ویژگی دسترسی به داده‌ها که اتریوم ارائه می‌دهد، خطر فرار اپراتورهای رول آپ با رفتارهای مخرب (مانند ارسال بلاک‌های نامعتبر) کاهش می‌یابد.

مقاومت در برابر سانسور

رول آپ های آپتیمیستیک نیز برای مقاومت در برابر سانسورها به اتریوم متکی هستند. در یک رول آپ آپتیمیستیک ، یک نهاد متمرکز (اپراتور) مسئول پردازش تراکنش‌ها و ارسال بلاک‌های رول آپ به اتریوم است. این اتفاق چندین پیامد دارد از جمله:

  • اپراتورهای رول آپ می‌توانند کاربران را با آفلاین شدن کامل یا با امتناع از تولید بلاک‌هایی که شامل تراکنش‌های خاصی در آن‌ها هستند، سانسور کنند.
  • اپراتورهای رول آپ می‌توانند از برداشتن وجوه سپرده ‌شده در قرارداد رول آپ توسط کاربران جلوگیری کنند و از داده‌های دولتی لازم برای اثبات مالکیت درخت مرکل (Merkle) جلوگیری کنند. نگه داشتن داده‌های حالت همچنین می‌تواند وضعیت رول آپ را از کاربران پنهان کند و مانع از تعامل آنها با رول آپ شود.

رول آپ های آپتیمیستیک این مشکل را با مجبور کردن اپراتورها به انتشار داده‌های مرتبط با به‌روزرسانی‌های حالت در اتریوم حل می‌کند. انتشار داده‌های رول آپ به صورت آنچین دارای مزایای زیر است:

  • اگر یک اپراتور رول آپ آپتیمیستیک آفلاین شود یا تولید دسته‌های تراکنش را متوقف کند، نود دیگری می‌تواند از داده‌های موجود برای بازتولید آخرین وضعیت رول آپ و ادامه تولید بلاک استفاده کند.
  • کاربران می‌توانند از داده‌های تراکنش برای ایجاد مدارک مربوط به مِرکل که مالکیت وجوه را اثبات می‌کند و دارایی‌های خود را از جمع‌بندی خارج کنند، استفاده کنند.
  • کاربران همچنین می‌توانند تراکنش‌های خود را به جای سیکوئنسر به لایه پایه ارسال کنند. در این صورت سیکوئنسر باید تراکنش را در یک محدوده زمانی مشخص برای ادامه تولید بلاک‌های معتبر ترتیب بندی کند.

رول آپ های آپتیمیستیک چگونه کار می‌کنند؟

اجرای تراکنش

کاربران تراکنش‌ها را به اپراتورها ارسال می‌کنند. اپراتورها نودهایی هستند که مسئول پردازش تراکنش‌ها در رول آپ آپتیمیستیک هستند. این اپراتور که به‌عنوان “اعتبارسنج” یا “ولیدیتور” نیز شناخته می‌شود، تراکنش‌ها را جمع‌آوری می‌کند، داده‌های زیربنایی را فشرده می‌کند و بلاک را در بلاک چین اتریوم منتشر می‌کند.

اگرچه هرکسی می‌تواند اعتبارسنج شود، اما اعتبارسنج‌های رول آپ های آپتیمیستیک باید قبل از تولید بلاک‌ها، مانند یک سیستم اثبات سهام، پیوندی ارائه دهند. اگر اعتبارسنج یک بلاک نامعتبر را به شبکه ارسال کند یا روی یک بلاک قدیمی اما نامعتبر ساخته شود (حتی اگر بلاک آنها معتبر باشد) این پیوند می‌تواند کاهش یابد. به این ترتیب رول آپ های آپتیمیستیک از انگیزه‌های اکوسیستم ارز دیجیتال استفاده می‌کنند تا اطمینان حاصل شود که اعتبارسنجی‌ها صادقانه انجام می‌شوند.

انتظار می‌رود دیگر اعتبارسنج‌ها در شبکه رول آپ های آپتیمیستیک تراکنش‌های ارائه‌شده را با استفاده از نسخه وضعیت رول آپ خود اجرا کنند. اگر وضعیت نهایی اعتبارسنجی با حالت پیشنهادی اپراتور متفاوت باشد، آنها می‌توانند یک چالش را شروع کنند و یک اثبات تقلب را محاسبه کنند.

برخی از رول آپ های آپتیمیستیک ممکن است از یک سیستم اعتبار سنجی بدون نیاز به مجوز صرف نظر کنند و از یک سیکوئنسر واحد برای اجرای شبکه استفاده کنند. سیکوئنسرها مانند اعتبارسنج‌ها تراکنش‌ها را پردازش می‌کند، بلاک‌های رول آپ را تولید می‌کنند و تراکنش‌های رول آپ را به شبکه L1 (اتریوم) ارسال می‌کند.

سیکوئنسر با یک عملگر رول آپ معمولی متفاوت است. زیرا آنها کنترل بیشتری بر ترتیب تراکنش‌ها دارند. همچنین، سیکوئنسر دسترسی اولویت‌دار را به شبکه رول آپ دارد و تنها نهاد مجاز برای ارسال تراکنش‌ها به قرارداد آنچین است. تراکنش‌های نودهای غیر سیکوئنسر یا کاربران عادی به سادگی در یک صندوق ورودی جداگانه در صف قرار می‌گیرند تا زمانی که سیکوئنسر آنها را در یک دسته جدید قرار دهد.

ارسال بلاک‌های رول آپ به شبکه اتریوم

همانطور که گفته شد، اپراتور یک رول آپ آپتیمیستیک، تراکنش‌های آفچین را در یک دسته جمع می‌کند و آن را برای تأیید به شبکه اتریوم می‌فرستد. این فرآیند شامل فشرده سازی داده‌های مربوط به تراکنش و انتشار آن در بلاک چین اتریوم به عنوان calldata است.

calldata یک قسمت غیرقابل تغییر و غیر پایدار در یک قرارداد هوشمند است که بسیار شبیه به حافظه عمل می‌کند. در حالی که calldata به‌عنوان بخشی از گزارش‌های تاریخچه بلاک چین در شبکه باقی می‌مانند، بخشی از وضعیت اتریوم ذخیره نمی‌شوند. از آنجایی که calldata با هیچ بخشی از وضعیت اتریوم تماس ندارد، برای ذخیره داده‌ها در شبکه ارزان‌تر است.

اصطلاح calldata در زبان برنامه نویسی سالیدیتی(Solidity) نیز برای ارسال آرگومان‌ها به تابع قرارداد هوشمند در زمان اجرا استفاده می‌شود. calldata تابعی را که در حین تراکنش فراخوانی می‌شود شناسایی می‌کند و ورودی‌های تابع را در قالب یک دنباله دلخواه از بایت‌ها نگه می‌دارد.

در مورد رول آپ های آپتیمیستیک، calldata برای ارسال داده‌های فشرد شده تراکنش به قرارداد آنچین استفاده می‌شود. اپراتور رول آپ با فراخوانی تابع مورد نیاز در قرارداد رول آپ و ارسال داده‌های فشرده به عنوان آرگومان‌های تابع، یک دسته جدید اضافه می‌کند. استفاده از calldata هزینه‌های کاربر را کاهش می‌دهد زیرا بیشتر هزینه‌هایی که رول آپ‌ها متحمل می‌شوند از ذخیره داده‌ها در شبکه است.

تعهدات مربوط به وضعیت (state)

در هر مقطع زمانی، وضعیت رول آپ آپتیمیستیک (حساب‌ها، موجودی‌ها، کد قرارداد و غیره) به‌عنوان درخت مرکل به نام “درخت وضعیت” سازمان‌دهی می‌شود. ریشه این درخت مرکل (ریشه وضعیت) که به آخرین وضعیت رول آپ اشاره می‌کند، تبدیل به هش شده و در قرارداد رول آپ ذخیره می‌شود. هر تغییر حالت در شبکه، یک حالت رول آپ جدید ایجاد می‌کند که یک اپراتور با محاسبه یک ریشه حالت جدید به آن متعهد می‌شود.

اپراتور موظف است در هنگام ارسال دسته، هم ریشه‌های حالت قدیمی و هم ریشه‌های حالت جدید را ارسال کند. اگر ریشه حالت قدیمی با ریشه حالت موجود در قرارداد آنچین مطابقت داشته باشد، دومی کنار گذاشته شده و با ریشه حالت جدید جایگزین می‌شود.

اپراتور رول آپ همچنین ملزم است که یک ریشه Merkle را برای خود دسته تراکنش متعهد کند که به هر کسی اجازه می‌دهد تا با ارائه یک اثبات مرکل (Merkle proof)، گنجاندن یک تراکنش در دسته (در لایه پایه) را ثابت کند.

تعهدات مربوط به حالت، به ویژه ریشه‌های حالت، برای اثبات درستی تغییرات حالت در یک رول آپ آپتیمیستیک ضروری است. قرارداد رول آپ، ریشه‌های حالت جدید را از اپراتورها بلافاصله پس از ارسال می‌پذیرد اما بعداً می‌تواند ریشه‌های حالت نامعتبر را حذف کند تا رول آپ به حالت صحیح خود بازگردد.

اثبات تقلب (Fraud Proving)

همانطور که توضیح داده شد، رول آپ های آپتیمیستیک به هر کسی اجازه می‌دهد تا بلاک ها را بدون ارائه شواهدِ معتبر منتشر کند. با این حال، برای اطمینان از ایمن ماندن شبکه، رول آپ های آپتیمیستیک یک بازه زمانی (time window) را مشخص می‌کنند که طی آن هر کسی می‌تواند در مورد تغییرات حالت اعتراض کند. از این رو، بلاک‌های رول آپ “assertion” یا ادعا نامیده می‌شوند، زیرا هر کسی می‌تواند اعتبار آن‌ها را مورد مناقشه قرار دهد.

اگر کسی ادعایی را رد کند، پروتکل رول آپ محاسبات اثبات تقلب را آغاز می‌کند. هر نوع اثبات تقلب تعاملی است، یعنی یک نفر باید قبل از اینکه شخص دیگری آن را به چالش بکشد، یک ادعا را بررسی کند. تفاوت در این است که چند دور تعامل برای محاسبه اثبات تقلب مورد نیاز است.

طرح‌های اثبات تعاملی تک دوری، تراکنش‌های مورد مناقشه در لایه پایه را دوباره پخش می‌کنند تا ادعاهای نامعتبر را شناسایی کنند. پروتکل رول آپ اجرای مجدد تراکنش مورد مناقشه در L1 (یعنی شبکه اصلی اتریوم) را با استفاده از یک قرارداد تأییدکننده شبیه‌سازی می‌کند. این کار با استفاده از ریشه حالت محاسبه ‌شده انجام می‌شود که تعیین می‌کند چه کسی برنده چالش است. اگر ادعای رقیب در مورد وضعیت صحیح رول آپ درست باشد، اپراتور با قطع کردن باند (پیوند) خود جریمه می‌شود.

با این حال، اجرای مجدد تراکنش‌ها در L1 یا همان لایه اول اتریوم برای شناسایی تقلب مستلزم انتشار تعهدات مربوط به وضعیت برای تراکنش‌های فردی است و جمع‌آوری داده‌ها را افزایش می‌دهد که باید در شبکه منتشر شوند. همچنین بازپخش تراکنش‌ها هزینه‌های گس قابل توجهی را به همراه دارد. به این دلایل، رول آپ های آپتیمیستیک به سمت اثبات تعاملی چند دوره‌ای (multi-round interactive proving) تغییر می‌کنند، که به همان هدف (یعنی تشخیص عملیات رول آپ نامعتبر) با کارایی بیشتر دست می‌یابد.

اثبات تعاملی چند دوره‌ای

اثبات تعاملی چند دوره‌ای شامل یک پروتکل رفت و برگشت بین ادعا کننده و رقیب تحت نظارت یک قرارداد L1 است که در نهایت طرف دروغگو را تعیین می‌کند. پس از اینکه یک نود لایه 2 یک ادعا را به چالش می‌کشد، ادعا کننده باید ادعای مورد بررسی را به دو نیمه مساوی تقسیم کند. هر قسمت از این ادعا در این مورد به اندازه دیگری شامل مراحل محاسباتی خواهد بود.

سپس رقیب انتخاب خواهد کرد که چه ادعایی را می خواهد به چالش بکشد. فرآیند تقسیم (که “پروتکل دوگانه یا bisection protocol” نامیده می‌شود) تا زمانی ادامه می‌یابد که هر دو طرف در مورد ادعایی در مورد یک مرحله اختلاف نظر داشته باشند. در این مرحله، قرارداد لایه 1 با ارزیابی دستورالعمل (و نتیجه آن) برای شناسایی طرف متقلب، اختلاف را حل می‌کند.

ادعاکننده ملزم به ارائه “اثبات یک مرحله‌ای” است که اعتبار محاسبات تک مرحله‌ای مورد مناقشه را تأیید می‌کند. اگر ادعاکننده نتواند اثبات یک مرحله‌ای را ارائه کند، یا تأییدکننده لایه 1 اثبات را نامعتبر بداند، چالش را از دست می‌دهد.

چند نکته در مورد این نوع اثبات تقلب:

  1. اثبات تقلب تعاملی چند دور‌ه‌ای، کارآمد در نظر گرفته می‌شود زیرا کاری که شبکه L1 باید در داوری اختلاف انجام دهد را به حداقل می‌رساند. به جای پخش مجدد کل تراکنش، شبکه L1 فقط باید یک مرحله از مجموعه را دوباره اجرا کند.
  2. پروتکل‌های دوگانه مقدار داده‌های ارسال شده در شبکه را کاهش می‌دهند. همچنین تراکنش‌های رول آپ های آپتیمیستیک با محدودیت هزینه گس اتریوم محدود نمی‌شوند. برعکس، رول آپ های آپتیمیستیک که تراکنش‌ها را مجدداً اجرا می‌کنند، باید مطمئن شوند که تراکنش لایه 2 دارای محدودیت گس کمتری برای تقلید اجرای آن در یک تراکنش واحد اتریوم است.
  3. بخشی از باند ادعا کننده مخرب (malicious asserter) به رقیب تعلق می‌گیرد، در حالی که بخشی دیگر سوزانده می‌شود. سوزاندن از تبانی بین اعتبارسنج‌ها جلوگیری می‌کند. اگر دو اعتبارسنج با هم تبانی کنند تا چالش‌های جعلی را آغاز کنند، باز هم بخش قابل توجهی از کل استیک را از دست خواهند داد.
  4. اثبات تعاملی چند دوره‌ای به هر دو طرف (مدعی کننده و رقیب) نیاز دارد که در بازه زمانی مشخص شده حرکت کنند. عدم اقدام قبل از انقضای مهلت مقرر باعث می‌شود که طرف متخلف از چالش منصرف شود.

چرا اثبات تقلب در رول آپ های آپتیمیستیک اهمیت دارند؟

اثبات تقلب مهم است زیرا نهایی شدن بدون نیاز به اعتماد را در رول آپ های آپتیمیستیک تسهیل می‌کنند. نهایی بودن بدون نیاز به اعتماد کیفیتی از رول آپ های آپتیمیستیک است که تضمین می‌کند تا زمانی که یک تراکنش معتبر است، در نهایت تایید شود.

نودهای مخرب می‌توانند با شروع چالش‌های نادرست، تأیید یک بلاک رول آپ معتبر را به تأخیر بیندازند. با این حال، اثبات تقلب در نهایت اعتبار بلاک رول آپ را ثابت می‌کند و باعث تایید آن می‌شود که همچنین به یکی دیگر از ویژگی‌های امنیتی رول آپ های آپتیمیستیک مربوط می‌شود: اعتبار شبکه به وجود یک نود صادق متکی است. نود صادق می‌تواند با ارسال ادعاهای معتبر یا مخالفت با ادعاهای نامعتبر، مسیر حرکت شبکه را به درستی پیش ببرد. در هر صورت، نود‌های مخربی که با نود صادق وارد اختلاف می‌شوند، سهم خود را در طول فرآیند اثبات تقلب از دست خواهند داد.

 

مترجم: محمدامین علی‌زاده

منابع: CoinDesk ، داکیومنتیشن اتریوم

به این نوشته امتیاز بدهید!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

×