شیرجه عمیق به پروتکل Uniswap V2

  • 2022-05-20

بدانید که پروتکل Top Defi چگونه در زیر کاپوت کار می کند

به سریال های عمیق Defi خوش آمدید!این سریال از چندین پست تشکیل شده است. هرکدام شامل توضیحی در مورد پروتکل فردی خواهند بود. هدف اصلی این مجموعه درک از رویکردهای اصول اول است که چگونه پروتکل های برتر Defi در زیر کاپوت کار می کنند.

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

پیش نیازها

به منظور دنبال کردن ، داشتن دانش زیر مفید است:

  1. درک کلی از EVM
  2. راحت با استحکام
  3. ریاضی اساسی (جبر)
  4. درک کلی از اصول blockchains و پروتکل های قرارداد هوشمند ساخته شده در بالا

Uniswap v2

این پست به دو بخش اصلی تقسیم می شود: بخش اول ، "نمای اجمالی اجزای سیستم" ، تئوری و عمل در پشت مهمترین مؤلفه هایی که باعث می شود سیستم کار کند توضیح می دهد.

بخش دوم ، "اجرای اصلی سیستم" ، اجرای واقعی معماری را پشت سر می گذارد.

من معتقدم که برای درک واقعی یک سیستم در عمق ، باید بتوانید آن را از ابتدا بازنویسی کنید. امیدوارم تا پایان این پست بتوانید این کار را انجام دهید.

برای شروع یادگیری سیستم به روشی ساختاری ، مهم است که از خودمان سؤالاتی بپرسیم که برای سیستم اساسی است:

  • مکانیسم قیمت گذاری UNISWAP چگونه کار می کند؟
  • چه کسی نقدینگی را برای سیستم فراهم می کند؟
  • چرا کسی نقدینگی را به سیستم ارائه می دهد؟
  • چگونه سیستم نقدینگی را نشان می دهد؟

در طول راه ، باید با درک عمیق پروتکل به تمام سؤالات اساسی پاسخ داده شود.

قبل از شروع ، بیایید به سرعت در مورد UnisWap صحبت کنیم.

UNISWAP یک پروتکل سازنده بازار خودکار غیرمتمرکز است که به هر کسی امکان می دهد Token A را برای نشانه B. مبادله کند. سازندگان بازار خودکار متفاوت از یک مدل کتاب سفارش سنتی کار می کنند. اصل اصلی که یک سازنده بازار خودکار (UNISWAP) را از یک کتاب سفارش سنتی متمرکز متمایز می کند این است که سابق کد بدون اجازه را در blockchain اجرا می کند و به هر کسی امکان می دهد شرکت کند.

قبل از ادامه کار ، می خواهم چند چیز را بگویم.

  1. Uniswap V2 غیر متمرکز است: عدم تمرکز باینری نیست ، اما از نظر من (و بسیاری دیگر) ، یک پروتکل قرارداد هوشمند غیرمتمرکز یکی از طرفین است که در آن هیچ یک از طرفین مرکزی نمی تواند به بودجه کاربر دسترسی پیدا کند. به عبارت دیگر ، هیچ کس کلید خاصی ندارد که بتواند قراردادها را اصلاح کند.
  2. سه نسخه از UNISWAP وجود دارد: برای این پست ، ما روی V2 تمرکز خواهیم کرد (در آینده یک پست V3 انجام خواهیم داد). اما اگر می خواهید یاد بگیرید که چگونه UnisWap ایجاد شده است ، پیشنهاد می کنم این فیلم را تماشا کنید.
  3. بسیاری از AMM ها چنگال Uniswap V2 هستند: Uniswap V2 بسیار ساده تر از V3 است ، بنابراین ، نگهداری آن آسان تر است. بنابراین هنگامی که می دانید Uniswap V2 چگونه کار می کند ، بیشتر AMM ها را نیز می شناسید!

بررسی اجزای سازنده سیستم

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

اما در یک سطح اساسی ، شما در حال تعامل با یک قرارداد هوشمند (استخر) هستید که ذخایر دو نشانه مختلف را "نگه می دارد". به عنوان مثال ، اگر برای USDC مقداری WETH را تعویض می کنید ، با جفت قرارداد هوشمند WETH/USDC در تعامل هستید (ما توضیح خواهیم داد که چگونه این کار بعداً انجام می شود). اگر علاقه مند هستید ، اینجا جفت قرارداد هوشمند WETH/USDC در Etherscan است.

