Phân tích mã Uniswap: 7 mẹo phát triển hợp đồng hữu ích

robot
Đang tạo bản tóm tắt

Mẹo hữu ích trong phát triển hợp đồng: Kinh nghiệm học từ mã Uniswap

Gần đây, khi phát triển một hướng dẫn về sàn giao dịch phi tập trung, tôi đã tham khảo mã nguồn của Uniswap V3 và học được nhiều điểm thú vị. Là một nhà phát triển lần đầu thử nghiệm phát triển hợp đồng Defi, những kỹ thuật này sẽ rất hữu ích cho những người mới muốn học phát triển hợp đồng.

Tiếp theo, hãy cùng xem những mẹo nhỏ hữu ích này, có những mẹo thậm chí có thể được coi là những kỹ thuật kỳ diệu.

Web3 Người mới series: Những mẹo phát triển hợp đồng mà tôi học được từ mã Uniswap

Địa chỉ triển khai hợp đồng dự đoán

Trong trường hợp thông thường, địa chỉ của hợp đồng được triển khai có vẻ ngẫu nhiên, vì nó liên quan đến nonce và khó dự đoán. Nhưng trong một số trường hợp, chúng ta cần suy luận địa chỉ hợp đồng thông qua cặp giao dịch và thông tin liên quan. Điều này rất hữu ích trong việc xác định quyền giao dịch hoặc nhận địa chỉ của pool.

Uniswap đã sử dụng phương pháp CREATE2 để tạo hợp đồng, bằng cách thêm tham số salt để làm cho địa chỉ hợp đồng được tạo ra có thể dự đoán. Logic tạo địa chỉ mới là: hash("0xFF", địa chỉ người tạo, salt, initcode). Phương pháp này làm cho địa chỉ hợp đồng trở nên có thể dự đoán, thuận tiện cho các thao tác tiếp theo.

Web3 người mới series: Những mẹo nhỏ trong phát triển hợp đồng mà tôi học được từ mã Uniswap

Sử dụng hiệu quả hàm callback

Trong Solidity, các hợp đồng có thể gọi lẫn nhau. Một kịch bản phổ biến là phương thức A gọi phương thức B, và B trong phương thức được gọi sẽ gọi lại A. Điều này rất hữu ích trong một số trường hợp.

Lấy Uniswap làm ví dụ, khi gọi phương thức swap của hợp đồng UniswapV3Pool để thực hiện giao dịch, nó sẽ gọi lại swapCallback, truyền vào Token cần thiết cho giao dịch được tính toán. Bên gọi cần chuyển Token cần thiết cho giao dịch vào UniswapV3Pool trong quá trình gọi lại. Thiết kế này đảm bảo việc thực thi hoàn chỉnh và an toàn của phương thức swap, không cần ghi lại các biến phức tạp.

Sử dụng thông tin chuyển giao ngoại lệ, thực hiện ước lượng giao dịch bằng try catch

Trong hợp đồng Quoter của Uniswap, sử dụng try catch để bao bọc việc thực thi phương thức swap của UniswapV3Pool. Điều này nhằm mô phỏng phương thức swap để ước lượng Token cần thiết cho giao dịch. Do việc ước lượng sẽ không thực sự phát sinh sự trao đổi Token, nên sẽ gặp lỗi. Uniswap thông qua việc ném ra lỗi đặc biệt trong hàm callback giao dịch, sau đó bắt lỗi đó và phân tích thông tin cần thiết từ nó.

Phương pháp này có vẻ như là một cách dễ dàng, nhưng rất thực tế. Nó tránh việc cải tiến phương pháp swap để ước lượng nhu cầu giao dịch, giúp logic trở nên đơn giản hơn.

Web3 Người mới bắt đầu: Những mẹo nhỏ về phát triển hợp đồng mà tôi đã học từ mã Uniswap

Sử dụng số lớn để giải quyết vấn đề độ chính xác

Mã Uniswap liên quan đến nhiều logic tính toán, chẳng hạn như tính toán token được trao đổi dựa trên giá hiện tại và tính thanh khoản. Để tránh mất độ chính xác do phép chia, Uniswap thường sử dụng "<< FixedPoint96.RESOLUTION" hoạt động, tức là dịch trái 96 bit, tương đương với nhân với 2^96. Việc dịch trái trước khi thực hiện phép chia có thể đảm bảo độ chính xác trong các giao dịch bình thường mà không bị tràn. ( thường được tính bằng uint256 để đảm bảo độ chính xác.

Mặc dù về lý thuyết vẫn sẽ có một chút mất mát độ chính xác, nhưng mức độ sai số như vậy thường có thể chấp nhận được.

Tính toán lợi nhuận bằng cách sử dụng Share

Uniswap cần ghi lại lợi nhuận phí giao dịch của nhà cung cấp thanh khoản LP). Để tránh việc ghi lại phí cho mỗi nhà cung cấp thanh khoản trong mỗi giao dịch và tiêu tốn nhiều Gas, Uniswap đã áp dụng một phương pháp tinh vi.

