​SharkTeam: Các biện pháp bảo mật tốt nhất cho UniswapV4 Hook
SharkTeam
2023-08-08 03:59
本文约5316字,阅读全文需要约21分钟
​Mới đây, Uniswap Lab đã chính thức công bố tiến độ phát triển của AMM Uniswap V4 thế hệ tiếp theo, đồng thời phát hành sách trắng và kho mã. Lần này, sách trắng của V4 chỉ có 3 trang, nguyên nhân là do V4 không thực hiện quá nhiều thay đổi đối với logic thuật toán cốt lõi của AMM mà bổ sung thêm mộ

danh hiệu cấp một

tiêu đề phụ


1.1 AMM

Ở cấp độ thuật toán AMM, Uniswap V4 không sửa đổi V3 và vẫn sử dụng thuật toán thanh khoản dựa trên sản phẩm không đổi x*y=k.

Trong Uniswap V3, mỗi cặp giao dịch có thể có 4 nhóm (ban đầu là 3 và một nhóm 1 bp mới được thêm vào sau đó), đại diện cho các nhóm có tỷ lệ lần lượt là 0,01%, 0,05%, 0,3% và 1%. cũng khác nhau Khi tạo một nhóm, chỉ có thể chọn một trong bốn loại này.

Trong Uniswap V4, về mặt lý thuyết, mỗi cặp giao dịch có thể có số lượng nhóm bất kỳ và mức phí của mỗi nhóm cũng có thể là bất kỳ giá trị nào và không gian đánh dấu của các nhóm này cũng có thể là bất kỳ giá trị nào.

tiêu đề phụ

1.2 Hooks

Hook là một tập hợp các hợp đồng được phát triển bởi bên thứ ba hoặc chính thức của Uniswap. Khi tạo một pool, pool có thể chọn liên kết một hook. Sau đó, ở một giai đoạn cụ thể của giao dịch, pool sẽ tự động gọi hợp đồng Hook bị ràng buộc. Uniswap V4 xác định các giai đoạn sau trong đó mã hợp đồng hook có thể được thực thi:


  • beforeInitialize

  • afterInitialize

  • beforeModifyPosition

  • afterModifyPosition

  • beforeSwap

  • afterSwap

  • beforeDonate

  • afterDonate


Điều đó có nghĩa là hợp đồng hook có thể được gọi trước và sau các hoạt động như khởi tạo nhóm, thêm/xóa thanh khoản, giao dịch và quyên góp.

Hợp đồng Hook cần chỉ định rõ ràng giai đoạn nào sẽ thực hiện trong các giai đoạn trên và pool cần biết liệu Hook tương ứng có cần được thực thi ở một giai đoạn nhất định hay không. Để tiết kiệm gas, những cờ này không được lưu trữ trong hợp đồng, nhưng yêu cầu Hook sử dụng một địa chỉ cụ thể để chỉ ra địa chỉ. Mã phán đoán cụ thể như sau:

Có thể thấy, 8 bit đầu tiên của địa chỉ Hook không được dùng để đánh dấu Hook có cần được thực thi ở một giai đoạn cụ thể hay không.

Do đó, nhà phát triển Hook cần tạo một địa chỉ đáp ứng yêu cầu của Pool khi triển khai hợp đồng, địa chỉ này thường yêu cầu sử dụng tính toán Create 2 + Salt ngẫu nhiên để đạt được.

Đây là một ví dụ về việc thực hiện Hook từ sách trắng:

tiêu đề phụ

Tỷ lệ phí động 1,3


Ngoài việc thực thi mã ở một giai đoạn cụ thể, Hook còn có thể xác định tỷ lệ phí hoán đổi và tỷ lệ rút tiền của một nhóm nhất định. Tỷ lệ rút tiền đề cập đến tỷ lệ mà người dùng cần phải trả cho Hook khi rút thanh khoản. Ngoài ra, Hook cũng có thể chỉ định một phần phí swap cho chính mình.