بنابراین، اگر USDC را با WETH خریداری می کنید، عرضه WETH در استخر را افزایش می دهید و عرضه USDC را کاهش می دهید، بنابراین، قیمت نسبی USDC در مقابل WETH را افزایش می دهید.

در بخش‌های بعدی به نحوه عملکرد استخر (ریاضی پشت آن) خواهیم پرداخت.

نکته مهمی که باید در نظر داشته باشید این است که استخرهای UniswapV1 همیشه در برابر Eth معامله می‌شدند. به عبارت دیگر، هر استخر ETH/xToken بود.

در Uniswap V2، هر استخر ERC-20/ERC-20 است. این رویکرد انعطاف پذیری بیشتری را برای ارائه دهندگان نقدینگی فراهم می کند زیرا آنها نیازی به اتکای 100٪ به اتریوم ندارند. بنابراین، هر بار که ETH را با توکن دیگری تعویض می‌کنید، ابتدا ETH شما به WETH تبدیل می‌شود.

شرکت کنندگان پروتکل

Uniswap با ارائه مشوق هایی به شرکت کنندگان مختلف برای کار با سیستم به منظور کسب سود کار می کند. شرکت کنندگان اصلی سیستم عبارتند از:

  1. معامله گران: معامله گران می توانند چندین عمل را در سیستم انجام دهند. بعضی از آنها ... هستند:
  • گمانه زنی در مورد قیمت دارایی
  • نرم افزار آربیتراژ. به عنوان مثال، اگر قیمت ETH در Uniswap با 3000 دلار و در Coinbase با 3800 دلار معامله شود، آربیتراژور بلافاصله ETH را در Uniswap خریداری می کند و آن را در Coinbase برای کسب سود مجدد می فروشد.
  • عملکرد مبادله پایهمی‌خواهید توکن x را به نشانه y تغییر دهید تا از آن‌ها در Dapp استفاده کنید.

2. ارائه دهندگان نقدینگی (LPs): LP ها نقدینگی را در اختیار استخرهای توکن قرار می دهند. به عنوان پاداش، آنها کارمزد معامله را دریافت می کنند.

3. توسعه دهندگان: توسعه دهندگان سیستم ها و برنامه های کاربردی موجود در اکوسیستم را ایجاد می کنند. در اصطلاح Uniswap، آنها می توانند توسعه دهندگان پروتکل اصلی، توسعه دهندگان Dapp شخص ثالث که با Uniswap ادغام می شوند، توسعه دهندگان کیف پول و غیره باشند.

قبل از فرو رفتن در قراردادهای هوشمند، بیایید مفاهیم اصلی را درک کنیم.

سه جزء اساسی وجود دارد که برای داشتن دانش عمیق از Uniswap (و بیشتر پروتکل های DeFi) باید آنها را درک کنیم: آنها فرمول ثابت محصول، آربیتراژ و از دست دادن دائمی هستند.

UniswapV2 یک کارمزد ثابت 0. 3٪ برای هر معامله دریافت می کند. در بخش‌های آینده نحوه محاسبه آن را خواهیم دید. این کارمزد به تامین کنندگان نقدینگی تعلق می گیرد و این برای پاداش نقدینگی مردم است. این پروتکل همچنین می تواند تغییری ایجاد کند که 0. 05٪ به تیم Uniswap می دهد و بخشی از هزینه به جای معامله گران از LP ها تخفیف می یابد.

فرمول محصول ثابت در عمق

بسیاری از بازارسازان خودکار به لطف فرمول ثابت محصول کار می کنند. این یک الگوریتم بسیار ساده و در عین حال قدرتمند است.

فرمول ثابت محصول، الگوریتم بازار خودکار است که پروتکل Uniswap (و بسیاری از AMMهای دیگر) را تقویت می کند.

این فرمول به سادگی بیان می‌کند که k ثابت باید در رابطه با جریان خروجی/ورودی x و y بدون تغییر باقی بماند.

به عبارت دیگر، تا زمانی که k ثابت بماند، می توانید مقدار x و y را به هر چیزی که می خواهید تغییر دهید.

مثلا:

x و y چیست؟

x و y ذخایر توکن ها در استخر هستند. برای مثال، اگر DAI را با WETH عوض می‌کنید، در حال تعامل با مجموعه قرارداد هوشمند DAI/WETH هستید. مقدار کل DAI که قرارداد دارد x خواهد بود و مقدار کل WETH y خواهد بود.

