LapTrinhBlockchain

Chia sẻ kiến thức về Lập Trình Blockchain

Kiến thức Blockchain, Kiến thức lập trình, Lập trình Blockchain, Lập Trình DApp, Lập trình NodeJs, Lập trình Smart Contract, Nâng cao Kiến thức

Uniswap V3 Development Book: Hướng dẫn xây dựng ứng dụng tài chính phi tập trung Uniswap V3

Uniswap V3 Development Book: Hướng dẫn xây dựng ứng dụng tài chính phi tập trung Uniswap V3

Uniswap V3 Development Book: Hướng dẫn xây dựng ứng dụng tài chính phi tập trung Uniswap V3

Chia sẻ bài viết
5
(88)

Trước đây mình có tìm hiểu về UniswapV3 nhưng chưa tìm được tài liệu nào cho nhà phát triển. Gần đây mình mới tìm ra tài liệu rất hay Uniswap V3 Development Book, đây là tài liệu rất hay mà các nhà phát triển trong mảng Blockchain/Crypto Currency nên đọc. Tài liệu được xây dựng nhờ khoản tài trợ của Uniswap Foundation, cũng chính vì vậy nó là mã nguồn mở và miễn phí cho mọi người. Chúng ta cảm ơn tác giả đã bỏ ra nhiều thời gian và công sức để hoàn thành bộ tài liệu rất giá trị này cho anh em Developer.

Trong bài viết này, chúng ta sẽ cùng nhau xây dựng một trong những ứng dụng thú vị và quan trọng nhất, đóng vai trò là trụ cột tài chính phi tập trung ngày này – Uniswap V3! Cuốn sách này sẽ hướng dẫn các bạn phát triển một ứng dụng phi tập trung, bao gồm:

  • Phát triển hợp đồng thông minh (trong Solidity );
  • Thử nghiệm và triển khai hợp đồng (sử dụng Forge và Anvil từ Foundry);
  • Thiết kế và toán học của một sàn giao dịch phi tập trung;
  • Phát triển ứng dụng giao diện người dùng cho sàn giao dịch (React và MetaMask).

Cuốn sách này không dành cho người mới bắt đầu lập trình. Nhưng nếu bạn là người đã có kinh nghiệm về lập trìnhbắt đầu tìm hiểu về Blockchain thì đây là cuốn sách rất phù hợp cho bạn.

Các liên kết hữu ích:

  1. Cuốn sách này có sẵn tại: https://uniswapv3book.com/
  2. Cuốn sách này được lưu trữ trên GitHub: https://github.com/Jeiwan/uniswapv3-book
  3. Tất cả các mã nguồn được lưu trữ trong một kho lưu trữ riêng: https://github.com/Jeiwan/uniswapv3-code
  4. Nếu bạn nghĩ rằng bạn có thể giúp Uniswap, thì họ có chương trình trợ cấp.
  5. Nếu bạn quan tâm đến DeFi và chuỗi khối, hãy theo dõi tác giả trên Twitter.

Nếu bạn là người mới tiếp xúc tới Blockchain và chưa có kinh nghiệm về các sàn Phi Tập Trung, thì bạn nên đọc tài liệu dưới trước rồi mới bắt đầu đọc về cuốn sách này:

  1. Seri Uniswap V1: Nó bao gồm những điều cơ bản nhất về Uniswap và mã đơn giản hơn nhiều. Nếu bạn có một số kinh nghiệm với Solidity, hãy bỏ qua đoạn mã này vì nó rất cơ bản và Uniswap V2 làm điều đó tốt hơn.
    1. Lập trình DeFi: Uniswap. Phần 1
    2. Lập trình DeFi: Uniswap. Phần 2
    3. Lập trình DeFi: Uniswap. Phần 3
  2. Seri Uniswap V2: Tôi không đi sâu vào toán học và các khái niệm cơ bản ở đây vì chúng đã được trình bày trong loạt bài V1, nhưng mã của V2 thực sự đáng để làm quen – hy vọng nó sẽ dạy cho bạn một cách nghĩ khác về hợp đồng thông minh lập trình (đó không phải là cách chúng ta thường viết chương trình).
    1. Lập trình DeFi: Uniswap V2. Phần 1
    2. Lập trình DeFi: Uniswap V2. Phần 2
    3. Lập trình DeFi: Uniswap V2. Phần 3
    4. Lập trình DeFi: Uniswap V2. Phần 4

