Belajar dari kode Uniswap tentang teknik pengembangan kontrak, jauh lebih menarik daripada buku teks



Baru-baru ini saat membuat tutorial pengembangan bExchange terdesentralisasi, saya mendalami cara implementasi Uniswap V3, dan menemukan beberapa cara penulisan yang benar-benar keren. Sebelumnya saya hanya pernah menulis kontrak NFT sederhana, ini adalah kali pertama saya benar-benar mengulik kode kontrak DeFi, dan banyak hal yang layak dibagikan kepada teman-teman yang ingin belajar tentang Uniswap.

Pertama, saya ingin menyebut satu hal yang paling mengejutkan—apakah alamat kontrak bisa diprediksi?

Biasanya, alamat kontrak yang di-deploy terlihat acak, tapi Uniswap menggunakan trik pintar. Mereka menambahkan parameter salt saat membuat kontrak, memakai opcode CREATE2, sehingga alamat yang dihasilkan bisa diprediksi. Caranya adalah seperti ini: “pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}());” dalam kode. Keuntungan dari ini adalah, cukup tahu pasangan token dan fee, kita bisa menghitung alamat kontrak pool tanpa harus benar-benar deploy dulu. Ini sangat berguna untuk verifikasi izin transaksi atau cepat menemukan pool.

Desain callback function juga sangat cerdas.

Di Uniswap, saat kamu memanggil metode swap untuk melakukan transaksi, kontrak akan memanggil fungsi swapCallback, mengirimkan jumlah token yang diperlukan, dan kamu akan mentransfer token ke sana dalam callback. Keuntungan dari ini adalah seluruh logika transaksi berjalan lengkap, tanpa perlu memecah menjadi beberapa langkah atau menyimpan variabel kompleks untuk keamanan. Singkatnya, A memanggil B, lalu B saat dipanggil kembali memanggil A, membentuk lingkaran tertutup.

Metode estimasi transaksi juga cukup hack—menggunakan error untuk mengirim pesan.

Karena saat estimasi transaksi, transaksi tidak benar-benar menukar token, maka akan error. Pendekatan Uniswap adalah melempar error khusus dalam callback, lalu tangkap dengan try-catch, dan parsing data dari pesan error tersebut. Terlihat agak kasar, tapi sangat praktis, tanpa perlu mengubah metode swap, kita bisa menambahkan fitur estimasi.

Solusi untuk masalah presisi juga patut dipelajari.

Saat menghitung pertukaran token, jika langsung dibagi, akan kehilangan presisi. Uniswap melakukan dengan menggeser angka 96 bit ke kiri (seperti mengalikan dengan 2^96), lalu melakukan pembagian, dan kemudian menghilangkan 2^96 dari hasilnya. Dengan cara ini, dalam rentang uint256, presisi tetap terjaga dan tidak overflow. Variabel seperti sqrtRatioAX96 dan sqrtRatioBX96 di kode menunjukkan pendekatan ini, terlihat rumit tapi logikanya jelas.

Cara menghitung pendapatan fee juga sangat cerdas.

Daripada mencatat fee setiap LP setiap transaksi (yang akan menghabiskan banyak gas), lebih baik mencatat total fee dan proporsi distribusi untuk setiap liquidity provider. Saat LP menarik, mereka tinggal mengalikan jumlah liquidity yang dimiliki dengan total fee per saham yang tercatat, sehingga bisa menghitung pendapatannya, mirip seperti pembagian dividen berdasarkan saham. Metode perhitungan Share ini banyak digunakan di berbagai proyek.

Penting juga untuk tidak semua data harus di-chain.

Daftar pool, info dasar, dan data lain bisa disimpan di database tradisional, dan sinkronisasi secara berkala dari chain sudah cukup, tidak perlu panggilan RPC secara langsung setiap saat. Banyak layanan blockchain saat ini menyediakan API tingkat tinggi yang memungkinkan pengambilan data lebih cepat dan murah, ini juga merupakan pendekatan yang sama.

Terakhir, tentang organisasi kode.

Proyek besar biasanya membagi kontrak menjadi beberapa bagian untuk memudahkan pemeliharaan, dan Uniswap mengikuti prinsip ini. Selain itu, manfaatkan kontrak standar seperti OpenZeppelin ERC721 untuk mengelola posisi, sehingga pengembangan lebih efisien dan kode lebih terpercaya.

Sejujurnya, membaca artikel sebanyak apapun tidak akan seefektif belajar langsung praktek. Saat membuat bExchange versi sederhana, kamu benar-benar memahami mengapa Uniswap merancangnya seperti itu. Kursus WTF-DApp didasarkan pada ide ini, membimbingmu langkah demi langkah menyelesaikan proyek praktis belajar Uniswap, dan saya yakin ini akan sangat membantu pengembangan kontrakmu.
Lihat Asli
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.
  • Hadiah
  • Komentar
  • Posting ulang
  • Bagikan
Komentar
Tambahkan komentar
Tambahkan komentar
Tidak ada komentar
  • Sematkan