توضیح عملکرد آن با گروه بندی خطوط کد
شما احتمالاً فرمول محصول ثابت (x*y = k) را می دانید که قدرت UNISWAP را دارد. اما چگونه قرارداد هوشمند UNISWAP واقعاً زیر کاپوت کار می کند؟
در این مقاله ، ما می خواهیم درک کنیم که چگونه UNISWAP با شکستن قرارداد هوشمند خود اجرا می شود. ما قصد داریم چند صد خط کد استحکام را که روزانه 1. 28 میلیارد دلار درآمد ایجاد می کند ، بررسی کنیم.
هشدار Spoiler: شما یک کد استحکام بسیار کارآمد ، ظریف و ایمن را در پیش خواهید دید.
در اینجا طرح کلی این مقاله آمده است:
- چگونه UNISWAP در سطح بالایی کار می کند
- چگونه کد UNISWAP سازماندهی شده است
- عملکردهای UNISWAP
- قراردادهای اصلی: جفت (سخت)
- قراردادهای اصلی: کارخانه (آسان)
- قرارداد حاشیه ای: روتر (آسان)
- کد کاملاً حاشیه نویسی
چگونه UNISWAP در سطح بالایی کار می کند
هدف اصلی UNISWAP این است که به شما امکان دهید یک نشانه ERC20 را برای دیگری مبادله کنید. به عنوان مثال ، شما به Dogecoin احتیاج دارید اما فقط سکه Shiba دارید. Uniswap به شما امکان می دهد Shiba خود را بفروشید و در عوض Dogecoin را دریافت کنید. این همه به روشی اتوماتیک و غیرمتمرکز انجام می شود. Uniswap فقط یک مبادله غیرمتمرکز است.
مبادلات را می توان از دو طریق اجرا کرد.
- سفارش مدل کتاب: خریداران و فروشندگان سفارشات پرونده. و سیستم متمرکز با سفارشات خرید با سفارشات فروش مطابقت دارد. اینگونه است که بورس سنتی کار می کند.
- سازندگان خودکار بازار (AMM): هیچ همبازی متمرکز وجود ندارد. افرادی هستند که هر دو نشانه (Dogecoin و Shiba) را ارائه می دهند. به آنها ارائه دهنده نقدینگی گفته می شود. این ارائه دهندگان نقدینگی استخر سنگی و نشانه های Shiba ایجاد می کنند. اکنون معامله گران می توانند بیایند و Dogecoin را واریز کنند و در عوض Shiba را دریافت کنند. این کار به طور خودکار و بدون یک نهاد متمرکز انجام می شود. معامله گران مبلغ کمی برای تجارت که برای خدمات خود به ارائه دهندگان نقدینگی می رود ، پرداخت می کنند.
Uniswap از تکنیک AMM استفاده می کند. چگونه نرخ ارز در استخر را تعیین می کند؟یعنی چند توکن شیبا 1 سگکین ارزش دارد؟این با فرمول محصول ثابت (مقدار سگکوئین)*(مقدار shiba) = k تعیین می شود. در طول معاملات ، این محصول باید ثابت بماند.
نگران نباشید اگر این کاملاً مشخص نیست. ما در مورد این فرمول و پویایی بازار اطلاعات بیشتری کسب خواهیم کرد.
یادداشتی در مورد نسخه های UniSwap
Uniswap 3 نسخه دارد.
- ما با V2 کار خواهیم کرد.
- V1 خیلی ساده است و تمام ویژگی های مدرن را ندارد.
- V3 در اصل V2 است اما بهبود یافته و بهینه شده است - کد آن پیچیده تر از V2 است.
اگر می خواهید در مورد تفاوت های نسخه های UNISWAP اطلاعات بیشتری کسب کنید ، مقاله من را بررسی کنید.
چگونه کد UNISWAP سازماندهی شده است
Uniswap در کل 4 قرارداد هوشمند دارد. آنها به هسته و حاشیه تقسیم می شوند.
- هسته اصلی برای ذخیره وجوه (نشانه ها) و در معرض توابع برای تعویض نشانه ها ، اضافه کردن بودجه ، دریافت پاداش و غیره است.
- حاشیه برای تعامل با هسته است.
هسته شامل قراردادهای هوشمند زیر است:
- جفت - یک قرارداد هوشمند که قابلیت تعویض ، مینینگ ، سوزاندن نشانه ها را اجرا می کند. این قرارداد برای هر جفت مبادله مانند Dogecoin ↔ Shiba ایجاد شده است.
- کارخانه - همه قراردادهای زوج را ایجاد و پیگیری می کند
- ERC20 - برای پیگیری مالکیت استخر. به استخر به عنوان یک ملک فکر کنید. زمانی که ارائهدهندگان نقدینگی وجوهی را به استخر ارائه میکنند، در ازای آن «توکنهای مالکیت استخر» دریافت میکنند. این توکن های مالکیت پاداش دریافت می کنند (توسط معامله گرانی که درصد کمی برای هر معامله پرداخت می کنند). وقتی ارائهدهندگان نقدینگی میخواهند وجوه خود را پس بگیرند، فقط توکنهای مالکیت را ارسال میکنند و وجوه + پاداشهای انباشته شده را دریافت میکنند. قرارداد ERC20 توکن های مالکیت را پیگیری می کند.
حاشیه فقط از یک قرارداد هوشمند تشکیل شده است:
- روتر برای تعامل با هسته است. توابعی مانند swapExactETHForTokens، swapETHForExactTokens و غیره را ارائه می دهد.
قابلیت Uniswap
ما در مورد 4 قرارداد هوشمندی که Uniswap دارد و نحوه سازماندهی آنها صحبت کردیم. اما کارکرد اصلی این قراردادها چیست؟عملکرد اصلی به شرح زیر است:
- مدیریت وجوه (نحوه مدیریت توکن هایی مانند Dogecoin و Shiba در استخر)
- وظایف ارائه دهندگان نقدینگی - وجوه بیشتری را واریز کنید و وجوه را همراه با پاداش برداشت کنید
- توابع برای معامله گران - مبادله
- مدیریت توکن های مالکیت استخر
- هزینه پروتکل – Uniswap v2 هزینه پروتکل قابل تعویض را معرفی کرد. این هزینه پروتکل به خاطر تلاش های تیم Uniswap در حفظ Uniswap می رود. در حال حاضر، این هزینه پروتکل خاموش است، اما می توان آن را در آینده روشن کرد. وقتی فعال است، معاملهگران همچنان همان کارمزد را برای معامله پرداخت میکنند، اما 1/6 از این کارمزد اکنون به تیم Uniswap و 5/6 مابقی به ارائهدهندگان نقدینگی به عنوان پاداش برای ارائه وجوه خود میرسد.
علاوه بر عملکرد اصلی که در بالا توضیح داده شد، Uniswap یکی دیگر نیز دارد که هسته اصلی Uniswap نیست، اما کمکی مفید برای سایر قراردادها در اکوسیستم اتریوم است:
- اوراکل قیمت - Uniswap قیمت توکنها را نسبت به یکدیگر دنبال میکند و میتواند به عنوان اوراکل قیمت برای سایر قراردادهای هوشمند در اکوسیستم اتریوم استفاده شود. به دلیل آربیتراژ (که بعداً در مقاله با آن آشنا خواهیم شد)، قیمتهای Uniswap تمایل دارند از نزدیک قیمتهای واقعی بازار توکنها را دنبال کنند. بنابراین اوراکل قیمت Uniswap تقریب خوبی از قیمت های واقعی بازار است.
قراردادهای اصلی: جفت (سخت)
اکنون بیایید به کد Solidity واقعی قراردادهای هوشمند Uniswap بپردازیم. ما با قرارداد جفت شروع می کنیم. این پیچیده ترین قرارداد از 4 قرارداد هوشمند است. بقیه راحت تر خواهند شد.
قرارداد Pair مبادله بین یک جفت توکن مانند Dogecoin و Shiba را اجرا می کند. کد کامل قرارداد هوشمند Pair را میتوانید در Github تحت v2-core/contracts/UniswapV2Pair. sol پیدا کنید.
بیایید آن را خط به خط تجزیه کنیم.
اول، اظهارات واردات:
بعد، بیانیه قرارداد:
- نام قرارداد UniswapV2Pair است
- این رابط IUniswapV2Pair را پیاده سازی می کند که فقط یک رابط برای این قرارداد است (در اینجا می توانید پیدا کنید). همچنین قرارداد UniswapV2ERC20 را تمدید می کند. چرا؟برای مدیریت توکن های مالکیت استخر. بعداً در مورد آن بیشتر خواهیم آموخت.
- SafeMath یک کتابخانه برای مقابله با سرریز/زیر جریان است. UQ112x112 یک کتابخانه برای پشتیبانی از اعداد شناور است. Solidity به طور پیش فرض از شناورها پشتیبانی نمی کند. این کتابخانه شناورها را با استفاده از 224 بیت نشان می دهد. 112 بیت اول برای کل عدد و 112 بیت آخر مربوط به قسمت کسری است.
در مرحله بعد، کد را بر اساس عملکردی که پیاده سازی می کند گروه بندی می کنیم.
مدیریت وجوه
یک جفت Uniswap تبادل بین یک جفت توکن مانند Dogecoin و Shiba است. این توکن ها به صورت token0 و token1 در قرارداد نشان داده می شوند. آنها آدرس قراردادهای هوشمند ERC20 هستند که آنها را اجرا می کنند.
متغیرهای رزرو مقدار توکن ما را در این جفت ذخیره می کنند.
ممکن است تعجب کنید که رمز واقعی کجا ذخیره می شود؟این در قرارداد ERC20 خود توکن انجام می شود. در قرارداد زوج انجام نشده است. قرارداد جفت فقط ذخایر را پیگیری می کند. از دیدگاه ERC20، قرارداد Pair فقط یک کاربر معمولی است که می تواند توکن ها را انتقال و دریافت کند، موجودی خود را دارد و غیره.
قرارداد جفت، عملکردهای ERC20 مانند balanceOf (با مالک=آدرس قرارداد جفت) و انتقال را برای مدیریت توکنها فراخوانی میکند (اگر گیج شدهاید، به قسمت قرارداد هوشمند ERC20 من مراجعه کنید). در اینجا مثالی از نحوه استفاده از تابع انتقال ERC20 در قرارداد Pair آورده شده است.
تابع _update زیر زمانی فراخوانی می شود که وجوه جدیدی توسط ارائه دهندگان نقدینگی واریز یا برداشت شود یا توکن ها توسط معامله گران مبادله شوند.
چند مورد در این تابع اتفاق می افتد:
- balance0 و balance1 موجودی توکن ها در ERC20 هستند. آنها مقدار بازگشتی تابع balanceOf ERC20 هستند.
- _reserve0 و _reserve1 موجودی های قبلی شناخته شده Uniswap هستند (آخرین باری که balanceOf بررسی شد).
- تمام کاری که ما در این تابع انجام می دهیم این است که سرریز (خط 74) را بررسی کنیم، اوراکل قیمت را به روز کنیم (این در بخش بعدی توضیح داده خواهد شد)، ذخیره ها را به روز رسانی کرده و یک رویداد Sync را به روز رسانی کنیم.
تفاوت بین آرگومان های _reserve0، _reserve1 و متغیرهای ذخیره شده rezerv0، rezerv1 (در زیر نشان داده شده است) چیست؟آنها در اصل یکسان هستند. فراخوانکنندگان تابع _update قبلاً متغیرهای رزرو را از ذخیرهسازی خواندهاند و فقط آنها را بهعنوان آرگومان به تابع _update ارسال میکنند. این فقط راهی برای صرفه جویی در مصرف بنزین است. خواندن از حافظه گرانتر از خواندن از روی حافظه است
این را بارها و بارها متوجه خواهید شد: Uniswap کاملاً کارایی و صرفه جویی در مصرف گاز را دوست دارد. آنها هر نقطه عملکردی را که می توانند از Solidity حذف می کنند. _reserve0 و _reserve1 نمونه ای از آن هستند.
ضرب و سوزاندن
اکنون به عملکرد بعدی بروید - ضرب کردن و سوزاندن. منتینگ زمانی است که یک ارائهدهنده نقدینگی وجوهی را به استخر اضافه میکند و در نتیجه توکنهای جدید مالکیت استخر برای ارائهدهنده نقدینگی ایجاد میشود. سوزاندن برعکس است - ارائهدهنده نقدینگی وجوه (و پاداشهای انباشتهشده) را برداشت میکند و توکنهای مالکیت استخر او سوزانده میشوند (از بین میروند).
بیایید نگاهی به عملکرد نعناع بیندازیم.
- بلافاصله ممکن است دوباره متوجه صرفه جویی در گاز شوید: rezerv0، rezerv1، و totalSupply از حافظه به حافظه (خطوط 111 و 118) منتقل می شوند تا خواندن این مقادیر ارزان تر باشد.
- ما موجودی قرارداد خود (قرارداد جفت) را در خطوط 112 و 113 می خوانیم و سپس مبلغ هر توکن واریز شده را محاسبه می کنیم.
- قسمت صورتی کد برای هزینه پروتکل اختیاری است. بعدا آن را بررسی خواهیم کرد.
- totalSupply کل عرضه توکن های مالکیت استخر را نشان می دهد و یک متغیر ذخیره شده در قرارداد UniswapV2ERC20 است (تفکیک من را در اینجا ببینید). قرارداد Pair UniswapV2ERC20 را تمدید می کند، به همین دلیل است که به متغیر totalSupply دسترسی دارد.
- اگر TotalSupply 0 باشد ، به این معنی است که این استخر کاملاً جدید است و ما باید در حد متوسط_ میزان توکن مالکیت استخر قفل کنیم تا از تقسیم در محاسبات نقدینگی جلوگیری کنیم. نحوه قفل شدن آن با ارسال آن به آدرس صفر است.(هیچ کس کلید خصوصی را که منجر به آدرس صفر می شود ، نمی داند ، بنابراین با ارسال وجوه به آدرس صفر ، شما اساساً وجوه را برای همیشه قفل می کنید).
- متغیر نقدینگی میزان نشانه های جدید مالکیت استخر است که باید به ارائه دهنده نقدینگی استخراج شوند. ارائه دهنده نقدینگی بسته به میزان وجوه جدیدی که وی ارائه می دهد ، تعداد متناسب از نشانه های مالکیت استخر را دریافت می کند (خط 123)
- ما سرانجام نشانه های مالکیت استخر جدید را به آدرس (خط 126) نعناع می کنیم. آدرس ارائه دهنده نقدینگی است (این توسط قرارداد حاشیه ای به نام روتر ارائه می شود که عملکرد نعناع را فراخوانی می کند)
روش افزودن وجوه این است: آنها فقط به قراردادهای ERC20 (با فراخوانی انتقال (از آدرس ارائه دهنده نقدینگی ، به: آدرس قرارداد ، مبلغ) برای هر نشانه) واریز می شوند. سپس قرارداد زوج تعادل (خطوط 112 و 113) را می خواند و آنها را با آخرین مانده های شناخته شده (خطوط 114 و 115) مقایسه می کند. اینگونه است که قرارداد زوج می تواند مبالغ سپرده شده را استنباط کند.
عملکرد سوختگی فقط تصویر آینه عملکرد نعناع است:
- ما دوباره پس انداز گاز را در خطوط 135 ، 136 ، 137 و 143 مشاهده می کنیم
- Balance0 و Balance1 توازن کل نشانه ها در این استخر است. نقدینگی میزان نشانه های مالکیت استخر است که ارائه دهنده نقدینگی (که مایل به پرداخت پول است) است. چرا به عنوان تعادل آدرس (این) به نقدینگی دسترسی پیدا می کنیم؟از آنجا که نقدینگی قبل از فراخوانی عملکرد سوختگی به قرارداد حاشیه به قرارداد حاشیه منتقل شد.
- ما مبلغ نشانه ها را برای خروج از ارائه دهنده نقدینگی به طور متناسب با میزان نقدینگی (نشانه های مالکیت استخر) محاسبه می کنیم (خطوط 144 و 145)
- سپس نقدینگی او را می سوزانیم و نشانه ها را به او منتقل می کنیم.
- پاداش به ارائه دهنده نقدینگی به طور خودکار همراه با بودجه وی پس گرفته می شود. ریاضیات اطمینان می دهد که پاداش به درستی جمع می شود و بیشتر از سپرده گذاری می شوید.
این برای قسمت 1 است!من این مقاله را به 2 قسمت تقسیم کردم زیرا خیلی طولانی می شد. امیدوارم این مفید باشد. اگر سوالی دارید در نظرات به من اطلاع دهید.
در قسمت 2 ما پوشش خواهیم داد:
- بقیه قرارداد زوج: مبادله ، نشانه های مالکیت استخر ، هزینه پروتکل و قیمت اوراکل.
- همچنین کارخانه ، ERC20 و قراردادهای روتر Uniswap
من قصد دارم تا از قراردادهای هوشمند محبوب مانند Axie Infinity و BAYC ، خرابی بیشتری انجام دهم ، بنابراین برای دریافت به روزرسانی من را در متوسط یا توییتر دنبال کنید.
همچنین می توانید خرابی سایر قراردادهای هوشمند و موارد دیگر را برای استحکام Noobs در SolidNoob. com بررسی کنید.