Teknik Pengembangan Kontrak yang Dipelajari dari Kode Uniswap
Baru-baru ini, saat menulis tutorial pengembangan bursa terdesentralisasi, saya merujuk pada implementasi kode Uniswap V3 dan mempelajari banyak poin penting yang berharga. Sebagai pengembang yang pertama kali mencoba mengembangkan kontrak Defi, keterampilan ini akan sangat membantu bagi pemula yang ingin belajar pengembangan kontrak.
Alamat penyebaran kontrak yang dapat diprediksi
Alamat yang dihasilkan dari penyebaran kontrak biasanya tampak acak, karena berkaitan dengan nonce. Namun dalam beberapa kasus, kita perlu menyimpulkan alamat kontrak melalui pasangan perdagangan dan informasi terkait, seperti menentukan izin transaksi atau mendapatkan alamat kolam.
Uniswap menggunakan metode CREATE2 untuk membuat kontrak, dengan menambahkan parameter salt sehingga alamat yang dihasilkan dapat diprediksi. Logika perhitungan alamat baru adalah: hash("0xFF", alamat pencipta, salt, initcode).
Memanfaatkan Fungsi Callback
Kontrak di Solidity dapat saling memanggil. Dalam beberapa skenario, memanggil metode B dari A dan B memanggil kembali A dalam metode yang dipanggil sangat berguna.
Di Uniswap, saat memanggil metode swap dari kontrak UniswapV3Pool untuk melakukan transaksi, itu akan memanggil kembali swapCallback, yang mengirimkan Token yang sebenarnya dibutuhkan untuk transaksi ini. Panggilan harus mentransfer Token yang diperlukan ke UniswapV3Pool dalam panggilan kembali, bukan membagi metode swap menjadi dua bagian. Ini memastikan keamanan dan eksekusi lengkap dari metode swap, tanpa perlu mencatat variabel yang rumit.
Menggunakan pengecualian untuk menyampaikan informasi, menggunakan try catch untuk mengimplementasikan estimasi transaksi
Dalam kontrak Quoter Uniswap, metode swap dari UniswapV3Pool dibungkus dengan try catch saat dieksekusi. Ini bertujuan untuk mensimulasikan perkiraan token yang diperlukan untuk transaksi swap, tetapi pada saat perkiraan tidak akan terjadi pertukaran token yang sebenarnya, sehingga akan terjadi kesalahan.
Uniswap memanfaatkan dengan melempar kesalahan khusus dalam fungsi callback perdagangan, kemudian menangkap kesalahan ini untuk mengurai informasi yang diperlukan dari pesan kesalahan. Metode ini tampaknya merupakan jalan pintas, tetapi sangat praktis, tidak perlu mengubah metode swap untuk memperkirakan permintaan perdagangan, dan logikanya juga lebih sederhana.
Menggunakan Bilangan Besar untuk Mengatasi Masalah Presisi
Dalam kode Uniswap terdapat banyak logika perhitungan, seperti menghitung token yang ditukar berdasarkan harga saat ini dan likuiditas. Untuk menghindari kehilangan presisi dalam operasi pembagian, proses perhitungan sering menggunakan operasi "<< FixedPoint96.RESOLUTION", yaitu menggeser ke kiri 96 bit, yang setara dengan mengalikan dengan 2^96.
Melakukan operasi pembagian setelah pergeseran ke kiri dapat memastikan akurasi dalam transaksi normal tanpa overflow. Meskipun secara teori masih akan ada kehilangan akurasi unit terkecil, ini dapat diterima.
Menghitung Pendapatan dengan Cara Share
Uniswap perlu mencatat pendapatan biaya dari penyedia likuiditas LP(. Untuk menghindari konsumsi Gas yang besar dengan mencatat biaya untuk setiap penyedia likuiditas pada setiap transaksi, Uniswap menggunakan metode yang cerdas.
Struktur Position berisi feeGrowthInside0LastX128 dan feeGrowthInside1LastX128, yang mencatat biaya terakhir yang harus diterima oleh setiap likuiditas saat biaya ditarik dari setiap posisi. Cukup catat total biaya dan biaya yang harus dialokasikan untuk setiap likuiditas, saat LP menarik, biaya yang dapat ditarik dihitung berdasarkan likuiditas yang dimiliki.
![Web3 Pemula Series: Tips Kecil Pengembangan Kontrak yang Saya Pelajari dari Kode Uniswap])https://img-cdn.gateio.im/webp-social/moments-45e66af69435e6d4412ae506e77ab893.webp(
Strategi Pengambilan Informasi di Blockchain
Tidak semua informasi perlu diambil dari blockchain. Penyimpanan di blockchain relatif mahal, banyak informasi dapat disimpan di database biasa dan disinkronkan secara berkala dari blockchain.
Seperti daftar kolam perdagangan, informasi kolam perdagangan, dll., dapat disimpan dalam database biasa, tanpa perlu memanggil antarmuka RPC layanan rantai atau node secara real-time. Tentu saja, transaksi kunci tetap dilakukan di rantai.
Pembagian Kontrak dan Penggunaan Kontrak Standar
Sebuah proyek mungkin mencakup beberapa kontrak yang sebenarnya dikerahkan. Bahkan jika hanya ada satu kontrak yang sebenarnya dikerahkan, kode tersebut juga dapat dibagi menjadi beberapa kontrak untuk pemeliharaan melalui pewarisan.
Misalnya, kontrak NonfungiblePositionManager dari Uniswap mewarisi beberapa kontrak. Dengan menggunakan kontrak ERC721 dari OpenZeppelin, ini memudahkan pengelolaan posisi melalui NFT dan meningkatkan efisiensi pengembangan.
Kesimpulan
Praktik adalah metode belajar terbaik. Mencoba untuk mengimplementasikan versi sederhana dari bursa terdesentralisasi dapat membantu memahami implementasi kode Uniswap dengan lebih mendalam dan mempelajari lebih banyak poin pengetahuan dalam proyek nyata. Jika tertarik dalam pengembangan proyek Web3 dan Defi, Anda bisa merujuk ke kursus praktis terkait untuk secara bertahap menyelesaikan versi sederhana dari bursa.
![Web3 Pemula Series: Tips Kecil Pengembangan Kontrak yang Saya Pelajari dari Kode Uniswap])https://img-cdn.gateio.im/webp-social/moments-f95ddc9d89809cf11dbe65b9bafda157.webp(
Halaman ini mungkin berisi konten pihak ketiga, yang disediakan untuk tujuan informasi saja (bukan pernyataan/jaminan) dan tidak boleh dianggap sebagai dukungan terhadap pandangannya oleh Gate, atau sebagai nasihat keuangan atau profesional. Lihat Penafian untuk detailnya.
Pengungkapan Kode Uniswap: 7 Teknik Pengembangan Kontrak untuk Membantu Pemula Defi
Teknik Pengembangan Kontrak yang Dipelajari dari Kode Uniswap
Baru-baru ini, saat menulis tutorial pengembangan bursa terdesentralisasi, saya merujuk pada implementasi kode Uniswap V3 dan mempelajari banyak poin penting yang berharga. Sebagai pengembang yang pertama kali mencoba mengembangkan kontrak Defi, keterampilan ini akan sangat membantu bagi pemula yang ingin belajar pengembangan kontrak.
Alamat penyebaran kontrak yang dapat diprediksi
Alamat yang dihasilkan dari penyebaran kontrak biasanya tampak acak, karena berkaitan dengan nonce. Namun dalam beberapa kasus, kita perlu menyimpulkan alamat kontrak melalui pasangan perdagangan dan informasi terkait, seperti menentukan izin transaksi atau mendapatkan alamat kolam.
Uniswap menggunakan metode CREATE2 untuk membuat kontrak, dengan menambahkan parameter salt sehingga alamat yang dihasilkan dapat diprediksi. Logika perhitungan alamat baru adalah: hash("0xFF", alamat pencipta, salt, initcode).
Memanfaatkan Fungsi Callback
Kontrak di Solidity dapat saling memanggil. Dalam beberapa skenario, memanggil metode B dari A dan B memanggil kembali A dalam metode yang dipanggil sangat berguna.
Di Uniswap, saat memanggil metode swap dari kontrak UniswapV3Pool untuk melakukan transaksi, itu akan memanggil kembali swapCallback, yang mengirimkan Token yang sebenarnya dibutuhkan untuk transaksi ini. Panggilan harus mentransfer Token yang diperlukan ke UniswapV3Pool dalam panggilan kembali, bukan membagi metode swap menjadi dua bagian. Ini memastikan keamanan dan eksekusi lengkap dari metode swap, tanpa perlu mencatat variabel yang rumit.
Menggunakan pengecualian untuk menyampaikan informasi, menggunakan try catch untuk mengimplementasikan estimasi transaksi
Dalam kontrak Quoter Uniswap, metode swap dari UniswapV3Pool dibungkus dengan try catch saat dieksekusi. Ini bertujuan untuk mensimulasikan perkiraan token yang diperlukan untuk transaksi swap, tetapi pada saat perkiraan tidak akan terjadi pertukaran token yang sebenarnya, sehingga akan terjadi kesalahan.
Uniswap memanfaatkan dengan melempar kesalahan khusus dalam fungsi callback perdagangan, kemudian menangkap kesalahan ini untuk mengurai informasi yang diperlukan dari pesan kesalahan. Metode ini tampaknya merupakan jalan pintas, tetapi sangat praktis, tidak perlu mengubah metode swap untuk memperkirakan permintaan perdagangan, dan logikanya juga lebih sederhana.
Menggunakan Bilangan Besar untuk Mengatasi Masalah Presisi
Dalam kode Uniswap terdapat banyak logika perhitungan, seperti menghitung token yang ditukar berdasarkan harga saat ini dan likuiditas. Untuk menghindari kehilangan presisi dalam operasi pembagian, proses perhitungan sering menggunakan operasi "<< FixedPoint96.RESOLUTION", yaitu menggeser ke kiri 96 bit, yang setara dengan mengalikan dengan 2^96.
Melakukan operasi pembagian setelah pergeseran ke kiri dapat memastikan akurasi dalam transaksi normal tanpa overflow. Meskipun secara teori masih akan ada kehilangan akurasi unit terkecil, ini dapat diterima.
Menghitung Pendapatan dengan Cara Share
Uniswap perlu mencatat pendapatan biaya dari penyedia likuiditas LP(. Untuk menghindari konsumsi Gas yang besar dengan mencatat biaya untuk setiap penyedia likuiditas pada setiap transaksi, Uniswap menggunakan metode yang cerdas.
Struktur Position berisi feeGrowthInside0LastX128 dan feeGrowthInside1LastX128, yang mencatat biaya terakhir yang harus diterima oleh setiap likuiditas saat biaya ditarik dari setiap posisi. Cukup catat total biaya dan biaya yang harus dialokasikan untuk setiap likuiditas, saat LP menarik, biaya yang dapat ditarik dihitung berdasarkan likuiditas yang dimiliki.
![Web3 Pemula Series: Tips Kecil Pengembangan Kontrak yang Saya Pelajari dari Kode Uniswap])https://img-cdn.gateio.im/webp-social/moments-45e66af69435e6d4412ae506e77ab893.webp(
Strategi Pengambilan Informasi di Blockchain
Tidak semua informasi perlu diambil dari blockchain. Penyimpanan di blockchain relatif mahal, banyak informasi dapat disimpan di database biasa dan disinkronkan secara berkala dari blockchain.
Seperti daftar kolam perdagangan, informasi kolam perdagangan, dll., dapat disimpan dalam database biasa, tanpa perlu memanggil antarmuka RPC layanan rantai atau node secara real-time. Tentu saja, transaksi kunci tetap dilakukan di rantai.
Pembagian Kontrak dan Penggunaan Kontrak Standar
Sebuah proyek mungkin mencakup beberapa kontrak yang sebenarnya dikerahkan. Bahkan jika hanya ada satu kontrak yang sebenarnya dikerahkan, kode tersebut juga dapat dibagi menjadi beberapa kontrak untuk pemeliharaan melalui pewarisan.
Misalnya, kontrak NonfungiblePositionManager dari Uniswap mewarisi beberapa kontrak. Dengan menggunakan kontrak ERC721 dari OpenZeppelin, ini memudahkan pengelolaan posisi melalui NFT dan meningkatkan efisiensi pengembangan.
Kesimpulan
Praktik adalah metode belajar terbaik. Mencoba untuk mengimplementasikan versi sederhana dari bursa terdesentralisasi dapat membantu memahami implementasi kode Uniswap dengan lebih mendalam dan mempelajari lebih banyak poin pengetahuan dalam proyek nyata. Jika tertarik dalam pengembangan proyek Web3 dan Defi, Anda bisa merujuk ke kursus praktis terkait untuk secara bertahap menyelesaikan versi sederhana dari bursa.
![Web3 Pemula Series: Tips Kecil Pengembangan Kontrak yang Saya Pelajari dari Kode Uniswap])https://img-cdn.gateio.im/webp-social/moments-f95ddc9d89809cf11dbe65b9bafda157.webp(