متوسط مقالات

کریپتو با ویتالیک؛ بازارسازی درون زنجیره‌ای

ویتالیک بوترین یکی از بزرگترین متفکران دنیای بلاکچین است. بلاگ شخصی وی گنجینه ارزشمندی از مطالب است که به نوعی تاریخچه زنده اتفاقات اتریوم و بلاکچین به شمار می‌رود. از این رو در میهن بلاکچین بر آن شدیم تا نوشته‌های بوترین را به ترتیب تاریخی برای شما ترجمه کنیم. مطلب پیش رو در تاریخ ۲۲ ژوئن ۲۰۱۷ در بلاگ شخصی ویتالیک منتشر شد. در این مطلب بوترین به مساله عدم وابستگی به مسیر در بازارسازهای اولیه می‌پردازد؛ بازارسازهایی که در ادامه بدل به صرافی‌های غیرمتمرکزی شدند که امروزه می‌شناسیم و از آن استفاده می‌کنیم. همچنین او به MEV و ضرر ناپایدار اشاره‌هایی می‌کند و راه‌حل‌هایی بیان می‌کند. مقاله پیشین بوترین را می‌توانید از لینک زیر مطالعه کنید:

عدم وابستگی به مسیر

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

چیزی مثل این:

منبع انرژی پیشنهادی

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

یک رویکرد این است که به شکل ریاضی کاوش کنیم و دقیق شویم، انتگرال ها را محاسبه کنیم و نشان دهیم که مازاد انرژی فرضی در واقع دقیقا برابر با صفر است. اما یک رویکرد ساده نیز وجود دارد: به رسمیت شناختن این‌که انرژی مستقل از مسیر است. یعنی وقتی سفینه از نقطه‌ A به نقطه B حرکت می‌کند که به زمین نزدیک‌تر است، انرژی جنبشی آن قطعاً بالا می‌رود چرا که سرعت آن افزایش می‌یابد. اما از آنجایی که انرژی کل (پتانسیل به اضافه جنبشی) حفظ می‌شود و انرژی پتانسیل فقط به موقعیت سفینه فضایی بستگی دارد و نه اینکه چگونه به آنجا رسیده است. می‌دانیم که فارغ از اینکه سفینه فضایی چه مسیری را از نقطه A به نقطه B طی می‌کند، پس از رسیدن به نقطه B، میزان تغییر انرژی جنبشی دقیقاً یکسان خواهد بود.

مسیر‌های متفاوت؛ تغییر انرژی یکسان
مسیر‌های متفاوت؛ تغییر انرژی یکسان

علاوه بر آن می دانیم که در تغییر مکان جسم از نقطه A به نقطه A، فارغ از مسیر، انٰرژی جنشی کسب شده یکسان خواهد بود: صفر!


خونریزی تا مرگ یک بازارساز

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

به عنوان مثال، بگذارید بخشی از پستی که به این معضل در مورد بنکور (Bancor) می‌پردازد، ذکر کنم:

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

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

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

بنکور در طول این دوره «برداشت مداوم» (Bank Run – به پدیده‌ای اطلاق می‌شود که به دلایل ترس از آینده، مشتریان برای برداشت موجودی حساب‌های خود به بانک‌ها هجوم می‌برند) قیمت‌ کمتر و کمتری ارائه می‌کند تا اینکه ذخیره آن تمام شود. شاهد این خواهد بود که ترس بازار سبب از بین رفتن تدریجی موجودی شما خواهد شد. به یاد داشته باشید که مردم متقاعد شده‌اند که ارزش واقعی X در این سناریو صفر است و فرمول Bancor به نحوی طراحی شده است که همواره قیمتی بالاتر از صفر ارائه دهد. بنابراین کل ذخیره شما از بین خواهد رفت.

hackingdistributed.com

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