Trong cấu trúc Position, đã định nghĩa feeGrowthInside0LastX128 và feeGrowthInside1LastX128, ghi lại phí giao dịch mà mỗi thanh khoản nên nhận được khi rút phí lần trước. Như vậy, chỉ cần ghi lại tổng phí và phí mà mỗi thanh khoản nên phân bổ, LP có thể tính toán phí có thể rút dựa trên thanh khoản nắm giữ khi rút. Điều này tương tự như cơ chế chia cổ tức của cổ phiếu, khi rút chỉ cần biết lợi nhuận trên mỗi cổ phiếu trong lịch sử của công ty và lợi nhuận lúc rút lần trước.

Web3 Người mới series: Những mẹo nhỏ trong phát triển hợp đồng mà tôi học được từ mã Uniswap

Lựa chọn hợp lý các phương thức thu thập thông tin

Lưu trữ trên chuỗi tương đối đắt đỏ, vì vậy không phải tất cả thông tin đều cần phải được đưa lên chuỗi hoặc lấy từ chuỗi. Ví dụ, nhiều giao diện mà trang web front-end của Uniswap gọi là giao diện Web2 truyền thống.

Danh sách hồ giao dịch, thông tin hồ giao dịch, v.v. có thể được lưu trữ trong cơ sở dữ liệu thông thường, một số dữ liệu có thể cần được đồng bộ định kỳ từ chuỗi, nhưng không cần gọi giao diện RPC của chuỗi hoặc dịch vụ nút một cách thời gian thực để lấy dữ liệu liên quan.

Một số nhà cung cấp RPC blockchain cung cấp giao diện cao cấp, cho phép truy cập dữ liệu nhanh hơn và tiết kiệm hơn. Những giao diện này thường sử dụng bộ nhớ đệm để cải thiện hiệu suất và hiệu quả.

Tất nhiên, các giao dịch quan trọng vẫn cần được thực hiện trên chuỗi.

Học cách phân chia hợp đồng và sử dụng hợp đồng tiêu chuẩn hiện có

Một dự án có thể bao gồm nhiều hợp đồng thực tế đã được triển khai. Ngay cả khi chỉ có một hợp đồng được triển khai, chúng ta cũng có thể chia hợp đồng thành nhiều phần để bảo trì thông qua kế thừa.

Ví dụ, hợp đồng NonfungiblePositionManager của Uniswap đã kế thừa nhiều hợp đồng khác. Trong việc thực hiện hợp đồng ERC721Permit, hợp đồng @openzeppelin/contracts/token/ERC721/ERC721.sol đã được sử dụng trực tiếp. Điều này không chỉ thuận tiện cho việc quản lý vị thế thông qua NFT mà còn có thể tận dụng các hợp đồng tiêu chuẩn hiện có để nâng cao hiệu quả phát triển.

Tóm tắt

Thực hành phát triển một phiên bản sàn giao dịch phi tập trung đơn giản, sẽ giúp bạn hiểu sâu hơn về việc triển khai mã của Uniswap, cũng như học hỏi thêm nhiều kiến thức trong các dự án thực tế. Tôi tin rằng những kỹ năng này sẽ rất hữu ích cho những người mới muốn học phát triển hợp đồng.

Web3 người mới: Những mẹo phát triển hợp đồng mà tôi học được từ mã Uniswap

UNI3.75%
Xem bản gốc
Trang này có thể chứa nội dung của bên thứ ba, được cung cấp chỉ nhằm mục đích thông tin (không phải là tuyên bố/bảo đảm) và không được coi là sự chứng thực cho quan điểm của Gate hoặc là lời khuyên về tài chính hoặc chuyên môn. Xem Tuyên bố từ chối trách nhiệm để biết chi tiết.
  • Phần thưởng
  • 7
  • Chia sẻ
Bình luận
0/400
DataPickledFishvip
· 20giờ trước
Lại đang nghiên cứu mã à, đau đầu quá!
Xem bản gốcTrả lời0
PermabullPetevip
· 20giờ trước
Mở ra rồi, không hiểu những điều này, tôi chỉ biết thua lỗ.
Xem bản gốcTrả lời0
MEVSandwichVictimvip
· 21giờ trước
CREATE2 này còn cao cấp thật đấy, không hổ danh là uni.
Xem bản gốcTrả lời0
MrRightClickvip
· 21giờ trước
Này create2 thật tuyệt vời!
Xem bản gốcTrả lời0
PanicSeller69vip
· 21giờ trước
Code dog nhìn thấy cũng rơi nước mắt
Xem bản gốcTrả lời0
BearMarketBardvip
· 21giờ trước
Lão Gàn Diêu là thật sự bull
Xem bản gốcTrả lời0
Deconstructionistvip
· 21giờ trước
Lại đang nghiên cứu mã sản xuất rồi, không học nổi nữa.
Xem bản gốcTrả lời0
Giao dịch tiền điện tử mọi lúc mọi nơi
qrCode
Quét để tải xuống ứng dụng Gate
Cộng đồng
Tiếng Việt
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)