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

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

Mẹo phát triển hợp đồng: kinh nghiệm 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 cách triển khai của Uniswap V3 và học được nhiều điểm thú vị. Là một người mới lần đầu thử nghiệm phát triển hợp đồng Defi, những mẹo này chắc chắn sẽ 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 nhỏ trong phát triển hợp đồng mà 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ỉ hợp đồng được triển khai có vẻ ngẫu nhiên, 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 thông tin giao dịch, chẳng hạn như xác định quyền giao dịch hoặc lấy địa chỉ hồ.

Uniswap đã sử dụng phương pháp CREATE2 để tạo hợp đồng, thêm tham số salt để làm cho địa chỉ có thể dự đoán được. 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 được, rất hữu ích.

Web3 Dành cho người mới: 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 hàm callback một cách khéo léo

Trong Solidity, các hợp đồng có thể gọi lẫn nhau. Trong một số trường hợp, 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, mô hình này rất hữu ích.

Giao dịch swap của Uniswap sử dụng cơ chế callback. Phương thức swap của UniswapV3Pool sẽ gọi lại swapCallback, truyền vào số lượng Token thực tế cần thiết. Bên gọi cần chuyển Token trong callback, đả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 chép 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, sử dụng try catch để bao bọc việc thực hiện phương thức swap của UniswapV3Pool. Điều này nhằm mô phỏng việc swap để ước lượng Token cần thiết cho giao dịch, nhưng trong quá trình ước lượng sẽ không thực hiện trao đổi Token nên sẽ báo lỗi.

Uniswap thông qua việc ném ra lỗi đặc biệt trong hàm callback, sau đó bắt lỗi đó và phân tích thông tin cần thiết 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 đặc biệt cho việc ước tính nhu cầu, logic trở nên đơn giản hơn.

Web3 Người mới series: 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

Mã Uniswap liên quan đến nhiều phép tính, chẳng hạn như tính toán số lượng 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 trong 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 trái 96 bit, tương đương với nhân với 2^96.

Di chuyển sang bên trái rồ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ù lý thuyết vẫn sẽ có một chút mất mát độ chính xác, nhưng đã có thể chấp nhận.

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(. Rõ ràng là không thể ghi lại phí cho mỗi nhà cung cấp thanh khoản trong mỗi giao dịch, điều này sẽ tiêu tốn rất nhiều Gas.

Giải pháp là ghi lại feeGrowthInside0LastX128 và feeGrowthInside1LastX128 trong cấu trúc Position, biểu thị phí phải thu cho mỗi đơn vị thanh khoản khi rút phí lần cuối của mỗi vị trí.

Chỉ cần ghi lại tổng phí giao dịch và phí giao dịch phân bổ cho mỗi đơn vị thanh khoản, phí giao dịch có thể rút khi LP rút tiền có thể được tính toán dựa trên thanh khoản nắm giữ. Tương tự như việc nắm giữ cổ phiếu, khi rút lợi nhuận chỉ cần biết lợi nhuận trên mỗi cổ phiếu trong quá khứ và lợi nhuận tại lần rút trước.

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

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 đỏ, không phải tất cả thông tin đều cần phải lên chuỗi hoặc lấy từ chuỗi. Ví dụ, nhiều giao diện mà frontend của Uniswap gọi là giao diện Web2 truyền thống.

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

Nhiều nhà cung cấp RPC blockchain cũng cung cấp các giao diện nâng cao, cho phép truy cập dữ liệu nhất định nhanh hơn và rẻ hơn. Các 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 chính vẫn được thực hiện trên chuỗi.

Học cách phân tách hợp đồng và sử dụng các 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ỉ triển khai một hợp đồng, mã cũng có thể được duy trì bằng cách chia nhỏ thành nhiều hợp đồng thông qua việc kế thừa.

Ví dụ, hợp đồng NonfungiblePositionManager của Uniswap đã kế thừa từ nhiều hợp đồng khác nhau. Trong đó, hợp đồng ERC721Permit đã sử dụng trực tiếp việc triển khai ERC721 của OpenZeppelin, vừa thuận tiện cho việc quản lý vị trí bằng NFT, vừa nâng cao hiệu suất phát triển.

Tóm tắt

Tự tay 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ề cách Uniswap hoạt động, học hỏi thêm nhiều điểm kiến thức trong các dự án thực tế. Việc học lý thuyết dĩ nhiên là quan trọng, nhưng kinh nghiệm thực hành còn quý giá hơn. Hy vọng những mẹo nhỏ này có thể giúp ích cho bạn trong con đường 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 từ mã Uniswap])https://img-cdn.gateio.im/webp-social/moments-f95ddc9d89809cf11dbe65b9bafda157.webp(

UNI-0.78%
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
GasWastervip
· 07-16 11:49
Học hợp đồng thì phải xem
Xem bản gốcTrả lời0
MissedAirdropAgainvip
· 07-16 07:39
Học hợp đồng không kịp rồi...
Xem bản gốcTrả lời0
YieldWhisperervip
· 07-14 20:20
đã thấy mẫu chính xác này ở dyydx vào năm 2020... thật sự không có gì mới
Xem bản gốcTrả lời0
MEVictimvip
· 07-14 20:18
Những kiến thức này có thật sự hữu ích không?
Xem bản gốcTrả lời0
VitaliksTwinvip
· 07-14 20:14
Có chút gì đó, cũng khá thực tế.
Xem bản gốcTrả lời0
ForkLibertarianvip
· 07-14 20:13
Uniswap lại có trò mới?
Xem bản gốcTrả lời0
QuorumVotervip
· 07-14 20:00
Viết rất tốt, đã sắp xếp để học.
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)