Khám phá mã Uniswap: 7 mẹo phát triển hợp đồng giúp đỡ Người mới Defi

Kỹ thuật phát triển hợp đồng học được từ mã Uniswap

Gần đây, khi viết hướng dẫn phát triển 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 kiến thức quý giá. Là một nhà phát triển lần đầu tiên thử nghiệm phát triển hợp đồng Defi, những mẹo 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 bắt đầu: Những mẹo phát triển hợp đồng tôi học được từ mã Uniswap

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

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. 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, chẳng hạn như xác định quyền giao dịch hoặc lấy địa chỉ của pool.

Uniswap sử dụng phương thức CREATE2 để tạo hợp đồng, thông qua việc thêm tham số salt để làm cho địa chỉ được tạo có thể dự đoán. Logic tính toán địa chỉ mới là: hash("0xFF", địa chỉ của người tạo, salt, initcode).

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 được từ mã Uniswap

Sử dụng hàm callback một cách thông minh

Hợp đồng trong Solidity có thể gọi lẫn nhau. Trong một số tình huống, việc A gọi phương thức của B và B gọi lại A trong phương thức được gọi là rất hữu ích.

Trong Uniswap, khi gọi phương thức swap của hợp đồng UniswapV3Pool để giao dịch, nó sẽ gọi lại swapCallback và truyền vào token cần thiết cho giao dịch này. Bên gọi cần chuyển token cần thiết vào UniswapV3Pool trong callback, chứ không chia phương thức swap thành hai phần. Điều này đảm bảo tính an toàn và thực hiện đầy đủ của phương thức swap mà không cần phải ghi lại các biến phức tạp.

Sử dụng ngoại lệ để truyền thông tin, sử dụng try catch để thực hiện ước lượng giao dịch

Trong hợp đồng Quoter của Uniswap, phương thức swap của UniswapV3Pool được bao bọc bằng try catch để thực hiện. Điều này nhằm mô phỏng việc ước lượng Token cần thiết cho giao dịch của phương thức swap, nhưng trong quá trình ước lượng sẽ không xảy ra việc trao đổi Token thực tế, vì vậy sẽ báo 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ấy lỗi này, từ thông tin lỗi phân tích ra thông tin cần thiết. Phương pháp này có vẻ như là một mẹo, nhưng rất thực tế, không cần phải cải tạo phương thức swap cho ước lượng nhu cầu giao dịch, logic cũng đơn giản hơn.

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

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

Trong mã Uniswap có 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 việc phép chia mất độ chính xác, quá trình tính toán thường sử dụng phép toán "<< FixedPoint96.RESOLUTION", tức là dịch trái 96 bit, tương đương với việc nhân với 2^96.

Sau khi dịch trái, thực hiện phép chia có thể đảm bảo độ chính xác trong trường hợp giao dịch bình thường không bị tràn. Mặc dù về lý thuyết vẫn có sự mất mát độ chính xác của đơn vị tối thiểu, nhưng điều này là 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 tiêu tốn nhiều Gas khi ghi lại phí cho mỗi nhà cung cấp thanh khoản trong mỗi giao dịch, Uniswap đã áp dụng một phương pháp khéo léo.

Cấu trúc Position bao gồm feeGrowthInside0LastX128 và feeGrowthInside1LastX128, ghi lại phí giao dịch mà mỗi vị thế nên nhận được khi rút phí giao dịch lần trước. Chỉ cần ghi lại tổng phí giao dịch và phí giao dịch mà mỗi thanh khoản nên được phân bổ, phí giao dịch có thể rút được sẽ được tính theo thanh khoản mà LP nắm giữ.

![Web3 người mới series: Những mẹo phát triển hợp đồng tôi học được từ mã Uniswap])https://img-cdn.gateio.im/webp-social/moments-45e66af69435e6d4412ae506e77ab893.webp(

Chiến lược thu thập thông tin trên chuỗi

Không phải tất cả thông tin đều cần phải lấy từ chuỗi. Lưu trữ trên chuỗi tương đối đắt đỏ, nhiều thông tin có thể được lưu trữ trong cơ sở dữ liệu thông thường và đồng bộ định kỳ từ chuỗi.

Như 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, không cần gọi trực tiếp giao thức RPC của chuỗi hoặc dịch vụ nút theo thời gian thực. Tất nhiên, các giao dịch quan trọng vẫn diễn ra trên chuỗi.

Phân tách hợp đồng và sử dụng hợp đồng tiêu chuẩn

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

Ví dụ, hợp đồng NonfungiblePositionManager của Uniswap kế thừa từ nhiều hợp đồng khác. Sử dụng hợp đồng ERC721 của OpenZeppelin, không chỉ tiện lợi trong việc quản lý vị thế qua NFT mà còn nâng cao hiệu suất phát triển.

Kết luận

Thực hành là phương pháp học tập tốt nhất. Cố gắng xây dựng một phiên bản đơn giản của sàn giao dịch phi tập trung, bạn sẽ hiểu sâu hơn về cách triển khai mã của Uniswap, và học được nhiều điểm kiến thức thực tế trong các dự án. Nếu bạn quan tâm đến phát triển dự án Web3 và Defi, bạn có thể tham khảo các khóa học thực chiến liên quan, để dần hoàn thành một sàn giao dịch đơn giản.

![Web3 Người mới bắt đầu: Những mẹo nhỏ phát triển hợp đồng mà tôi học được từ mã Uniswap])https://img-cdn.gateio.im/webp-social/moments-f95ddc9d89809cf11dbe65b9bafda157.webp(

UNI-7.73%
DEFI0.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
  • 5
  • Đăng lại
  • Retweed
Bình luận
0/400
Không có bình luận
  • Ghim
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)