Vào Đường Cong Bất Biến - phần 1

Bài viết này được dịch máy
Xem bản gốc

Phần đầu của bài viết này nói về StableSwap invariant.

StableSwap

Amplified Invariant là một khái niệm toán học được giới thiệu để cải thiện hiệu quả của các bể thanh khoản bằng cách giảm slippage trong các giao dịch, đồng thời vẫn cho phép linh hoạt cho mất cân bằng giá. Nó kết hợp các khía cạnh của invariant tổng-hằng số và invariant tích-hằng số để tạo ra một công thức cân bằng giữa slippage thấp (gần cân bằng) và khả năng truy vết nguồn gốc ở bất kỳ mức giá nào.

Cảm ơn bạn đã đọc Verichains! Đăng ký miễn phí để nhận các bài viết mới và ủng hộ công việc của tôi.

  • Invariant tích-hằng số (∏x_i=k): Được sử dụng trong các bể thanh khoản giống Uniswap. Nó rất linh hoạt và hỗ trợ giao dịch ở bất kỳ mức giá nào, nhưng slippage tăng đáng kể đối với các giao dịch lớn.

  • Invariant tổng-hằng số (∑x_i=k): Được sử dụng cho stablecoin. Nó không có slippage đối với các giao dịch cân bằng nhưng không thể xử lý các mất cân bằng giá lớn.

  • Amplified Invariant kết hợp lợi ích của cả hai: slippage thấp gần cân bằng và linh hoạt cho các giao dịch mất cân bằng. Đặc điểm của tham số hệ số khuếch đại trong StableSwap là, giá trị càng thấp, invariant càng gần với tích-hằng số.

Một hệ số đòn bẩy χ được giới thiệu để giảm slippage. Yếu tố này điều chỉnh hình dạng của invariant, cho phép nó kết hợp các đặc tính của invariant tích-hằng số và tổng-hằng số, cải thiện hiệu quả của nó trong các kịch bản giao dịch khác nhau.

Công thức chung là:

Trong đó:

  • χ: Hệ số đòn bẩy kiểm soát độ cong của invariant.

  • D: Hằng số cho tổng giá trị token ở trạng thái cân bằng.

  • n: Số lượng token trong bể.

  • ∑x_i: Tổng số lượng token.

  • ∏x_i​: Tích số lượng token.

Nếu phương trình này luôn đúng, người dùng sẽ có các giao dịch với đòn bẩy χ. Tuy nhiên, nó sẽ không hỗ trợ giá cả đi xa khỏi mức giá lý tưởng 1.0. Invariant nên hỗ trợ bất kỳ giá nào (để luôn có thanh khoản). Vì vậy, Stable Swap làm cho χ động. Khi danh mục đầu tư ở trạng thái cân bằng hoàn hảo, nó bằng một hằng số A, tuy nhiên giảm xuống 0 khi mất cân bằng:

Invariant StableSwap thêm χ vào công thức chung (1):

Có hai phép toán toán học thường gặp để tính toán:

  • Tính D với các giá trị cố định cho A, và các dự trữ x_1,x_2,...x_n với n là số lượng đồng xu mà bể hỗ trợ, là hằng số khi bể được triển khai.

  • Với D đã biết, người dùng muốn tăng giá trị của một dự trữ xixi​ lên x'_i và tính xem dự trữ x_j​ khác cần giảm bao nhiêu để giữ phương trình cân bằng.

Trong Curve V1 (StableSwap), D có hành vi tương tự như kk trong Uniswap V2 - D càng lớn, các dự trữ càng nhiều, và đường cong giá 'xa hơn'. D thay đổi và cần được tính lại sau khi thanh khoản được thêm hoặc loại bỏ, hoặc phí thay đổi cân bằng bể.

Gọi S=∑x_i và P=∏x_i​, phương trình (3) bây giờ là:

Ví dụ, nếu chỉ có hai token trong bể, invariant sẽ trở thành:

Trong mã nguồn StableSwap, nó tính D bằng cách tính D_next:

aaaa