به اندازه کافی سادهاین الگوریتمی است که بسیاری از AMM ها را تغذیه می کند.

در اجرای واقعی، فرمول کمی متفاوت است.

بیایید فرمول واقعی مورد استفاده Uniswap V2 را ببینیم.

در اینجا، می توانید اجرای کامل تابع "swap" را بیابید. اما ما به خصوص به خطوط کد زیر علاقه مند هستیم:

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

چهار متغیر در داخل دستور require وجود دارد:

  • balance0Adjusted: پس از اینکه معامله گر توکن هایX را به استخر ارسال کرد، ذخیره x پس از منهای 0. 3 درصد از مبلغ ارسال شده، ذخیره می شود.
  • balance1Adjusted: ذخایر y پس از توکن Y از استخر برای معامله گر ارسال می شود.
  • _reserve0: ذخیره توکن x قبل از مبادله.
  • _reserve1: ذخایر رمز y قبل از مبادله.

البته، balance0Adjusted و balance1Adjusted را می توان معکوس کرد.

برای درک بهتر این موضوع مثالی می زنیم:

  • یک استخر DAI/WETH در Uniswap وجود دارد.
  • ذخایر فعلی 20000DAI / 10 WETH است و یک معامله گر می خواهد 1 WETH را با 1500 DAI مبادله کند:

همانطور که می بینید، معامله گر 1 WETH را در ازای 1500 DAI به استخر فرستاد. آنها می توانستند DAI بیشتری برای WETH خود دریافت کنند، اما نکته اینجاست که دو چیز را نشان دهیم:

  1. k هرگز ثابت نمی ماند. همیشه به دلیل کارمزد تراکنش افزایش می‌یابد، اما در صورت استفاده ناکارآمد از سیستم می‌تواند افزایش یابد (مانند مثال ما، معامله‌گر می‌توانست DAI بیشتری برای WETH خود دریافت کند).
  2. تنها کنترلی که تابع مبادله واقعاً اعمال می‌کند این است که ذخایر جدید (منهای کارمزد) بزرگتر یا برابر با ذخایر قبلی باشد: newK ≥ oldK.

در اینجا اجرای کد واقعی مثال قبلی است:

همانطور که می بینید، چیزها در 1000 ضرب می شوند. این به این دلیل است که اعداد ممیز شناور در Solidity وجود ندارد، بنابراین برای نشان دادن کارمزد 0. 3٪ ضروری است. به همین دلیل است که مقدار0In یا مقدار1in در 3 ضرب می شود (برای نشان دادن 0. 3٪).

دریافت حداکثر مقدار

نکته بسیار مهمی که باید درک کنید این است که حداکثر مقدار توکن هایی است که می توانید برای یک ورودی داده شده دریافت کنید.

توجه: در Uniswap V2 Periphery، شما تمام توابع کمکی برای پیاده سازی این ریاضی را دارید.

مثال: ما یک استخر DAI /WETH با ذخایر زیر داریم: - DAI: 100000 - WETH: 20

ما می خواهیم 1 WETH را با حداکثر مقدار DAI تعویض کنیم.

حداکثر مقدار DAI که برای 1 WETH (برای این استخر) دریافت می کنیم 4748. 29 است.

ریاضیاتی که ما انجام دادیم می تواند در کد نیز نمایش داده شود (این تابع از V2 Periphery است):

بسیار مهم است که همیشه این ریاضیات را درست انجام دهید تا از دریافت نشانه های خروجی کمتر جلوگیری کنید.

به عنوان آخرین نکته در مورد این موضوع، ممکن است از خود بپرسید که چه چیزی متغیر k را تعیین می کند؟

هنگامی که استخر برای اولین بار ایجاد می شود، K تعیین می شود، و سپس هر بار که یک معامله جدید وجود دارد، رشد می کند. اگر به مثال گذشته خود برویم، اگر معامله‌گری یک مبادله را درست بعد از انجام آن انجام دهد، k برای معامله او، k جدید معامله قبلی خواهد بود.

آربیتراژ

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

به عنوان مثال، هنگامی که شما در حال تعویض WETH با DAI در Uniswap هستید، پروتکل چگونه می داند که قیمت WETH نسبت به DAI x است؟