Nếu toán học là một vấn đề, hãy cân nhắc tham gia các khóa học Đại số 1 và Đại số 2 trên Khan Academy. Toán học của Uniswap không khó, nhưng nó đòi hỏi kỹ năng thao tác đại số cơ bản.

Khái niệm chung

Giới thiệu về thị trường (Market)

Cách hoạt động của các sàn giao dịch tập trung

Trong cuốn sách này, chúng ta sẽ xây dựng một sàn giao dịch phi tập trung (DEX – Decentralized Exchange) chạy trên Ethereum. Có nhiều cách tiếp cận về cách thiết kế một sàn giao dịch. Tất cả các sàn giao dịch tập trung (CEX – Centralized Exchanges) đều có Sổ lệnh (Order Book). Sổ lệnh chỉ là một nhật ký lưu trữ tất cả các lệnh mua và bán mà các nhà giao dịch muốn thực hiện. Mỗi đơn đặt hàng (Order) trong Sổ lệnh này chứa một mức giá mà đơn đặt hàng phải được thực hiện và số lượng cần phải được mua hoặc bán.

Sổ lệnh trên sàn giao dịch tập trung CEX
Sổ lệnh trên sàn giao dịch tập trung CEX

Để giao dịch diễn ra, phải tồn tại Tính thanh khoản (Liquidity), đơn giản là sự sẵn có của tài sản trên thị trường. Bạn muốn mua tủ quần áo nhưng không ai bán, tức là không có thanh khoản. Nếu bạn muốn bán tủ quần áo nhưng không ai muốn mua, có thanh khoản nhưng không có người mua. Nếu không có thanh khoản, sẽ không có gì để mua hoặc bán.

Trên các sàn giao dịch tập trung, sổ lệnh là nơi tích lũy thanh khoản. Nếu ai đó đặt lệnh bán, họ sẽ cung cấp thanh khoản cho thị trường. Nếu ai đó đặt lệnh mua, họ mong đợi thị trường có tính thanh khoản, nếu không, không có giao dịch nào được thực hiện.

Khi không có thanh khoản, nhưng thị trường vẫn quan tâm đến giao dịch, các nhà tạo lập thị trường (Market Maker) sẽ vào cuộc. Nhà tạo lập thị trường là một công ty hoặc một cá nhân cung cấp tính thanh khoản cho thị trường, đó là người có nhiều tiền và mua các tài sản khác nhau để bán chúng trên các sàn giao dịch. Đối với công việc này, các nhà tạo lập thị trường được trả tiền bởi các sàn giao dịch. Các nhà tạo lập thị trường kiếm tiền từ việc cung cấp thanh khoản cho các sàn giao dịch.

Cách hoạt động của các sàn giao dịch phi tập trung

Đừng ngạc nhiên, các sàn giao dịch phi tập trung cũng cần thanh khoản. Và họ cũng cần một người cung cấp nó cho các nhà giao dịch (trader) nhiều loại tài sản. Tuy nhiên, quá trình này không thể được xử lý một cách tập trung. Một giải pháp phi tập trung phải được tìm thấy. Có nhiều giải pháp phi tập trung và một số trong số chúng được thực hiện khác nhau. Trọng tâm của chúng ta sẽ là cách Uniswap giải quyết vấn đề này.

Nhà tạo lập thị trường tự động

Sự phát triển của thị trường on-chain (on-chain market) đã đưa chúng ta đến ý tưởng về Nhà tạo lập thị trường tự động (AMM – Automated Market Maker). Đúng như tên gọi, thuật toán này hoạt động giống hệt như các nhà tạo lập thị trường nhưng theo cách tự động. Hơn nữa, nó phi tập trungkhông cần cấp phép từ ai (permissionless), nghĩa là:

  • Nó không bị chi phối bởi một thực thể duy nhất;
  • Tất cả tài sản không được lưu trữ ở một nơi;
  • Bất cứ ai cũng có thể sử dụng nó từ bất cứ đâu.