Khi tạo nhóm, bạn cần sử dụng 4 bit đầu tiên của tham số phí (uint 24) để đánh dấu xem nhóm có sử dụng phí động hay không và có bật phí hoán đổi hook và phí rút tiền hay không:

Nếu phí động được bật, nhóm sẽ gọi hợp đồng Hook để lấy tỷ lệ phí hoán đổi hiện tại trước mỗi lần hoán đổi. Hợp đồng Hook cần triển khai hàm getFee() để trả về tỷ lệ phí hoán đổi hiện tại.

tiêu đề phụ

1.4 Hợp đồng đơn lẻ


Mỗi khi một pool mới được tạo trong Uniswap V3, một hợp đồng mới cần được triển khai, việc này tiêu tốn rất nhiều gas, nhưng trên thực tế, mã được sử dụng bởi các pool này là giống nhau, chỉ có các tham số khởi tạo là khác nhau. Uniswap V4 giới thiệu hợp đồng Singleton để quản lý tất cả các nhóm, do đó việc tạo nhóm mới không còn yêu cầu triển khai hợp đồng mới, giúp tiết kiệm gas khi triển khai hợp đồng.

Ngoài ra, ưu điểm của việc sử dụng hợp đồng Singleton là nó có thể giảm việc chuyển mã thông báo trong quá trình giao dịch, bởi vì tất cả các nhóm đều nằm trong cùng một hợp đồng, do đó việc hoán đổi giữa các nhóm có thể được hoàn thành trực tiếp trong hợp đồng và trong V3, trao đổi giữa các nhóm Sẽ cần phải chuyển mã thông báo giữa các nhóm khác nhau, điều này sẽ làm tăng gas.

tiêu đề phụ

1.5 extload


tiêu đề phụ

1.6 Flash Accounting


Để giảm việc chuyển mã thông báo qua các lần hoán đổi nhóm, V4 cũng sử dụng một phương pháp có tên Flash Accounting để chuẩn hóa quy trình hoán đổi, thêm/xóa thanh khoản/khoản vay nhanh thành quy trình giống như khoản vay nhanh:

(1) Người dùng nhận được khóa

(2) Người dùng thực hiện bất kỳ thao tác nào, chẳng hạn như hoán đổi trong nhiều nhóm, thêm/xóa tính thanh khoản hoặc mượn mã thông báo từ nhóm thông qua các khoản vay nhanh

(3) Việc chuyển mã thông báo được tạo bởi tất cả các hoạt động của người dùng sẽ được ghi lại trong khóa

(4) Sau khi tất cả các thao tác kết thúc, người dùng có thể lấy đi mã thông báo mà mình đã nhận được, đồng thời cần thanh toán mã thông báo mà mình cần thanh toán được ghi trong khóa.

Các quá trình này cần phải xảy ra trong một giao dịch.

tiêu đề phụ

1.7 ERC 1155 mint/burn


Flash Accounting có thể giảm việc chuyển token của swap trong cùng một giao dịch. Bằng cách sử dụng token ERC 1155, nó có thể giảm hơn nữa việc chuyển token của nhiều giao dịch.

V4 cho phép bạn lưu mã thông báo của mình trong hợp đồng V4 thông qua đúc tiền ERC 1155, để bạn có thể sử dụng các mã thông báo này trong nhiều giao dịch mà không cần chuyển mã thông báo sang hợp đồng V4 mỗi lần.

Mã thông báo được lưu trữ trong hợp đồng V4 có thể được rút bằng cách sử dụng ghi ERC 1155.

danh hiệu cấp một

tiêu đề phụ


2.1 TWAMM (Nhà tạo lập thị trường tự động tính theo thời gian)


Alice muốn mua ether trị giá 100 triệu USD trên blockchain. Việc thực hiện một đơn đặt hàng có quy mô này trên các nền tảng tạo lập thị trường tự động (AMM) hiện có như Uniswap sẽ rất tốn kém vì những nền tảng này có thể sẽ tính phí cắt cổ cho Alice để ngăn cô ấy sử dụng thông tin nội bộ để có được mức giá tốt hơn.