پاسخ کوتاه این است که Uniswap هیچ سرنخی از قیمت واقعی ندارد. در واقعیت، قیمت به دلیل انگیزه ها با دنیای خارج مطابقت دارد.

تنها چیزی که پروتکل واقعاً برای انجام یک مبادله موفق اعمال می‌کند «فرمول ثابت محصول» است.

بیایید یک مثال را مرور کنیم.

فرض کنید یک استخر DAI/WETH در Uniswap وجود دارد. قیمت WETH در Uniswap در حدود 3000 DAI معامله می شود. ما می‌توانیم با تقسیم تعداد ذخایر DAI بر تعداد ذخایر ETH، قیمت را بدست آوریم (این مقدار دقیقی نیست که شما دریافت می‌کنید، ما آن را در بخش قبل محاسبه کردیم).

اکنون، این فرصت فرا رسیده است!

قیمت WETH با قیمت 3200 دلار در کوین بیس معامله می شود. تفاوت 200 دلاری بین قیمت WETH Uniswap و Coinbase وجود دارد. این یک فرصت آربیتراژ ایجاد می کند و بلافاصله یک آربیتراژور (نرم افزار ربات) WETH را در Uniswap خریداری می کند و تا زمانی که قیمت مطابقت داشته باشد آن را در Coinbase می فروشد.

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

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

بنابراین، در نتیجه، Uniswap از قیمت های جهان خارج اطلاعی ندارد. به لطف آربیتراژورها، قیمت ها تقریباً با دنیای خارج یکسان است.

از دست دادن دائمی

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

بیایید یک مثال برای درک بهتر این موضوع ایجاد کنیم.

تصور کنید که آلیس چند توکن در کیف پول خود دارد، بنابراین او می‌خواهد یک ارائه‌دهنده نقدینگی برای کسب سود باشد. برای مثال، او قصد دارد یک استخر DAI/WETH جدید در Uniswap ایجاد کند. قیمت فعلی بازار WETH 3000 دلار است، بنابراین برای جلوگیری از آربیتراژ، او باید با قرار دادن 3000 DAI برای هر WETH، استخر را شروع کند.

او استخر را با قرار دادن 10 WETH و 30000 DAI با ارزش کل USD 60000 دلار آغاز خواهد کرد (ما باید این عدد را در نظر داشته باشیم).

*برای ساده کردن کار، ما کارمزد معامله را در نظر نخواهیم گرفت.

عالی است، بنابراین اکنون آلیس یک LP این استخر Uniswap DAI/WETH شده است. حال، بیایید تصور کنیم که قیمت WETH به 4687 دلار می‌رسد. همانطور که تا به حال باید بدانید، این یک فرصت آربیتراژ بزرگ ایجاد می کند، بنابراین بلافاصله، یک آربیتراژ ETH را در استخر آلیس خریداری می کند تا زمانی که قیمت با بازار خارجی برابری کند.

بنابراین، پس از مدتی آربیتراژ، استخر آلیس چیزی شبیه به این خواهد شد (باز هم، ما هزینه های تراکنش را در نظر نمی گیریم):

همانطور که می بینیم، پس از مقداری آربیتراژ، اکنون استخر به جای 10، 8 WETH و به جای 30،000، 37500 DAI دارد (چیزی که آلیس در ابتدا ارائه کرد). مبلغ کل استخر اکنون 75000 دلار است ((8ETH * 4687. 5 دلار) + 37500)).

مشکل اینجا پیش می‌آید: اگر آلیس فقط دارایی‌ها را در اختیار داشت، پول بیشتری داشت. به یاد داشته باشید که در ابتدا، او استخر را با 10 WETH و 30000 DAI تامین کرد. بنابراین، در پایان، او ضرر دائمی 1875 دلار داشت:

برای این مثال، ما سود حاصل از کارمزد تراکنش (0. 3٪) را در نظر نگرفتیم، اما این مفهوم بدون تغییر باقی می ماند.

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

امیدواریم که این مفهوم تا کنون روشن شده باشد!اگر هنوز شک دارید، تماشای این ویدیو را به شدت توصیه می کنم.

نقدینگی / توکن های LP

مقادیر زیاد نقدینگی چیزی است که Uniswap را به یک سیستم جذاب برای استفاده تبدیل می کند. بدون نقدینگی کافی، سیستم ناکارآمد می شود، به ویژه برای معاملات بزرگ نسبت به کل نقدینگی استخر.

