Tips Kecil Pengembangan Kontrak yang Dipelajari dari Kode Uniswap
Belakangan ini, saat menulis tutorial pengembangan bursa terdesentralisasi, saya merujuk pada implementasi kode Uniswap V3 dan belajar banyak poin berharga. Sebagai seorang pengembang yang sebelumnya hanya mengembangkan kontrak NFT sederhana, percobaan pengembangan kontrak Defi kali ini memberikan banyak pengalaman baru. Saya yakin trik-trik kecil ini akan sangat membantu bagi pemula yang ingin belajar pengembangan kontrak.
Selanjutnya, mari kita lihat beberapa tips pengembangan yang berguna ini, beberapa di antaranya bahkan dapat dianggap sebagai trik yang luar biasa.
Alamat penyebaran kontrak yang dapat diprediksi
Biasanya, alamat yang diperoleh dari penyebaran kontrak tampak acak karena terkait dengan nonce, sehingga alamat kontrak sulit diprediksi. Namun, dalam beberapa kasus, kita perlu menyimpulkan alamat kontrak melalui pasangan perdagangan dan informasi terkait, seperti menentukan izin transaksi atau mendapatkan alamat kolam, dll.
Uniswap menggunakan metode CREATE2 dengan menambahkan parameter salt untuk membuat kontrak, sehingga alamat kontrak yang dibuat dapat diprediksi. Logika pembuatan alamat adalah: alamat baru = hash("0xFF", alamat pembuat, salt, initcode).
Memanfaatkan Fungsi Callback
Dalam Solidity, kontrak dapat saling memanggil. Dalam beberapa skenario, sangat berguna bagi A untuk memanggil metode B, dan B untuk memanggil kembali A dalam metode yang dipanggil.
Di Uniswap, saat memanggil metode swap dari kontrak UniswapV3Pool untuk melakukan perdagangan, ia akan memanggil kembali swapCallback, yang akan menerima Token yang dihitung diperlukan untuk transaksi ini. Pihak yang memanggil perlu mentransfer Token yang diperlukan untuk transaksi ke UniswapV3Pool dalam callback, bukan memisahkan metode swap menjadi dua bagian yang harus dipanggil oleh pihak pemanggil. Ini memastikan keamanan metode swap, menjamin bahwa seluruh logika dieksekusi secara utuh, tanpa perlu mencatat variabel yang rumit untuk memastikan keamanan.
Menggunakan pengecualian untuk menyampaikan informasi, menggunakan try catch untuk melakukan estimasi transaksi
Dalam beberapa kontrak Uniswap, metode swap dari UniswapV3Pool dibungkus dengan try catch untuk dieksekusi. Ini bertujuan untuk mensimulasikan metode swap untuk memperkirakan Token yang diperlukan untuk transaksi. Karena tidak ada pertukaran Token yang sebenarnya terjadi saat perkiraan, maka akan terjadi kesalahan. Uniswap melemparkan kesalahan khusus dalam fungsi callback transaksi dan kemudian menangkap kesalahan tersebut, menguraikan informasi yang diperlukan dari pesan kesalahan.
Metode ini tampaknya sedikit licik, tetapi sangat praktis. Tidak perlu memodifikasi metode swap untuk memperkirakan permintaan perdagangan, logikanya juga lebih sederhana.
Menggunakan angka besar untuk mengatasi masalah presisi
Kode Uniswap memiliki banyak logika perhitungan, seperti menghitung token yang ditukar berdasarkan harga dan likuiditas saat ini. Untuk menghindari kehilangan presisi yang disebabkan oleh operasi pembagian, seringkali digunakan operasi << FixedPoint96.RESOLUTION dalam proses perhitungan, yaitu menggeser ke kiri 96 bit, setara dengan mengalikan 2^96. Setelah digeser ke kiri, operasi pembagian dilakukan, yang memastikan presisi di bawah kondisi transaksi normal tanpa overflow.
Meskipun secara teori masih akan ada kehilangan presisi, tetapi biasanya hanya kehilangan unit terkecil, yang dapat diterima.
Menghitung Pendapatan dengan Cara Share
Di Uniswap, perlu mencatat pendapatan biaya dari LP (penyedia likuiditas). Jelas tidak mungkin untuk mencatat biaya masing-masing LP pada setiap transaksi, karena ini akan menghabiskan banyak Gas.
Solusi Uniswap adalah mendefinisikan feeGrowthInside0LastX128 dan feeGrowthInside1LastX128 dalam struktur Position, yang mencatat biaya yang seharusnya diterima setiap likuiditas saat menarik biaya terakhir kali untuk setiap posisi.
Singkatnya, Anda hanya perlu mencatat total biaya transaksi dan biaya yang harus dialokasikan untuk setiap likuiditas. Ketika LP menarik biaya, biaya yang dapat ditarik dihitung berdasarkan likuiditas yang dimiliki. Ini mirip dengan memiliki saham perusahaan, ketika menarik hasil saham, Anda hanya perlu mengetahui laba per saham perusahaan dalam sejarah dan hasil dari penarikan terakhir.
Tidak semua informasi perlu diperoleh dari rantai
Penyimpanan di blockchain relatif mahal, dan tidak semua informasi perlu disimpan di blockchain atau diperoleh dari blockchain. Misalnya, banyak antarmuka yang dipanggil oleh situs web front-end Uniswap adalah antarmuka Web2 tradisional.
Daftar kolam perdagangan, informasi kolam perdagangan, dan sebagainya dapat disimpan di database biasa, beberapa mungkin perlu disinkronkan secara berkala dari rantai, tetapi tidak perlu memanggil secara real-time antarmuka RPC yang disediakan oleh layanan rantai atau node untuk mendapatkan data terkait.
Tentu saja, transaksi kunci harus dilakukan di blockchain.
Pelajari pemisahan kontrak, manfaatkan kontrak standar yang ada
Sebuah proyek mungkin terdiri dari beberapa kontrak yang sebenarnya diterapkan. Bahkan jika hanya ada satu kontrak yang diterapkan, kita dapat memecah kontrak menjadi beberapa kontrak dengan cara pewarisan untuk pemeliharaan.
Misalnya, beberapa kontrak di Uniswap mewarisi beberapa kontrak. Dalam implementasinya, kontrak @openzeppelin/contracts/token/ERC721/ERC721.sol digunakan secara langsung, sehingga memudahkan pengelolaan posisi melalui cara NFT dan dapat memanfaatkan kontrak standar yang sudah ada untuk meningkatkan efisiensi pengembangan.
Ringkasan
Mengembangkan secara langsung lebih dapat memperdalam pemahaman dibandingkan membaca artikel. Mencoba untuk mengimplementasikan versi sederhana dari bursa terdesentralisasi akan memberi Anda pemahaman yang lebih dalam tentang implementasi kode Uniswap, serta mempelajari lebih banyak poin pengetahuan dalam proyek nyata.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
7 Suka
Hadiah
7
4
Bagikan
Komentar
0/400
ForumLurker
· 07-10 04:37
Pro, bisakah Anda menjelaskan lebih rinci tentang teknik ini?
Lihat AsliBalas0
BearMarketGardener
· 07-09 08:14
Pemula, mulai dari membuat obat.
Lihat AsliBalas0
MissedAirdropAgain
· 07-09 08:10
Sudah mau buka buku lagi? Baru saja selesai menggulir nft masih belum cukup.
Analisis Kode Uniswap V3: 7 Tips Pengembangan Kontrak yang Berguna
Tips Kecil Pengembangan Kontrak yang Dipelajari dari Kode Uniswap
Belakangan ini, saat menulis tutorial pengembangan bursa terdesentralisasi, saya merujuk pada implementasi kode Uniswap V3 dan belajar banyak poin berharga. Sebagai seorang pengembang yang sebelumnya hanya mengembangkan kontrak NFT sederhana, percobaan pengembangan kontrak Defi kali ini memberikan banyak pengalaman baru. Saya yakin trik-trik kecil ini akan sangat membantu bagi pemula yang ingin belajar pengembangan kontrak.
Selanjutnya, mari kita lihat beberapa tips pengembangan yang berguna ini, beberapa di antaranya bahkan dapat dianggap sebagai trik yang luar biasa.
Alamat penyebaran kontrak yang dapat diprediksi
Biasanya, alamat yang diperoleh dari penyebaran kontrak tampak acak karena terkait dengan nonce, sehingga alamat kontrak sulit diprediksi. Namun, dalam beberapa kasus, kita perlu menyimpulkan alamat kontrak melalui pasangan perdagangan dan informasi terkait, seperti menentukan izin transaksi atau mendapatkan alamat kolam, dll.
Uniswap menggunakan metode CREATE2 dengan menambahkan parameter salt untuk membuat kontrak, sehingga alamat kontrak yang dibuat dapat diprediksi. Logika pembuatan alamat adalah: alamat baru = hash("0xFF", alamat pembuat, salt, initcode).
Memanfaatkan Fungsi Callback
Dalam Solidity, kontrak dapat saling memanggil. Dalam beberapa skenario, sangat berguna bagi A untuk memanggil metode B, dan B untuk memanggil kembali A dalam metode yang dipanggil.
Di Uniswap, saat memanggil metode swap dari kontrak UniswapV3Pool untuk melakukan perdagangan, ia akan memanggil kembali swapCallback, yang akan menerima Token yang dihitung diperlukan untuk transaksi ini. Pihak yang memanggil perlu mentransfer Token yang diperlukan untuk transaksi ke UniswapV3Pool dalam callback, bukan memisahkan metode swap menjadi dua bagian yang harus dipanggil oleh pihak pemanggil. Ini memastikan keamanan metode swap, menjamin bahwa seluruh logika dieksekusi secara utuh, tanpa perlu mencatat variabel yang rumit untuk memastikan keamanan.
Menggunakan pengecualian untuk menyampaikan informasi, menggunakan try catch untuk melakukan estimasi transaksi
Dalam beberapa kontrak Uniswap, metode swap dari UniswapV3Pool dibungkus dengan try catch untuk dieksekusi. Ini bertujuan untuk mensimulasikan metode swap untuk memperkirakan Token yang diperlukan untuk transaksi. Karena tidak ada pertukaran Token yang sebenarnya terjadi saat perkiraan, maka akan terjadi kesalahan. Uniswap melemparkan kesalahan khusus dalam fungsi callback transaksi dan kemudian menangkap kesalahan tersebut, menguraikan informasi yang diperlukan dari pesan kesalahan.
Metode ini tampaknya sedikit licik, tetapi sangat praktis. Tidak perlu memodifikasi metode swap untuk memperkirakan permintaan perdagangan, logikanya juga lebih sederhana.
Menggunakan angka besar untuk mengatasi masalah presisi
Kode Uniswap memiliki banyak logika perhitungan, seperti menghitung token yang ditukar berdasarkan harga dan likuiditas saat ini. Untuk menghindari kehilangan presisi yang disebabkan oleh operasi pembagian, seringkali digunakan operasi << FixedPoint96.RESOLUTION dalam proses perhitungan, yaitu menggeser ke kiri 96 bit, setara dengan mengalikan 2^96. Setelah digeser ke kiri, operasi pembagian dilakukan, yang memastikan presisi di bawah kondisi transaksi normal tanpa overflow.
Meskipun secara teori masih akan ada kehilangan presisi, tetapi biasanya hanya kehilangan unit terkecil, yang dapat diterima.
Menghitung Pendapatan dengan Cara Share
Di Uniswap, perlu mencatat pendapatan biaya dari LP (penyedia likuiditas). Jelas tidak mungkin untuk mencatat biaya masing-masing LP pada setiap transaksi, karena ini akan menghabiskan banyak Gas.
Solusi Uniswap adalah mendefinisikan feeGrowthInside0LastX128 dan feeGrowthInside1LastX128 dalam struktur Position, yang mencatat biaya yang seharusnya diterima setiap likuiditas saat menarik biaya terakhir kali untuk setiap posisi.
Singkatnya, Anda hanya perlu mencatat total biaya transaksi dan biaya yang harus dialokasikan untuk setiap likuiditas. Ketika LP menarik biaya, biaya yang dapat ditarik dihitung berdasarkan likuiditas yang dimiliki. Ini mirip dengan memiliki saham perusahaan, ketika menarik hasil saham, Anda hanya perlu mengetahui laba per saham perusahaan dalam sejarah dan hasil dari penarikan terakhir.
Tidak semua informasi perlu diperoleh dari rantai
Penyimpanan di blockchain relatif mahal, dan tidak semua informasi perlu disimpan di blockchain atau diperoleh dari blockchain. Misalnya, banyak antarmuka yang dipanggil oleh situs web front-end Uniswap adalah antarmuka Web2 tradisional.
Daftar kolam perdagangan, informasi kolam perdagangan, dan sebagainya dapat disimpan di database biasa, beberapa mungkin perlu disinkronkan secara berkala dari rantai, tetapi tidak perlu memanggil secara real-time antarmuka RPC yang disediakan oleh layanan rantai atau node untuk mendapatkan data terkait.
Tentu saja, transaksi kunci harus dilakukan di blockchain.
Pelajari pemisahan kontrak, manfaatkan kontrak standar yang ada
Sebuah proyek mungkin terdiri dari beberapa kontrak yang sebenarnya diterapkan. Bahkan jika hanya ada satu kontrak yang diterapkan, kita dapat memecah kontrak menjadi beberapa kontrak dengan cara pewarisan untuk pemeliharaan.
Misalnya, beberapa kontrak di Uniswap mewarisi beberapa kontrak. Dalam implementasinya, kontrak @openzeppelin/contracts/token/ERC721/ERC721.sol digunakan secara langsung, sehingga memudahkan pengelolaan posisi melalui cara NFT dan dapat memanfaatkan kontrak standar yang sudah ada untuk meningkatkan efisiensi pengembangan.
Ringkasan
Mengembangkan secara langsung lebih dapat memperdalam pemahaman dibandingkan membaca artikel. Mencoba untuk mengimplementasikan versi sederhana dari bursa terdesentralisasi akan memberi Anda pemahaman yang lebih dalam tentang implementasi kode Uniswap, serta mempelajari lebih banyak poin pengetahuan dalam proyek nyata.