Phương trình trong mã này có thể được viết lại như:

Ví dụ, chúng ta có 100.000 USDC và 1.000.000 USDT trong bể. Sử dụng (3) hoặc (4), chúng ta có thể tính D xấp xỉ 1.094.540,84. Đây là một đoạn mã Python đơn giản để tính D với (5) (vì đây là ví dụ cho (4)):

Chúng ta có thể sử dụng hằng số D đó một lần nữa để tính lại số lượng USDT hoặc USDC bằng cách sử dụng (6).

StableSwap sử dụng phương pháp Newton để giải phương trình số học vì nó không thể được giải đại số. StableSwap tạo f(D), bằng 0 khi phương trình (4) cân bằng. Ngoài ra, nó tính đạo hàm f′(D).

StableSwap giải D bằng phương pháp Newton, với D có thể được hiểu là giá trị hiện tại của D:

Trước tiên, chúng ta có thể viết lại (8) bằng cách kết hợp tất cả các phần tử thành một phân số duy nhất và nhân tử và mẫu số của phân số với D, sau đó :

Viết lại phương pháp Newton bằng cách làm cho các mẫu số bằng f'(D), sau đó thay thế bằng (10):

Phân phối tất cả các thuật ngữ để loại bỏ các dấu ngoặc trong tử số:

Sau khi loại bỏ tất cả các phép hủy trong (11), chúng ta có thể định nghĩa một phần tử D_p như:

Phương trình trở thành:

Phương trình này bằng với phương trình được định nghĩa trong (6).

Hơn nữa, trong mã Viper, D_p được tính bằng:

D_P: uint256 = D # D_P = Sfor _x in xp:D_P = D_P * D / (_x * N_COINS)

xp là số lượng token, vì vậy vòng lặp sẽ chạy n lần. Do đó, chúng ta có D nhân với chính nó n lần trong mẫu số.

Sau đó, chúng ta có thể tính y hoặc x'_j (giá trị sau của x_j​) khi người dùng tăng giá trị của một dự trữ x_i​ lên x'_i​.

Với S=∑x_iP=∏x_i. Giả sử tính token y với D, A, n; hãy điều chỉnh công thức SP một chút:

SP′ là tổng và tích của số dư của tất cả các tokens ngoại trừ token y mà chúng ta muốn tính.

Công thức sau đó trở thành từ (4) đến:

Một lần nữa, StableSwap sử dụng phương pháp Newton để giải phương trình số học. Lần này nó tạo f(y) và đạo hàm f′(y).

Phương pháp Newton của StableSwap cho y là:

Kết hợp (13) và (14) cho phương trình đó, điều này có thể được chuyển đổi thành:

Một lần nữa, viết lại phương pháp (16) bằng cách làm cho các mẫu số bằng (14):

Mặt khác, (12) có thể được viết lại thành f(ADn^n):

Thay thế vào (17) sau đó loại bỏ tất cả các phép hủy:

Chúng ta nhân tử và mẫu số với y/(A*n^n):

Viết lại invariant (12) một lần nữa và thay thế vào (20):

Công thức (23) có thể được thực hiện như:

Trong mã Viper, hai biến được định nghĩa:

Sau khi thay thế vào công thức (24), chúng ta có:

Có hai hàm cho y trong mã nguồn Curve, get_yget_Y_D. Hàm `get_Y_D` tính y từ D, giống như phương pháp ở trên. Ngoài ra, `get_y` tính y mới khi số lượng một token x thay đổi từ x thành x'. Quay l

Cảm ơn bạn đã đọc Verichains! Đăng ký miễn phí để nhận các bài đăng mới và ủng hộ công việc của tôi.

Nguồn
Tuyên bố từ chối trách nhiệm: Nội dung trên chỉ là ý kiến của tác giả, không đại diện cho bất kỳ lập trường nào của Followin, không nhằm mục đích và sẽ không được hiểu hay hiểu là lời khuyên đầu tư từ Followin.
Thích
1
Thêm vào Yêu thích
Bình luận