Teknik Pengembangan Kontrak: Pengalaman Berharga yang Dipelajari dari Kode Uniswap
Baru-baru ini, saat menulis tutorial pengembangan bursa terdesentralisasi, melalui penelitian implementasi kode Uniswap V3, saya belajar banyak keterampilan dalam pengembangan kontrak. Sebagai seorang pemula yang baru mengenal pengembangan kontrak Defi, trik-trik kecil ini sangat menginspirasi saya, dan saya percaya ini juga akan berguna bagi pemula lain yang ingin belajar pengembangan kontrak.
Alamat Penyebaran Kontrak yang Dapat Diprediksi
Biasanya, alamat yang diperoleh dari penyebaran kontrak tampak acak dan sulit diprediksi. Namun, dalam beberapa skenario, kita perlu menyimpulkan alamat kontrak melalui pasangan perdagangan dan informasi terkait, seperti menentukan hak transaksi atau mendapatkan alamat kolam.
Uniswap menggunakan metode CREATE2 untuk membuat kontrak, dengan menambahkan parameter "salt" sehingga alamat kontrak yang dibuat dapat diprediksi. Logika penghasil alamat baru adalah: hash("0xFF", alamat pembuat, salt, initcode). Metode ini sangat berguna dalam banyak kasus.
Memanfaatkan Fungsi Callback
Kontrak di Solidity dapat saling memanggil. Terkadang A memanggil metode B, dan B melakukan callback ke A dalam metode yang dipanggil, ini berguna dalam beberapa skenario.
Misalnya, dalam metode swap Uniswap, kontrak UniswapV3Pool akan memanggil swapCallback, dengan mengirimkan Token yang benar-benar dibutuhkan untuk transaksi ini. Panggilan harus mentransfer Token yang diperlukan ke UniswapV3Pool dalam callback, bukan memecah metode swap. Ini memastikan keamanan dan pelaksanaan lengkap metode swap, tanpa perlu pencatatan variabel yang rumit.
Menggunakan pengecualian untuk menyampaikan informasi, menggunakan try catch untuk mewujudkan estimasi transaksi
Dalam kontrak Quoter Uniswap, metode swap dari UniswapV3Pool dibungkus dengan try catch. Ini dilakukan untuk mensimulasikan swap guna memperkirakan Token yang diperlukan untuk transaksi. Saat memperkirakan, Token tidak akan benar-benar ditukar, sehingga akan terjadi kesalahan. Uniswap melempar kesalahan khusus dalam fungsi callback, kemudian menangkap kesalahan tersebut dan mengurai informasi yang diperlukan.
Metode ini tampaknya licik, tetapi sangat praktis. Tidak perlu mengubah metode swap untuk memperkirakan permintaan perdagangan, logikanya lebih sederhana.
Masalah Akurasi Penyelesaian Bilangan Besar
Kode Uniswap melibatkan banyak logika perhitungan, seperti menghitung token yang ditukar berdasarkan harga dan likuiditas saat ini. Untuk menghindari kehilangan presisi pada operasi pembagian, proses perhitungan sering menggunakan operasi "<< FixedPoint96.RESOLUTION", yaitu menggeser kiri 96 bit, yang setara dengan mengalikan dengan 2^96. Setelah digeser ke kiri, pembagian dilakukan, memastikan presisi dalam kondisi transaksi normal tanpa overflow.
Meskipun secara teori masih akan ada kehilangan presisi yang kecil, tetapi sudah dapat diterima.
Cara Berbagi Menghitung Keuntungan
Uniswap perlu mencatat pendapatan biaya dari penyedia likuiditas LP( ). Jelas bahwa tidak mungkin untuk mencatat biaya untuk setiap LP pada setiap transaksi, ini akan menghabiskan banyak Gas.
Struktur Position di Uniswap mencakup feeGrowthInside0LastX128 dan feeGrowthInside1LastX128, yang mencatat biaya yang seharusnya diterima setiap likuiditas saat biaya ditarik terakhir kali untuk setiap posisi.
Cukup catat total biaya transaksi dan biaya yang harus dialokasikan untuk setiap likuiditas. Saat LP menarik, biaya yang dapat ditarik dihitung berdasarkan likuiditas yang dimiliki. Mirip dengan memegang saham perusahaan, saat menarik keuntungan, cukup mengetahui penghasilan per saham historis dan penghasilan saat penarikan terakhir.
Informasi non-kritis tidak perlu diunggah ke rantai
Penyimpanan di blockchain relatif mahal, dan tidak semua informasi perlu disimpan di blockchain atau diambil dari blockchain. Banyak antarmuka yang dipanggil oleh frontend Uniswap adalah antarmuka Web2 tradisional.
Daftar kolam perdagangan, informasi, dll dapat disimpan di database biasa, sebagian perlu disinkronkan secara berkala dari blockchain. Tidak perlu memanggil antarmuka RPC layanan rantai atau node secara real-time untuk mendapatkan data terkait.
Tentu saja, transaksi kunci harus dilakukan di atas rantai.
Pembagian Kontrak dan Penggunaan Kontrak Standar
Sebuah proyek mungkin mencakup beberapa kontrak yang benar-benar diterapkan. Bahkan jika hanya ada satu yang diterapkan, itu dapat dibagi menjadi beberapa kontrak untuk pemeliharaan melalui pewarisan.
Seperti kontrak NonfungiblePositionManager Uniswap yang mewarisi beberapa kontrak. Di mana ERC721Permit langsung menggunakan kontrak ERC721 OpenZeppelin, yang memudahkan pengelolaan posisi melalui NFT, sekaligus meningkatkan efisiensi pengembangan.
Kesimpulan
Praktik langsung dalam mengembangkan versi sederhana dari bursa terdesentralisasi akan membuat Anda lebih memahami implementasi kode Uniswap dan mempelajari lebih banyak poin pengetahuan yang relevan dalam proyek nyata. Melihat lebih banyak artikel tidak ada bandingannya dengan praktik langsung, semoga pengalaman ini bermanfaat bagi pemula yang ingin belajar pengembangan kontrak.
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.
20 Suka
Hadiah
20
10
Posting ulang
Bagikan
Komentar
0/400
GasGuzzler
· 07-18 21:18
Jangan bermain terlalu dalam dengan pemula.
Lihat AsliBalas0
LowCapGemHunter
· 07-17 14:17
Tips yang harus dimiliki oleh pengembang berpengalaman.
Lihat AsliBalas0
SmartMoneyWallet
· 07-15 22:24
Transaksi on-chain tidak akan luput dari pengamatan saya
Lihat AsliBalas0
WalletDetective
· 07-15 22:24
v3 semudah ini? Setelah melihatnya, saya merasa tidak mengerti apa-apa
Lihat AsliBalas0
gas_guzzler
· 07-15 22:21
又在凭本事Kupon Klip
Lihat AsliBalas0
AllInDaddy
· 07-15 21:55
Kode V3 itu memang keras banget.
Lihat AsliBalas0
SleepyValidator
· 07-15 21:55
Berbicara sedetail ini, lebih baik sendiri menggulung kode sumber.
7 Teknik Pengembangan Kontrak Uniswap: Meningkatkan Efisiensi dan Keamanan Proyek Keuangan Desentralisasi
Teknik Pengembangan Kontrak: Pengalaman Berharga yang Dipelajari dari Kode Uniswap
Baru-baru ini, saat menulis tutorial pengembangan bursa terdesentralisasi, melalui penelitian implementasi kode Uniswap V3, saya belajar banyak keterampilan dalam pengembangan kontrak. Sebagai seorang pemula yang baru mengenal pengembangan kontrak Defi, trik-trik kecil ini sangat menginspirasi saya, dan saya percaya ini juga akan berguna bagi pemula lain yang ingin belajar pengembangan kontrak.
Alamat Penyebaran Kontrak yang Dapat Diprediksi
Biasanya, alamat yang diperoleh dari penyebaran kontrak tampak acak dan sulit diprediksi. Namun, dalam beberapa skenario, kita perlu menyimpulkan alamat kontrak melalui pasangan perdagangan dan informasi terkait, seperti menentukan hak transaksi atau mendapatkan alamat kolam.
Uniswap menggunakan metode CREATE2 untuk membuat kontrak, dengan menambahkan parameter "salt" sehingga alamat kontrak yang dibuat dapat diprediksi. Logika penghasil alamat baru adalah: hash("0xFF", alamat pembuat, salt, initcode). Metode ini sangat berguna dalam banyak kasus.
Memanfaatkan Fungsi Callback
Kontrak di Solidity dapat saling memanggil. Terkadang A memanggil metode B, dan B melakukan callback ke A dalam metode yang dipanggil, ini berguna dalam beberapa skenario.
Misalnya, dalam metode swap Uniswap, kontrak UniswapV3Pool akan memanggil swapCallback, dengan mengirimkan Token yang benar-benar dibutuhkan untuk transaksi ini. Panggilan harus mentransfer Token yang diperlukan ke UniswapV3Pool dalam callback, bukan memecah metode swap. Ini memastikan keamanan dan pelaksanaan lengkap metode swap, tanpa perlu pencatatan variabel yang rumit.
Menggunakan pengecualian untuk menyampaikan informasi, menggunakan try catch untuk mewujudkan estimasi transaksi
Dalam kontrak Quoter Uniswap, metode swap dari UniswapV3Pool dibungkus dengan try catch. Ini dilakukan untuk mensimulasikan swap guna memperkirakan Token yang diperlukan untuk transaksi. Saat memperkirakan, Token tidak akan benar-benar ditukar, sehingga akan terjadi kesalahan. Uniswap melempar kesalahan khusus dalam fungsi callback, kemudian menangkap kesalahan tersebut dan mengurai informasi yang diperlukan.
Metode ini tampaknya licik, tetapi sangat praktis. Tidak perlu mengubah metode swap untuk memperkirakan permintaan perdagangan, logikanya lebih sederhana.
Masalah Akurasi Penyelesaian Bilangan Besar
Kode Uniswap melibatkan banyak logika perhitungan, seperti menghitung token yang ditukar berdasarkan harga dan likuiditas saat ini. Untuk menghindari kehilangan presisi pada operasi pembagian, proses perhitungan sering menggunakan operasi "<< FixedPoint96.RESOLUTION", yaitu menggeser kiri 96 bit, yang setara dengan mengalikan dengan 2^96. Setelah digeser ke kiri, pembagian dilakukan, memastikan presisi dalam kondisi transaksi normal tanpa overflow.
Meskipun secara teori masih akan ada kehilangan presisi yang kecil, tetapi sudah dapat diterima.
Cara Berbagi Menghitung Keuntungan
Uniswap perlu mencatat pendapatan biaya dari penyedia likuiditas LP( ). Jelas bahwa tidak mungkin untuk mencatat biaya untuk setiap LP pada setiap transaksi, ini akan menghabiskan banyak Gas.
Struktur Position di Uniswap mencakup feeGrowthInside0LastX128 dan feeGrowthInside1LastX128, yang mencatat biaya yang seharusnya diterima setiap likuiditas saat biaya ditarik terakhir kali untuk setiap posisi.
Cukup catat total biaya transaksi dan biaya yang harus dialokasikan untuk setiap likuiditas. Saat LP menarik, biaya yang dapat ditarik dihitung berdasarkan likuiditas yang dimiliki. Mirip dengan memegang saham perusahaan, saat menarik keuntungan, cukup mengetahui penghasilan per saham historis dan penghasilan saat penarikan terakhir.
Informasi non-kritis tidak perlu diunggah ke rantai
Penyimpanan di blockchain relatif mahal, dan tidak semua informasi perlu disimpan di blockchain atau diambil dari blockchain. Banyak antarmuka yang dipanggil oleh frontend Uniswap adalah antarmuka Web2 tradisional.
Daftar kolam perdagangan, informasi, dll dapat disimpan di database biasa, sebagian perlu disinkronkan secara berkala dari blockchain. Tidak perlu memanggil antarmuka RPC layanan rantai atau node secara real-time untuk mendapatkan data terkait.
Tentu saja, transaksi kunci harus dilakukan di atas rantai.
Pembagian Kontrak dan Penggunaan Kontrak Standar
Sebuah proyek mungkin mencakup beberapa kontrak yang benar-benar diterapkan. Bahkan jika hanya ada satu yang diterapkan, itu dapat dibagi menjadi beberapa kontrak untuk pemeliharaan melalui pewarisan.
Seperti kontrak NonfungiblePositionManager Uniswap yang mewarisi beberapa kontrak. Di mana ERC721Permit langsung menggunakan kontrak ERC721 OpenZeppelin, yang memudahkan pengelolaan posisi melalui NFT, sekaligus meningkatkan efisiensi pengembangan.
Kesimpulan
Praktik langsung dalam mengembangkan versi sederhana dari bursa terdesentralisasi akan membuat Anda lebih memahami implementasi kode Uniswap dan mempelajari lebih banyak poin pengetahuan yang relevan dalam proyek nyata. Melihat lebih banyak artikel tidak ada bandingannya dengan praktik langsung, semoga pengalaman ini bermanfaat bagi pemula yang ingin belajar pengembangan kontrak.