Uniswap mã nguồn tiết lộ: 7 kỹ thuật phát triển hợp đồng giúp Người mới Defi To da moon

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

Chia sẻ kỹ thuật phát triển hợp đồng: Học từ mã nguồn Uniswap

Gần đây, khi viết một hướng dẫn phát triển cho 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 lập trình viê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.

Dưới đây là một số mẹo nhỏ mà tôi đã học được, có những mẹo thậm chí có thể được gọi là những kỹ năng kỳ diệu.

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ì địa chỉ của hợp đồng được triển khai sẽ có vẻ ngẫu nhiên, vì nó liên quan đến nonce, nên địa chỉ hợp đồng khó có thể dự đoán. Tuy nhiên, trong một số trường hợp, chúng ta có thể suy ra đị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 lấy địa chỉ của pool.

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

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

Sử dụng hàm gọi lại một cách khéo léo

Trong một số tình huống, hợp đồng A gọi phương thức của hợp đồng B, và B gọi lại A trong phương thức được gọi, cách này rất thực tiễn.

Ví dụ, 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, truyền vào Token thực tế cần thiết cho giao dịch này. Bên gọi cần phải chuyển Token cần thiết cho giao dịch vào UniswapV3Pool trong callback, thay vì tách phương thức swap thành hai phần để bên gọi thực hiện. Điều này đảm bảo tính an toàn của phương thức swap, đảm bảo toàn bộ logic được thực hiện đầy đủ mà không cần ghi lại các biến phức tạp để đảm bảo an toàn.

Sử dụng thông tin truyền qua ngoại lệ, 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 thực hiện bằng cách bao bọc trong try catch. Đ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. Vì trong quá trình ước lượng không thực sự phát sinh trao đổi Token, nên sẽ xảy ra 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 đó, 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ẻ là mẹo vặt, nhưng rất thực tiễn. Không cần cải tiến phương pháp swap để ước lượng nhu cầu giao dịch, logic đơ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

Trong mã của Uniswap có rất nhiều logic tính toán, chẳng hạn như tính toán các 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 khi thực hiện phép chia, quá trình tính toán thường sử dụng phép toán "<< FixedPoint96.RESOLUTION", tức là dịch sang trái 96 bit, tương đương với việc nhân với 2^96. Sau khi dịch sang trái, thực hiện phép chia, đảm bảo độ chính xác trong trường hợp giao dịch bình thường không bị tràn.

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

Trong Uniswap, cần ghi lại lợi nhuận phí giao dịch của nhà cung cấp thanh khoản LP(. Rõ ràng là không thể ghi lại phí cho mỗi nhà cung cấp LP trong mỗi giao dịch, điều này sẽ tiêu tốn rất nhiều Gas.

Giải pháp của Uniswap là ghi lại feeGrowthInside0LastX128 và feeGrowthInside1LastX128 trong cấu trúc Position, thể hiện phí mà mỗi vị trí được hưởng khi rút phí lần trước. Chỉ cần ghi lại tổng phí và phí mà mỗi thanh khoản được phân bổ, LP có thể tính toán phí có thể rút khi rút dựa trên thanh khoản nắm giữ. Điều này tương tự như việc nắm giữ cổ phiếu công ty, khi rút lợi nhuận chỉ cần biết lịch sử lợi nhuận trên mỗi cổ phiếu của công ty và lợi nhuận vào lần rút trước.

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

Thông tin không cần thiết không cần lấy từ chuỗi.

Lưu trữ trên chuỗi tương đối đắt đỏ, 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. Nhiều giao diện mà trang web trước 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ố 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 theo thời gian thực để lấy dữ liệu liên quan.

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

Phân chia hợp đồng hợp lý, tận 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 đã đượ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 chia thành nhiều hợp đồng để bảo trì thông qua kế thừa.

Ví dụ, hợp đồng NonfungiblePositionManager của Uniswap kế thừa từ nhiều hợp đồng. Khi xem xét việc triển khai hợp đồng ERC721Permit, phát hiện ra rằng nó trực tiếp sử dụng hợp đồng @openzeppelin/contracts/token/ERC721/ERC721.sol. Đ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 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 là phương pháp học tập tốt nhất. Cố gắng tự mình xây dựng một phiên bản đơn giản của sàn giao dịch phi tập trung, sẽ giúp hiểu sâu hơn về mã nguồn của Uniswap và học hỏi được nhiều điểm kiến thức trong các dự án thực tế.

![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])https://img-cdn.gateio.im/webp-social/moments-f95ddc9d89809cf11dbe65b9bafda157.webp(

Xem bản gốc
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Phần thưởng
  • 8
  • Chia sẻ
Bình luận
0/400
SchrodingerWalletvip
· 07-09 09:07
Quá cơ bản rồi, đi đây đi đó~
Xem bản gốcTrả lời0
LiquidityWizardvip
· 07-08 13:06
Chép là xong.
Xem bản gốcTrả lời0
PoolJumpervip
· 07-07 22:21
Hợp đồng chuyên nghiệp cứu mạng
Xem bản gốcTrả lời0
IntrovertMetaversevip
· 07-06 09:37
Lại đến với hợp đồng phái sinh rồi.
Xem bản gốcTrả lời0
SerumSurfervip
· 07-06 09:37
Mã nguồn v3 này sử dụng khá ấn tượng.
Xem bản gốcTrả lời0
FlyingLeekvip
· 07-06 09:36
Có vẻ tốt, mong được chơi đùa với mọi người
Xem bản gốcTrả lời0
LiquidityWhisperervip
· 07-06 09:31
Cuối cùng tôi cũng có thể hiểu mã uniV3.
Xem bản gốcTrả lời0
GateUser-75ee51e7vip
· 07-06 09:10
Mã này có chút thú vị.
Xem bản gốcTrả lời0
  • 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)