- vừa được xem lúc

Khốn vãi lò. Phần 2: x*y=k đã đi đâu? Sao tôi không thấy nó trong code. To be continued...

0 0 7

Người đăng: thiên thần gãy cánh

Theo Viblo Asia

Ủa sao nói UniswapV3 vẫn là constant-product mà có thấy dòng nào trong code đảm bảo xy=kx * y= k đâu?

2. Suy luận từ V2 sang V3

2.1. Nhắc lại một chút về V2

Ai cũng biết, công thức toán khi swap của Uniswap là constant-product, nghĩa là: xy=kx*y=k. Giá trị k trước khi swap và sau khi swap phải được giữ nguyên, k chỉ thay đổi khi có hành động thêm hoặc rút thanh khoản.

Dễ hiểu hơn, ban đầu Pool đang có reserves là xx token0 và yy token1. Alice muốn swap một lượng x0x_0 token0 lấy một lượng y0y_0 token1. Thì x0x_0y0y_0 phải thoả mãn:

(x+x0)(yy0)=xy(x + x_0) * (y - y_0) = x * y

Ví dụ: ban đầu x=100x = 100, y=48y = 48. Alice muốn swap 20 token0 lấy token1 thì lượng token1 mà Alice nhận được là:

y0=484800100+20=8y_0 = 48 - \frac{4800}{100 + 20} = 8

Và, thanh khoản của Pool được tính theo công thức:

L=xyL=\sqrt{x*y}

Mắc đi hát karaoke quá mà ở quê không ai rủ đi.

Tại sao công thức tính L lại là L=xyL = \sqrt{x * y} ?

Suy luận một chút, tính chất đầu tiên của L cần phải được thoả mãn là: LL phải được giữ nguyên giá trị trước khi swap và sau khi swap. Nếu lấy công thức L=x+yL = x + y, tính chất đó sẽ không thể thoả mãn, mà ta đã có xy=kx* y = k (hằng số), do đó L sẽ là một công thức gì đó liên quan đến xyx * y, dạng L=f(xy)L = f(x * y).

Tính chất thứ hai mà LL cần phải được thoả mãn là tính tỷ lệ, nghĩa là khi một liquidity provider thêm thanh khoản vào Pool, lượng liquidity được ghi nhận cho provider đó phải có tỷ lệ tương xứng với liquidity của tổng Pool dưa trên số lượng token0 và token1 mà provider đó đã thêm vào.

Ví dụ, Pool đang có reserves là xx token0 và yy token1, có tổng liquidity là LtotalL_{total}, Alice thêm x0x_0 token0 và y0y_0 token1 vào Pool, liquidity được ghi nhận cho Alice L0L_0, phải thoả mãn:

L0Ltotal=x0x\frac{L_0}{L_{total}}=\frac{x_0}{x} hoặc L0Ltotal=y0y\frac{L_0}{L_{total}} = \frac{y_0}{y}

Nếu chúng ta sử dụng công thức L=xyL = x * y, công thức trên không thể thoả mãn, hãy cho các con số vào để dễ hình dung hơn.

x=300,y=600=>Ltotal=300600=180000x = 300, y = 600 => L_{total} = 300 * 600 = 180000

x0=100,y0=200=>L0=100200=20000x_0 = 100, y_0 = 200 => L_0 = 100 * 200 = 20000

=>L0Ltotal=20000180000=19=> \frac{L_0}{L_{total}} = \frac{20000}{180000} = \frac{1}{9}

=>x0x=100300=13=> \frac{x_0}{x} = \frac{100}{300} = \frac{1}{3}yy=200600=13\frac{y}{y} = \frac{200}{600} = \frac{1}{3}

Rõ ràng là công thức L=xyL= x * y không thể thoả mãn tính tỷ lệ.

Nếu L=xyL = \sqrt{x * y} thì sao? Hãy thử với các con số ở trên:

x=300,y=600=>Ltotal=300600=180000x = 300, y = 600 => L_{total} = \sqrt{300 * 600} = \sqrt{180000}

