7 kỹ năng phát triển hợp đồng lớn: Học hỏi những thực tiễn tốt nhất của DeFi từ mã DEX

Những mẹo tuyệt vời trong 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 mã nguồn của một DEX nổi tiếng và đã học được nhiều kiến thức mới. Là một nhà phát triển đã từng phát triển hợp đồng NFT đơn giản, đây là lần đầu tiên tôi thử nghiệm phát triển hợp đồng Defi, tôi tin rằng những mẹo nhỏ 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 nhau xem qua những mẹo thú vị này, có những mẹo thậm chí có thể được gọi là kỳ diệu.

Chuỗi Web3 cho người mới: 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 có thể dự đoán

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

Bạn có thể sử dụng phương thức CREATE2 để tạo hợp đồng bằng cách thêm tham số salt, địa chỉ hợp đồng được tạo ra sẽ có thể dự đoán được. Logic tạo địa chỉ là: Địa chỉ mới = hash("0xFF", địa chỉ người tạo, salt, initcode).

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

Sử dụng hàm callback một cách hiệu quả

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

Ví dụ, khi bạn gọi phương thức swap của một hợp đồng DEX để giao dịch, nó sẽ gọi lại swapCallback, truyền vào Token thực sự cần thiết cho giao dịch lần này. Bên gọi cần chuyển Token cần thiết cho giao dịch vào hợp đồng DEX trong hàm gọi lại, 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 thi đầy đủ, không cần ghi chép biến phức tạp để đảm bảo an toàn.

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 mã của một số DEX, chúng tôi phát hiện ra rằng nó đã bao bọc phương thức swap bằng try catch để thực hiện. Tại sao lại như vậy? Bởi vì chúng tôi cần mô phỏng phương thứ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 sự xảy ra việc trao đổi Token, vì vậy sẽ báo lỗi. Nó 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 này và phân tích thông tin cần thiết từ thông điệp lỗi.

Điều này có vẻ hơi khéo léo, nhưng rất thực dụng. Như vậy, không cần phải cải biến phương pháp swap cho nhu cầu giao dịch ước tính, 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 được từ mã Uniswap

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

Trong mã DEX, 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. Trong quá trình này, chúng ta cần tránh mất độ chính xác khi thực hiện phép chia. Trong một số triển khai, quá trình tính toán thường sử dụng phép toán "<< FixedPoint96.RESOLUTION", nó đại diện cho việc 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, điều này 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 toán bằng uint256, đủ cho trường hợp ).

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

Trong DEX, chúng ta 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, không thể ghi lại phí của từng LP trong mỗi giao dịch, điều này sẽ tiêu tốn một lượng lớn Gas. Vậy chúng ta nên xử lý như thế nào?

Có thể định nghĩa một cấu trúc chứa feeGrowthInside0LastX128 và feeGrowthInside1LastX128 trong Position, chúng ghi lại phí giao dịch mà mỗi thanh khoản nên nhận được khi rút phí lần cuối từ mỗi vị trí.

Nói một cách đơn giản, chỉ cần ghi lại tổng phí giao dịch và phí giao dịch cần phân bổ cho mỗi thanh khoản. Khi LP rút phí giao dịch, có thể tính toán phí giao dịch có thể 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ủa một công ty, khi rút lợi nhuận cổ phiếu 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 bạn đã rút lần trước.

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

Không phải mọi thông tin đều cần được lấy từ chuỗi.

Lưu trữ trên chuỗi tương đối đắt đỏ, vì vậy không phải mọi 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à các trang web DEX 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 có thể được lưu trữ trong cơ sở dữ liệu thông thường, một số có thể cần đồng bộ định kỳ từ chuỗi, nhưng không cần gọi giao diện RPC do chuỗi hoặc dịch vụ nút cung cấp để lấy dữ liệu liên quan.

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

Học cách phân tách hợp đồng, 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ế, chúng ta cũng có thể chia hợp đồng thành nhiều hợp đồng khác nhau thông qua phương thức kế thừa để bảo trì.

Ngoài ra, bạn có thể sử dụng trực tiếp các hợp đồng tiêu chuẩn như @openzeppelin/contracts/token/ERC721/ERC721.sol. Cách này vừa có thể quản lý vị thế thông qua NFT, vừa có thể nâng cao hiệu quả phát triển bằng các hợp đồng tiêu chuẩn có sẵn.

Tóm tắt

Thực hành phát triển một sàn giao dịch phi tập trung phiên bản đơn giản sẽ giúp bạn hiểu sâu hơn về việc triển khai mã của DEX, cũng như học hỏi thêm nhiều kiến thức thực tiễn trong các dự án. Dù bạn quan tâm đến phát triển các dự án Web3 hay DeFi, kinh nghiệm thực chiến sẽ rất hữu ích cho bạ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 được từ mã Uniswap])https://img-cdn.gateio.im/webp-social/moments-f95ddc9d89809cf11dbe65b9bafda157.webp(

DEFI0.9%
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
  • 6
  • Chia sẻ
Bình luận
0/400
rekt_but_resilientvip
· 07-31 11:05
Địa chỉ hợp đồng thật tuyệt vời!
Xem bản gốcTrả lời0
AltcoinMarathonervip
· 07-31 06:49
Đi sâu vào hợp đồng thông minh
Xem bản gốcTrả lời0
ZkSnarkervip
· 07-31 03:30
Đáng để nghiên cứu một phen
Xem bản gốcTrả lời0
LiquidityNinjavip
· 07-28 11:40
Học được đồ mới rồi
Xem bản gốcTrả lời0
OldLeekNewSicklevip
· 07-28 11:40
Mã là tiền à
Xem bản gốcTrả lời0
WhaleWatchervip
· 07-28 11:38
Chi tiết được nói rất đúng chỗ
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)