
عکس توسط Piret Ilver در Unsplash
مقدمه
بهترین راه برای یادگیری چیزی آموزش دیگران است. دوم بهترین راه برای یادگیری چیزی این است که خودتان این کار را انجام دهید. من تصمیم گرفتم که دو روش را با هم ترکیب کنم و به خودم و شما آموزش دهم که چگونه خدمات DEFI را در Ethereum (و هر blockchain های دیگر بر اساس دستگاه مجازی EVM - Ethereum) برنامه ریزی کنم.
تمرکز اصلی ما بر نحوه عملکرد این خدمات خواهد بود ، ما سعی خواهیم کرد مکانیک های اقتصادی را که آنها را به آنچه در آن هستند ، درک کنیم (و همه آنها بر اساس مکانیک اقتصادی). ما مکانیسم های اصلی آنها را می یابیم ، تجزیه می کنیم ، می آموزیم و می سازیم.
با این حال ، ما فقط روی قراردادهای هوشمند کار خواهیم کرد: ساختن جلوی آن برای قراردادهای هوشمند نیز یک کار بزرگ و جالب است ، اما از محدوده این سریال خارج نیست.
بیایید سفر خود را با Uniswap آغاز کنیم.
نسخه های مختلف Uniswap
از ژوئن سال 2021 ، سه نسخه Uniswap راه اندازی شده است.
نسخه اول در نوامبر 2018 راه اندازی شد و فقط مبادله ای بین اتر و یک نشانه امکان پذیر بود. مبادلات زنجیره ای نیز امکان پذیر بود تا مبادلات توکن را به دست آورد.
V2 در مارس 2020 راه اندازی شد و این یک پیشرفت بزرگ V1 بود که امکان مبادله مستقیم بین هر نشانه ERC20 و همچنین تعویض زنجیره ای بین هر جفت را فراهم می آورد.
V3 در ماه مه 2021 راه اندازی شد و به طور قابل توجهی راندمان سرمایه را بهبود بخشید ، که به ارائه دهندگان نقدینگی اجازه می داد بخش بزرگی از نقدینگی آنها را از استخرها حذف کنند و هنوز هم همان پاداش ها را دریافت کنند (یا سرمایه را در محدوده قیمت های کوچکتر فشار داده و تا 4000 برابر سود کسب کنند.).
در این سری ، ما به هر یک از نسخه ها حفر خواهیم کرد و سعی خواهیم کرد نسخه های ساده ای از هر یک از آنها را از ابتدا بسازیم.
این پست وبلاگ به طور خاص برای احترام به نظم زمانی بر UNISWAP V1 متمرکز شده و بهتر درک می کند که چگونه راه حل های قبلی بهبود یافته است.
UNISWAP چیست؟
به زبان ساده ، UNISWAP یک مبادله غیرمتمرکز (DEX) است که هدف آن جایگزینی برای مبادلات متمرکز است. این کار در Blockchain Ethereum اجرا می شود و کاملاً خودکار است: هیچ سرپرست ، مدیران یا کاربران با دسترسی ممتاز وجود ندارد.
در اهرم پایین ، این یک الگوریتم است که امکان تهیه استخرها یا جفت های نشانه را فراهم می کند و آنها را با نقدینگی پر می کند تا به کاربران اجازه دهد تا با استفاده از این نقدینگی ، نشانه ها را مبادله کنند. به این الگوریتم سازنده خودکار بازار یا ارائه دهنده نقدینگی خودکار گفته می شود.
بیایید در مورد سازندگان بازار اطلاعات بیشتری کسب کنیم.
سازندگان بازار نهادهایی هستند که نقدینگی (دارایی های تجاری) را به بازارها ارائه می دهند. نقدینگی همان چیزی است که معاملات را ممکن می کند: اگر می خواهید چیزی بفروشید اما هیچ کس آن را خریداری نمی کند ، تجارت نخواهد بود. برخی از جفت های معاملاتی دارای نقدینگی بالایی هستند (به عنوان مثال BTC-USDT) ، اما برخی از آنها به هیچ وجه نقدینگی کم یا بدون آن ندارند (مانند برخی از آلتکین های کلاهبرداری یا سایه دار).
DEX باید نقدینگی کافی (یا زیاد) برای عملکرد داشته باشد و به عنوان جایگزینی برای مبادلات متمرکز عمل کند. یکی از راه های بدست آوردن نقدینگی این است که توسعه دهندگان DEX بتوانند پول خود را (یا پول سرمایه گذاران خود) در آن قرار دهند و سازنده بازار شوند. با این حال ، این یک راه حل واقع بینانه نیست زیرا آنها به پول زیادی برای تأمین نقدینگی کافی برای همه جفت ها نیاز دارند ، با توجه به اینکه Dexes اجازه می دهد مبادله بین هر نشانه باشد. علاوه بر این ، این باعث می شود DEX متمرکز شود: به عنوان تنها سازندگان بازار ، توسعه دهندگان قدرت زیادی در دست خود دارند.
یک راه حل بهتر این است که به هر کسی اجازه دهد که یک بازار ساز باشد و این همان چیزی است که UNISWAP را به عنوان سازنده بازار خودکار تبدیل می کند: هر کاربر می تواند وجوه خود را به یک جفت معاملاتی واریز کند (و از آن بهره مند شود).
نقش مهم دیگری که Uniswap بازی می کند ، Oracle Price است. اوراکل های قیمت خدماتی هستند که قیمت ها را از مبادلات متمرکز نشان می دهند و آنها را به قراردادهای هوشمند ارائه می دهند - چنین قیمت هایی معمولاً دستکاری می شوند زیرا حجم در مبادلات متمرکز اغلب بسیار بزرگ است. با این حال ، در حالی که این حجم های بزرگ را ندارد ، Uniswap هنوز هم می تواند به عنوان یک اوراکل قیمت باشد.
UNISWAP به عنوان یک بازار ثانویه عمل می کند که داوری را جذب می کند که از اختلاف قیمت بین UniSWAP و مبادلات متمرکز سود می برند. این باعث می شود قیمت در استخرهای UniSwap تا حد امکان برای کسانی که در صرافی های بزرگتر قرار دارند نزدیک باشد. و این بدون قیمت مناسب و توابع متعادل کننده امکان پذیر نبود.
سازنده بازار محصول ثابت
احتمالاً قبلاً این تعریف را شنیده اید ، بگذارید ببینیم معنی آن چیست.
سازنده بازار اتوماتیک یک اصطلاح کلی است که الگوریتم های مختلف سازنده بازار غیرمتمرکز را در بر می گیرد. محبوب ترین آنها (و مواردی که این اصطلاح را به دنیا آوردند) مربوط به بازارهای پیش بینی است - بازارهایی که امکان سودآوری را در پیش بینی ها دارند. Uniswap و سایر مبادلات زنجیره ای ادامه آن الگوریتم ها است.
در هسته uniSwap عملکرد ثابت محصول است: $ $ x * ry = k $ $ که در آن (x ) اتر ذخیره است ، (y ) ذخیره است (یا برعکس) ، و (k )ثابت استUniswap مستلزم این است که (k ) بدون توجه به اینکه چه مقدار از ذخایر (x ) یا (y ) وجود دارد ، یکسان باقی می ماند. هنگامی که اتر را برای نشانه ها تجارت می کنید ، اترهای خود را به قرارداد واریز می کنید و در عوض مقداری نشانه دریافت می کنید. Uniswap تضمین می کند که بعد از هر تجارت (k ) یکسان باقی بماند (این واقعاً درست نیست ، بعداً می بینیم که چرا).
این فرمول همچنین مسئول محاسبات قیمت گذاری است و به زودی خواهیم دید که چگونه.
توسعه قراردادهای هوشمند
برای اینکه واقعاً بفهمیم UNISWAP چگونه یک نسخه از آن را می سازیم. ما قراردادهای هوشمند را در استحکام می نویسیم و از Hardhat به عنوان محیط توسعه خود استفاده خواهیم کرد. Hardhat ابزاری واقعاً خوب است که توسعه ، آزمایش و استقرار قراردادهای هوشمند را بسیار ساده می کند. بسیار توصیه شده!
اگر تازه وارد توسعه قراردادهای هوشمند هستید ، من به شما توصیه می کنم این دوره را به پایان برسانید (حداقل مسیر اصلی) - این یک کمک بزرگ برای شما خواهد بود!
راه اندازی پروژه
ابتدا یک دایرکتوری خالی ایجاد کنید (من به نام Mine Zuniswap) ، سی دی داخل آن و نصب Hardhat:
ما همچنین به یک قرارداد توکن نیاز داریم ، اجازه دهید از قراردادهای ERC20 ارائه شده توسط OpenZeppelin استفاده کنیم.
یک پروژه Hardhat را اولیه کنید و همه چیز را از پوشه های قرارداد ، اسکریپت و تست حذف کنید.
لمس نهایی: ما از آخرین نسخه استحکام استفاده خواهیم کرد که در زمان نوشتن 0. 8. 4 است. Hardhat. config. js خود را باز کرده و نسخه استحکام را در پایین آن به روز کنید.
قرارداد توکن
UNISWAP V1 فقط از مبادلات اتر-توکاک پشتیبانی می کند. برای اینکه آنها را ممکن کنیم به یک قرارداد توکن ERC20 نیاز داریم. بیایید آن را بنویسیم!
این تنها چیزی است که ما نیاز داریم: ما قرارداد ERC20 را که توسط OpenZeppelin ارائه شده است تمدید می کنیم و سازنده خودمان را تعریف می کنیم که به ما امکان می دهد نام ، نماد و عرضه اولیه را تنظیم کنیم. سازنده همچنین به صورت اولیه از نشانه ها نعناع می کند و آنها را به آدرس خالق توکن می فرستد.
اکنون ، جالب ترین قسمت آغاز می شود!
قرارداد مبادله
UNISWAP V1 فقط دو قرارداد دارد: کارخانه و مبادله.
کارخانه یک قرارداد رجیستری است که امکان ایجاد صرافی را فراهم می کند و کلیه مبادلات مستقر شده را پیگیری می کند ، و این امکان را برای یافتن آدرس مبادله توسط آدرس توکن و برعکس فراهم می کند. قرارداد مبادله در واقع تبادل منطق را تعریف می کند. هر جفت (ETH-Token) به عنوان یک قرارداد مبادله مستقر می شود و اجازه می دهد تا اتر را از/فقط از یک نشانه تبادل کنید.
ما قرارداد مبادله ای ایجاد خواهیم کرد و کارخانه را به پست وبلاگ بعدی واگذار خواهیم کرد.
بیایید یک قرارداد خالی جدید ایجاد کنیم:
از آنجا که هر مبادله ای فقط با یک توکن مبادله می کند ، ما باید مبادله را با یک آدرس توکن متصل کنیم:
آدرس Token یک متغیر حالت است که باعث می شود از هر عملکرد قرارداد دیگری در دسترس باشد. عمومی ساختن آن به کاربران و توسعه دهندگان این امکان را می دهد تا آن را بخوانند و دریابند که این مبادله با چه چیزی مرتبط است. در سازنده ، ما بررسی می کنیم که Token معتبر است (نه آدرس صفر) و آن را در متغیر حالت ذخیره می کند.
تأمین نقدینگی
همانطور که قبلاً آموخته ایم ، نقدینگی معاملات را ممکن می سازد. بنابراین ، ما به راهی برای اضافه کردن نقدینگی به قرارداد مبادله نیاز داریم:
به طور پیش فرض ، قراردادها نمی توانند اترها را دریافت کنند ، که می توانند از طریق اصلاح کننده قابل پرداخت که امکان پذیر کردن اتصبی را که در یک تابع دریافت می کنند ، برطرف شود: هر اتری ارسال شده به همراه یک تماس عملکردی به مانده قرارداد اضافه می شود.
سپرده گذاری نشانه ها چیز دیگری است: از آنجا که مانده های توکن در قراردادهای توکن ذخیره می شوند ، ما باید از عملکرد TransfermFrom (مطابق با استاندارد ERC20 تعریف شده) برای انتقال نشانه ها از آدرس فرستنده معامله به قرارداد استفاده کنیم. همچنین ، فرستنده معامله باید با عملکرد تأیید شده در قرارداد توکن تماس بگیرد تا قرارداد مبادله ما بتواند نشانه های خود را بدست آورد.
این اجرای افزودنی کامل نیست. من عمداً این کار را کردم تا بیشتر روی عملکردهای قیمت گذاری تمرکز کنم. ما در قسمت بعدی شکاف را پر خواهیم کرد.
بیایید یک عملکرد یاور را نیز اضافه کنیم که توازن توکن مبادله را برگرداند:
و اکنون می توانیم AddIquid را آزمایش کنیم تا همه چیز صحیح باشد:
اول ، ما اجازه می دهیم که قرارداد مبادله 200 از نشانه های خود را با فراخوانی تأیید کند. سپس ، ما برای واریز 200 توکن (قرارداد مبادله برای دریافت آنها) و 100 اتری که همراه با تماس عملکرد ارسال می شوند ، با افزودنی تماس می گیریم. سپس اطمینان می دهیم که مبادله در واقع آنها را دریافت کرده است.
من در تست های کوتاه مدت کد دیگ بخار زیادی را حذف نکرده ام. لطفاً اگر چیزی مشخص نیست ، کد منبع کامل را بررسی کنید.
تابع قیمت گذاری
حال ، اجازه دهید در مورد چگونگی محاسبه قیمت مبادله فکر کنیم.
این ممکن است وسوسه انگیز باشد که فکر کنیم قیمت صرفاً رابطه ذخایر است ، به عنوان مثال: $ $ p_x = frac y x ، p_y = frac x y $ $
و این منطقی است: قراردادهای مبادله با مبادلات متمرکز یا هر اوراکل قیمت خارجی دیگر تعامل ندارند ، بنابراین آنها نمی توانند قیمت مناسب را بدانند. در حقیقت ، قرارداد مبادله ای اوراکل قیمت است. هر آنچه آنها می دانند ذخایر اتر و توکن است ، و این تنها اطلاعاتی است که ما باید برای محاسبه قیمت ها داشته باشیم.
بیایید به این ایده بکشیم و یک عملکرد قیمت گذاری بسازیم:
و بیایید آن را آزمایش کنیم:
ما 2000 توکن و 1000 اتر را واریز کردیم و انتظار داریم قیمت توکن 0. 5 اتر باشد و قیمت اتر 2 نشانه باشد. با این حال ، این آزمون انجام نمی شود: این می گوید ما در ازای نشانه های خود 0 اتر دریافت می کنیم. چرا این است؟
دلیل این امر این است که استحکام از تقسیم عدد صحیح و تنها گرد کردن کف پشتیبانی می کند. قیمت 0. 5 به 0 می رسد! بیایید با افزایش دقت آن را برطرف کنیم:
پس از به روزرسانی آزمون ، آن را تصویب می کند:
بنابراین ، اکنون 1 نشانه برابر با 0. 5 اتر و 1 اتر برابر با 2 توکن است.
همه چیز صحیح به نظر می رسد اما اگر ما 2000 نشانه را برای اتر مبادله کنیم ، چه اتفاقی خواهد افتاد؟ما 1000 اتر دریافت خواهیم کرد و این همه چیز در قرارداد است! مبادله تخلیه می شود!
ظاهراً با عملکرد قیمت گذاری چیزی اشتباه است: این امکان را برای تخلیه مبادله فراهم می کند ، و این چیزی نیست که ما می خواهیم اتفاق بیفتد.
دلیل این امر این است که عملکرد قیمت گذاری متعلق به یک فرمول جمع ثابت است ، که (k ) را به عنوان یک مقدار ثابت (x ) و (y ) تعریف می کند. عملکرد این فرمول جمع ثابت یک خط مستقیم است:
از محورهای (x ) و (y ) عبور می کند ، به این معنی که در هر یک از آنها 0 را فراهم می کند! ما قطعاً چنین چیزی را نمی خواهیم.
عملکرد مناسب قیمت گذاری
بیایید به یاد بیاوریم که UniSwap یک سازنده ثابت بازار محصول است ، به این معنی که بر اساس فرمول محصول ثابت است: $ $ x * y = k $ $
آیا این فرمول عملکرد قیمت گذاری بهتری ایجاد می کند؟اجازه بدید ببینم.
فرمول بیان می کند که (k ) بدون توجه به آنچه ذخایر ( (x ) و (y )) ثابت است ، ثابت باقی می ماند. هر تجارت باعث افزایش ذخیره اتر یا نشانه می شود و ذخیره یا توکن یا اتر را کاهش می دهد - بگذارید این منطق را در یک فرمول قرار دهیم:
$ $ (x + delta x) (y - delta y) = x y $ $
جایی که ( Delta x ) مقدار اترها یا نشانه هایی است که ما برای ( Delta y ) تجارت می کنیم ، مقدار نشانه ها یا اترهایی که در آن می گیریم. با داشتن این فرمول اکنون می توانیم ( delta y ) را پیدا کنیم: $ $ delta y = frac $ $
این جالب به نظر می رسد: عملکرد اکنون به مقدار ورودی احترام می گذارد. بیایید سعی کنیم آن را برنامه ریزی کنیم ، اما توجه داشته باشید که اکنون با مبلغ سر و کار داریم ، نه قیمت.
این یک عملکرد سطح پایین است ، بنابراین بگذارید خصوصی باشد. بیایید دو کارکرد بسته بندی سطح بالا را برای ساده سازی محاسبات انجام دهیم:
بنابراین ، اکنون ما برای 1 توکن 1. 998 توکن برای 1 اتر و 0. 999 اتر دریافت می کنیم. این مقادیر بسیار نزدیک به کالاهای تولید شده توسط عملکرد قیمت گذاری قبلی است. با این حال ، آنها کمی کوچکتر هستند. چرا این است؟
فرمول محصول ثابت که ما محاسبات قیمت خود را بر اساس آن پایه گذاری می کنیم ، در واقع ، یک هایپربولا است:
Hyperbola هرگز از (x ) یا (y ) عبور نمی کند ، بنابراین هیچ یک از ذخایر هرگز 0 نیست. این باعث می شود ذخایر بی نهایت باشد!
و پیامدهای جالب دیگری وجود دارد: عملکرد قیمت باعث کاهش قیمت می شود. هرچه میزان نشانه های معامله شده نسبت به ذخایر بزرگتر باشد ، قیمت آن نیز بیشتر می شود.
این همان چیزی است که ما در تست ها دیدیم: کمی کمتر از آنچه انتظار داشتیم. این ممکن است به عنوان یک اشکال سازندگان ثابت بازار محصولات به نظر برسد (از آنجا که هر تجارت دارای لغزش است) ، اما این همان مکانیسم است که استخرها را از تخلیه محافظت می کند. این همچنین با قانون عرضه و تقاضا هماهنگ است: هرچه تقاضا بالاتر باشد (میزان خروجی بزرگتر که می خواهید دریافت کنید) نسبت به عرضه (ذخایر) ، قیمت بالاتر (کمتر می شود).
بگذارید آزمایشات ما را بهبود بخشد تا ببینیم که چگونه لغزش بر قیمت ها تأثیر می گذارد:
همانطور که می بینید ، وقتی می خواهیم استخر را تخلیه کنیم ، ما فقط نیمی از آنچه را که انتظار داریم دریافت می کنیم.
نکته نهایی که باید در اینجا توجه داشته باشید: عملکرد قیمت گذاری مبتنی بر نسبت ذخایر اولیه ما اشتباه نبود. در واقع ، صحیح است که مقدار نشانه هایی که در آن تجارت می کنیم در مقایسه با ذخایر بسیار اندک است. اما برای ساختن AMM ، ما به چیزی پیچیده تر نیاز داریم.
توابع مبادله
اکنون ، ما آماده اجرای مبادله هستیم.
مبادله اترها برای نشانه ها به معنای ارسال مقداری از اترها (ذخیره شده در متغیر msg. value) به یک عملکرد قرارداد قابل پرداخت و دریافت نشانه ها در ازای آن است. توجه داشته باشید که ما باید msg. value را از تعادل قرارداد تفریق کنیم زیرا تا زمانی که عملکرد نامیده می شود ، اترها ارسال شده قبلاً به تعادل آن اضافه شده اند.
متغیر مهم دیگر در اینجا __mintokens است - این حداقل تعداد نشانه هایی است که کاربر می خواهد در ازای اترهای خود بدست آورد. این مقدار در UI محاسبه می شود و همیشه شامل تحمل لغزش است. کاربر موافقت می کند که حداقل آن را بدست آورد اما نه کمتر. این یک مکانیسم بسیار مهم است که کاربران را از ربات های جلویی محافظت می کند که سعی می کنند معاملات آنها را رهگیری کنند و تعادل استخر را برای سود خود تغییر دهند.
سرانجام ، آخرین کد برای امروز:
این تابع اساساً _tokenssold از نشانه ها را از تعادل کاربر منتقل می کند و در ازای آن ، اخلاق اترها را برای آنها ارسال می کند.
نتیجه
این برای امروز است! ما هنوز تمام نشده ایم ، اما کارهای زیادی انجام دادیم. قرارداد مبادله ما می تواند نقدینگی را از کاربران بپذیرد ، قیمت ها را به شکلی محاسبه کند که از زهکشی محافظت می کند و به کاربران امکان می دهد ETH را برای نشانه ها و عقب تعویض کنند. این بسیار زیاد است ، اما برخی از قطعات مهم هنوز از دست رفته اند:
- اضافه کردن نقدینگی جدید می تواند باعث تغییر قیمت عظیم شود.
- ارائه دهندگان نقدینگی پاداش نمی گیرند. همه مبادلات رایگان است.
- هیچ راهی برای از بین بردن نقدینگی وجود ندارد.
- هیچ راهی برای تعویض نشانه های ERC20 (مبادلات زنجیر شده).
- کارخانه هنوز اجرا نشده است.
ما این کارها را در قسمت آینده انجام خواهیم داد!
لینک های مفید
- بسیاری از اطلاعات اساسی در مورد قراردادهای هوشمند ، blockchain ها و EVM ، برای یادگیری قبل از شروع قراردادهای هوشمند.، پستی در مورد reddit از ویتالیک باترین که در آن پیشنهاد کرد از مکانیک بازارهای پیش بینی برای ساخت مبادلات غیرمتمرکز استفاده کند. این ایده برای استفاده از فرمول محصول ثابت فراهم کرد.
اگر این پست را مفید دیدید ، از نویسنده حمایت کنید.
محتوای این سایت تحت مجوز بین المللی Creative Commons Attribution-Noncommercial-Sharealike 4. 0 مجوز دارد.< Pan> ارائه دهندگان نقدینگی پاداش نمی گیرند. همه مبادلات رایگان است.
فارکس وکسب درامد...
ما را در سایت فارکس وکسب درامد دنبال می کنید
برچسب :
نویسنده : احمد قانع پور
بازدید : 48
تاريخ : يکشنبه
20 فروردين
1402 ساعت: :