7 mẹo hữu ích để học phát triển hợp đồng DEX chính thống

Chia sẻ mẹo nhỏ phát triển hợp đồng: Kinh nghiệm học được từ Uniswap

Gần đây, khi phát triển dự á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 hữu ích. Với tư cách là một người mới bắt đầu tiếp xúc với phát triển hợp đồng Defi, những mẹo này đã truyền cảm hứng cho tôi, và tôi tin rằng chúng cũng sẽ hữu ích cho những người bạn khác muốn học phát triển hợp đồng thông minh.

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

Địa chỉ 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 vì nó liên quan đến nonce. Nhưng trong một số tình huống, 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ỉ của bể thanh khoản.

Điều này có thể được thực hiện bằng cách sử dụng phương thức CREATE2 để tạo hợp đồng. Cách cụ thể là thêm tham số salt khi tạo hợp đồng:

solidity pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}());

Địa chỉ hợp đồng được tạo ra như vậy là có thể dự đoán, tuân theo logic sau:

Địa chỉ mới = hash("0xFF", địa chỉ người tạo, muối, initcode)

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 hợp lý hàm callback

Trong một số tình huống, việc gọi lẫn nhau giữa các hợp đồng rất hữu ích. Ví dụ, 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.

Khi thực hiện giao dịch bằng cách gọi phương thức swap trong một DEX nào đó, nó sẽ gọi lại swapCallback và truyền vào Token mà tính toán được cần thiết cho giao dịch lần này. Bên gọi phải chuyển Token cần thiết vào bể giao dịch trong callback, thay vì tách biệt phương thức swap. Điều này đảm bảo việc thực thi hoàn chỉnh 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 để đảm bảo tính an toàn.

Sử dụng thông tin truyền qua ngoại lệ

Trong việc ước lượng giao dịch, chúng ta cần mô phỏng phương thức swap, nhưng sẽ không thực sự hoán đổi Token, vì vậy sẽ xảy ra lỗi. Một số DEX thực hiện ước lượng bằng cách 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.

Phương pháp này có vẻ như là một mẹo, nhưng rất thực dụng. Không cần phải cải tạo phương pháp swap để ước lượng nhu cầu, logic đơ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 được từ mã Uniswap

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

Trong mã liên quan đến phép toán, cần tránh mất độ chính xác khi thực hiện phép chia. Một số DEX thường sử dụng "<< FixedPoint96.RESOLUTION" hoạt động, tương đương với việc nhân với 2^96. Sau khi dịch trái rồi thực hiện phép chia, có thể đảm bảo độ chính xác mà không bị tràn.

solidity uint256 numerator1 = uint256(liquidity) << FixedPoint96.RESOLUTION; uint256 numerator2 = sqrtRatioBX96 - sqrtRatioAX96; amount0 = numerator1 * numerator2 / (sqrtRatioBX96 * sqrtRatioAX96);

Mặc dù về lý thuyết vẫn có thể có mất mát độ chính xác, nhưng thường chỉ là mất mát của đơn vị tối thiểu, có thể chấp nhận.

Tính toán lợi nhuận theo phương thức chia sẻ

Đối với việc tính toán thu nhập phí giao dịch cho nhà cung cấp thanh khoản (LP), không thể ghi lại cho mỗi giao dịch, điều này sẽ tiêu tốn rất nhiều Gas. Một số DEX sử dụng cách 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ổ.

Khi rút phí LP, số tiền có thể rút được sẽ được tính dựa trên tính thanh khoản nắm giữ. 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ợi nhuận lịch sử mỗi cổ phiếu và lợi nhuận vào lần rút 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ý phương thức thu thập thông tin

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. Ví dụ, danh sách hồ bơi giao dịch, thông tin, v.v. có thể được lưu trữ trong cơ sở dữ liệu thông thường và đồng bộ định kỳ từ chuỗi.

Một số nhà cung cấp RPC blockchain cung cấp giao diện cao cấp, giúp thu thập dữ liệu nhanh hơn. Tuy nhiên, các giao dịch quan trọng vẫn cần phải được thực hiện trên chuỗi.

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

Một dự án có thể bao gồm nhiều hợp đồng, ngay cả khi thực tế triển khai một hợp đồng duy nhất, cũng có thể được duy trì bằng cách kế thừa và chia tách thành nhiều hợp đồng.

Hợp đồng quản lý vị trí NFT của một DEX đã kế thừa nhiều hợp đồng:

solidity hợp đồng NonfungiblePositionManager là INonfungiblePositionManager, Multicall, PeripheryImmutableState, PoolInitializer, Quản lý thanh khoản, PeripheryValidation, SelfPermit, ERC721Permit {...}

Đồng thời, nó cũng sử dụng hợp đồng tiêu chuẩn ERC721 của OpenZeppelin, vừa thuận tiện cho việc quản lý vị thế, vừa nâng cao hiệu quả phát triển.

Tóm tắt

Tự tay phát triển một phiên bản đơn giản của sàn giao dịch phi tập trung, sẽ giúp bạn hiểu sâu hơn về việc triển khai mã của các dự án trưởng thành, học hỏi được nhiều kiến thức thực tiễn hơn. Hy vọng những mẹo nhỏ này sẽ truyền cảm hứng cho bạn, chúc bạn phát triển thuận lợi!

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

UNI5.42%
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
NFTArchaeologisvip
· 10giờ trước
Việc chép bài mù cũng là một hình thức học tập.
Xem bản gốcTrả lời0
OnlyOnMainnetvip
· 08-05 15:56
Đừng quên thực hành trên Testnet
Xem bản gốcTrả lời0
TokenGuruvip
· 08-05 15:55
Nguồn mã được giải thích rất rõ ràng
Xem bản gốcTrả lời0
BlockchainTherapistvip
· 08-05 15:49
Mẹo hay, rất hữu ích
Xem bản gốcTrả lời0
TaxEvadervip
· 08-05 15:40
CREATE2 thật tuyệt bạn thân
Xem bản gốcTrả lời0
SchroedingerGasvip
· 08-05 15:32
Hôm nay gas rẻ quá
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)