برای بسیاری از بازارسازهای درون زنجیره‌ای که به شکل دقیق طراحی نشده‌اند، نظر بالا در خصوص رخنه‌پذیری و دنبال کردن بازار صحت دارد و مشکل جدی‌ای است. اما، دسته‌های متفاوت دیگری از بازارسازهای درون زنجیره‌ای نیز موجودند که بی‌شک در معرض از دست دادن ذخایر خود در صورت مواجهه با حملات پامپ پول (money pumping attack) نیستند. به عنوان مثالی ساده،بازارسازی را تصور کنید که MKR را می‌فروشد و ETH دریافت می‌کند؛ مشخصات این بازارساز شامل قیمت کنونی p است که در آن مقادیر بی‌نهایت کوچک میکر (MKR) را در هر سطح قیمتی خرید و فروش می‌کند. برای مثال فرض کنید که قیمت فعلی p = 5 است و می‌خواهید ۲ میکر خریدرای کنید. بازارساز به شما چنین چیزی خواهد فروخت:

  • ۰.۰۰۰۰۰۰۱ میکر با قیمت ۵ اتر/میکر
  • ۰.۰۰۰۰۰۰۱ میکر با قیمت ۵.۰۰۰۰۱ اتر/میکر
  • ۰.۰۰۰۰۰۰۱ میکر با قیمت ۵.۰۰۰۰۲ اتر/میکر
  • ۰.۰۰۰۰۰۰۱ میکر با قیمت ۶.۹۹۹۹۸ میکر/اتر
  • ۰.۰۰۰۰۰۰۱ میکر با قیمت ۶.۹۹۹۹۹ میکر/اتر

در نهایت بازارساز به شما ۲ MKR با متوسط قیمت ۶ اتر به ازای هر میکر (در مجموع ۱۲ ETH) خواهد فروخت و در انتهای عملیات فروش، قیمت کنونی (p) به ۷ افزایش یافته است. اگر پس از شما کسی بخواهد که ۱ MKR به فروش برساند، بازارساز ۶.۵ اتر خرج خواهد کرد و در پایان عملیات، قیمت به ۶ افت می‌کند.

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

۱. بازارساز چند MKR به دست آورده یا از دست داده است؟

۲. بازارساز چند ETH به دست آورده یا از دست داده است؟

جواب‌ این است: ۱ میکر به ذخیره (استخر) افزوده شده و ۴.۵ اتر خارج شده است.دقت کنید که جواب این سوال‌ها کاملا مستقل از مسیری که p طی کرده است. این جواب‌ها همچنان صحیح می‌بود اگر p از ۵ مستقیما به ۴ می‌رسید و یا اگر در ابتدا قیمت به ۴.۷ می‌رسید و سپس به ۴ می‌رسید و یا حتی اگر در ابتدا قیمت به ۲ افت می‌کرد و سپس به ۹.۸۱۸ می‌رسید و با ریزشی شدید به ۰.۵۳ می‌رسید و در نهایت به ۴ می‌رسید.

چرا اوضاع بدین شکل است؟ ساده‌ترین راه دیدن این قضیه این است که تصور کنید اگر p به زیر ۴ کاهش یابد و سپس دوباره به ۴ برسد، تمام فروش‌هایی که در زمان کاهش رخ داده است، دقیقا در مسیر بازگشت قیمت باید با میزان خرید جبران شوند. اما طور دیگری نیز می‌توانیم این مساله را ببینیم؛ اگر حالت مارکت میکر را تنها با متغیر تک بعدی p تعریف کنیم، آن‌گاه موجودی اتر و میکر با فرمول‌های زیر تعریف خواهند شد:

موجودی میکر (بر حسب p) = 10 – p

موجودی اتر (بر حسب p) = p2/2

همگان می‌توانند توان p را تغییر دهند (بین بازه ۰ تا ۱۰)، اما این کار را تنها با فراهم آوردن مقدار درستی از میکر و اتر می‌توانند انجام دهند و در ازای آن نیز مقدار متناظری میکر و اتر دریافت می‌کنند بنابراین تعادل برقرار می‌ماند؛ موجودی مارکت میکر پس از انجام عملیات دقیقا مقداری خواهد بود که طبق این فرمول‌ها (و مطابق با مقدار جدید p) باید می‌داشت. هر تغییری در p که با تراکنش صحیحی از اتر و میکر همراه نباشد به شکل خودکار انجام نخواهد شد.

این نکته که هر سری تغییراتی که منجر به پایین آمدن قیمت p از ۵ به ۴ شود، سبب افزایش موجودی میکر به اندازه یک و کاهش موجودی اتر به اندازه ۴.۵ عدد می‌شود، حال فارغ از مسیر، بدیهی به نظر می‌رسد: mkr_balance(4) – mkr_balance(5) = 1 و eth_balance(4) – eth_balance(5) = -4.5

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

