Seri Pemula Web3: Kiat Pengembangan Kontrak yang Saya Pelajari dari Kode Uniswap
Saya baru-baru ini menulis tutorial tentang pengembangan pertukaran terdesentralisasi https://github.com/WTFAcademy/WTF-Dapp , mengacu pada implementasi kode Uniswap V3, dan mempelajari banyak poin pengetahuan. Saya telah mengembangkan kontrak NFT sederhana sebelumnya, dan ini adalah pertama kalinya saya mencoba mengembangkan kontrak Defi. Saya yakin kiat-kiat ini akan sangat membantu bagi para pemula yang ingin mempelajari pengembangan kontrak.
Pengembang kontrak dapat langsung menuju ke https://github.com/WTFAcademy/WTF-Dapp untuk berkontribusi kode dan membuat perbedaan untuk Web3~
Selanjutnya, mari kita lihat trik-trik kecil ini, beberapa di antaranya bahkan dapat disebut trik tipuan.
Alamat kontrak dari penyebaran kontrak dapat dibuat dapat diprediksi
Saat kami menerapkan kontrak, kami biasanya mendapatkan alamat yang tampak acak. Karena terkait dengan nonce, alamat kontrak sulit diprediksi. Namun, di Uniswap, kami memiliki persyaratan seperti itu: kami perlu menyimpulkan alamat kontrak melalui pasangan transaksi dan informasi terkait. Ini sangat berguna dalam banyak kasus, seperti menentukan otoritas transaksi atau memperoleh alamat pool.
Di Uniswap, kontrak dibuat dengan menggunakan kode seperti pool = address(new Uniswap V3 Pool{salt: keccak 256(abi.encode(token 0, token 1, fee))}());. Dengan menambahkan salt untuk membuat kontrak menggunakan BUAT 2 ( https://github.com/AmazingAng/WTF-Solidity/blob/main/25_Create2/readme.md ), keuntungannya adalah alamat kontrak yang dibuat dapat diprediksi. Logika pembuatan alamat adalah new address = hash(0x FF, creator address, salt, initcode).
Anda dapat mempelajari lebih lanjut tentang ini di kursus WTF-DApp di https://github.com/WTFAcademy/WTF-Dapp/blob/main/P103_Factory/readme.md .
Memanfaatkan fungsi panggilan balik dengan baik
Dalam Solidity, kontrak dapat saling memanggil. Ada skenario di mana A memanggil B dalam metode tertentu, dan B memanggil kembali A dalam metode yang dipanggil, yang juga sangat berguna dalam beberapa skenario.
Di Uniswap, ketika Anda memanggil metode swap dari kontrak Uniswap V3 Pool, ia akan memanggil kembali swapCallback, dan panggilan balik akan meneruskan nilai yang dihitung Token sebenarnya diperlukan untuk transaksi ini. Pemanggil perlu mentransfer Token yang diperlukan untuk transaksi ke Uniswap V3 Pool dalam panggilan balik, alih-alih membagi metode swap menjadi dua bagian agar pemanggil dapat memanggilnya. Ini memastikan keamanan metode swap dan memastikan bahwa seluruh logika dijalankan sepenuhnya tanpa perlu catatan variabel yang rumit untuk memastikan keamanan.
Potongan kode tersebut adalah sebagai berikut:
You can learn more about the trading part of the course di https://github.com/WTFAcademy/WTF-Dapp/blob/main/P106_PoolSwap/readme.md .
Gunakan pengecualian untuk meneruskan informasi dan coba tangkap untuk menerapkan estimasi transaksi
Ketika mengacu pada kode Uniswap, kami menemukan bahwa di dalamnya https://github.com/Uniswap/v3-periphery/blob/main/contracts/lens/Quoter.sol kontrak, metode swap dari Uniswap V3 Pool dibungkus dalam try catch dan dieksekusi:
Mengapa demikian? Karena kita perlu mensimulasikan metode swap untuk memperkirakan token yang dibutuhkan untuk transaksi, tetapi karena pertukaran token tidak akan benar-benar terjadi selama estimasi, maka akan terjadi kesalahan. Di Uniswap, ia memunculkan kesalahan khusus dalam fungsi panggilan balik transaksi, lalu menangkap kesalahan tersebut dan mengurai informasi yang dibutuhkan dari pesan kesalahan.
Kelihatannya seperti hack, tetapi juga sangat praktis. Dengan cara ini, tidak perlu memodifikasi metode swap sesuai dengan kebutuhan transaksi yang diperkirakan, dan logikanya lebih sederhana. Dalam kursus kami, kami juga merujuk pada logika ini untuk mengimplementasikan kontrak https://github.com/WTFAcademy/WTF-Dapp/blob/main/demo-contract/contracts/wtfswap/SwapRouter.sol .
Menggunakan angka besar untuk memecahkan masalah presisi
Ada banyak logika perhitungan dalam kode Uniswap, seperti menghitung token yang dipertukarkan berdasarkan harga dan likuiditas saat ini. Dalam proses ini, kita harus menghindari hilangnya presisi selama operasi pembagian. Di Uniswap, proses perhitungan sering kali menggunakan
Kodenya adalah sebagai berikut (menghitung jumlah token yang diperlukan untuk transaksi melalui harga dan likuiditas):
Seperti yang Anda lihat, pertama-tama, harga di Uniswap dikalikan dengan akar kuadrat 2 ^ 96 (sesuai dengan sqrtRatioAX 96 dan sqrtRatioBX 96 dalam kode di atas), lalu likuiditasnya akan digeser ke kiri untuk menghitung pembilang 1. Dalam perhitungan berikut, 2 ^ 96 akan dihilangkan dalam proses perhitungan untuk mendapatkan hasil akhir.
Tentu saja, apa pun yang terjadi, tetap akan ada hilangnya presisi secara teori, tetapi dalam kasus ini, unit terkecil akan hilang, yang masih dapat diterima.
Untuk informasi lebih lanjut, Anda dapat mempelajari lebih lanjut dari kursus ini di https://github.com/WTFAcademy/WTF-Dapp/blob/main/P106_PoolSwap/readme.md .
Hitung pendapatan menggunakan Share
Di Uniswap, kita perlu mencatat pendapatan biaya LP (penyedia likuiditas). Tentu saja, kita tidak dapat mencatat biaya untuk setiap LP dalam setiap transaksi, yang akan menghabiskan banyak Gas. Jadi, bagaimana cara mengatasinya?
Di Uniswap, kita dapat melihat struktur berikut ini defiDitempatkan di Posisi:
Ini termasuk feeGrowthInside0LastX128 dan feeGrowthInside1LastX128, yang mencatat biaya yang seharusnya diterima setiap likuiditas saat setiap posisi (Posisi) menarik biaya terakhir kali.
Sederhananya, saya hanya perlu mencatat total biaya dan berapa biaya yang harus dialokasikan untuk setiap likuiditas, sehingga ketika LP menarik biaya, ia dapat menghitung berapa biaya yang dapat ia tarik sesuai dengan likuiditas yang ada di tangannya. Ini seperti jika Anda memegang saham perusahaan, ketika Anda ingin menarik pendapatan saham, Anda hanya perlu mengetahui laba per saham historis perusahaan dan pendapatan saat Anda terakhir menariknya.
Sebelumnya, kami telah memperkenalkan metode perhitungan keuntungan stETH pada artikel Desain kontrak yang cerdik, lihat bagaimana stETH secara otomatis mendistribusikan keuntungan setiap hari? Biarkan ETH Anda berpartisipasi dalam staking untuk memperoleh bunga yang stabil , dan prinsipnya serupa.
Tidak semua informasi perlu diperoleh dari rantai
Penyimpanan on-chain relatif mahal, jadi kita tidak perlu menyimpan semua informasi on-chain atau mendapatkannya dari rantai. Misalnya, banyak antarmuka yang dipanggil oleh situs web front-end Uniswap adalah antarmuka Web2 tradisional.
Daftar kumpulan transaksi, informasi tentang kumpulan transaksi, dll. semuanya dapat disimpan dalam basis data biasa. Beberapa mungkin perlu disinkronkan dari rantai secara teratur, tetapi kita tidak perlu memanggil antarmuka RPC yang disediakan oleh rantai atau layanan node secara real time untuk memperoleh data yang relevan.
Tentu saja, banyak pemasok blockchain RRC sekarang menyediakan beberapa antarmuka canggih, Anda bisa mendapatkan beberapa data dengan cara yang lebih cepat dan lebih murah, yang serupa. Misalnya, ZAN menyediakan antarmuka yang mirip dengan mendapatkan semua NFT di bawah pengguna tertentu. Informasi ini jelas dapat di-cache untuk meningkatkan kinerja dan efisiensi. Anda dapat mengunjungi https://zan.top/service/advance-api untuk mendapatkan lebih banyak.
Tentu saja, transaksi utama harus dilakukan secara on-chain.
Pelajari cara membagi kontrak dan menggunakan kontrak standar yang ada seperti ERC 721
Suatu proyek dapat berisi beberapa kontrak yang benar-benar diterapkan. Bahkan jika hanya ada satu kontrak yang benar-benar diterapkan, kode kita dapat membagi kontrak tersebut menjadi beberapa kontrak untuk pemeliharaan melalui pewarisan.
Misalnya, di Uniswap, https://github.com/Uniswap/v3-periphery/blob/main/contracts/NonfungiblePositionManager.sol kontrak mewarisi banyak kontrak, dan kodenya adalah sebagai berikut:
Dan ketika Anda melihat implementasi kontrak Izin ERC 721, Anda akan menemukan bahwa kontrak tersebut secara langsung menggunakan kontrak @openzeppelin/contracts/token/ERC 721/ERC 721.sol. Hal ini memudahkan pengelolaan posisi melalui NFT, dan di sisi lain, kontrak standar yang ada juga dapat digunakan untuk meningkatkan efisiensi pengembangan kontrak.
Dalam kursus kami, Anda dapat belajar https://github.com/WTFAcademy/WTF-Dapp/blob/main/P 108 _PositionManager /readme.md dan mencoba mengembangkan kontrak ERC 721 sederhana untuk mengelola posisi.
Meringkaskan
Tidak peduli berapa banyak artikel yang Anda baca, hal itu tidak sepraktis mengembangkannya sendiri. Dalam proses mencoba menerapkan versi sederhana dari bursa terdesentralisasi sendiri, Anda dapat memiliki pemahaman yang lebih mendalam tentang implementasi kode Uniswap dan mempelajari lebih banyak poin pengetahuan yang akan Anda alami dalam proyek-proyek yang sebenarnya.
Kursus WTF-DApp adalah kursus sumber terbuka yang diselesaikan bersama oleh komunitas pengembang ZAN dan komunitas pengembang WTF Academy. Jika Anda juga tertarik dengan pengembangan proyek Web3 dan Defi, Anda dapat merujuk ke kursus praktis kami https://github.com/WTFAcademy/WTF-Dapp dan selesaikan versi sederhana dari pertukaran tersebut selangkah demi selangkah. Saya yakin ini pasti akan membantu Anda~
Artikel ini ditulis oleh Fisher (akun X) @yudao1024 ) dari Tim ZAN (akun X @zan_team ).
Artikel ini bersumber dari internet: Web3 Beginner Series: Tips Pengembangan Kontrak yang Saya Pelajari dari Kode Uniswap
Terkait: Menemukan Permata 100x Berikutnya: Cara Menghasilkan Uang di Pump.fun dengan ChatGPT
Penulis asli: CMed Catatan editor: Di pasar Pump, token baru diluncurkan setiap saat. Sementara yang lain di pasar masih mencari jarum dalam tumpukan jerami untuk menemukan memecoin yang dapat menghasilkan keuntungan berlebih, @AlphaBatcher telah menggunakan Chatgpt untuk mencapai perdagangan presisi otomatis. Metodologi ini tidak memerlukan modal dalam jumlah besar atau keterampilan pemrograman yang kuat. Kita dapat menggunakan AI untuk memberdayakan investasi memecoin kita. Berikut ini adalah teks asli (agar lebih mudah dibaca dan dipahami, konten asli telah dihapus dan diatur ulang): Saya baru saja menghasilkan $2300 dalam 1 menit menggunakan ChatGPT dan PumpFun. Sementara yang lain masih mencari peluang dalam memecoin, saya sudah mengotomatiskan perdagangan yang akurat. Anda hanya perlu 0,2 SOL untuk memulai, dan tidak ada keterampilan pemrograman yang…