Để có được mức giá tốt hơn, lựa chọn tốt nhất của Alice là chia lệnh theo cách thủ công thành nhiều lệnh phụ nhỏ hơn và thực hiện chúng dần dần trong vài giờ. Ý tưởng là cho thị trường đủ thời gian để nhận ra cô ấy không có thông tin nội bộ và đưa ra mức giá tốt hơn cho cô ấy. Tuy nhiên, ngay cả khi cô ấy gửi một số đơn đặt hàng phụ lớn hơn, mỗi đơn hàng phụ vẫn sẽ có tác động đáng kể đến giá cả, đồng thời cũng dễ bị tấn công bởi các nhà giao dịch thù địch.

TWAMM giải quyết vấn đề này bằng cách thực hiện các giao dịch thay mặt Alice. Nó chia đơn hàng của cô ấy thành vô số đơn hàng ảo nhỏ để đảm bảo thực hiện suôn sẻ kịp thời. Đồng thời, TWAMM sử dụng mối quan hệ toán học đặc biệt của giao thức AMM được nhúng để có thể chia sẻ chi phí gas giữa các đơn đặt hàng ảo này. Vì TWAMM xử lý các giao dịch giữa các khối nên nó cũng không dễ bị tấn công sandwich.

Nhìn chung, TWAMM cung cấp cho Alice một cách hiệu quả hơn để thực hiện các giao dịch quy mô lớn, tránh mức phí cao và khả năng thao túng thị trường.

2.1.1 Nguyên tắc

TWAMM có AMM tích hợp, không khác gì các AMM khác, người dùng có thể trực tiếp thực hiện các giao dịch giao ngay thông qua AMM này hoặc thêm thanh khoản cho nó. Tuy nhiên, TWAMM cũng có hai nhóm lệnh TWAP, dùng để thực hiện các lệnh TWAP theo hai hướng, khi người dùng gửi lệnh, hãy chỉ định số lượng đầu vào token và thời lượng của giao dịch, TWAMM sẽ đặt lệnh theo cùng một hướng giao dịch vào nhóm tương ứng. , và tự động thực hiện các giao dịch theo tốc độ giao dịch được chỉ định. Khi lệnh của người dùng được thực hiện đầy đủ, người dùng có thể lấy mã thông báo nhận được từ giao dịch. Tất nhiên, trước khi lệnh của người dùng được thực thi, người dùng cũng có thể hủy lệnh trước hoặc sửa đổi số lượng token mà lệnh cần giao dịch.

Trong Ethereum, hợp đồng thông minh chỉ có thể được kích hoạt bởi các giao dịch được thực hiện bởi địa chỉ EOA và không thể được thực hiện tự động. Do đó, TWAMM cần gửi định kỳ các giao dịch từ tài khoản EOA để giải quyết các mã thông báo sẽ được giao dịch trong nhóm đơn đặt hàng của mình, điều này yêu cầu tài khoản người giữ để thực hiện các giao dịch này.

Tất nhiên, TWAMM cũng có thể tự động giải quyết nhóm đơn đặt hàng mỗi khi người dùng tương tác với nó, điều này giúp tiết kiệm chi phí cho người quản lý, đây cũng là cách phổ biến để các giao thức DeFi xử lý dữ liệu truyền phát.

2.1.2 Tại sao mô hình giao dịch này khó bị tấn công bởi bánh sandwich?

Kiểu tấn công này khó thực hiện, vì dấu thời gian trong một khối sẽ không thay đổi nên kẻ tấn công phải tăng giá nhóm trong giao dịch cuối cùng của khối, do đó việc giải quyết TWAMM trong khối tiếp theo sẽ bị ảnh hưởng. Điều này đòi hỏi cuộc tấn công sandwich xảy ra theo nhiều khối, điều này chắc chắn sẽ mang lại rủi ro lớn cho kẻ tấn công, bởi vì các nhà kinh doanh chênh lệch giá khác có thể can thiệp vào giữa, khiến kẻ tấn công bị tổn thất.