AMM là gì? AMM là một tập hợp các hợp đồng thông minh xác định cách quản lý tính thanh khoản. Mỗi cặp giao dịch (ví dụ: ETH/USDC) là một hợp đồng riêng lưu trữ cả ETH và USDC và được lập trình để dàn xếp các giao dịch: đổi ETH lấy USDC và ngược lại.

Ý tưởng cốt lõi là Tổng hợp (pooling): Mỗi hợp đồng là một nhóm (pool) lưu trữ thanh khoản cho phép những người dùng khác nhau (bao gồm cả hợp đồng thông minh khác) giao dịch theo cách được phép. Có hai vai trò, nhà cung cấp thanh khoản (liquidity provider) và nhà giao dịch (trader), và những vai trò này tương tác với nhau thông qua các nhóm thanh khoản và cách họ có thể tương tác với các pool đã được lập trình (programmed) và không thể sửa đổi (immutable).

Điều làm cho cách tiếp cận này khác với các sàn giao dịch tập trung là các hợp đồng thông minh hoàn toàn tự động và không được quản lý bởi bất kỳ ai. Không có người quản lý, không có quản trị viên, không có người dùng đặc quyền, v.v. Chỉ có nhà cung cấp thanh khoản và nhà giao dịch (họ có thể là cùng một người) và tất cả các thuật toán đều được lập trình, không thay đổi và công khai.

Constant Product Market Maker (CFMM) – Nhà tạo lập thị trường tích không đổi

Như tôi đã đề cập trong phần trước, có nhiều cách tiếp cận khác nhau để xây dựng AMM. Chúng ta sẽ tập trung vào xây dựng một loại AMM – Constant Product Market Maker. Đừng sợ hãi bởi cái tên dài! Cốt lõi của nó là một công thức toán học rất đơn giản:
xy=k

Vậy đó, đây là AMM. Trong đó xy là dự trữ tài sản trong nhóm – nó chính là số lượng mã thông báo mà nó hiện đang nắm giữ, k là một hằng số.

Tại sao chỉ có hai dự trữ, x và y? Mỗi nhóm Uniswap chỉ có thể chứa hai mã thông báo. Chúng ta sử dụng x và y để chỉ dự trữ của một nhóm, trong đó x là dự trữ của mã thông báo đầu tiên và y là dự trữ của mã thông báo khác và thứ tự không quan trọng.

Công thức hàm hằng cho biết: sau mỗi thương k phải không đổi. Khi các nhà giao dịch thực hiện giao dịch, họ đặt một số lượng của một mã thông báo vào nhóm (mã thông báo họ muốn bán) và loại bỏ một số lượng mã thông báo khác khỏi nhóm (mã thông báo họ muốn mua). Điều này làm thay đổi trữ lượng của nhóm và công thức hàm hằng nói rằng tích của trữ lượng không được thay đổi. Như chúng ta sẽ thấy nhiều lần trong cuốn sách này, yêu cầu đơn giản này là thuật toán cốt lõi về cách thức hoạt động của Uniswap.

Chức năng giao dịch

Bây giờ chúng ta đã biết nhóm là gì, hãy viết công thức về cách giao dịch diễn ra trong một nhóm:
(x + rΔx)(y – Δy) = k

  • Có một pool với một số lượng dự trữ của token0 là x và và của token1 là y
  • Khi chúng ta mua token1 từ token0, chúng ta phải đưa vào pool một lượng token0 là Δx
  • Và pool sẽ gửi lại chúng ta token1 một lượng Δy
  • Pool cũng sẽ thu một khoản phí nhỏ (swapfee) từ token0, ta đặt r = 1 – swapfee
  • Lượng dự trữ token0 lúc này là (x + rΔx) và lượng dự trữ token1 là (y – Δy)
  • Tích lượng dữ trữ sau khi swap vẫn phải bằng k.

Giá các mã thông báo

Làm cách nào để chúng ta tính toán giá của các mã thông báo trong một nhóm? Vì các nhóm Uniswap là các hợp đồng thông minh riêng biệt, nên các mã thông báo trong một nhóm được định giá theo nhau. Ví dụ: trong nhóm ETH/USDC, ETH được định giá theo USDC và USDC được định giá theo ETH. Nếu 1 ETH có giá 1000 USDC, thì 1 USDC có giá 0,001 ETH. Điều này cũng đúng với bất kỳ nhóm nào khác, cho dù đó có phải là một cặp stablecoin hay không (ví dụ: ETH/BTC).

