Berbagi Tips Kecil dalam Pengembangan Kontrak: Pengalaman yang Dipelajari dari Uniswap
Baru-baru ini saat mengembangkan proyek bursa terdesentralisasi, saya merujuk pada implementasi kode dari DEX terkenal, dan belajar banyak poin berguna. Sebagai seorang pemula yang baru saja memasuki pengembangan kontrak Defi, teknik-teknik ini sangat menginspirasi saya, dan saya yakin ini juga akan membantu teman-teman lain yang ingin belajar pengembangan kontrak pintar.
Alamat Kontrak yang Dapat Diprediksi
Alamat yang diperoleh dari penerapan kontrak biasanya terlihat acak karena terkait dengan nonce. Namun dalam beberapa skenario, kita perlu menyimpulkan alamat kontrak melalui informasi transaksi, seperti menentukan izin transaksi atau mendapatkan alamat kolam likuiditas.
Ini dapat dicapai dengan membuat kontrak menggunakan metode CREATE2. Cara spesifiknya adalah dengan menambahkan parameter salt saat membuat kontrak:
soliditas
pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}());
Alamat kontrak yang dihasilkan dengan cara ini dapat diprediksi, mengikuti logika berikut:
Alamat baru = hash("0xFF", alamat pencipta, salt, initcode)
Penggunaan Fungsi Callback yang Rasional
Dalam beberapa skenario, pemanggilan saling antar kontrak sangat berguna. Misalnya, metode A memanggil B, dan B memanggil kembali A dalam metode yang dipanggil.
Dalam DEX tertentu, saat memanggil metode swap untuk melakukan transaksi, ia akan memanggil swapCallback dengan Token yang diperlukan untuk transaksi kali ini. Panggilan harus mentransfer Token yang diperlukan ke dalam pool transaksi dalam callback, bukan memecah metode swap. Ini memastikan bahwa metode swap dieksekusi secara lengkap, tanpa perlu catatan variabel yang rumit untuk menjamin keamanan.
Menggunakan Penyampaian Informasi yang Tidak Biasa
Dalam memperkirakan transaksi, kita perlu mensimulasikan metode swap, tetapi tidak akan benar-benar menukar Token, sehingga akan muncul kesalahan. Sebuah DEX mencapai perkiraan dengan melemparkan kesalahan khusus dalam fungsi callback transaksi, kemudian menangkap kesalahan tersebut dan menganalisis informasi yang diperlukan.
Metode ini tampaknya licik, tetapi sangat praktis. Tidak perlu mengubah metode swap untuk memperkirakan permintaan, logikanya lebih sederhana.
Menggunakan Bilangan Besar untuk Mengatasi Masalah Presisi
Dalam kode yang melibatkan perhitungan, harus menghindari kehilangan presisi saat melakukan operasi pembagian. Beberapa DEX sering menggunakan "<< FixedPoint96.RESOLUTION" operasi, setara dengan mengalikan 2^96. Menggeser ke kiri dan kemudian melakukan pembagian dapat memastikan presisi tanpa overflow.
Meskipun secara teoritis masih mungkin ada kehilangan presisi, tetapi biasanya hanya kehilangan unit terkecil, yang dapat diterima.
Menghitung Pendapatan dengan Metode Share
Untuk perhitungan pendapatan biaya transaksi penyedia likuiditas (LP), tidak mungkin untuk mencatat setiap transaksi, karena ini akan menghabiskan banyak Gas. Beberapa DEX menggunakan cara mencatat total biaya transaksi dan setiap likuiditas yang seharusnya mendapatkan bagian dari biaya transaksi.
Saat menarik biaya LP, jumlah yang dapat ditarik dihitung berdasarkan likuiditas yang dimiliki. Mirip dengan memiliki saham perusahaan, saat menarik keuntungan, Anda hanya perlu mengetahui hasil historis per saham dan hasil saat penarikan terakhir.
Memilih Cara Mendapatkan Informasi dengan Bijak
Penyimpanan di blockchain relatif mahal, tidak semua informasi perlu disimpan di blockchain atau diambil dari blockchain. Misalnya, daftar kolam transaksi, informasi, dan sebagainya dapat disimpan di database biasa dan disinkronkan secara berkala dari blockchain.
Beberapa penyedia RPC blockchain menawarkan antarmuka canggih untuk mendapatkan data dengan lebih cepat. Namun, transaksi kunci tetap harus dilakukan di blockchain.
Pembagian Kontrak dan Penggunaan Kembali Kontrak Standar
Sebuah proyek mungkin terdiri dari beberapa kontrak, bahkan jika hanya satu kontrak yang diterapkan, itu dapat dipecah menjadi beberapa kontrak untuk pemeliharaan melalui pewarisan.
Kontrak pengelolaan posisi NFT dari suatu DEX mewarisi beberapa kontrak:
Pada saat yang sama, ia juga menggunakan kontrak standar ERC721 dari OpenZeppelin, yang memudahkan pengelolaan posisi dan meningkatkan efisiensi pengembangan.
Ringkasan
Mengembangkan versi sederhana dari bursa terdesentralisasi secara langsung, dapat membantu Anda memahami implementasi kode dari proyek yang sudah matang dengan lebih mendalam, dan mempelajari lebih banyak poin pengetahuan praktis. Semoga tips kecil ini menginspirasi Anda, semoga pengembangan Anda berjalan lancar!
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.
9 Suka
Hadiah
9
6
Posting ulang
Bagikan
Komentar
0/400
NFTArchaeologis
· 08-07 00:10
Menyalin buta juga merupakan salah satu cara belajar
7 Tip Praktis untuk Belajar Pengembangan Kontrak DEX Utama
Berbagi Tips Kecil dalam Pengembangan Kontrak: Pengalaman yang Dipelajari dari Uniswap
Baru-baru ini saat mengembangkan proyek bursa terdesentralisasi, saya merujuk pada implementasi kode dari DEX terkenal, dan belajar banyak poin berguna. Sebagai seorang pemula yang baru saja memasuki pengembangan kontrak Defi, teknik-teknik ini sangat menginspirasi saya, dan saya yakin ini juga akan membantu teman-teman lain yang ingin belajar pengembangan kontrak pintar.
Alamat Kontrak yang Dapat Diprediksi
Alamat yang diperoleh dari penerapan kontrak biasanya terlihat acak karena terkait dengan nonce. Namun dalam beberapa skenario, kita perlu menyimpulkan alamat kontrak melalui informasi transaksi, seperti menentukan izin transaksi atau mendapatkan alamat kolam likuiditas.
Ini dapat dicapai dengan membuat kontrak menggunakan metode CREATE2. Cara spesifiknya adalah dengan menambahkan parameter salt saat membuat kontrak:
soliditas pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}());
Alamat kontrak yang dihasilkan dengan cara ini dapat diprediksi, mengikuti logika berikut:
Alamat baru = hash("0xFF", alamat pencipta, salt, initcode)
Penggunaan Fungsi Callback yang Rasional
Dalam beberapa skenario, pemanggilan saling antar kontrak sangat berguna. Misalnya, metode A memanggil B, dan B memanggil kembali A dalam metode yang dipanggil.
Dalam DEX tertentu, saat memanggil metode swap untuk melakukan transaksi, ia akan memanggil swapCallback dengan Token yang diperlukan untuk transaksi kali ini. Panggilan harus mentransfer Token yang diperlukan ke dalam pool transaksi dalam callback, bukan memecah metode swap. Ini memastikan bahwa metode swap dieksekusi secara lengkap, tanpa perlu catatan variabel yang rumit untuk menjamin keamanan.
Menggunakan Penyampaian Informasi yang Tidak Biasa
Dalam memperkirakan transaksi, kita perlu mensimulasikan metode swap, tetapi tidak akan benar-benar menukar Token, sehingga akan muncul kesalahan. Sebuah DEX mencapai perkiraan dengan melemparkan kesalahan khusus dalam fungsi callback transaksi, kemudian menangkap kesalahan tersebut dan menganalisis informasi yang diperlukan.
Metode ini tampaknya licik, tetapi sangat praktis. Tidak perlu mengubah metode swap untuk memperkirakan permintaan, logikanya lebih sederhana.
Menggunakan Bilangan Besar untuk Mengatasi Masalah Presisi
Dalam kode yang melibatkan perhitungan, harus menghindari kehilangan presisi saat melakukan operasi pembagian. Beberapa DEX sering menggunakan "<< FixedPoint96.RESOLUTION" operasi, setara dengan mengalikan 2^96. Menggeser ke kiri dan kemudian melakukan pembagian dapat memastikan presisi tanpa overflow.
solidity uint256 numerator1 = uint256(liquidity) << FixedPoint96.RESOLUTION; uint256 numerator2 = sqrtRatioBX96 - sqrtRatioAX96; amount0 = numerator1 * numerator2 / (sqrtRatioBX96 * sqrtRatioAX96);
Meskipun secara teoritis masih mungkin ada kehilangan presisi, tetapi biasanya hanya kehilangan unit terkecil, yang dapat diterima.
Menghitung Pendapatan dengan Metode Share
Untuk perhitungan pendapatan biaya transaksi penyedia likuiditas (LP), tidak mungkin untuk mencatat setiap transaksi, karena ini akan menghabiskan banyak Gas. Beberapa DEX menggunakan cara mencatat total biaya transaksi dan setiap likuiditas yang seharusnya mendapatkan bagian dari biaya transaksi.
Saat menarik biaya LP, jumlah yang dapat ditarik dihitung berdasarkan likuiditas yang dimiliki. Mirip dengan memiliki saham perusahaan, saat menarik keuntungan, Anda hanya perlu mengetahui hasil historis per saham dan hasil saat penarikan terakhir.
Memilih Cara Mendapatkan Informasi dengan Bijak
Penyimpanan di blockchain relatif mahal, tidak semua informasi perlu disimpan di blockchain atau diambil dari blockchain. Misalnya, daftar kolam transaksi, informasi, dan sebagainya dapat disimpan di database biasa dan disinkronkan secara berkala dari blockchain.
Beberapa penyedia RPC blockchain menawarkan antarmuka canggih untuk mendapatkan data dengan lebih cepat. Namun, transaksi kunci tetap harus dilakukan di blockchain.
Pembagian Kontrak dan Penggunaan Kembali Kontrak Standar
Sebuah proyek mungkin terdiri dari beberapa kontrak, bahkan jika hanya satu kontrak yang diterapkan, itu dapat dipecah menjadi beberapa kontrak untuk pemeliharaan melalui pewarisan.
Kontrak pengelolaan posisi NFT dari suatu DEX mewarisi beberapa kontrak:
solidity kontrak NonfungiblePositionManager adalah INonfungiblePositionManager, Multicall, PeripheryImmutableState, PoolInitializer, ManajemenKecairan, PeripheryValidation, SelfPermit, ERC721Permit {...}
Pada saat yang sama, ia juga menggunakan kontrak standar ERC721 dari OpenZeppelin, yang memudahkan pengelolaan posisi dan meningkatkan efisiensi pengembangan.
Ringkasan
Mengembangkan versi sederhana dari bursa terdesentralisasi secara langsung, dapat membantu Anda memahami implementasi kode dari proyek yang sudah matang dengan lebih mendalam, dan mempelajari lebih banyak poin pengetahuan praktis. Semoga tips kecil ini menginspirasi Anda, semoga pengembangan Anda berjalan lancar!