Tips Kecil untuk Pengembangan Kontrak: Pengalaman yang Dipelajari dari Kode Uniswap
Baru-baru ini, saat menulis tutorial pengembangan bursa terdesentralisasi, saya merujuk pada implementasi Uniswap V3 dan mempelajari banyak poin menarik. Sebagai pemula yang mencoba pertama kali mengembangkan kontrak Defi, teknik-teknik ini seharusnya sangat membantu bagi pemula lain yang ingin belajar pengembangan kontrak.
Alamat penyebaran kontrak yang dapat diprediksi
Alamat yang dihasilkan dari penyebaran kontrak biasanya tampak acak dan sulit untuk diprediksi. Namun dalam beberapa kasus, kita perlu menginferensikan alamat kontrak melalui informasi terkait transaksi, seperti menentukan hak transaksi atau mendapatkan alamat kolam.
Uniswap menggunakan metode CREATE2 untuk membuat kontrak, menambahkan parameter salt agar alamat dapat diprediksi. Logika pembuatan alamat baru adalah: hash("0xFF", alamat pembuat, salt, initcode). Metode ini membuat alamat kontrak menjadi dapat diprediksi, sangat berguna.
Menggunakan Fungsi Callback dengan Cerdas
Di Solidity, kontrak dapat saling memanggil. Dalam beberapa skenario, A memanggil metode B, dan B memanggil kembali A dalam metode yang dipanggil, pola ini sangat berguna.
Transaksi swap Uniswap menggunakan mekanisme callback. Metode swap UniswapV3Pool akan memanggil swapCallback, dengan jumlah Token yang diperlukan sebenarnya. Pihak yang memanggil harus mentransfer Token dalam callback, memastikan bahwa metode swap dieksekusi dengan lengkap dan aman, tanpa perlu pencatatan variabel yang rumit.
Menggunakan pengecualian untuk mentransfer informasi, menggunakan try catch untuk melakukan estimasi transaksi
Dalam kontrak Quoter Uniswap, metode swap UniswapV3Pool dibungkus dengan try catch. Ini dilakukan untuk mensimulasikan swap guna memperkirakan Token yang diperlukan untuk transaksi, tetapi pada saat perkiraan tidak akan terjadi pertukaran Token yang sebenarnya sehingga akan menghasilkan kesalahan.
Uniswap menangani dengan melempar kesalahan khusus dalam fungsi callback, kemudian menangkap kesalahan tersebut dan mengurai informasi yang diperlukan darinya. Metode ini terlihat seperti akal, tetapi sangat praktis, tanpa harus mengubah metode swap khusus untuk memperkirakan permintaan, logikanya lebih sederhana.
Mengatasi masalah presisi dengan angka besar
Dalam kode Uniswap, terdapat banyak perhitungan, seperti menghitung jumlah Token yang ditukar berdasarkan harga dan likuiditas saat ini. Untuk menghindari kehilangan presisi saat operasi pembagian, proses perhitungan sering menggunakan operasi "<< FixedPoint96.RESOLUTION", yang artinya menggeser ke kiri 96 bit, setara dengan mengalikan dengan 2^96.
Menggeser ke kiri dan kemudian melakukan pembagian dapat memastikan akurasi dalam transaksi normal tanpa overflow. Meskipun secara teoritis masih akan ada sedikit kehilangan akurasi, namun sudah dapat diterima.
Menghitung Pendapatan dengan Cara Share
Uniswap perlu mencatat keuntungan biaya dari penyedia likuiditas LP(. Jelas bahwa tidak mungkin untuk mencatat biaya untuk setiap LP pada setiap transaksi, karena akan menghabiskan banyak Gas.
Solusinya adalah dengan mencatat feeGrowthInside0LastX128 dan feeGrowthInside1LastX128 dalam struktur Position, yang menunjukkan biaya yang seharusnya diterima setiap unit likuiditas saat biaya ditarik terakhir kali untuk setiap posisi.
Cukup catat total biaya transaksi dan biaya transaksi yang dialokasikan per unit likuiditas, biaya transaksi yang dapat ditarik dapat dihitung berdasarkan likuiditas yang dimiliki saat LP menarik. Mirip dengan memiliki saham, saat menarik keuntungan, Anda hanya perlu mengetahui keuntungan per saham historis dan keuntungan saat penarikan terakhir.
![Seri Pemula Web3: Tip Kecil Pengembangan Kontrak yang Saya Pelajari dari Kode Uniswap])https://img-cdn.gateio.im/webp-social/moments-45e66af69435e6d4412ae506e77ab893.webp(
Tidak semua informasi perlu diambil dari rantai
Penyimpanan di blockchain relatif mahal, 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 basis data biasa, beberapa perlu disinkronkan secara berkala dari rantai, tetapi tidak perlu memanggil data secara real-time dari rantai atau antarmuka RPC node.
Banyak penyedia RPC blockchain juga menawarkan antarmuka tingkat lanjut yang memungkinkan akses data tertentu dengan lebih cepat dan murah. Antarmuka ini biasanya memanfaatkan caching untuk meningkatkan kinerja dan efisiensi.
Tentu saja, transaksi kunci masih dilakukan di blockchain.
Pelajari Pemisahan Kontrak dan Memanfaatkan Kontrak Standar yang Ada
Sebuah proyek dapat mencakup beberapa kontrak yang sebenarnya dikerahkan. Bahkan jika hanya satu kontrak yang dikerahkan, kode dapat dipisahkan menjadi beberapa kontrak melalui pewarisan untuk pemeliharaan.
Seperti kontrak NonfungiblePositionManager dari Uniswap yang mewarisi beberapa kontrak. Kontrak ERC721Permit langsung menggunakan implementasi ERC721 dari OpenZeppelin, yang tidak hanya memudahkan pengelolaan posisi dengan NFT, tetapi juga meningkatkan efisiensi pengembangan.
Ringkasan
Mengembangkan versi sederhana dari bursa terdesentralisasi secara langsung dapat membantu Anda memahami implementasi Uniswap dengan lebih mendalam dan mempelajari lebih banyak poin pengetahuan dari proyek praktis. Pembelajaran teori memang penting, tetapi pengalaman praktik jauh lebih berharga. Semoga tips kecil ini dapat membantu Anda dalam perjalanan pengembangan kontrak.
![Web3 Pemula Series: Tips Kecil dalam 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.
19 Suka
Hadiah
19
7
Bagikan
Komentar
0/400
GasWaster
· 07-16 11:49
Semua yang belajar kontrak harus melihat
Lihat AsliBalas0
MissedAirdropAgain
· 07-16 07:39
Belajar kontrak sudah terlambat...
Lihat AsliBalas0
YieldWhisperer
· 07-14 20:20
melihat pola yang persis sama di dyydx pada 2020... tidak ada yang baru sejujurnya
Lihat AsliBalas0
MEVictim
· 07-14 20:18
Apakah pengetahuan yang konyol ini benar-benar berguna?
Analisis Kode Uniswap: 7 Tips Pengembangan Smart Contract
Tips Kecil untuk Pengembangan Kontrak: Pengalaman yang Dipelajari dari Kode Uniswap
Baru-baru ini, saat menulis tutorial pengembangan bursa terdesentralisasi, saya merujuk pada implementasi Uniswap V3 dan mempelajari banyak poin menarik. Sebagai pemula yang mencoba pertama kali mengembangkan kontrak Defi, teknik-teknik ini seharusnya sangat membantu bagi pemula lain yang ingin belajar pengembangan kontrak.
Alamat penyebaran kontrak yang dapat diprediksi
Alamat yang dihasilkan dari penyebaran kontrak biasanya tampak acak dan sulit untuk diprediksi. Namun dalam beberapa kasus, kita perlu menginferensikan alamat kontrak melalui informasi terkait transaksi, seperti menentukan hak transaksi atau mendapatkan alamat kolam.
Uniswap menggunakan metode CREATE2 untuk membuat kontrak, menambahkan parameter salt agar alamat dapat diprediksi. Logika pembuatan alamat baru adalah: hash("0xFF", alamat pembuat, salt, initcode). Metode ini membuat alamat kontrak menjadi dapat diprediksi, sangat berguna.
Menggunakan Fungsi Callback dengan Cerdas
Di Solidity, kontrak dapat saling memanggil. Dalam beberapa skenario, A memanggil metode B, dan B memanggil kembali A dalam metode yang dipanggil, pola ini sangat berguna.
Transaksi swap Uniswap menggunakan mekanisme callback. Metode swap UniswapV3Pool akan memanggil swapCallback, dengan jumlah Token yang diperlukan sebenarnya. Pihak yang memanggil harus mentransfer Token dalam callback, memastikan bahwa metode swap dieksekusi dengan lengkap dan aman, tanpa perlu pencatatan variabel yang rumit.
Menggunakan pengecualian untuk mentransfer informasi, menggunakan try catch untuk melakukan estimasi transaksi
Dalam kontrak Quoter Uniswap, metode swap UniswapV3Pool dibungkus dengan try catch. Ini dilakukan untuk mensimulasikan swap guna memperkirakan Token yang diperlukan untuk transaksi, tetapi pada saat perkiraan tidak akan terjadi pertukaran Token yang sebenarnya sehingga akan menghasilkan kesalahan.
Uniswap menangani dengan melempar kesalahan khusus dalam fungsi callback, kemudian menangkap kesalahan tersebut dan mengurai informasi yang diperlukan darinya. Metode ini terlihat seperti akal, tetapi sangat praktis, tanpa harus mengubah metode swap khusus untuk memperkirakan permintaan, logikanya lebih sederhana.
Mengatasi masalah presisi dengan angka besar
Dalam kode Uniswap, terdapat banyak perhitungan, seperti menghitung jumlah Token yang ditukar berdasarkan harga dan likuiditas saat ini. Untuk menghindari kehilangan presisi saat operasi pembagian, proses perhitungan sering menggunakan operasi "<< FixedPoint96.RESOLUTION", yang artinya menggeser ke kiri 96 bit, setara dengan mengalikan dengan 2^96.
Menggeser ke kiri dan kemudian melakukan pembagian dapat memastikan akurasi dalam transaksi normal tanpa overflow. Meskipun secara teoritis masih akan ada sedikit kehilangan akurasi, namun sudah dapat diterima.
Menghitung Pendapatan dengan Cara Share
Uniswap perlu mencatat keuntungan biaya dari penyedia likuiditas LP(. Jelas bahwa tidak mungkin untuk mencatat biaya untuk setiap LP pada setiap transaksi, karena akan menghabiskan banyak Gas.
Solusinya adalah dengan mencatat feeGrowthInside0LastX128 dan feeGrowthInside1LastX128 dalam struktur Position, yang menunjukkan biaya yang seharusnya diterima setiap unit likuiditas saat biaya ditarik terakhir kali untuk setiap posisi.
Cukup catat total biaya transaksi dan biaya transaksi yang dialokasikan per unit likuiditas, biaya transaksi yang dapat ditarik dapat dihitung berdasarkan likuiditas yang dimiliki saat LP menarik. Mirip dengan memiliki saham, saat menarik keuntungan, Anda hanya perlu mengetahui keuntungan per saham historis dan keuntungan saat penarikan terakhir.
![Seri Pemula Web3: Tip Kecil Pengembangan Kontrak yang Saya Pelajari dari Kode Uniswap])https://img-cdn.gateio.im/webp-social/moments-45e66af69435e6d4412ae506e77ab893.webp(
Tidak semua informasi perlu diambil dari rantai
Penyimpanan di blockchain relatif mahal, 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 basis data biasa, beberapa perlu disinkronkan secara berkala dari rantai, tetapi tidak perlu memanggil data secara real-time dari rantai atau antarmuka RPC node.
Banyak penyedia RPC blockchain juga menawarkan antarmuka tingkat lanjut yang memungkinkan akses data tertentu dengan lebih cepat dan murah. Antarmuka ini biasanya memanfaatkan caching untuk meningkatkan kinerja dan efisiensi.
Tentu saja, transaksi kunci masih dilakukan di blockchain.
Pelajari Pemisahan Kontrak dan Memanfaatkan Kontrak Standar yang Ada
Sebuah proyek dapat mencakup beberapa kontrak yang sebenarnya dikerahkan. Bahkan jika hanya satu kontrak yang dikerahkan, kode dapat dipisahkan menjadi beberapa kontrak melalui pewarisan untuk pemeliharaan.
Seperti kontrak NonfungiblePositionManager dari Uniswap yang mewarisi beberapa kontrak. Kontrak ERC721Permit langsung menggunakan implementasi ERC721 dari OpenZeppelin, yang tidak hanya memudahkan pengelolaan posisi dengan NFT, tetapi juga meningkatkan efisiensi pengembangan.
Ringkasan
Mengembangkan versi sederhana dari bursa terdesentralisasi secara langsung dapat membantu Anda memahami implementasi Uniswap dengan lebih mendalam dan mempelajari lebih banyak poin pengetahuan dari proyek praktis. Pembelajaran teori memang penting, tetapi pengalaman praktik jauh lebih berharga. Semoga tips kecil ini dapat membantu Anda dalam perjalanan pengembangan kontrak.
![Web3 Pemula Series: Tips Kecil dalam Pengembangan Kontrak yang Saya Pelajari dari Kode Uniswap])https://img-cdn.gateio.im/webp-social/moments-f95ddc9d89809cf11dbe65b9bafda157.webp(