Trong thế giới thực, mọi thứ đều được định giá dựa trên quy luật cung cầu. Điều này cũng đúng với AMM. Hiện tại, chúng ta sẽ đặt phần cầu sang một bên và tập trung vào nguồn cung.

Giá của các mã thông báo trong một nhóm được xác định bởi nguồn cung cấp mã thông báo, nghĩa là theo số lượng dự trữ của các mã thông báo mà nhóm đang nắm giữ. Giá mã thông báo chỉ đơn giản là mối quan hệ của dự trữ:

Trong đó PxPy là giá của các mã thông báo tính theo mã thông báo khác. Giá như vậy được gọi là giá giao ngay và chúng chỉ phản ánh giá thị trường hiện tại. Tuy nhiên, giá thực tế của một giao dịch được tính theo cách khác. Và đây là lúc chúng ta cần đưa phần nhu cầu trở lại.

Kết luận từ quy luật cung cầu, nhu cầu cao sẽ làm tăng giá – và đây là đặc tính mà chúng ta cần phải có trong một hệ thống không cần cấp phép. Chúng ta muốn giá cao khi nhu cầu cao và chúng ta có thể sử dụng dự trữ nhóm để đo lường nhu cầu: bạn càng muốn xóa nhiều mã thông báo khỏi nhóm (so với dự trữ của nhóm) thì tác động của nhu cầu càng cao.

Hãy quay lại công thức giao dịch và xem xét kỹ hơn:

Chúng ta có thể tính được ΔxΔy, có nghĩa là chúng ta có thể tính toán số tiền đầu ra của một giao dịch dựa trên số tiền đầu vào và ngược lại:

Trên thực tế, những công thức này giải phóng chúng ta khỏi việc tính giá! Chúng ta luôn có thể tìm thấy số tiền đầu ra bằng cách sử dụng công thức Δy (khi chúng ta muốn bán một lượng mã thông báo đã biết) và chúng ta luôn có thể tìm thấy số lượng đầu vào bằng cách sử dụng công thức Δx (khi chúng ta muốn mua một lượng mã thông báo đã biết). Lưu ý rằng mỗi công thức trong số này là mối quan hệ của dự trữ (x/y hoặc y/x) và chúng cũng xem xét số tiền giao dịch (Δx ở công thức trước và Δy ở công thức sau). Đây là những chức năng định giá tôn trọng cả cung và cầu. Và chúng ta thậm chí không cần tính giá!

Đường cong

Các tính toán trên có vẻ quá trừu tượng và khô khan. Hãy nhìn trực quan đồ thị của hàm tích không đổi để hiểu rõ hơn cách thức hoạt động của nó. Khi vẽ đồ thị, hàm tích không đổi là một hyperbol bậc hai:

Trong đó các trục là dự trữ nhóm. Mọi giao dịch bắt đầu tại điểm trên đường cong tương ứng với tỷ lệ dự trữ hiện tại. Để tính toán số lượng đầu ra, chúng ta cần tìm một điểm mới trên đường cong, có tọa độ là x+Δx, tức là dự trữ hiện tại của mã thông báo 0 + số lượng chúng tôi đang bán. Sự thay đổi trong y là số lượng mã thông báo 1 chúng tôi sẽ nhận được.

Hãy xem xét một ví dụ cụ thể:

  • Đường màu tím là đường cong, các trục là trữ lượng của một nhóm (lưu ý rằng chúng bằng nhau ở mức giá khởi điểm).
  • Giá khởi điểm là 1.
  • Chúng tôi đang bán 200 mã token0. Nếu chúng tôi chỉ sử dụng giá khởi điểm, chúng tôi hy vọng sẽ nhận được 200 mã token1.
  • Tuy nhiên, giá thực hiện là 0,666, vì vậy chúng tôi chỉ nhận được 133,333 của mã token1!
  • Ví dụ này là từ biểu đồ Desmos của Dan Robinson, một trong những người tạo ra Uniswap. Để xây dựng một trực giác tốt hơn về cách thức hoạt động của nó, hãy thử tạo ra các tình huống khác nhau và vẽ chúng trên biểu đồ. Hãy thử các mức dự trữ khác nhau, xem lượng đầu ra thay đổi như thế nào khi Δx nhỏ so với x.