توجه داشته باشید که این بدین معنی نیست که بازارساز نمی‌تواند ضرر مالی کند – حداقل در مقایسه با استراتژی‌هایی مبتنی بر هولد کردن. برای مثال، اگر با قیمت یک MKR = پنج ETH کار خود را آغاز کنیم و سپس قیمت میکر تغییر کند، تغییرات ارزش دلاری ۵ میکر و ۱۲.۵ اتر (موجودی اولیه مثال بازارساز ما) در مقابل هولد کردن صرف آن به شرح شکل زیر است:

عملکرد بازارساز (قرمز) در مقابل هولد کردن صرف (آبی)
عملکرد بازارساز (قرمز) در مقابل هولد کردن صرف (آبی)

هولد کردن سبدی متعادل همیشه برنده است مگر در شرایطی که قیمت دقیقا یکسان باقی بماند که در آن صورت بازگشت سرمایه بازارساز دقیقا یکسان خواهد بود. در این حالت بازارساز به عنوان وظیفه‌ای عام المنفعه عمل می‌‌کند و سعی در درآمدزایی ندارد. اما قطعا می‌توان شرایط را به نحوی تغییر داد تا بازارساز درآمد داشته باشد و کار ساده‌ای است: باید برای معامله اسپرد (Spread) در نظر بگیریم. در این وضعیت به عنوان مثال، بازارساز برای سفارش‌‌های خرید مبلغ ۱.۰۰۵p دریافت می‌کند و تنها حاضر به پرداخت ۰.۹۹۵p برای سفارش‌های فروش است. حال منتفع شدن بازارساز بسته به پیش‌بینی او از آینده دارد: اگر در درازمدت قیمت (قیمت زوج ارز نسبت به هم) به یک سمت حرکت کند، مارکت میکر ضرر خواهد کرد – حداقل نسبت به نگه داشتن هر یک از این ارزها به طور جداگانه – اما از سویی دیگر اگر قیمت‌ها حول قیمت فعلی نوسان (حتی شدید) داشته باشند اما در نهایت دوباره به نقطه فعلی بازگردند، آن‌گاه بازارساز می‌تواند سود خوبی از کارمزد تراکنش‌ها به دست آورد. این مساله خصوصیت «عدم وابستگی به مسیر» را قربانی می‌کند اما این کار را به نحوی انجام می‌دهد که هر گونه دور شدنی از این اصل، به نفع بازارساز تمام شود.

طرح‌های زیادی وجود دارد که می‌تواند توسط مارکت میکر انتخاب شود و به «عدم وابستگی به مسیر» وفادار ماند: اگر بخواهید توکنی منتشر کنید که عرضه‌ای نامحدود داشته باشد، آن‌گاه فرایند «نسبت رزرو ثابت – Constant Reserve Ratio» می‌تواند به کار گرفته شود (در این فرایند برای نسبت ثابت r که عددی بین صفر تا یک است، عرضه توکن به شکل p^{1/r – 1} و میزان رزرو به شکل r.p^{1/r} تعریف می‌شود)؛ به شرطی که به درستی اجرا شود و عدم وابستگی به مسیر با محدود کردن و خطاهای گرد کردن تحت تاثیر قرار نگیرد.

همچنین اگر می‌خواهید برای توکن‌ها موجود که سقف قیمت ندارند، بازارسازی کنید، فرایند محبوب من (که اعتبار آن باید به مارتین کاپلمن – بنیان‌گذار گنوسیس – تعلق گیرد) روشی است که طی آن حاصل‌ضرب موجودی دو توکن، عددی ثابت است: tokenA_balance(p) \cdot tokenB_balance(p) = k

بدین ترتیب تابع موجودی بر حسب قیمت به شکل زیر برای هر یک تعریف می‌شود:

tokenA\_balance(p) = \sqrt{k\cdot p} tokenB\_balance(p) = \sqrt{k/p}
نمودار موجودی بر حسب قیمت در صرافی‌های غیرمتمرکز که با روش AMM کار می‌کنند
نمودار موجودی بر حسب قیمت در صرافی‌های غیرمتمرکز که با روش AMM کار می‌کنند