Đồng thời, do sự tồn tại của các nhà kinh doanh chênh lệch giá nên việc thao túng giá như vậy chắc chắn sẽ không bền vững, do đặc điểm của lệnh TWAP nên sẽ không giao dịch quá nhiều token trong thời gian ngắn nên hầu hết các trường hợp đều thua lỗ. phải được hạn chế.

2.1.3 Quy trình làm việc TWAMM trong V4

(1) Hook này duy trì hai nhóm lệnh TWAP, tương ứng thể hiện thứ tự TWAP của hai hướng giao dịch

(2) Người dùng có thể gửi đơn đặt hàng TWAP thông qua Hook này và cần chỉ định mã thông báo, số lượng và thời lượng của giao dịch

(3) Hook này đăng ký beforeSwap và beforeModifyPosition, và Hook này sẽ được kích hoạt mỗi khi người dùng giao dịch hoặc điều chỉnh một vị thế

(4) Sau khi được kích hoạt, Hook có nhiệm vụ giải quyết 2 nhóm lệnh TWAP

(5) Người dùng cũng có thể kích hoạt thanh toán theo cách thủ công bất cứ lúc nào

(6) Người dùng có thể hủy hoặc sửa đổi số lượng mã thông báo theo thứ tự TWAP

2.1.4 Ví dụ chi tiết

TWAMM đăng ký ba giai đoạn cho các lệnh gọi logic của hook, khởi tạo TWAMM trước khi khởi tạo nhóm và kích hoạt hook này mỗi khi người dùng giao dịch hoặc điều chỉnh một vị thế.

Người dùng có thể gọi thủ công hàm submitOrder trong TWAMM để gửi lệnh họ cần thực hiện cho hợp đồng.

Sau khi người dùng thêm lệnh mà mình cần thực hiện vào hợp đồng, lệnh đó sẽ được thực hiện tự động mỗi khi nhóm thực hiện các hoạt động hoán đổi và sửa đổiPosition.

Mỗi khi người dùng gọi hàm swap của v4 để giao dịch hoặc hàm ModifyPosition để thay đổi vị thế, hàm thực thi trong TWAMM sẽ được kích hoạt và hàm bên trong _executeTWAMMOrders sẽ được gọi trong hàm để tiếp tục thực hiện lệnh chưa hoàn thành trước đó .

_executeTWAMMOrders chức năng

tiêu đề phụ

2.2 Limit Order


Không giống như lệnh thị trường được thực hiện ngay lập tức ở mức giá thị trường cuối cùng, lệnh giới hạn được thực hiện ngay khi đạt đến mức giá định trước. Hầu hết các DEX dựa trên các nhà tạo lập thị trường tự động (AMM) đều chọn hệ thống đặt hàng thị trường theo mặc định. Đơn giản và dễ hiểu cho người mới. Lệnh thị trường được thực hiện hoặc không thành công do các thông số như tác động giá tối đa. Trong lệnh giới hạn, lệnh sẽ chỉ được thực hiện khi giá tài sản đạt đến giá giới hạn, nếu không lệnh sẽ vẫn mở.

Ví dụ: giả sử ETH hiện đang giao dịch ở mức 1 ETH = 1500 DAI trong nhóm ETH/DAI. Người dùng có thể đặt lệnh chốt lời, nội dung chính là"Nếu 1 ETH = 2000 DAI, hãy bán tất cả ETH của tôi". Nếu đạt đến mức giá này, ETH của người dùng sẽ tự động được hoán đổi lấy DAI hoàn toàn trên chuỗi theo cách phi tập trung.