x0=100,y0=200=>L0=100200=20000x_0 = 100, y_0 = 200 => L_0 = \sqrt{100 * 200} = \sqrt{20000}

L0Ltotal=20000180000=13\frac{L_0}{L_{total}} = \frac{\sqrt{20000}}{\sqrt{180000}} = \frac{1}{3}

Như vậy, công thức L=xyL= \sqrt{x*y} thoả mãn tính tỷ lệ.

Oke, tiếp theo, tại sao lại hoặc giữa x0x\frac{x_0}{x}, y0y\frac{y_0}{y}. Hãy nhìn vào code một tí, hàm mint() của UniswapV2Pair.sol

image.png

Nếu là provider đầu tiên thêm thanh khoản thì LL sẽ được tính theo công thức L=xyL =\sqrt{x * y}, dòng 119-120.

Những provider tiếp theo chỉ cần tính theo công thức L0=min(x0xLtotal,y0yLtotal)L_0 = min(\frac{x_0}{x} * L_{total}, \frac{y_0}{y} * L_{total}) (dòng 122, 123) là sẽ tự động thoả mãn 2 tính chất ở trên. Điều này cho phép những provider này không cần thêm thành khoản đúng tỷ lệ x0y0=xy\frac{x_0}{y_0} = \frac{x}{y}, với mục đích có thể làm thay đổi price luôn trong lúc thêm thanh khoản, cho nên L0L_{0} phải là min(x0xLtotal,y0yLtotal)min(\frac{x_0}{x} * L_{total}, \frac{y_0}{y} * L_{total}).

2.2. Chuyển đổi từ V2 sang V3

Mặc dụ V2 ko quy ước về công thức giá, nhưng bây giờ chúng ta hãy quy ước rằng P được xem là giá của token0 trên token1, nghĩa là 1 token0 = P token1. Nghĩa là P=yxP = \frac{y}{x}

Chúng ta có thể biểu diễn tương quan của x,y,Px,y,P như sau (lưu ý, hình này không đúng về mặt toán học, đừng cố chia tỷ lệ độ dài hay diện tích làm gì, nó chỉ minh hoạ ra cho dễ hiểu):

image.png

Chúng ta có thể thấy những điều sau với Pool V2:

  • PP sẽ có khoảng giá trị (price-range) là (0,+)(0, +\infin), nhưng PP sẽ không bao giờ chạm đến 0
  • xx càng tăng, nghĩa là lượng token0 trong pool càng nhiều thì PP càng giảm image.png
  • yy càng tăng, nghĩa là lượng token1 trong pool càng nhiều thì PP càng tăng image.png
  • Bên phải của PP, chỉ chứa toàn token0. Bên trái của PP chỉ chứa toàn token1

Ok, bây giờ hãy qua lại điểm khác nhau về tính năng của V2 và V3 là: thanh khoản khi một provider thêm vào V2, provider không có quyền chọn price-range, LL sẽ được hoà tan hoàn toàn vào price-range (0,+)(0, +\infin). Còn ở V3, provider có quyền chọn price-range cho lượng thanh khoản của mình, khi nào current-price đi vào price-range mà provider đã chọn thì lượng thanh khoản mà anh ấy đã thêm vào mới được phép mang ra sử dụng, và L của mỗi price-range có giá trị khác nhau.

Từ hình mình hoạ của V2, chúng ta có thể mở rộng ra minh hoạ cho V3 như sau:

Để ra được hình minh hoạ này thì mình tư duy như sau:

  • Lấy A,B,C,D,E,F,G,H là những tick mà index của chúng đều chia hết cho tick-spacing, chúng không cần phải cách đều nhau.

  • Đầu tiên gom cả PoolV2 thành 1 price-range nhất định, ở đây là [D,E). Trong price range này, sẽ có vừa có cả xx token0 và yy token1, giá hiện tại (current-price) đang là ở điểm D1 thuộc [D,E) và L[D,E)=xyL_{[D,E)} = \sqrt{x * y}. Và nếu sau khi swap, price không vượt qua khỏi [1.0001D1.0001^D, 1.0001E11.0001^{E-1}, thì lệnh swap đó mới được sử dụng token0 hoặc token1 trong thanh khoản L[D,E)L_{[D,E)}

  • Bên trái của current-price vẫn sẽ toàn là token1, bên phải của current-price vẫn sẽ toàn là token0.

  • Và như mình đã nói ở phần trước, liquidity provider có thể thêm thanh khoản vào bất cứ price-range nào họ muốn. Do đó, L của các đoạn sẽ nhấp nhô (không bằng nhau). Khi họ thêm thanh khoản vào price-range lớn hơn current-price-range, họ chỉ được phép deposit token0. Khi họ thêm thanh khoản vào price-range nhỏ hơn current-price-range, họ chỉ được phép deposit token1.

Nhưng có một vấn đề ở đây là, với các đoạn [E,F), [F,G), [G,H) chỉ toàn token0 và các đoạn [A,B), [B,C), [C,D) chỉ toàn là token1 thì làm sao xác định được L của mỗi đoạn nếu dựa vào công thức thuần tuý L=xyL = \sqrt{x * y}, chẳng phải tất cả L sẽ là 0 sao?

2.3 Hô biến các công thức

Bình luận

Bài viết tương tự

- vừa được xem lúc

[Blockchain] Road to Bitcoin

. Chắc mọi người hẳn đã không còn xa lạ gì với anh chàng tỷ phú đã ném vỡ cửa kính ô tô nhà mình cùng với siêu năng lực điều khiển vật giá chỉ bằng lời nói, người đã đẩy định giá Bitcoin trên thị trường vượt ngưỡng 50K dolar/coin với những bài twitter để đời . .

0 0 61

- vừa được xem lúc

Khi Ethereum có chi phí giao dịch quá đắt đỏ - Tương lai cho layer2 ?

Với sự phát triển như vũ bão của Blockchain, ETH dường như đang quá tải và hệ quả là chi phí Gas đã lên đến 1000Gwei, phí để tạo những transaction phức tạp đã xấp xỉ 500$ . Và một giải pháp cứu cánh cho các sản phẩm Defi trên ETH chính là Layer2, và trong nhiệm vụ lần này Matic đang thể hiện khả năn

0 0 89

- vừa được xem lúc

Blockchain với Java - Tại sao không?

Cuộc cách mạng công nghiệp 4.0 ra đời kéo theo nhiều sự thay đổi và xu hướng mới được hình thành. Riêng đối với lĩnh vực CNTT cũng không nằm ngoài vùng ảnh hưởng mạnh mẽ. Chính làn sóng 4.

0 0 92

- vừa được xem lúc

Phân loại và tầm quan trọng của các node trong mạng blockchain

Trước khi đi vào phân loại và nêu rõ được tầm quan trọng của các node trọng mạng blockchain thì mình xin được trích dẫn khái niệm về blockchain từ Wikipedia như sau:. .

0 1 65

- vừa được xem lúc

Code Smart Contract bằng Assembly ?

Introduction. Hồi còn học trong ghế nhà trường bộ môn lập trình tốn nhiều não nhất của mình là code assembly. Nôm na thì bất cứ ngôn ngữ bậc cao nào như C , Go, Java,... được sinh ra để người dễ hiểu và dễ code , tuy nhiên chúng đều sẽ được compiled down xuống assembly một ngôn ngữ bậc thấp để máy h

0 0 58

- vừa được xem lúc

Dextool - Công cụ phân tích Decentralized Exchange tuyệt vời

. Trend Defi mặc dù đã bớt nhiệt nhưng những sản phẩm nổi bật của làn sóng này mang lại thì vẫn rất được người dùng ưa chuộng. Đặc biệt là các nền tảng Decentralized Exchange, tiêu biểu là Uniswap, SushiSwap, 1inch Exchange, FalconSwap,... Nhưng khi đã sử dụng các nền tảng DEx này mà không biết đến

0 0 106