توجه: برای معاملات بزرگ (نسبت به استخر)، بهتر است از تجمیع کننده استفاده کنید تا لغزش تا حد امکان کاهش یابد.

خوب!بنابراین اولین چیزی که باید بدانیم این است که چگونه توکن های LP ضرب و سوزانده می شوند؟

هنگامی که یک ارائه‌دهنده نقدینگی نقدینگی را به یک استخر ارائه می‌کند، توکن‌های LP خود را متناسب با مقدار نقدینگی خود دریافت می‌کند.

بیایید این را باز کنیم

استخر Uniswap فقط یک قرارداد هوشمند است که مقدار معینی از ذخایر (توکن x و y) را در خود نگه می‌دارد. تامین کنندگان نقدینگی این ذخایر را تامین می کنند. اما، این استخر یک توکن داخلی به نام "توکن LP" نیز دارد. این توکن برای هر استخر منحصر به فرد است و هدف اصلی پیگیری نقدینگی است که هر ارائه دهنده نقدینگی تزریق کرده است. می توانید این توکن را به عنوان گواهی نقدینگی خود در نظر بگیرید. این توکن همچنین 0. 3% کارمزدی را که Uniswap دریافت می‌کند تعلق می‌گیرد.

استخر قرارداد هوشمند «UniswapV2ERC20. sol» را وارد می‌کند (شما می‌توانید آن را در اینجا پیدا کنید)، که اساساً قراردادی است که دارای عملکرد اساسی ERC20 (ضربه زدن، سوزاندن، انتقال، و غیره) است.

توکن های LP در داخل این UniswapV2ERC20. sol "ذخیره" می شوند. هر بار که ارائه‌دهنده نقدینگی نقدینگی ارائه می‌کند، مقداری توکن به آدرس او ضرب می‌شود. برعکس، هر بار که ارائه‌دهنده نقدینگی نقدینگی را خارج می‌کند، توکن‌های LP سوزانده می‌شوند.

خب این چگونه کار میکند؟

اگر از سطح بالایی به آن فکر کنیم، یک تامین کننده نقدینگی می تواند الف) نقدینگی را تامین کند و ب) نقدینگی را خارج کند. Uniswap این مکانیزم را در دو تابع پیاده سازی می کند: mint() و burn().

ابتدا به عملکرد نعناع می پردازیم. می توانید اجرای کامل تابع را در اینجا بیابید.

برای محاسبه توکن‌های LP که یک ارائه‌دهنده نقدینگی دریافت می‌کند، ابتدا باید بدانیم که آیا نقدینگی وجود دارد یا این اولین بار است که کسی نقدینگی ارائه می‌کند.

در اینجا قطعه کد (داخل تابع mint) است که ما به آن علاقه داریم:

MINIMUM_LIQUIDITY یک متغیر ثابت برابر با 1000 است:

برای درک بهتر این موضوع، یک مثال را مرور می کنیم.

توجه: در اتریوم، ارز برای محاسبه WEI (ETH * 10 **18) است. این همچنین در مورد بیشتر توکن های ERC-20 صدق می کند. برای سادگی، اعداد را بدون 18 صفر می نویسیم، اما هر بار که یک عدد رمزگذاری شده مانند MAXIMUM_LIQUIDITY = 1000 وجود دارد، فقط آن عدد را در نظر می گیریم.

بیایید فرض کنیم که Alice (یک ارائه دهنده نقدینگی) به تازگی یک استخر DAI/WETH جدید ایجاد کرده است.

او 10000 DAI و 2 WETH عرضه خواهد کرد:

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

توجه: هر بار که یک منت وجود دارد، متغیر totalSupply به روز می شود:

سپس مقدار توکن های LP را دریافت می کنیم که قرار است برای ارائه دهنده نقدینگی (آلیس) ضرب شود. برای مثال ما، نتیجه 141. 42 بود. باز هم این فرمول برای تعیین اینکه:

عالی است، بنابراین اکنون استخر ما شامل موارد زیر است:

عرضه کل به معنای کل مقدار توکن های LP در گردش است (آن را با ذخیره های x و y اشتباه نگیرید).

حال، بیایید تصور کنیم که آلیس می‌خواهد هر DAI و WETH را که وارد استخر می‌کند، خارج کند. برای سادگی، فرض می کنیم که ذخایر ثابت باقی می مانند.