Tôi cá là bạn đang thắc mắc tại sao lại sử dụng một đường cong như vậy? Có vẻ như nó trừng phạt bạn vì giao dịch số tiền lớn. Đây là sự thật, và đây là một đặc tính mà chúng ta mong muốn! Quy luật cung cầu cho chúng ta biết rằng khi nhu cầu cao (và nguồn cung không đổi) thì giá cũng cao. Và khi nhu cầu thấp, giá cũng thấp hơn. Đây là cách thị trường hoạt động. Và thật kỳ diệu, hàm tích không đổi thực hiện cơ chế này! Nhu cầu được xác định bởi số lượng bạn muốn mua và nguồn cung là dự trữ nhóm. Khi bạn muốn mua một số lượng lớn so với dự trữ chung, giá sẽ cao hơn so với khi bạn muốn mua một số lượng nhỏ hơn. Một công thức đơn giản như vậy vẫn đảm bảo một cơ chế mạnh mẽ như vậy!

Mặc dù Uniswap không tính toán giá giao dịch, nhưng chúng ta vẫn có thể thấy chúng trên đường cong. Đáng ngạc nhiên là có nhiều mức giá khi thực hiện giao dịch:

  • Trước khi giao dịch, có một mức giá giao ngay. Nó bằng với mối quan hệ của dự trữ, y/x hoặc x/y tùy thuộc vào hướng giao dịch. Giá này cũng chính là hệ số góc của tiếp tuyến tại điểm xuất phát.
  • Sau một giao dịch, sẽ có một mức giá giao ngay mới, tại một điểm khác trên đường cong. Và đó là hệ số góc của tiếp tuyến tại điểm mới này.
  • Giá thực tế của giao dịch là độ dốc của đường nối hai điểm!

Và đó là toàn bộ bài toán của Uniswap! Chà, đây là toán học của Uniswap V2 và chúng tôi đang nghiên cứu Uniswap V3. Vì vậy, trong phần tiếp theo, chúng ta sẽ xem toán học của Uniswap V3 khác biệt như thế nào.

Uniswap V3

Giới thiệu về Uniswap V3

Để hiểu rõ hơn về những đổi mới mà Uniswap V3 mang lại, trước tiên chúng ta hãy xem xét những điểm chưa hoàn hảo của Uniswap V2.

Uniswap V2 là một sàn giao dịch chung thực hiện một thuật toán AMM. Tuy nhiên, không phải tất cả các cặp giao dịch đều như nhau. Các cặp có thể được nhóm theo biến động giá:

  • Token có biến động giá trung bình và cao. Nhóm này bao gồm hầu hết các mã thông báo vì hầu hết các mã thông báo không có giá cố định và có thể thay đổi theo biến động của thị trường.
  • Token có độ biến động thấp. Nhóm này bao gồm các token được chốt, chủ yếu là stablecoin: USDC/USDT, USDC/DAI, USDT/DAI, v.v. Ngoài ra: ETH/stETH, ETH/rETH (các biến thể của ETH được bao bọc).

Các nhóm này yêu cầu khác nhau, hãy gọi chúng là cấu hình nhóm. Sự khác biệt chính là các mã thông báo được chốt yêu cầu tính thanh khoản cao để giảm hiệu ứng nhu cầu (chúng ta đã tìm hiểu về nó trong chương trước) đối với các giao dịch lớn. Giá của USDC và USDT phải ở gần 1, bất kể số lượng mã thông báo chúng tôi muốn mua và bán lớn đến mức nào. Do thuật toán AMM chung của Uniswap V2 không phù hợp lắm cho giao dịch stablecoin nên các AMM thay thế (chủ yếu là Curve) phổ biến hơn cho giao dịch stablecoin.

Điều gây ra vấn đề này là thanh khoản trong nhóm Uniswap V2 được phân phối vô hạn – tính thanh khoản nhóm cho phép giao dịch ở bất kỳ mức giá nào, từ 0 đến vô cùng:

