Gần đây, khi tham gia vào một 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 kỹ năng phát triển hợp đồng hữu ích. Là một nhà phát triển trước đây chủ yếu phát triển hợp đồng NFT, đây là lần đầu tiên tôi thử nghiệm phát triển hợp đồng Defi. Ở đây, tôi xin chia sẻ một số mẹo nhỏ có thể hữu ích cho các nhà phát triển mới.
Địa chỉ hợp đồng có thể dự đoán
Địa chỉ hợp đồng thường được triển khai có vẻ ngẫu nhiên, vì liên quan đến nonce. Nhưng trong một số tình huống, chúng ta cần suy luận ra địa chỉ hợp đồng thông qua thông tin giao dịch, đ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ỉ pool.
Một phương pháp là sử dụng CREATE2 để tạo hợp đồng, bằng cách thêm tham số salt để làm cho địa chỉ được tạo ra có thể dự đoán. Công thức tính địa chỉ mới là:
Địa chỉ mới = hash("0xFF", địa chỉ người tạo, muối, initcode)
Sử dụng hàm callback một cách khéo léo
Hợp đồng trong Solidity có thể gọi lẫn nhau. Trong một số tình huống, 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, mô hình này rất hữu ích.
Ví dụ, khi giao dịch trên một DEX nhất định, phương thức swap của hợp đồng pool sẽ gọi lại swapCallback, chuyể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, chứ không chia nhỏ swap thành nhiều bước gọi. Điều này đảm bảo tính toàn vẹn và an toàn của phương thức swap.
Truyền thông tin bằng ngoại lệ
Trong mã của một DEX, sử dụng try-catch để bao bọc phương thức swap của hợp đồng pool để mô phỏng giao dịch và ước tính Token cần thiết. Vì trong quá trình ước tính sẽ không thực hiện việc trao đổi Token, nó sẽ ném ra lỗi. Bằng cách ném ra lỗi đặc biệt trong callback, sau đó bắt và phân tích thông tin lỗi, bạn có thể nhận được kết quả ước tính.
Kỹ thuật này tránh việc phải cải tiến phương pháp swap để ước lượng nhu cầu, giữ cho logic được đơn giản.
Vấn đề độ chính xác trong xử lý số lớn
Khi liên quan đến việc tính toán giá cả và tính thanh khoản, để tránh việc mất độ chính xác khi thực hiện phép chia, có thể dịch chuyển sang trái 96 bit ( tương đương với việc nhân với 2^96) rồi thực hiện phép toán. Như vậy, trong trường hợp giao dịch bình thường không bị tràn, có thể đảm bảo độ chính xác.
Tính toán lợi nhuận theo chế độ Chia sẻ
Khi ghi lại lợi nhuận phí giao dịch LP, không thể ghi lại cho từng LP trong mỗi giao dịch, điều này sẽ tiêu tốn rất nhiều Gas. Một giải pháp là ghi lại tổng phí giao dịch và phí giao dịch nên phân bổ cho mỗi đơn vị 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 nắm giữ, tương tự như cổ tức cổ phiếu.
Kết hợp dữ liệu trên chuỗi và ngoài chuỗi
Không phải tất cả thông tin đều cần được đưa lên chuỗi hoặc lấy từ chuỗi. Ví dụ như danh sách giao dịch, thông tin hồ bơi có thể được lưu trữ trong cơ sở dữ liệu thông thường và đồng bộ định kỳ từ chuỗi. Điều này có thể cải thiện hiệu suất và hiệu quả. Tất nhiên, các giao dịch quan trọng vẫn cần được thực hiện trên chuỗi.
Phân tách và tái sử dụng hợp đồng
Các dự án lớ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, nó cũng có thể được chia thành nhiều hợp đồng thông qua kế thừa để dễ bảo trì. Đồng thời, việc học cách sử dụng các hợp đồng tiêu chuẩn hiện có như ERC721 có thể nâng cao hiệu suất phát triển.
Thực hành là cách học tốt nhất. Bằng cách thực hiện một phiên bản DEX đơn giản, có thể hiểu sâu hơn về mã nguồn của một số dự án phức tạp, học hỏi được nhiều kiến thức thực tế trong các dự án. Hy vọng những mẹo nhỏ này có thể giúp ích cho những người mới muốn học phát triển hợp đồng.
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.
Bảy kỹ thuật cần thiết cho phát triển hợp đồng DEX Người mới phải đọc
Chia sẻ mẹo nhỏ phát triển hợp đồng
Gần đây, khi tham gia vào một 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 kỹ năng phát triển hợp đồng hữu ích. Là một nhà phát triển trước đây chủ yếu phát triển hợp đồng NFT, đây là lần đầu tiên tôi thử nghiệm phát triển hợp đồng Defi. Ở đây, tôi xin chia sẻ một số mẹo nhỏ có thể hữu ích cho các nhà phát triển mới.
Địa chỉ hợp đồng có thể dự đoán
Địa chỉ hợp đồng thường được triển khai có vẻ ngẫu nhiên, vì liên quan đến nonce. Nhưng trong một số tình huống, chúng ta cần suy luận ra địa chỉ hợp đồng thông qua thông tin giao dịch, đ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ỉ pool.
Một phương pháp là sử dụng CREATE2 để tạo hợp đồng, bằng cách thêm tham số salt để làm cho địa chỉ được tạo ra có thể dự đoán. Công thức tính địa chỉ mới là:
Địa chỉ mới = hash("0xFF", địa chỉ người tạo, muối, initcode)
Sử dụng hàm callback một cách khéo léo
Hợp đồng trong Solidity có thể gọi lẫn nhau. Trong một số tình huống, 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, mô hình này rất hữu ích.
Ví dụ, khi giao dịch trên một DEX nhất định, phương thức swap của hợp đồng pool sẽ gọi lại swapCallback, chuyể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, chứ không chia nhỏ swap thành nhiều bước gọi. Điều này đảm bảo tính toàn vẹn và an toàn của phương thức swap.
Truyền thông tin bằng ngoại lệ
Trong mã của một DEX, sử dụng try-catch để bao bọc phương thức swap của hợp đồng pool để mô phỏng giao dịch và ước tính Token cần thiết. Vì trong quá trình ước tính sẽ không thực hiện việc trao đổi Token, nó sẽ ném ra lỗi. Bằng cách ném ra lỗi đặc biệt trong callback, sau đó bắt và phân tích thông tin lỗi, bạn có thể nhận được kết quả ước tính.
Kỹ thuật này tránh việc phải cải tiến phương pháp swap để ước lượng nhu cầu, giữ cho logic được đơn giản.
Vấn đề độ chính xác trong xử lý số lớn
Khi liên quan đến việc tính toán giá cả và tính thanh khoản, để tránh việc mất độ chính xác khi thực hiện phép chia, có thể dịch chuyển sang trái 96 bit ( tương đương với việc nhân với 2^96) rồi thực hiện phép toán. Như vậy, trong trường hợp giao dịch bình thường không bị tràn, có thể đảm bảo độ chính xác.
Tính toán lợi nhuận theo chế độ Chia sẻ
Khi ghi lại lợi nhuận phí giao dịch LP, không thể ghi lại cho từng LP trong mỗi giao dịch, điều này sẽ tiêu tốn rất nhiều Gas. Một giải pháp là ghi lại tổng phí giao dịch và phí giao dịch nên phân bổ cho mỗi đơn vị 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 nắm giữ, tương tự như cổ tức cổ phiếu.
Kết hợp dữ liệu trên chuỗi và ngoài chuỗi
Không phải tất cả thông tin đều cần được đưa lên chuỗi hoặc lấy từ chuỗi. Ví dụ như danh sách giao dịch, thông tin hồ bơi có thể được lưu trữ trong cơ sở dữ liệu thông thường và đồng bộ định kỳ từ chuỗi. Điều này có thể cải thiện hiệu suất và hiệu quả. Tất nhiên, các giao dịch quan trọng vẫn cần được thực hiện trên chuỗi.
Phân tách và tái sử dụng hợp đồng
Các dự án lớ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, nó cũng có thể được chia thành nhiều hợp đồng thông qua kế thừa để dễ bảo trì. Đồng thời, việc học cách sử dụng các hợp đồng tiêu chuẩn hiện có như ERC721 có thể nâng cao hiệu suất phát triển.
Thực hành là cách học tốt nhất. Bằng cách thực hiện một phiên bản DEX đơn giản, có thể hiểu sâu hơn về mã nguồn của một số dự án phức tạp, học hỏi được nhiều kiến thức thực tế trong các dự án. Hy vọng những mẹo nhỏ này có thể giúp ích cho những người mới muốn học phát triển hợp đồng.