Gần đây, khi phát triển một 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 kỹ năng phát triển hợp đồng hữu ích. Là một người mới bắt đầu tiếp cận phát triển hợp đồng Defi, những kỹ năng này đã mang lại cho tôi nhiều cảm hứng, tôi tin rằ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.
Địa chỉ hợp đồng có thể dự đoán
Thông thường, địa chỉ hợp đồng triển khai có vẻ ngẫu nhiên và 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 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 pool.
Điều này có thể được thực hiện bằng cách sử dụng phương pháp 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 theo cách này là có thể dự đoán, logic sinh ra là:
Địa chỉ mới = hash("0xFF", địa chỉ người tạo, salt, initcode)
Sử dụng 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 là rất hữu ích. Chẳng hạn, A gọi phương thức của B, và B trong phương thức được gọi sẽ gọi lại A.
Lấy giao dịch làm ví dụ, khi gọi phương thức swap của hợp đồng pool, nó sẽ gọi lại swapCallback, truyền vào số lượng Token thực tế cần thiết được tính toán. Bên gọi phải chuyển Token vào hợp đồng pool trong callback, điều này đảm bảo việc thực hiện đầy đủ và an toàn của phương thức swap, không cần ghi lại các biến phức tạp.
Sử dụng ngoại lệ để truyền thông tin
Khi ước tính giao dịch, chúng ta cần mô phỏng phương pháp swap nhưng không thực sự hoán đổi Token. Có thể 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 từ đó.
Phương pháp này có vẻ là mánh khóe, nhưng rất thực tế. Không cần phải cải tiến phương pháp swap đặc biệt cho giao dịch ước lượng, logic đơn giản hơn.
Giải quyết vấn đề độ chính xác của số lớn
Trong việc tính toán giá cả và thanh khoản, để tránh mất độ chính xác trong các phép chia, có thể sử dụng phép dịch trái ( tương đương với nhân với 2^96).
Điều này có thể đảm bảo độ chính xác trong giao dịch bình thường mà không bị tràn. Mặc dù về lý thuyết vẫn có một chút mất mát độ chính xác, nhưng đã có thể chấp nhận.
Tính lợi nhuận theo cách chia sẻ
Để tránh việc ghi lại phí giao dịch cho tất cả LP mỗi lần giao dịch, có thể sử dụng phương thức Share.
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 tiền, phí giao dịch có thể rút được sẽ được tính dựa trên thanh khoản đang nắm giữ, tương tự như cổ tức cổ phiếu.
Sử dụng dữ liệu ngoài chuỗi một cách hợp lý
Không phải tất cả thông tin đều cần được ghi lại trên chuỗi hoặc lấy từ chuỗi. Ví dụ, danh sách hồ bơi giao dịch, thông tin cơ bản, v.v. có thể được lưu trữ trong cơ sở dữ liệu thông thường và đồng bộ định kỳ.
Một số giao diện RPC nâng cao cũng cung cấp cách lấy dữ liệu tối ưu hóa bộ nhớ đệm, có thể cải thiện hiệu suất và hiệu quả.
Phân chia và tái sử dụng hợp đồng
Các dự án lớn có thể được chia thành nhiều hợp đồng triển khai thực tế, hoặc được chia thành nhiều hợp đồng bảo trì thông qua kế thừa.
Đồng thời, có thể tái sử dụng các hợp đồng tiêu chuẩn hiện có như ERC721, nâng cao hiệu quả phát triển. Ví dụ:
solidity
hợp đồng NonfungiblePositionManager là
INonfungiblePositionManager,
PeripheryImmutableState,
PoolInitializer,
Quản lý thanh khoản,
PeripheryValidation,
Multicall,
ERC721Permit,
PeripheryPayments,
NFTDescriptor
{
// ...
}
Học cách triển khai mã của các dự án xuất sắc và cố gắng tự tay phát triển sẽ giúp bạn hiểu sâu hơn về sàn giao dịch phi tập trung. Hy vọng những mẹo nhỏ này sẽ hữu ích cho việc phát triển hợp đồng của bạn!
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.
7 mẹo phát triển hợp đồng hữu ích hỗ trợ dự án DEX
Tổng hợp mẹo phát triển hợp đồng
Gần đây, khi phát triển một 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 kỹ năng phát triển hợp đồng hữu ích. Là một người mới bắt đầu tiếp cận phát triển hợp đồng Defi, những kỹ năng này đã mang lại cho tôi nhiều cảm hứng, tôi tin rằ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.
Địa chỉ hợp đồng có thể dự đoán
Thông thường, địa chỉ hợp đồng triển khai có vẻ ngẫu nhiên và 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 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 pool.
Điều này có thể được thực hiện bằng cách sử dụng phương pháp 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 theo cách này là có thể dự đoán, logic sinh ra là:
Địa chỉ mới = hash("0xFF", địa chỉ người tạo, salt, initcode)
Sử dụng 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 là rất hữu ích. Chẳng hạn, A gọi phương thức của B, và B trong phương thức được gọi sẽ gọi lại A.
Lấy giao dịch làm ví dụ, khi gọi phương thức swap của hợp đồng pool, nó sẽ gọi lại swapCallback, truyền vào số lượng Token thực tế cần thiết được tính toán. Bên gọi phải chuyển Token vào hợp đồng pool trong callback, điều này đảm bảo việc thực hiện đầy đủ và an toàn của phương thức swap, không cần ghi lại các biến phức tạp.
Sử dụng ngoại lệ để truyền thông tin
Khi ước tính giao dịch, chúng ta cần mô phỏng phương pháp swap nhưng không thực sự hoán đổi Token. Có thể 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 từ đó.
Phương pháp này có vẻ là mánh khóe, nhưng rất thực tế. Không cần phải cải tiến phương pháp swap đặc biệt cho giao dịch ước lượng, logic đơn giản hơn.
Giải quyết vấn đề độ chính xác của số lớn
Trong việc tính toán giá cả và thanh khoản, để tránh mất độ chính xác trong các phép chia, có thể sử dụng phép dịch trái ( tương đương với nhân với 2^96).
Ví dụ:
solidity numerator1 = FullMath.mulDiv(liquidity << FixedPoint96.RESOLUTION, sqrtRatioBX96 - sqrtRatioAX96, sqrtRatioBX96);
Điều này có thể đảm bảo độ chính xác trong giao dịch bình thường mà không bị tràn. Mặc dù về lý thuyết vẫn có một chút mất mát độ chính xác, nhưng đã có thể chấp nhận.
Tính lợi nhuận theo cách chia sẻ
Để tránh việc ghi lại phí giao dịch cho tất cả LP mỗi lần giao dịch, có thể sử dụng phương thức Share.
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 tiền, phí giao dịch có thể rút được sẽ được tính dựa trên thanh khoản đang nắm giữ, tương tự như cổ tức cổ phiếu.
Sử dụng dữ liệu ngoài chuỗi một cách hợp lý
Không phải tất cả thông tin đều cần được ghi lại trên chuỗi hoặc lấy từ chuỗi. Ví dụ, danh sách hồ bơi giao dịch, thông tin cơ bản, v.v. có thể được lưu trữ trong cơ sở dữ liệu thông thường và đồng bộ định kỳ.
Một số giao diện RPC nâng cao cũng cung cấp cách lấy dữ liệu tối ưu hóa bộ nhớ đệm, có thể cải thiện hiệu suất và hiệu quả.
Phân chia và tái sử dụng hợp đồng
Các dự án lớn có thể được chia thành nhiều hợp đồng triển khai thực tế, hoặc được chia thành nhiều hợp đồng bảo trì thông qua kế thừa.
Đồng thời, có thể tái sử dụng các hợp đồng tiêu chuẩn hiện có như ERC721, nâng cao hiệu quả phát triển. Ví dụ:
solidity hợp đồng NonfungiblePositionManager là INonfungiblePositionManager, PeripheryImmutableState, PoolInitializer, Quản lý thanh khoản, PeripheryValidation, Multicall, ERC721Permit, PeripheryPayments, NFTDescriptor { // ... }
Học cách triển khai mã của các dự án xuất sắc và cố gắng tự tay phát triển sẽ giúp bạn hiểu sâu hơn về sàn giao dịch phi tập trung. Hy vọng những mẹo nhỏ này sẽ hữu ích cho việc phát triển hợp đồng của bạn!