Điều này có vẻ không phải là một điều xấu, nhưng điều này làm cho vốn sử dụng không hiệu quả. Giá lịch sử của một tài sản nằm trong một số phạm vi xác định, cho dù phạm vi đó hẹp hay rộng. Ví dụ: phạm vi giá lịch sử của ETH là từ $0,75 đến $4,800 (theo CoinMarketCap). Hôm nay (tháng 6 năm 2022, 1 ETH có giá 1.800 đô la), sẽ không có ai mua 1 ether với giá 5000 đô la, vì vậy việc cung cấp thanh khoản ở mức giá này là vô nghĩa. Do đó, việc cung cấp thanh khoản trong một phạm vi giá cách xa mức giá hiện tại hoặc sẽ không bao giờ đạt được là điều thực sự không hợp lý.

Tuy nhiên, tất cả chúng ta đều tin rằng ETH sẽ đạt 10.000 USD vào một ngày nào đó.

Thanh khoản tập trung (Concentrated Liquidity)

Uniswap V3 giới thiệu thanh khoản tập trung: các nhà cung cấp thanh khoản hiện có thể chọn phạm vi giá mà họ muốn cung cấp thanh khoản. Điều này cải thiện hiệu quả sử dụng vốn bằng cách cho phép đưa nhiều thanh khoản hơn vào một phạm vi giá hẹp, điều này làm cho Uniswap trở nên đa dạng hơn: giờ đây Uniswap có thể có các nhóm được định cấu hình cho các cặp có độ biến động khác nhau. Đây là cách V3 cải thiện V2.

Tóm lại, một cặp Uniswap V3 là nhiều cặp Uniswap V2 nhỏ. Sự khác biệt chính giữa V2 và V3 là ở V3, có nhiều mức giá trong một cặp. Và mỗi phạm vi giá ngắn hơn này có dự trữ hữu hạn. Toàn bộ phạm vi giá từ 0 đến vô hạn được chia thành các phạm vi giá ngắn hơn, với mỗi phạm vi giá có lượng thanh khoản riêng. Tuy nhiên, điều quan trọng là trong phạm vi giá ngắn hơn đó, nó hoạt động chính xác như Uniswap V2. Đây là lý do tại sao tôi nói rằng một cặp V3 là nhiều cặp V2 nhỏ.

Bây giờ, hãy thử hình dung nó. Điều chúng tôi đang nói là chúng tôi không muốn đường cong là vô hạn. Chúng tôi cắt nó tại các điểm a và b và nói rằng đây là các ranh giới của đường cong. Hơn nữa, chúng tôi dịch chuyển đường cong để các ranh giới nằm trên các trục. Đây là những gì chúng tôi nhận được:

Như chúng ta đã thấy trong chương trước, việc mua hoặc bán mã thông báo sẽ di chuyển giá dọc theo đường cong. Một phạm vi giá giới hạn sự chuyển động của giá. Khi giá di chuyển đến một trong hai điểm, nhóm sẽ cạn kiệt: một trong các dự trữ mã thông báo sẽ bằng 0 và việc mua mã thông báo này sẽ không thể thực hiện được.

Trên biểu đồ trên, giả sử rằng giá khởi điểm nằm ở giữa đường cong. Để đi đến điểm a, chúng ta cần mua tất cả y có sẵn và tối đa hóa x trong phạm vi; để đến điểm b, chúng ta cần mua tất cả x có sẵn và tối đa hóa y trong phạm vi. Tại những thời điểm này, chỉ có một mã thông báo trong phạm vi! Sự thật thú vị: Điều này cho phép sử dụng phạm vi giá Uniswap V3 như là các lệnh giới hạn (Limit order)!

Điều gì xảy ra khi phạm vi giá hiện tại bị cạn kiệt trong một giao dịch? Giá trượt vào phạm vi giá tiếp theo. Nếu phạm vi giá tiếp theo không tồn tại, giao dịch sẽ kết thúc một phần được thực hiện-chúng ta sẽ thấy điều này hoạt động như thế nào ở phần sau của cuốn sách.

