Gần đây tôi đã nghiên cứu quá trình phát triển sàn giao dịch phi tập trung, tham khảo một số mã nguồn của các dự án nổi tiếng và học được nhiều kiến thức thú vị. Là một nhà phát triển lần đầu tiên thử nghiệm phát triển hợp đồng Defi, những mẹo nhỏ này rất hữu ích cho những người mới muốn học phát triển hợp đồng.
Hãy cùng nhau xem những mẹo khéo léo này, có những mẹo thậm chí có thể được gọi là kỳ diệu.
địa chỉ triển khai hợp đồng có thể dự đoán
Thông thường, địa chỉ của 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 tương đương, chẳng hạn như xác định quyền giao dịch hoặc lấy địa chỉ của pool.
Một phương pháp là sử dụng CREATE2 để tạo hợp đồng, thêm tham số salt: 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 tạo ra là địa chỉ mới = hash("0xFF", địa chỉ người tạo, salt, initcode).
Sử dụng khéo léo hàm callback
Hợp đồng trong Solidity có thể gọi nhau. Một mô hình là A gọi phương thức của B, và B trong phương thức được gọi lại gọi A, điều này rất hữu ích trong một số tình huống.
Ví dụ, khi gọi phương thức swap của hợp đồng UniswapV3Pool để thực hiện giao dịch, nó sẽ gọi lại swapCallback, truyền vào Token thực tế cần thiết cho giao dịch này. Bên gọi cần chuyển Token cần thiết cho giao dịch vào UniswapV3Pool trong callback, thay vì tách phương thức swap thành hai phần. Điều này đảm bảo tính an toàn và thực thi đầy đủ của phương thức swap, mà 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, sử dụng try catch để thực hiện ước lượng giao dịch
Trong một số hợp đồng, việc thực hiện ước lượng giao dịch thông qua việc ném ra lỗi đặc biệt trong hàm gọi lại giao dịch, sau đó bắt lỗi đó và phân tích thông tin cần thiết từ thông báo lỗi, thực sự là một phương pháp hữu ích. Phương pháp này có vẻ như là một mẹo, nhưng rất thực tiễn, không cần phải cải tạo phương pháp swap cho nhu cầu ước lượng giao dịch, và logic đơn giản hơn.
Giải quyết vấn đề độ chính xác của số lớn
Trong các tình huống liên quan đến tính toán lớn, chẳng hạn như tính toán token trao đổi theo giá hiện tại và tính thanh khoản, cần tránh mất độ chính xác do phép chia. Một phương pháp là sử dụng phép dịch trái, chẳng hạn như << FixedPoint96.RESOLUTION, tương đương với nhân với 2^96. Sau khi dịch trái, thực hiện phép chia, đảm bảo độ chính xác trong trường hợp giao dịch bình thường không bị tràn.
Tính toán lợi nhuận theo phương thức chia sẻ
Đối với các tình huống cần ghi lại lợi nhuận phí giao dịch của nhà cung cấp thanh khoản LP(, không thể ghi lại phí cho mỗi 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 mà mỗi nhà cung cấp thanh khoản nên được phân bổ. Khi nhà cung cấp thanh khoản rút phí giao dịch, phí có thể rút được sẽ được tính dựa trên thanh khoản mà họ nắm giữ. Điều này tương tự như cơ chế rút cổ tức của cổ đô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 từ mã Uniswap])https://img-cdn.gateio.im/webp-social/moments-45e66af69435e6d4412ae506e77ab893.webp(
) Cân bằng thông tin trên chuỗi và ngoài chuỗi
Không phải tất cả thông tin đều cần lấy từ chuỗi. Lưu trữ trên chuỗi tương đối tốn kém, nhiều thông tin có thể được lưu trữ trong cơ sở dữ liệu truyền thống, chẳng hạn như danh sách hồ bơi giao dịch, thông tin hồ bơi giao dịch, v.v. Những dữ liệu này có thể được đồng bộ định kỳ từ chuỗi, không cần gọi giao diện RPC của chuỗi hoặc dịch vụ nút theo thời gian thực.
Một số nhà cung cấp RPC blockchain cung cấp giao diện cao cấp, có thể nhanh hơn và tiết kiệm chi phí hơn để lấy một số dữ liệu. Những giao diện này thường sử dụng bộ nhớ cache để cải thiện hiệu suất và hiệu quả.
Chia hợp đồng và sử dụng hợp đồng tiêu chuẩn
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ế, mã cũng có thể được chia thành nhiều hợp đồng để bảo trì thông qua cách kế thừa.
Ngoài ra, việc sử dụng các hợp đồng tiêu chuẩn đã có, như ERC721, có thể nâng cao hiệu quả phát triển hợp đồng. Điều này không chỉ thuận tiện cho việc quản lý mà còn có thể sử dụng các tiêu chuẩn đã trưởng thành để tăng tốc độ và độ an toàn trong phát triển.
Tóm tắt
Việc thực hành phát triển thực tế là cách hiệu quả nhất để học lập trình hợp đồng. Thử nghiệm xây dựng một 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 triển khai mã của các dự án nổi tiếng, đồng thời cũng học hỏi được nhiều kiến thức thực tế trong các dự án. Thực hành, tôi tin rằng sẽ có ích cho bạn.
![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-f95ddc9d89809cf11dbe65b9bafda157.webp(
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.
12 thích
Phần thưởng
12
3
Đăng lại
Chia sẻ
Bình luận
0/400
Blockwatcher9000
· 6giờ trước
Nói một cách dễ nghe thì đó là kỹ thuật, thực tế đều là những thao tác tinh vi khác nhau.
Xem bản gốcTrả lời0
OnChainDetective
· 6giờ trước
Nghiên cứu việc triển khai create2 đã lâu rồi. Chiêu thức này không phải là để chôn bom ngầm sao... những ai hiểu thì sẽ hiểu.
Xem bản gốcTrả lời0
ContractExplorer
· 6giờ trước
Phát hiện một lỗ hổng mới thật là thích thú, đang chạy đua với lỗ hổng.
7 mẹo hữu ích giúp bạn nắm vững phát triển hợp đồng thông minh
Mẹo hay trong phát triển hợp đồng
Gần đây tôi đã nghiên cứu quá trình phát triển sàn giao dịch phi tập trung, tham khảo một số mã nguồn của các dự án nổi tiếng và học được nhiều kiến thức thú vị. Là một nhà phát triển lần đầu tiên thử nghiệm phát triển hợp đồng Defi, những mẹo nhỏ này rất hữu ích cho những người mới muốn học phát triển hợp đồng.
Hãy cùng nhau xem những mẹo khéo léo này, có những mẹo thậm chí có thể được gọi là kỳ diệu.
địa chỉ triển khai hợp đồng có thể dự đoán
Thông thường, địa chỉ của 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 tương đương, chẳng hạn như xác định quyền giao dịch hoặc lấy địa chỉ của pool.
Một phương pháp là sử dụng CREATE2 để tạo hợp đồng, thêm tham số salt: 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 tạo ra là địa chỉ mới = hash("0xFF", địa chỉ người tạo, salt, initcode).
Sử dụng khéo léo hàm callback
Hợp đồng trong Solidity có thể gọi nhau. Một mô hình là A gọi phương thức của B, và B trong phương thức được gọi lại gọi A, điều này rất hữu ích trong một số tình huống.
Ví dụ, khi gọi phương thức swap của hợp đồng UniswapV3Pool để thực hiện giao dịch, nó sẽ gọi lại swapCallback, truyền vào Token thực tế cần thiết cho giao dịch này. Bên gọi cần chuyển Token cần thiết cho giao dịch vào UniswapV3Pool trong callback, thay vì tách phương thức swap thành hai phần. Điều này đảm bảo tính an toàn và thực thi đầy đủ của phương thức swap, mà 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, sử dụng try catch để thực hiện ước lượng giao dịch
Trong một số hợp đồng, việc thực hiện ước lượng giao dịch thông qua việc ném ra lỗi đặc biệt trong hàm gọi lại giao dịch, sau đó bắt lỗi đó và phân tích thông tin cần thiết từ thông báo lỗi, thực sự là một phương pháp hữu ích. Phương pháp này có vẻ như là một mẹo, nhưng rất thực tiễn, không cần phải cải tạo phương pháp swap cho nhu cầu ước lượng giao dịch, và logic đơn giản hơn.
Giải quyết vấn đề độ chính xác của số lớn
Trong các tình huống liên quan đến tính toán lớn, chẳng hạn như tính toán token trao đổi theo giá hiện tại và tính thanh khoản, cần tránh mất độ chính xác do phép chia. Một phương pháp là sử dụng phép dịch trái, chẳng hạn như << FixedPoint96.RESOLUTION, tương đương với nhân với 2^96. Sau khi dịch trái, thực hiện phép chia, đảm bảo độ chính xác trong trường hợp giao dịch bình thường không bị tràn.
Tính toán lợi nhuận theo phương thức chia sẻ
Đối với các tình huống cần ghi lại lợi nhuận phí giao dịch của nhà cung cấp thanh khoản LP(, không thể ghi lại phí cho mỗi 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 mà mỗi nhà cung cấp thanh khoản nên được phân bổ. Khi nhà cung cấp thanh khoản rút phí giao dịch, phí có thể rút được sẽ được tính dựa trên thanh khoản mà họ nắm giữ. Điều này tương tự như cơ chế rút cổ tức của cổ đô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 từ mã Uniswap])https://img-cdn.gateio.im/webp-social/moments-45e66af69435e6d4412ae506e77ab893.webp(
) Cân bằng thông tin trên chuỗi và ngoài chuỗi
Không phải tất cả thông tin đều cần lấy từ chuỗi. Lưu trữ trên chuỗi tương đối tốn kém, nhiều thông tin có thể được lưu trữ trong cơ sở dữ liệu truyền thống, chẳng hạn như danh sách hồ bơi giao dịch, thông tin hồ bơi giao dịch, v.v. Những dữ liệu này có thể được đồng bộ định kỳ từ chuỗi, không cần gọi giao diện RPC của chuỗi hoặc dịch vụ nút theo thời gian thực.
Một số nhà cung cấp RPC blockchain cung cấp giao diện cao cấp, có thể nhanh hơn và tiết kiệm chi phí hơn để lấy một số dữ liệu. Những giao diện này thường sử dụng bộ nhớ cache để cải thiện hiệu suất và hiệu quả.
Chia hợp đồng và sử dụng hợp đồng tiêu chuẩn
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ế, mã cũng có thể được chia thành nhiều hợp đồng để bảo trì thông qua cách kế thừa.
Ngoài ra, việc sử dụng các hợp đồng tiêu chuẩn đã có, như ERC721, có thể nâng cao hiệu quả phát triển hợp đồng. Điều này không chỉ thuận tiện cho việc quản lý mà còn có thể sử dụng các tiêu chuẩn đã trưởng thành để tăng tốc độ và độ an toàn trong phát triển.
Tóm tắt
Việc thực hành phát triển thực tế là cách hiệu quả nhất để học lập trình hợp đồng. Thử nghiệm xây dựng một 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 triển khai mã của các dự án nổi tiếng, đồng thời cũng học hỏi được nhiều kiến thức thực tế trong các dự án. Thực hành, tôi tin rằng sẽ có ích cho bạn.
![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-f95ddc9d89809cf11dbe65b9bafda157.webp(