برای اینکه آلیس نقدینگی خود را از بین ببرد ، او باید عملکرد سوختگی را صدا کند ، اما قبل از آن ، او باید تمام نشانه های LP خود را به آدرس استخر منتقل کند. بیایید درک کنیم که چگونه این کار می کند. در اینجا اجرای کامل عملکرد سوختگی وجود دارد:

اگر خط 187 را ببینیم ، نقدینگی متغیر میزان نشانه های LP است که آدرس قرارداد در آن وجود دارد. از این رو ، به همین دلیل من ذکر کردم که آلیس قبل از تماس عملکرد باید نشانه های LP را منتقل کند. سپس ، در خطوط 191 و 192 مقادیر نشانه های X و Y به آلیس منتقل می شوند.

به دنبال مثال ما ، اجازه دهید این را باز کنیم:

همانطور که مشاهده می کنید ، مقدار 0 = 10000 و مقدار 1 = 2. این مقدار اولیه است که آلیس تهیه کرده است!

پس از محاسبه مبالغ ، آنها منتقل می شوند و سپس سوزانده می شوند.

این جادوی پشت نشانه های LP است!

به عنوان یک یادداشت نهایی در مورد این موضوع ، اگر به یاد داشته باشیم ، پروتکل هزینه معاملات 0. 3 ٪ را پرداخت می کند. این هزینه به ارائه دهندگان نقدینگی می رود. نحوه جمع آوری هزینه از نظر فنی با افزایش ذخایر X و Y در هر تجارت است. این تأثیر مثبت بر میزان نشانه های LP که هر یک از ارائه دهنده های نقدینگی در اختیار دارند (متناسب با دارایی های آنها) تأثیر می گذارد.

اگر به عملکرد سوختگی برگردیم ، این دو خط کد چیزی است که تعداد نشانه های X و Y را محاسبه می کند تا وقتی می خواهند نشانه های LP خود را برای نشانه های X و Y مبادله کنند ، به ارائه دهنده نقدینگی ارسال کنند.

هر بار که یک معامله گر مبادله ای را انجام می دهد ، باید بافر 0. 3 ٪ نسبت به اندازه تجارت ارسال کند. این 0. 3 ٪ ذخایر استخر را افزایش می دهد. بنابراین ، افزایش ارزش تعادل 0 و تعادل 1 در عملکرد سوختگی.

اجرای اصلی سیستم

اکنون که ما درک کاملی از مؤلفه های فردی داریم ، اجازه می دهیم به اجرای واقعی برویم.

این قسمت بسیار سریعتر خواهد بود ، زیرا موضوعات اصلی قبلاً پوشش داده شده بود.

معماری پروتکل

Uniswap V2 یک سیستم قرارداد باینری هوشمند است. این مجموعه از V2-Core و V2-Periphery تشکیل شده است.

  • V2-Core قراردادهای پایه سطح پایین است. این قراردادهای هوشمند مسئول عملکرد سیستم هستند.
  • V2-Periphery قراردادهای یاور است که به برنامه های Frontend و توسعه دهندگان اجازه می دهد با استفاده از چک های ایمنی و انتزاع برخی موارد ، با قراردادهای اصلی ادغام شوند.

به عبارت ساده تر ، V2-CORE بخشی از پروتکل است که ویژگی های اصلی (مبادله ، مینینگ ، سوزاندن و غیره) را پیاده سازی می کند. در مقابل ، V2-Periphery یک لایه به بالا است. این مجموعه ای از قراردادها و کتابخانه ها است که ادغام را برای توسعه دهندگان آسان می کند.

تیم UNISWAP همچنین این رویکرد کد مدولار را برای کاهش آسیب پذیری های مهم امنیتی با داشتن حداقل لخت در V2-Core معماری کرد. به عبارت دیگر ، آنها فقط آنچه را که برای V2-CORE لازم است ، پیاده سازی کردند ، بنابراین کد کمتری برای حسابرسی وجود دارد (بنابراین امن تر). تمام عملکردهای یاور به V2-Periphery پرتاب شد.

ما فقط روی V2-Core تمرکز خواهیم کرد. دلیل ساده این است که اگر می دانید چگونه V2-Core کار می کند ، شما همچنین می دانید که چگونه V2-Periphery کار می کند (اما راه دیگر نیست).

باز هم ، می توانید repo v2-core را در اینجا پیدا کنید.

