Kỹ thuật phát triển hợp đồng thông minh 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 Uniswap V3 và học được nhiều kỹ thuật phát triển hợp đồng thông minh 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 kỹ thuật 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.
Địa chỉ 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ố trường hợp, 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 bể.
Uniswap sử dụng phương thức CREATE2 để tạo hợp đồng, thêm tham số salt để làm cho địa chỉ có thể dự đoán. Logic tạo địa chỉ mới là: hash("0xFF", địa chỉ người tạo, salt, initcode). Phương pháp này cho phép địa chỉ hợp đồng được tính toán trước.
https://img-cdn.gateio.im/webp-social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(
Giải quyết vấn đề độ chính xác của phép toán lớn
Trong Uniswap có nhiều phép toán phức tạp, chẳng hạn như tính toán số lượng Token cần hoán đổi dựa trên giá cả và tính thanh khoản. Để tránh mất độ chính xác trong phép chia, quá trình tính toán thường sử dụng phép toán << FixedPoint96.RESOLUTION, tức là dịch trái 96 bit, tương đương với việc nhân với 2^96.
Dịch chuyển sang bên trái rồi thực hiện phép chia, có thể đảm bảo độ chính xác trong điều kiện giao dịch bình thường 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 toán lợi nhuận theo cách chia sẻ
Uniswap 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 là không thể ghi lại phí cho mỗi nhà cung cấp thanh khoản trong mỗi giao dịch, điều này sẽ tiêu tốn một lượng lớn Gas.
Giải pháp là ghi lại tổng phí giao dịch và phí giao dịch được 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 toán dựa trên thanh khoản nắm giữ, tương tự như cổ tức cổ phiếu.
Phân biệt thông tin trên chuỗi và ngoài chuỗi
Lưu trữ trên chuỗi tương đối đắt đỏ, không phải tất cả thông tin đều cần được lưu trữ trên chuỗi hoặc lấy từ chuỗi. Ví dụ, nhiều giao diện mà front-end của Uniswap gọi là giao diện Web2 truyền thống.
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, định kỳ đồng bộ từ chuỗi. Không cần gọi giao diện RPC theo thời gian thực để lấy dữ liệu liên quan. Tất nhiên, các giao dịch quan trọng vẫn diễn ra trên chuỗi.
Phân tách 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 đã được triển khai thực tế. Ngay cả khi chỉ triển khai một hợp đồng, mã cũng có thể được chia thành nhiều hợp đồng để bảo trì thông qua kế thừa.
Như hợp đồng NonfungiblePositionManager của Uniswap kế thừa nhiều hợp đồng. Trong đó, ERC721Permit trực tiếp sử dụng hợp đồng ERC721 của OpenZeppelin, vừa thuận tiện cho việc quản lý vị trí thông qua NFT, vừa nâng cao hiệu suất phát triển.
Tóm tắt
Tự tay phát triển thì hiệu quả hơn nhiều so với việc chỉ đọc bài viết. Thử nghiệm xây dựng một phiên bản sàn giao dịch phi tập trung đơn giản sẽ giúp bạn hiểu sâu hơn về việc thực hiện mã của Uniswap, học hỏi được những kiến thức thực tế trong dự á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.
21 thích
Phần thưởng
21
7
Chia sẻ
Bình luận
0/400
PoolJumper
· 07-28 02:11
Không có cơ sở hạ tầng để làm gì đó.
Xem bản gốcTrả lời0
OldLeekConfession
· 07-27 04:18
Bạn có thể làm cho tôi hiểu thì đã giỏi lắm rồi...
Xem bản gốcTrả lời0
OnchainGossiper
· 07-27 03:51
Gợi ý thực hành một chút~
Xem bản gốcTrả lời0
BagHolderTillRetire
· 07-25 17:02
Cuối cùng tôi đã tìm thấy lối thoát cho tình trạng mắc bẫy của mình.
Phân tích 7 mẹo phát triển hợp đồng Uniswap nâng cao hiệu suất dự án Tài chính phi tập trung
Kỹ thuật phát triển hợp đồng thông minh 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 Uniswap V3 và học được nhiều kỹ thuật phát triển hợp đồng thông minh 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 kỹ thuật 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.
Địa chỉ 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ố trường hợp, 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 bể.
Uniswap sử dụng phương thức CREATE2 để tạo hợp đồng, thêm tham số salt để làm cho địa chỉ có thể dự đoán. Logic tạo địa chỉ mới là: hash("0xFF", địa chỉ người tạo, salt, initcode). Phương pháp này cho phép địa chỉ hợp đồng được tính toán trước.
https://img-cdn.gateio.im/webp-social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(
Giải quyết vấn đề độ chính xác của phép toán lớn
Trong Uniswap có nhiều phép toán phức tạp, chẳng hạn như tính toán số lượng Token cần hoán đổi dựa trên giá cả và tính thanh khoản. Để tránh mất độ chính xác trong phép chia, quá trình tính toán thường sử dụng phép toán << FixedPoint96.RESOLUTION, tức là dịch trái 96 bit, tương đương với việc nhân với 2^96.
Dịch chuyển sang bên trái rồi thực hiện phép chia, có thể đảm bảo độ chính xác trong điều kiện giao dịch bình thường 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 toán lợi nhuận theo cách chia sẻ
Uniswap 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 là không thể ghi lại phí cho mỗi nhà cung cấp thanh khoản trong mỗi giao dịch, điều này sẽ tiêu tốn một lượng lớn Gas.
Giải pháp là ghi lại tổng phí giao dịch và phí giao dịch được 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 toán dựa trên thanh khoản nắm giữ, tương tự như cổ tức cổ phiếu.
Phân biệt thông tin trên chuỗi và ngoài chuỗi
Lưu trữ trên chuỗi tương đối đắt đỏ, không phải tất cả thông tin đều cần được lưu trữ trên chuỗi hoặc lấy từ chuỗi. Ví dụ, nhiều giao diện mà front-end của Uniswap gọi là giao diện Web2 truyền thống.
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, định kỳ đồng bộ từ chuỗi. Không cần gọi giao diện RPC theo thời gian thực để lấy dữ liệu liên quan. Tất nhiên, các giao dịch quan trọng vẫn diễn ra trên chuỗi.
Phân tách 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 đã được triển khai thực tế. Ngay cả khi chỉ triển khai một hợp đồng, mã cũng có thể được chia thành nhiều hợp đồng để bảo trì thông qua kế thừa.
Như hợp đồng NonfungiblePositionManager của Uniswap kế thừa nhiều hợp đồng. Trong đó, ERC721Permit trực tiếp sử dụng hợp đồng ERC721 của OpenZeppelin, vừa thuận tiện cho việc quản lý vị trí thông qua NFT, vừa nâng cao hiệu suất phát triển.
Tóm tắt
Tự tay phát triển thì hiệu quả hơn nhiều so với việc chỉ đọc bài viết. Thử nghiệm xây dựng một phiên bản sàn giao dịch phi tập trung đơn giản sẽ giúp bạn hiểu sâu hơn về việc thực hiện mã của Uniswap, học hỏi được những kiến thức thực tế trong dự án.