Đây là cách thanh khoản được lan truyền trong nhóm USDC/ETH trong môi trường Mainnet:

Bạn có thể thấy rằng có rất nhiều thanh khoản xung quanh mức giá hiện tại nhưng càng xa mức giá đó thì càng ít thanh khoản hơn – điều này là do các nhà cung cấp thanh khoản cố gắng sử dụng vốn hiệu quả hơn. Ngoài ra, toàn bộ phạm vi không phải là vô hạn, ranh giới trên của nó được hiển thị trên hình ảnh.

Toán học của Uniswap V3

Về mặt toán học, Uniswap V3 dựa trên V2: nó sử dụng các công thức giống nhau, nhưng chúng ta hãy gọi nó là công thức tăng cường.

Để xử lý việc chuyển đổi giữa các phạm vi giá, đơn giản hóa việc quản lý thanh khoản và tránh lỗi làm tròn, Uniswap V3 sử dụng các khái niệm mới sau:

L là lượng thanh khoản. Tính thanh khoản trong một nhóm là sự kết hợp của lượng dự trữ của 2 mã thông báo. Chúng ta biết rằng tích của chúng là k, và chúng ta có thể sử dụng điều này để rút ra thước đo tính thanh khoản, là xy – một số mà khi nhân với chính nó sẽ bằng k. L là giá trị trung bình hình học của x và y.

y/x là giá của mã token0 theo token1. Vì giá mã thông báo trong nhóm là nghịch đảo của nhau, nên chúng tôi chỉ cần sử dụng một trong số chúng trong phép tính (và theo quy ước Uniswap V3 sử dụng y/x). Giá của token1 tính theo token0 chỉ đơn giản là:

Tại sao sử dụng √p (Căn bậc 2 của p) thay vì p? Có hai lý do:

  1. Tính toán căn bậc hai không chính xác và gây ra lỗi làm tròn. Do đó, việc lưu trữ căn bậc hai mà không tính toán nó trong hợp đồng sẽ dễ dàng hơn (chúng tôi sẽ không lưu trữ x và y trong hợp đồng).
  2. P có mối liên hệ thú vị với L: L cũng là mối quan hệ giữa thay đổi về lượng đầu ra và thay đổi về P (Xem ảnh dưới)

Giá các mã thông báo

Một lần nữa, chúng ta không cần tính giá thực tế – chúng ta có thể tính toán sản lượng ngay lập tức. Ngoài ra, vì chúng tôi sẽ không theo dõi và lưu trữ x và y, tính toán của chúng tôi sẽ chỉ dựa trên L và P.

Từ công thức trên, chúng ta có thể tìm được Δy:

Như chúng ta đã thảo luận ở trên, giá trong một nhóm là đối ứng của nhau. Do đó, ∆x là:

L và √P cho phép chúng tôi không lưu trữ và cập nhật dự trữ nhóm. Ngoài ra, chúng ta không cần tính √P mỗi lần vì chúng ta luôn có thể tìm được Δ√P và nghịch đảo của nó.

Ticks

Như chúng ta đã biết trong chương này, phạm vi giá vô hạn của V2 được chia thành các phạm vi giá ngắn hơn trong V3. Mỗi phạm vi giá ngắn hơn này được giới hạn bởi ranh giới–điểm trên (upper point) và điểm dưới (lower point). Để theo dõi tọa độ của các ranh giới này, Uniswap V3 sử dụng Tick.

Trong V3, toàn bộ phạm vi giá được phân định bằng các Tick riêng biệt được phân bổ đều. Mỗi đánh dấu có một chỉ số và tương ứng với một mức giá nhất định:

Trong đó p(i) là giá tại Tick thứ i. Lấy lũy thừa 1,0001 có một thuộc tính mong muốn: sự khác biệt giữa hai dấu tick liền kề là 0,01% hoặc 1 điểm cơ bản (Basis point). Điểm cơ bản (1/100 của 1%, hoặc 0,01%, hoặc 0,0001) là một đơn vị đo tỷ lệ phần trăm trong tài chính. Bạn có thể đã nghe về điểm cơ bản khi các ngân hàng trung ương công bố những thay đổi về lãi suất.