در اینجا p قیمت توکن B است که بر حسب توکن A بیان شده است. به شکل کلی، می‌توانید با تعریف هر رابطه یکنوایی بین موجودی توکن A و توکن B، مارکت میکری بدون وابستگی به سمیر داشته باشید. در این حالت قیمت، مشتق نمودار در هر نقطه خواهد بود.


توضیحات بیان شده، تنها در خصوص نقش عدم وابستگی به مسیر در جلوگیری از نوع مشخصی از حملات بحث می‌کند: حمله‌ای که در آن مهاجم با انجام تعدادی تراکنش قیمت را به سمت و سوی مشخصی حرکت می‌دهد تا بتواند به شکل مستمر سرمایه بازارساز را تصاحب کند. با یک بازارساز که به مسیر وابسته نیست، چنین «پامپ‌»هایی بی‌اثر و ناممکن خواهند شد. هرچند نقص‌های دیگری ممکن است وجود داشته باشد. اگر قیمت میکر از ۵ اتر به ۱ اتر کاهش یابد، میکر مثال ما ۲۸ اتر سرمایه از دست می‌دهد، در حالی که اگر این دو توکن را هولد می‌کرد، تنها ۲۰ اتر از دست می‌داد. ۸ اتر دیگر کجا رفته است؟

در شرایط ایده‌آل، قیمت (در اینجا منظور قیمت واقعی است؛ قیمتی که سطح عرضه و تقاضا کاربران و تریدرها در آن به موازنه می‌رسد) به سرعت کاهش می‌یابد و یک معامله‌گر خوش‌شانس موفق می‌شود که این ۸ اتر سود (منهای هزینه قابل صرف نظر تراکنش) را به جیب بزند. اما اگر چندین معامله‌گر وجود داشته باشد چه رخ خواهد داد؟ در صورتی که قیمت بین بلاک n و n+1 تفاوت داشته باشد، سبب این می‌شود که معامله‌گران برای تصاحب این سود وارد جنگ شوند و هر کدام سعی کنند با پرداخت کارمزد تراکنش بیشتر، تراکنش خود را در بلوک بگنجانند. در این صورت برنده اصلی ماینر خواهد بود. از نظریه تعادل درآمد می‌توانیم این نتیجه را بگیریم که میزان کارمزد تراکنش‌ها بین معامله‌گران آنقدر بالا خواهد رفت که تقریبا با سود (۸ اتر) برابر شود (حداقل در ابتدا چرا که تعادل واقعی زمانی رخ می‌دهد که ماینر شخصا دست به بهره‌گیری از این فرصت کند). بنابراین در هر دو حالت، این پیشامد همچون هدیه‌ای به ماینرهاست.

یک راه برای بهبود رفاه عمومی سیستم طراحی سازوکاری است که در آن تنها با موفقیت آمیز بودن تراکنش، به ماینرها کارمزد تراکنش پرداخت شود. این بدین معنی است که اگر قیمت «واقعی» میکر از ۵ اتر به ۴.۹ کاهش پیدا کند و ۵۰ معامله‌گر به دنبال آربیتراژگیری از مارکت میکر باشند و نفر اول موفق به انجام تراکنش شود، تنها او کارمزد تراکنش را پرداخت کند. این‌چنین، تراکنش ناموفق ۴۹ نفر دیگر سبب اشغال بی‌دلیل بلاکچین نخواهد شد. طرح پیشنهادی EIP-86 که قرار است در هاردفورک متروپلیس گنجانده شود، به این موضوع می‌پردازد و راه را برای استانداردسازی چنین تراکنش‌های مشروط باز می‌کند (تاثیر جانبی دیگر مثبت آن است که می‌تواند رقابت کاربران در عرضه اولیه توکن‌ها را کاهش دهد چرا که بسیاری از روش‌های فروش توکن، به نحوی طراحی شده‌اند که منجر به حراجی قیمت گس می‌شود).

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

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

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

منبع
vitalik

نوشته های مشابه

2 دیدگاه
جدید ترین
قدیمی ترین محبوب ترین
Inline Feedbacks
View all comments
دکمه بازگشت به بالا