سه قرارداد اصلی وجود دارد:

  1. Uniswapv2erc20. Sol: این قرارداد وظیفه رسیدگی به نشانه های LP را بر عهده دارد. این یک قرارداد اساسی ERC20 است ، بنابراین ما این کار را نمی کنیم.
  2. uniswapv2factory. sol: این کارخانه ای است که مسئولیت استقرار استخرهای جدید (جفت) و همچنین پیگیری آنها را بر عهده دارد.
  3. uniswapv2pair. sol: این جایی است که عمل اتفاق می افتد (اجرای استخر).

کارخانه Uniswap v2

مجدداً، قرارداد کارخانه عمدتاً مسئول ایجاد جفت قراردادهای جدید (UniswapV2Pair. sol) است. در اینجا قرارداد کارخانه V2 در Etherscan است.

به منظور تمرکز نقدینگی، تنها یک قرارداد هوشمند برای هر جفت می تواند وجود داشته باشد. به عبارت دیگر، اگر قبلاً یک جفت قرارداد WETH/UNI وجود داشته باشد، کارخانه به شما اجازه ایجاد همان جفت را نمی‌دهد. البته، شما می توانید آن را دور بزنید (با استقرار مستقیم قرارداد جفت)، اما اصل اصلی در اینجا تمرکز نقدینگی تا حد امکان برای جلوگیری از افت قیمت و داشتن نقدینگی بیشتر است.

در اینجا تابعی است که جفت ها را در UniswapV2Factory ایجاد می کند:

چیزی که احتمالا هنوز مورد سوال است این است که چه چیزی ترتیب x و y را تعیین می کند؟

همانطور که در خط 25 مشاهده می کنید، جفت ها بر اساس ترتیب هگزادسیمال گروه بندی می شوند:

خط 27 منحصر به فرد بودن جفت را بررسی می کند:

خطوط 30-32 جفت (UniswapV2Pair. sol) را با استفاده از create2 ایجاد می کنند:

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

نکته مهم دیگر این است که کارخانه می تواند کارمزدی را برای دریافت درصدی در هر سوآپ در نظر بگیرد (شما می توانید خودتان آن را بررسی کنید؛ این بسیار بی اهمیت است).

این برای کارخانه است. این یک اجرای کارخانه ای بسیار ساده و سرراست است، هیچ چیز پیچیده ای نیست.

Uniswap V2 Pair

UniswapV2Pair. sol پایه و اساس UniswapV2 است. اینجا قرارداد است.

این قرارداد مسئولیت رسیدگی به استخرهای منحصر به فرد (هر استخر = یک قرارداد) را بر عهده دارد.

کارکرد اصلی این قرارداد مبادله، نعناع و رایت است. ما قبلاً به جزئیات نحوه عملکرد این اجزا پرداختیم، بنابراین فقط یک قلم مو سریع به آنها می دهیم.

Swap() : تابع swap ستاره Uniswap است. هر بار که می خواهید یک توکن را با نشانه دیگری مبادله کنید، تابع فراخوانی می شود. پیاده سازی کامل تابع را می توانید اینجا ببینید. وظیفه اصلی این تابع اعمال این است که newK بزرگتر یا مساوی k باشد:

Mint() : تابع mint هر بار که یک ارائه دهنده نقدینگی نقدینگی ارائه می کند، توکن های LP را ضرب می کند. میتوانید اینجا پیدایش کنید.

Burn() : تابع Burn مسئول سوزاندن توکن های LP در هر زمانی است که یک ارائه دهنده نقدینگی می خواهد دارایی های خود را از استخر خارج کند. میتوانید اینجا پیدایش کنید.

شما تازه یاد گرفتید که موتور اکثر سازندگان بازار خودکار چگونه کار می کند!

یادداشت در مورد وام های فلش

وام های فلش موضوع بسیار مهمی است که در این پست به آن نپرداخته ایم. دلیل این امر این است که در پست بعدی در مورد AAVE به طور عمیق به آن می پردازیم.

برچسب ها

ثبت دیدگاه

مجموع دیدگاهها : 0در انتظار بررسی : 0انتشار یافته : ۰
قوانین ارسال دیدگاه
  • دیدگاه های ارسال شده توسط شما، پس از تایید توسط تیم مدیریت در وب منتشر خواهد شد.
  • پیام هایی که حاوی تهمت یا افترا باشد منتشر نخواهد شد.
  • پیام هایی که به غیر از زبان فارسی یا غیر مرتبط باشد منتشر نخواهد شد.