Như chúng ta đã thảo luận ở trên, Uniswap V3 lưu trữ √P chứ không phải P. Do đó, công thức trên thực tế là:

Vì vậy, chúng tôi nhận được các giá trị như:

Số Tick là số nguyên có thể dương và âm và tất nhiên, chúng không phải là vô hạn. Uniswap V3 lưu trữ √P dưới dạng số Q64.96 điểm cố định, là một số hữu tỉ sử dụng 64 bit cho phần nguyên và 96 bit cho phần phân số. Do đó, giá (bằng bình phương của √P) nằm trong phạm vi:

Để tìm hiểu sâu hơn về toán học của Uniswap V3, tôi không thể nhưng tôi xin giới thiệu tài liệu kỹ thuật của Atis Elsts để bạn tham khảo: LIQUIDITY MATH IN UNISWAP V3

Môi trường phát triển

Chúng tôi sẽ xây dựng hai ứng dụng:

  • Một ứng dụng on-chain: một tập hợp các hợp đồng thông minh được triển khai trên Ethereum.
  • Một ứng dụng off-chain: một ứng dụng giao diện người dùng sẽ tương tác với các hợp đồng thông minh.

Mặc dù việc phát triển ứng dụng giao diện người dùng là một phần của cuốn sách này, nhưng nó sẽ không phải là trọng tâm chính của chúng tôi. Chúng tôi sẽ xây dựng nó chỉ để chứng minh cách các hợp đồng thông minh được tích hợp với các ứng dụng giao diện người dùng. Do đó, ứng dụng giao diện người dùng là tùy chọn, nhưng tôi vẫn sẽ cung cấp mã.

Giới thiệu nhanh về Ethereum

Ethereum là một chuỗi khối cho phép mọi người chạy các ứng dụng trên đó. Nó có thể trông giống như một nhà cung cấp đám mây, nhưng có nhiều điểm khác biệt:

  • Bạn không phải trả tiền cho việc lưu trữ ứng dụng của bạn. Nhưng bạn trả tiền cho việc triển khai.
  • Ứng dụng của bạn là bất biến. Đó là: bạn sẽ không thể sửa đổi nó sau khi nó được triển khai.
  • Người dùng sẽ trả tiền để sử dụng ứng dụng của bạn.

Để hiểu rõ hơn về những vấn đề này, hãy xem Ethereum được tạo ra từ gì. Phần cốt lõi (Core) của Ethereum (và bất kỳ chuỗi khối nào khác) là cơ sở dữ liệu. Dữ liệu có giá trị nhất trong cơ sở dữ liệu của Ethereum là trạng thái của các tài khoản. Tài khoản là một địa chỉ Ethereum với dữ liệu được liên kết:

  • Số dư: Số dư ether của tài khoản.
  • : Mã byte của hợp đồng thông minh được triển khai tại địa chỉ này.
  • Lưu trữ: Không gian được sử dụng bởi các hợp đồng thông minh để lưu trữ dữ liệu.
  • Nonce: Một số nguyên sê-ri được sử dụng để bảo vệ chống lại các cuộc tấn công lặp lại.

Công việc chính của Ethereum là xây dựng và duy trì dữ liệu này theo cách an toàn, không cho phép truy cập trái phép.

Ethereum cũng là một mạng, một mạng máy tính xây dựng và duy trì trạng thái độc lập với nhau. Mục tiêu chính của mạng là phân cấp quyền truy cập vào cơ sở dữ liệu: không được có một cơ quan duy nhất nào được phép đơn phương sửa đổi bất kỳ thứ gì trong cơ sở dữ liệu. Điều này đạt được bằng một phương tiện đồng thuận, đó là một bộ quy tắc mà tất cả các nút trong mạng tuân theo. Nếu một bên quyết định lạm dụng quy tắc, thì quy tắc đó sẽ bị loại khỏi mạng.

<Đang cập nhật>

Tham khảo:

Bài viết này có hữu ích với bạn?

Kích vào một biểu tượng ngôi sao để đánh giá bài viết!

Xếp hạng trung bình 5 / 5. Số phiếu: 88

Bài viết chưa có đánh giá! Hãy là người đầu tiên đánh giá bài viết này.

Trả lời

Giao diện bởi Anders Norén