Trong các phiên bản trước của Uniswap, lệnh giới hạn thực tế là không thể. Hầu hết các AMM chỉ cho phép mua và bán trên thị trường. Ở phiên bản V4, do tính năng mạnh mẽ và khả năng mở rộng của hook nên có cơ sở để thực hiện các lệnh giới hạn ở v4.

2.2.1 Nguyên tắc

Nguyên tắc thiết kế lệnh giới hạn đơn giản hơn so với twamm, hiện tại, lệnh giới hạn để bổ sung thanh khoản đã được triển khai và việc thực hiện lệnh giới hạn để giao dịch sẽ dễ dàng hơn.

Vì có tickLower và tickUpper trong v4, và theo sự thay đổi trong điều kiện giao dịch của nhóm, mức dưới và mức trên sẽ thay đổi, khi người dùng thêm thanh khoản, họ không muốn thêm nó ở mức giá hiện tại, tại thời điểm này, họ có thể sử dụng móc đặt hàng giới hạn để thực hiện yêu cầu này, đặt giá tương ứng trong móc. Sau mỗi lần hoán đổi, móc sẽ đánh giá giá nhóm hiện tại. Nếu đạt đến giá đã đặt, thanh khoản tương ứng sẽ được thêm vào để thu nhập.

2.2.2 Quy trình làm việc của Lệnh giới hạn trong V4

1. Giới hạn duy trì nhiều kỷ nguyên dưới dạng lệnh giới hạn cho các mức thấp hơn và hướng giao dịch khác nhau.

2. Thông qua cái móc này, người dùng gửi giá thấp hơn và hướng giao dịch của mình, đồng thời thêm lệnh giới hạn vào hợp đồng.

3. Hook này đăng ký afterSwap, nó chỉ được kích hoạt khi giá thay đổi sau mỗi lần hoán đổi kết thúc

4. Sau khi được kích hoạt, Hook kiểm tra phạm vi giá hiện tại và kiểm tra từ thời điểm đó xem có lệnh giới hạn nào cần thêm thanh khoản ở mức giá hiện tại hay không.

5. Người dùng có thể rút tiền hoặc trực tiếp thêm thanh khoản bất cứ lúc nào

2.2.3 Ví dụ chi tiết

Hook được kích hoạt trong hai giai đoạn đăng ký hợp đồng, hook được khởi tạo sau khi khởi tạo Pool và logic hook được kích hoạt sau mỗi lần trao đổi.

Người dùng gọi hàm địa điểm để chuyển số lượng, giá cả và hướng giao dịch của thanh khoản mà người dùng muốn thêm. Đầu tiên, hook sẽ thêm thanh khoản mà người dùng muốn thêm vào nhóm để lưu trữ, sau đó tạo một lệnh giới hạn tương ứng cho người dùng.

Móc này sẽ được kích hoạt sau khi mỗi lần hoán đổi kết thúc và hoạt động thêm thanh khoản sẽ được hoàn thành dựa trên lệnh giới hạn có sẵn trong phạm vi giá theo phạm vi giá hiện tại.

Trước khi lệnh giới hạn được hoàn thành, người dùng có thể gọi hàm kill để hủy lệnh giới hạn và nhận được lợi ích từ việc thêm thanh khoản lần này.

Khi người dùng muốn loại bỏ thanh khoản, họ có thể gọi chức năng rút tiền để rút thanh khoản mong muốn.

Nhìn chung, hook order giới hạn này cung cấp cho người dùng một cách thuận tiện hơn, người dùng có thể đặt giá khi họ muốn thêm thanh khoản. Sau khi phạm vi giá trong pool đạt đến mức giá, hook sẽ tự động vào pool để người dùng thực hiện hoạt động thêm thanh khoản và người dùng có thể hủy và rút thanh khoản bất cứ lúc nào.

Ngoài TWAMM và Lệnh giới hạn, các chức năng như tái đầu tư LP và thay đổi phí động cũng có thể được thực hiện dựa trên Hook. Vì lý do không gian, chúng tôi sẽ giới thiệu chúng trong phần phân tích tiếp theo:

Tái đầu tư LP: Người dùng có thể sử dụng hook để thêm, sửa đổi và loại bỏ tính thanh khoản, đồng thời hook có thể đăng ký afterSwap và afterModifyPosition để gọi. Vì người dùng thống nhất sử dụng hook để thêm thanh khoản nên địa chỉ duy nhất bổ sung thanh khoản trong poolManager là hook. Hook có thể kiểm tra thời gian hiện tại mỗi khi nó được kích hoạt. Sau một khoảng thời gian nhất định, hãy chọn rút phần thưởng thanh khoản và nhận Lp mã thông báo sẽ thêm tính thanh khoản vào nhóm một lần nữa để tự động tối ưu hóa thu nhập của người dùng.

danh hiệu cấp một

tiêu đề phụ


Giảm việc sử dụng yêu cầu và hoàn nguyên


Trong logic chức năng của hook gọi nhóm, hãy giảm thiểu việc sử dụng câu lệnh rollback.Vì hợp đồng pool và hợp đồng hook có mối quan hệ chung nên sau khi rollback giao dịch xảy ra trong hook, giao dịch trong pool cũng sẽ được rollback. Các câu lệnh khôi phục trong hook không liên quan đến các giao dịch thông thường trong nhóm có thể khiến người dùng không thể sử dụng các chức năng trong nhóm một cách bình thường.

Tránh sử dụng chức năng tự hủy

Tránh sử dụng hàm tự hủy trong hook, nếu hàm tự hủy được gọi trong hook, nó không chỉ gây ra vấn đề về logic trong hook mà còn khiến các chức năng trong pool bị lỗi, khiến tài sản trong hook bị lỗi. toàn bộ nhóm bị mất và các chức năng không hoạt động.

Kiểm soát truy cập nghiêm ngặt

Kiểm soát chặt chẽ các quyền trong hợp đồng hook để tránh các vai trò có quá nhiều quyền và thực hiện quản lý đa chữ ký trên các vai trò đặc quyền để ngăn chặn các cuộc tấn công điểm đơn. Để tránh tình huống trong đó vai trò đặc quyền có thể tùy ý sửa đổi các biến trạng thái hợp đồng, lỗi logic có thể xảy ra và khiến toàn bộ giao dịch bị khôi phục, ảnh hưởng đến việc sử dụng nhóm thông thường. Để xác minh nguyên tắc đặc quyền tối thiểu, chúng ta nên sử dụng hợp đồng AccessControl của openzeppelin để triển khai các quyền chi tiết hơn nhằm kiểm soát quyền truy cập, vì cách làm này hạn chế từng thành phần hệ thống tuân theo nguyên tắc đặc quyền tối thiểu.

Thực hiện tốt các hạn chế chống tái nhập cảnh

Là mã mở rộng bên ngoài của Pool, hook cũng nên chú ý đến các cuộc tấn công tái nhập có thể xảy ra trong hợp đồng, chẳng hạn như các cuộc tấn công tái nhập có thể xảy ra trong các lệnh giới hạn khi chuyển mã thông báo gốc, dẫn đến mất tài sản hợp đồng. Kiểm tra và cố gắng cập nhật tất cả trạng thái trước khi gọi một hợp đồng bên ngoài hoặc mẫu được gọi là mẫu kiểm tra-xác thực-tương tác. Bằng cách này, ngay cả việc đăng nhập lại cũng sẽ không có hiệu lực vì tất cả các cập nhật trạng thái đã được thực hiện. .

Kiểm soát nâng cấp hợp đồng

danh hiệu cấp một

About Us


Trang web chính thức:

Trang web chính thức:https://www.sharkteam.org

Twitter:https://twitter.com/sharkteamorg

Discord:https://discord.gg/jGH9xXCjDZ

Telegram:https://t.me/sharkteamorg


SharkTeam
作者文库