توضیح عملکرد آن با گروه بندی خطوط کد
این قسمت 2 از تفکیک قرارداد هوشمند Uniswap است. در قسمت 1 به موارد زیر پرداختیم:
- نحوه عملکرد Uniswap در سطح بالا
- نحوه سازماندهی کد Uniswap
- قابلیت های Uniswap
- قراردادهای اصلی: جفت (سخت): مدیریت وجوه، ضرب کردن، و سوزاندن
در این مقاله به بقیه موارد می پردازیم:
- قراردادهای اصلی: جفت (سخت): مبادله، توکن های مالکیت استخر، کارمزد پروتکل و اوراکل قیمت
- قراردادهای اصلی: کارخانه (آسان)
- قرارداد پیرامونی: روتر (آسان)
- کد کاملا مشروح
قراردادهای اصلی: جفت (سخت)
مبادله
تابع swap توسط معامله گران برای مبادله توکن ها استفاده می شود:
- اول، ما یک دسته ادعا داریم
- سپس در خطوط 170 و 171، ما توکن ها را با خوش بینانه به خارج (به معامله گر) منتقل می کنیم (بدون اطمینان از اینکه معامله گر قبلاً توکن های مربوطه را به موجودی ما منتقل کرده است. ما می توانیم با خوش بینانه بودن توکن ها را به خارج منتقل کنیم، زیرا در ادامه در تابع اظهاراتی داریم تا بررسی کنیم که آیاما نشانه های مربوطه را دریافت کردیم (قرارداد Periphery باید قبل از اینکه ما را برای مبادله فراخوانی کند، توکن ها را برای ما ارسال کند).
- خط 172 در صورت درخواست، به گیرنده مبادله اطلاع خواهد داد.
- Then on lines 176 and 177 we actually check how many tokens we received. We assert that we received>مقدار 0 برای حداقل یک نشانه در خط 178. اگر این ادعا ناموفق باشد، کل تابع برمی گردد و هیچ اتفاقی رخ نخواهد داد.
- سپس در خطوط 180 و 181 کارمزد معاملاتی (0. 3%) را از موجودی کم می کنیم و در خط 182 بررسی می کنیم که آیا مقدار k (x*y=k) پس از معامله کاهش یافته است یا خیر. مقدار k هرگز نمی تواند کاهش یابد زیرا در غیر این صورت، Uniswap از مبادله ضرر می کند.
- در نهایت، ذخایر شناخته شده خود را با موجودی های جدید به روز می کنیم و یک رویداد Swap منتشر می کنیم.
یادداشتی در مورد هزینه ها و پاداش ها
Uniswap با گرفتن درصد کمی (0. 3٪) کارمزد از معامله گران در هر معامله کار می کند. سپس بعداً (اختیاری) برخی از آن کارمزدها (1/6) را برای خود می گیرد و بقیه را به نسبت میزانی که ارائه دهنده نقدینگی در استخر مشارکت کرده است بین تامین کنندگان نقدینگی توزیع می کند.
این هزینه ها/پاداش ها کجا ذخیره می شوند؟آنها در واقع درست در خود استخر ذخیره می شوند.
وقتی معامله گران کارمزد خود را پرداخت می کنند، این کارمزد به استخر اضافه می شود. بعداً هنگامی که ارائه دهندگان نقدینگی وجوه را اضافه یا برداشت می کنند، پاداش ارائه دهنده نقدینگی با استفاده از فرمول های ریاضی پیچیده محاسبه می شود.
این ظرافت UniSwap در بازی دوباره است - به جای ایجاد یک استخر/ذخیره سازی جداگانه برای هزینه ها/پاداش ها ، آنها فقط همه چیز را به استخر اضافه می کنند و سپس از فرمول های ریاضی هوشمندانه استفاده می کنند تا میزان استخر را از هزینه ها نتیجه بگیرند. و UNISWAP یک روش کارآمد برای پیگیری مطلقاً لخت برای به دست آوردن این مقادیر در هر نقطه در آینده دارد.
نشانه های مالکیت استخر
هنگامی که ارائه دهندگان نقدینگی بودجه ای به استخر اضافه می کنند ، به آنها نشانه های مالکیت استخر داده می شود. پس از مدتی ، این نشانه های مالکیت به دلیل هزینه معامله گران ارزش خود را کسب می کنند. هنگامی که نشانه ها به عقب مبادله می شوند ، ارائه دهندگان نقدینگی بیشتر از سپرده گذاری می شوند.
نشانه های مالکیت استخر به عنوان یک نشانه استاندارد ERC20 اجرا می شوند. این قرارداد در UNISWAPV2ERC20. SOL از UNISWAP (V2-Core/Contracts/UNISWAPV2ERC20. SOL) اجرا شده است. این قسمت از نمودار ما از قسمت 1 است:
من قبلاً در مقاله شکست قرارداد Smart ERC20 ، قرارداد ERC20 UNISWAP را انجام دادم ، بنابراین خودم را تکرار نمی کنم.
قرارداد زوج با تمدید آن به اجرای ERC20 دسترسی پیدا می کند:
به این ترتیب قرارداد جفت به توابع _mint _mint و _bu دسترسی پیدا می کند:
هزینه پروتکل
UNISWAP V2 هزینه پروتکل قابل تعویض را معرفی کرد - هزینه ای که می تواند توسط UNISWAP روشن یا خاموش شود که برای حفظ خدمات به UNISWAP می رود. این برابر با 1/6 هزینه پرداخت شده توسط معامله گران است. بیایید بررسی کنیم که چگونه هزینه پروتکل در قرارداد جفت انجام می شود.
عملکرد اصلی هزینه پروتکل _mintfee است:
این عملکرد پیچیده به نظر می رسد ، بنابراین بیایید فقط روی این خطوط تمرکز کنیم:
- ما ابتدا آدرس Feeto را از کارخانه دریافت می کنیم. کارخانه قراردادی است که این قرارداد جفت را ایجاد کرده است.
- اگر به چیزی غیر از آدرس صفر تنظیم شود ، این بدان معنی است که هزینه پروتکل روشن است. آدرس Feeto آدرس را نشان می دهد که هزینه پروتکل باید به آن ارسال شود.
- اگر هزینه روشن باشد ، ما مقداری نقدینگی را به آدرس پاها نعناع می کنیم.(عملکرد _mint تابع _mint ERC20 است)
بقیه کد برای محاسبه نقدینگی است. نقدینگی در اینجا نشان می دهد میزان نشانه های جدید مالکیت استخر که باید به آدرس پاها منتقل شوند. اینگونه است که UNISWAP هزینه های پروتکل را پیاده سازی می کند: این فقط نشانه های مالکیت استخر جدید را به خود می بخشد. در واقع ، همه افراد دیگر را در استخر (ارائه دهندگان نقدینگی) رقیق می کند.
IMHO ، _MINTFEE بهترین نام برای این عملکرد نیست زیرا دارای عوارض جانبی از نقدینگی جدید است. نام بهتر _collectprotocolfee خواهد بود.
چگونه هزینه پروتکل محاسبه می شود
یک روش ساده برای اجرای هزینه پروتکل این است که هر بار که مبادله ای از نشانه ها وجود داشته باشد ، 1/6 از هزینه معامله گران می گیرد. اما همانطور که احتمالاً متوجه شده اید ، Uniswap راه آسان را دوست ندارد. این کاملاً عاشق کارآیی و پس انداز بنزین است حتی اگر این بدان معنی باشد که کد 10 برابر پیچیده تر می شود
UNISWAP هزینه های مربوط به هر تجارت را محاسبه نمی کند زیرا این امر باعث می شود گاز اضافی در هر تجارت مبادله ای متحمل شود. از آنجا که هر روز معاملات زیادی وجود دارد ، این امر می تواند مبلغ زیادی از هزینه گاز باشد. در عوض ، UNISWAP هزینه پروتکل را فقط هنگامی که وجوه واریز می شود یا توسط ارائه دهندگان نقدینگی از استخر خارج می شود و یا از استخر خارج می شود ، محاسبه می کند. این یک رویداد بسیار نادر از معاملات است.
بنابراین عملکرد _mintfee فقط از توابع نعنا و سوختگی نامیده می شود.
هزینه پروتکل در طی معاملات به استخر جمع می شود تا استخر به ترکیبی از نشانه های مبادله ، هزینه پروتکل و پاداش برای ارائه دهندگان نقدینگی تبدیل شود. فرمول های ریاضی هوشمندانه به ما این امکان را می دهد تا محاسبه کنیم که هر ماده تشکیل دهنده چقدر است.
هزینه پروتکل ، به ویژه ، با استفاده از یک فرمول پیچیده که می توانید در Whitepaper Uniswap V2 پیدا کنید محاسبه می شود:
مقدار k در اینجا محصول ذخایر (k = x*y) است. به همین دلیل است که ما مقدار KLAST را در طول کد پیگیری می کنیم: مقدار KLAST به ما امکان می دهد تا تاکنون هزینه کل پروتکل انباشته شده (از هر تجارت) را محاسبه کنیم و تمام این هزینه ها را به صورت یک طرفه یا در عملکردهای نعناع یا سوختگی جمع کنیم.
قیمت اوراکل
UNISWAP یک Oracle قیمتی را که می تواند توسط سایر قراردادهای هوشمند در اکوسیستم Ethereum استفاده شود ، برای پرس و جو از قیمت نشانه ها نسبت به یکدیگر استفاده می کند.
برای اجرای قیمت Oracle ، UNISWAP فقط از 3 متغیر استفاده می کند: Price0Cumulativelast ، Price1Cumulativelast و Blocktimestamplast.
قیمت نسبی را می توان با کم کردن قیمت های تجمعی در 2 نقطه در زمان و تقسیم بر زمان سپری شده محاسبه کرد. برای اطلاعات بیشتر ، بخش "قیمت اوراکل" Uniswap را بررسی کنید.
متغیرها فقط یک بار در هر بلوک در اینجا به روز می شوند:
خطوط 75-77 محاسبه می کنند که آیا این اولین بار است که کد در یک بلوک خاص اجرا می شود.
چرا فقط یک بار در هر بلوک مقادیر را به روز می کنیم؟از آنجا که برای دستیابی به چیزی برای کسی سخت تر است که بتواند قیمت ها را دستکاری کند. برای اطلاعات بیشتر در مورد این مأمورین قیمت ، به بخش "قیمت اوراکل" از Whitepaper Uniswap مراجعه کنید.
یک رویداد نقدینگی زمانی است که بودجه توسط ارائه دهندگان نقدینگی اضافه یا پس گرفته می شود.
قفل برای محافظت در برابر سوء استفاده از ورود مجدد است. اساساً این تعدیل کننده عملکرد از اجرای همزمان 2 قسمت مختلف این قرارداد جلوگیری می کند. به نوعی باعث می شود که قرارداد با یک رشته اجرا شود.
زمانی که موجودی قراردادهای ERC20 توکن های مبادله، با متغیرهای ذخیره در قرارداد جفت همگام نمی شوند، اسکیم و همگام سازی مورد نیاز است. این ممکن است برای مثال زمانی اتفاق بیفتد که شخصی فقط مقداری Dogecoin را بدون دلیل به حساب قرارداد Pair منتقل کند. 2 راه حل برای همگام نگه داشتن متغیرهای ذخیره با موجودی واقعی قراردادهای ERC20 وجود دارد:
- skim به کسی اجازه می دهد تا وجوه اضافی را از قرارداد ERC20 برداشت کند. هر کسی می تواند این تابع را صدا بزند!
- همگام سازی متغیرهای ذخیره را برای مطابقت با مانده ها به روز می کند.
نکته ای در مورد پویایی بازار
توکن های قیمت Uniswap با توجه به نسبت آنها در استخر. هرچه عدم تعادل آنها در استخر بیشتر باشد، تفاوت قیمت بیشتر است (به نفع توکن نادرتر).
اما چگونه Uniswap مطمئن می شود که قیمت نسبی توکن ها در استخر با نرخ بازار مطابقت دارد؟آربیتراژ . Uniswap از آربیتراژ استفاده می کند تا اطمینان حاصل کند که قیمت ها در استخر از نزدیک قیمت های بازار را دنبال می کنند.
آربیتراژ زمانی است که یک سرمایه گذار باهوش بین نرخ بازار و نرخ ارز Uniswap مغایرت می بیند، از آن برای کسب سود استفاده می کند و در نتیجه نرخ Unsiwap را به نرخ بازار نزدیک می کند.
به عنوان مثال، اگر Uniswap قیمت Dogecoin به Shiba کمتری را در مقایسه با نرخ بازار ارائه دهد، یک سرمایه گذار هوشمند شیبای خود را با Dogecoin در Uniswap مبادله می کند و Dogecoin را با قیمت بالاتری در بازار می فروشد. او سود خواهد کرد و در نتیجه، نرخ Unsiwap را به نرخ بازار نزدیک کرد زیرا عرضه Dogecoin را کاهش داد و عرضه Shiba را در استخر Uniswap افزایش داد (قیمت Dogecoin به Shiba به دلیل نحوه Uniswap افزایش خواهد یافت. نشانه های قیمت نسبت به یکدیگر).
این تا زمانی ادامه خواهد داشت که نرخ Uniswap با نرخ بازار مطابقت داشته باشد. بنابراین نرخ Uniswap تمایل دارد تا نرخ بازار را از نزدیک دنبال کند و به همین دلیل است که می توان از آن به عنوان اوراکل قیمت روی زنجیره استفاده کرد.
- همانطور که وایت پیپر Uniswap v2 بیان می کند: اولین ارائه دهنده نقدینگی که به یک استخر ملحق می شود، نرخ مبادله اولیه را با واریز آنچه که معتقدند ارزش معادل توکن های ETH و ERC20 است تعیین می کند. اگر این نسبت پایین باشد، معامله گران آربیتراژ قیمت ها را با هزینه تامین کننده نقدینگی اولیه به تعادل می رسانند.
- و وایت پیپر Uniswap v1 بیان می کند: معاملات بزرگ باعث افت قیمت نیز می شوند، اما آربیتراژ تضمین می کند که قیمت خیلی از صرافی های دیگر تغییر نکند.
خلاصه
این برای قرارداد Pair است - پیچیده ترین قرارداد در Uniswap! 2 قرارداد دیگر بسیار آسان تر است. بیایید آنچه را که یاد گرفتیم خلاصه کنیم.
قرارداد جفت ترکیبی از مجموعه ای از عملکردها است:
- مدیریت وجوه
- افزودن/حذف نقدینگی
- تعویض توکن ها
- مدیریت هزینه ها / پاداش ها
- محاسبه هزینه پروتکل
- اجرای اوراکل قیمت
در اینجا کد کاملاً مشروح شده برای قرارداد جفت است که با توجه به عملکرد دارای کد رنگی است:
بهترین استراتژی معاملات...
ما را در سایت بهترین استراتژی معاملات دنبال می کنید
برچسب :
نویسنده : صدرا ذوالریاستین
بازدید : 50
تاريخ : سه
شنبه
22 فروردين
1402 ساعت: 13:47