Tip Praktis untuk Pengembangan Kontrak: Pengalaman yang Dipelajari dari Kode Uniswap
Baru-baru ini, saat mengembangkan tutorial untuk bursa terdesentralisasi, saya merujuk pada implementasi kode Uniswap V3 dan belajar banyak poin menarik. Sebagai pengembang yang mencoba mengembangkan kontrak Defi untuk pertama kalinya, teknik-teknik ini akan sangat membantu bagi pemula yang ingin belajar tentang pengembangan kontrak.
Selanjutnya, mari kita lihat beberapa trik kecil yang berguna, beberapa di antaranya bahkan bisa disebut sebagai keahlian yang luar biasa.
Alamat Penempatan Kontrak Prediksi
Dalam kondisi biasa, alamat yang diperoleh dari penyebaran kontrak tampak acak karena terkait dengan nonce, sehingga sulit untuk diprediksi. Namun, dalam beberapa skenario, kita perlu menyimpulkan alamat kontrak melalui pasangan perdagangan dan informasi terkait. Ini sangat berguna dalam menentukan izin transaksi atau mendapatkan alamat kolam.
Uniswap menggunakan metode CREATE2 untuk membuat kontrak, dengan menambahkan parameter salt sehingga alamat kontrak yang dihasilkan dapat diprediksi. Logika pembuatan alamat baru adalah: hash("0xFF", alamat pembuat, salt, initcode). Metode ini membuat alamat kontrak menjadi dapat diprediksi, memudahkan operasi selanjutnya.
Menggunakan Fungsi Callback dengan Cerdas
Dalam Solidity, kontrak dapat saling memanggil satu sama lain. Salah satu skenario umum adalah metode A memanggil B, dan B memanggil kembali A dalam metode yang dipanggil. Ini sangat berguna dalam beberapa situasi.
Sebagai contoh Uniswap, ketika memanggil metode swap dari kontrak UniswapV3Pool untuk melakukan transaksi, itu akan memanggil swapCallback, yang mengirimkan Token yang diperlukan untuk transaksi yang dihitung. Panggilan harus mentransfer Token yang diperlukan untuk transaksi ke UniswapV3Pool dalam callback. Desain ini memastikan eksekusi lengkap dan keamanan metode swap, tanpa perlu pencatatan variabel yang rumit.
Menggunakan penyampaian informasi melalui pengecualian, menggunakan try catch untuk mewujudkan estimasi transaksi
Dalam kontrak Quoter Uniswap, metode swap dari UniswapV3Pool dibungkus dengan try catch. Ini dilakukan untuk mensimulasikan metode swap guna memperkirakan Token yang diperlukan untuk transaksi. Karena saat perkiraan tidak ada pertukaran Token yang sebenarnya, maka akan terjadi kesalahan. Uniswap melempar kesalahan khusus dalam fungsi callback transaksi, kemudian menangkap kesalahan tersebut dan menguraikan informasi yang diperlukan darinya.
Metode ini tampaknya cerdik, tetapi sangat praktis. Ini menghindari perlu merombak metode swap untuk memperkirakan permintaan perdagangan, sehingga logika menjadi lebih sederhana.
Mengatasi masalah presisi dengan bilangan besar
Kode Uniswap melibatkan banyak logika perhitungan, seperti menghitung token yang dipertukarkan berdasarkan harga dan likuiditas saat ini. Untuk menghindari kehilangan presisi yang disebabkan oleh operasi pembagian, Uniswap sering menggunakan "<< FixedPoint96.RESOLUTION" operasi, yaitu menggeser ke kiri 96 bit, setara dengan mengalikan 2^96. Menggeser ke kiri sebelum melakukan operasi pembagian, dapat memastikan presisi dalam perhitungan uint256 dalam keadaan transaksi normal tanpa overflow.
Meskipun secara teori masih akan ada sedikit kehilangan akurasi, tetapi tingkat kesalahan semacam ini biasanya dapat diterima.
Menghitung Pendapatan dengan Cara Share
Uniswap perlu mencatat pendapatan biaya dari penyedia likuiditas LP(. Untuk menghindari penggunaan Gas yang besar dengan mencatat biaya untuk setiap penyedia likuiditas pada setiap transaksi, Uniswap menggunakan metode yang cerdik.
Di dalam struktur Position, didefinisikan feeGrowthInside0LastX128 dan feeGrowthInside1LastX128, yang mencatat biaya pertumbuhan terakhir setiap posisi ketika biaya layanan ditarik. Dengan cara ini, hanya perlu mencatat total biaya layanan dan biaya layanan yang seharusnya dialokasikan kepada setiap likuiditas, dan biaya layanan yang dapat ditarik dapat dihitung berdasarkan likuiditas yang dimiliki saat LP menarik. Ini mirip dengan mekanisme dividen saham, di mana saat menarik, hanya perlu mengetahui laba per saham perusahaan yang historis dan laba saat penarikan terakhir.
![Seri Pemula Web3: Tips Kecil Pengembangan Kontrak yang Saya Pelajari dari Kode Uniswap])https://img-cdn.gateio.im/webp-social/moments-45e66af69435e6d4412ae506e77ab893.webp(
Memilih Saluran Informasi yang Tepat
Penyimpanan di blockchain relatif mahal, sehingga tidak semua informasi perlu disimpan di blockchain atau diambil dari blockchain. Misalnya, banyak antarmuka yang digunakan oleh situs web frontend Uniswap adalah antarmuka Web2 tradisional.
Daftar kolam perdagangan, informasi kolam perdagangan, dan sebagainya dapat disimpan dalam basis data biasa, beberapa data mungkin perlu disinkronkan secara berkala dari rantai, tetapi tidak perlu memanggil antarmuka RPC dari rantai atau layanan node secara real-time untuk mendapatkan data terkait.
Beberapa penyedia RPC blockchain menawarkan antarmuka tingkat lanjut yang memungkinkan pengambilan data tertentu dengan lebih cepat dan lebih ekonomis. Antarmuka ini biasanya memanfaatkan caching untuk meningkatkan kinerja dan efisiensi.
Tentu saja, transaksi kunci masih perlu dilakukan di blockchain.
Memahami Pembagian Kontrak dan Memanfaatkan Kontrak Standar yang Ada
Sebuah proyek dapat mencakup beberapa kontrak yang benar-benar diterapkan. Bahkan jika hanya ada satu kontrak yang diterapkan, kita juga dapat memisahkan kontrak menjadi beberapa bagian melalui pewarisan untuk pemeliharaan.
Misalnya, kontrak NonfungiblePositionManager dari Uniswap mewarisi beberapa kontrak. Dalam implementasi kontrak ERC721Permit, langsung menggunakan kontrak @openzeppelin/contracts/token/ERC721/ERC721.sol. Ini tidak hanya memudahkan manajemen posisi melalui cara NFT, tetapi juga dapat memanfaatkan kontrak standar yang ada untuk meningkatkan efisiensi pengembangan.
Ringkasan
Mengembangkan versi sederhana dari bursa terdesentralisasi secara langsung akan memungkinkan Anda untuk memahami implementasi kode Uniswap dengan lebih mendalam, serta mempelajari lebih banyak poin pengetahuan dari proyek nyata. Saya yakin keterampilan ini akan sangat membantu bagi pemula yang ingin belajar tentang pengembangan kontrak.
![Seri Pemula Web3: 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.
10 Suka
Hadiah
10
7
Bagikan
Komentar
0/400
DataPickledFish
· 21jam yang lalu
Sedang mempelajari kode lagi, kepala sakit!
Lihat AsliBalas0
PermabullPete
· 21jam yang lalu
Sudah dimulai, tidak mengerti semua ini, saya hanya akan rugi.
Lihat AsliBalas0
MEVSandwichVictim
· 21jam yang lalu
CREATE2 ini juga terlihat cukup canggih, wajar saja itu uni.
Lihat AsliBalas0
MrRightClick
· 22jam yang lalu
Hey create2 benar-benar luar biasa!
Lihat AsliBalas0
PanicSeller69
· 22jam yang lalu
Kode anjing pun menangis.
Lihat AsliBalas0
BearMarketBard
· 22jam yang lalu
Laoganma itu benar-benar bull
Lihat AsliBalas0
Deconstructionist
· 22jam yang lalu
Saya sedang mempelajari kode produksi lagi, sudah tidak bisa belajar lagi.
Analisis Kode Uniswap: 7 Teknik Pengembangan Kontrak yang Berguna
Tip Praktis untuk Pengembangan Kontrak: Pengalaman yang Dipelajari dari Kode Uniswap
Baru-baru ini, saat mengembangkan tutorial untuk bursa terdesentralisasi, saya merujuk pada implementasi kode Uniswap V3 dan belajar banyak poin menarik. Sebagai pengembang yang mencoba mengembangkan kontrak Defi untuk pertama kalinya, teknik-teknik ini akan sangat membantu bagi pemula yang ingin belajar tentang pengembangan kontrak.
Selanjutnya, mari kita lihat beberapa trik kecil yang berguna, beberapa di antaranya bahkan bisa disebut sebagai keahlian yang luar biasa.
Alamat Penempatan Kontrak Prediksi
Dalam kondisi biasa, alamat yang diperoleh dari penyebaran kontrak tampak acak karena terkait dengan nonce, sehingga sulit untuk diprediksi. Namun, dalam beberapa skenario, kita perlu menyimpulkan alamat kontrak melalui pasangan perdagangan dan informasi terkait. Ini sangat berguna dalam menentukan izin transaksi atau mendapatkan alamat kolam.
Uniswap menggunakan metode CREATE2 untuk membuat kontrak, dengan menambahkan parameter salt sehingga alamat kontrak yang dihasilkan dapat diprediksi. Logika pembuatan alamat baru adalah: hash("0xFF", alamat pembuat, salt, initcode). Metode ini membuat alamat kontrak menjadi dapat diprediksi, memudahkan operasi selanjutnya.
Menggunakan Fungsi Callback dengan Cerdas
Dalam Solidity, kontrak dapat saling memanggil satu sama lain. Salah satu skenario umum adalah metode A memanggil B, dan B memanggil kembali A dalam metode yang dipanggil. Ini sangat berguna dalam beberapa situasi.
Sebagai contoh Uniswap, ketika memanggil metode swap dari kontrak UniswapV3Pool untuk melakukan transaksi, itu akan memanggil swapCallback, yang mengirimkan Token yang diperlukan untuk transaksi yang dihitung. Panggilan harus mentransfer Token yang diperlukan untuk transaksi ke UniswapV3Pool dalam callback. Desain ini memastikan eksekusi lengkap dan keamanan metode swap, tanpa perlu pencatatan variabel yang rumit.
Menggunakan penyampaian informasi melalui pengecualian, menggunakan try catch untuk mewujudkan estimasi transaksi
Dalam kontrak Quoter Uniswap, metode swap dari UniswapV3Pool dibungkus dengan try catch. Ini dilakukan untuk mensimulasikan metode swap guna memperkirakan Token yang diperlukan untuk transaksi. Karena saat perkiraan tidak ada pertukaran Token yang sebenarnya, maka akan terjadi kesalahan. Uniswap melempar kesalahan khusus dalam fungsi callback transaksi, kemudian menangkap kesalahan tersebut dan menguraikan informasi yang diperlukan darinya.
Metode ini tampaknya cerdik, tetapi sangat praktis. Ini menghindari perlu merombak metode swap untuk memperkirakan permintaan perdagangan, sehingga logika menjadi lebih sederhana.
Mengatasi masalah presisi dengan bilangan besar
Kode Uniswap melibatkan banyak logika perhitungan, seperti menghitung token yang dipertukarkan berdasarkan harga dan likuiditas saat ini. Untuk menghindari kehilangan presisi yang disebabkan oleh operasi pembagian, Uniswap sering menggunakan "<< FixedPoint96.RESOLUTION" operasi, yaitu menggeser ke kiri 96 bit, setara dengan mengalikan 2^96. Menggeser ke kiri sebelum melakukan operasi pembagian, dapat memastikan presisi dalam perhitungan uint256 dalam keadaan transaksi normal tanpa overflow.
Meskipun secara teori masih akan ada sedikit kehilangan akurasi, tetapi tingkat kesalahan semacam ini biasanya dapat diterima.
Menghitung Pendapatan dengan Cara Share
Uniswap perlu mencatat pendapatan biaya dari penyedia likuiditas LP(. Untuk menghindari penggunaan Gas yang besar dengan mencatat biaya untuk setiap penyedia likuiditas pada setiap transaksi, Uniswap menggunakan metode yang cerdik.
Di dalam struktur Position, didefinisikan feeGrowthInside0LastX128 dan feeGrowthInside1LastX128, yang mencatat biaya pertumbuhan terakhir setiap posisi ketika biaya layanan ditarik. Dengan cara ini, hanya perlu mencatat total biaya layanan dan biaya layanan yang seharusnya dialokasikan kepada setiap likuiditas, dan biaya layanan yang dapat ditarik dapat dihitung berdasarkan likuiditas yang dimiliki saat LP menarik. Ini mirip dengan mekanisme dividen saham, di mana saat menarik, hanya perlu mengetahui laba per saham perusahaan yang historis dan laba saat penarikan terakhir.
![Seri Pemula Web3: Tips Kecil Pengembangan Kontrak yang Saya Pelajari dari Kode Uniswap])https://img-cdn.gateio.im/webp-social/moments-45e66af69435e6d4412ae506e77ab893.webp(
Memilih Saluran Informasi yang Tepat
Penyimpanan di blockchain relatif mahal, sehingga tidak semua informasi perlu disimpan di blockchain atau diambil dari blockchain. Misalnya, banyak antarmuka yang digunakan oleh situs web frontend Uniswap adalah antarmuka Web2 tradisional.
Daftar kolam perdagangan, informasi kolam perdagangan, dan sebagainya dapat disimpan dalam basis data biasa, beberapa data mungkin perlu disinkronkan secara berkala dari rantai, tetapi tidak perlu memanggil antarmuka RPC dari rantai atau layanan node secara real-time untuk mendapatkan data terkait.
Beberapa penyedia RPC blockchain menawarkan antarmuka tingkat lanjut yang memungkinkan pengambilan data tertentu dengan lebih cepat dan lebih ekonomis. Antarmuka ini biasanya memanfaatkan caching untuk meningkatkan kinerja dan efisiensi.
Tentu saja, transaksi kunci masih perlu dilakukan di blockchain.
Memahami Pembagian Kontrak dan Memanfaatkan Kontrak Standar yang Ada
Sebuah proyek dapat mencakup beberapa kontrak yang benar-benar diterapkan. Bahkan jika hanya ada satu kontrak yang diterapkan, kita juga dapat memisahkan kontrak menjadi beberapa bagian melalui pewarisan untuk pemeliharaan.
Misalnya, kontrak NonfungiblePositionManager dari Uniswap mewarisi beberapa kontrak. Dalam implementasi kontrak ERC721Permit, langsung menggunakan kontrak @openzeppelin/contracts/token/ERC721/ERC721.sol. Ini tidak hanya memudahkan manajemen posisi melalui cara NFT, tetapi juga dapat memanfaatkan kontrak standar yang ada untuk meningkatkan efisiensi pengembangan.
Ringkasan
Mengembangkan versi sederhana dari bursa terdesentralisasi secara langsung akan memungkinkan Anda untuk memahami implementasi kode Uniswap dengan lebih mendalam, serta mempelajari lebih banyak poin pengetahuan dari proyek nyata. Saya yakin keterampilan ini akan sangat membantu bagi pemula yang ingin belajar tentang pengembangan kontrak.
![Seri Pemula Web3: Tips Kecil Pengembangan Kontrak yang Saya Pelajari dari Kode Uniswap])https://img-cdn.gateio.im/webp-social/moments-f95ddc9d89809cf11dbe65b9bafda157.webp(