Skip to main content

Những thách thức đối với các nhà phát triển ứng dụng trên Cardano

Ngày 23 tháng 10 năm 2023 - Chia sẻ bài viết này trên Twitter | FacebookTelegram

Các nhà phát triển ứng dụng có thể khó tận dụng tối đa mô hình UTxO vì họ phải tính đến tính năng song song hóa. Cardano không cho phép duy trì một trạng thái ứng dụng toàn cầu riêng lẻ trong phần on-chain của hợp đồng thông minh. Mỗi UTxO có thể đại diện cho một phần trạng thái của ứng dụng và có thể được xử lý độc lập và song song. Về mặt lý thuyết, điều này cho phép thông lượng và khả năng mở rộng cao hơn, nhưng ứng dụng phải giải quyết những vấn đề phức tạp liên quan đến việc quản lý các giao dịch đồng thời. Vậy các nhà phát triển ứng dụng phải đối mặt với những thách thức gì trên Cardano?

Khi việc song song hóa dễ dàng

Trong mô hình Đầu ra giao dịch chưa chi tiêu mở rộng (eUTxO), mỗi UTxO có thể được xử lý độc lập và song song. Việc chi tiêu UTxO không phụ thuộc vào bất kỳ trạng thái toàn cầu nào trên Cardano. Nếu các điều kiện chi tiêu được đáp ứng, một hoặc nhiều UTxO đầu ra sẽ được tạo thông qua giao dịch từ một hoặc nhiều UTxO đầu vào. Các UTxO đầu vào phải được chi tiêu hoàn toàn một lần. Các UTxO đầu ra phải có giá trị nhỏ hơn hoặc bằng với các UTxO đầu vào.

Nếu Alice gửi 100 ADA cho Bob thì việc chi tiêu UTxO chỉ phụ thuộc vào Chứng thực (witness) của Alice. Nếu một trăm người dùng khác gửi một giao dịch tương tự thì 100 UTxO đầu vào riêng lẻ khác sẽ được sử dụng. Mỗi người gửi giao dịch là chủ sở hữu của UTxO đầu vào. Không có sự phụ thuộc giữa các giao dịch và UTxO đầu vào.

Không có sự phụ thuộc giữa các giao dịch và UTxO đầu vào vì tất cả người gửi đều độc lập với nhau. Họ đã đưa ra quyết định độc lập của riêng mình là gửi 100 ADA. Tất cả 100 giao dịch có thể được chèn vào cùng một khối và sẽ được đánh giá là hợp lệ.

Một giao dịch sử dụng một hoặc nhiều UTxO làm đầu tạo ra một hoặc nhiều UTxO mới làm đầu ra. Quy tắc đơn giản này ứng dụng cho cả việc chuyển giao giá trị giữa Alice và Bob cũng như trong trường hợp các ứng dụng, như bạn sẽ thấy sau.

Trong hình, bạn thấy 3 giao dịch giống hệt nhau. Với 100 giao dịch, nó sẽ trông giống nhau. Đừng nhầm lẫn khi người gửi luôn là Alice và người nhận là Bob. Mỗi lần lại là một Alice khác và một Bob khác. Hình này nhằm chứng minh thực tế là không cần đồng bộ hóa giữa những người gửi giao dịch. Nếu các giao dịch hợp lệ, chúng không thể thất bại và tất cả đều được đưa vào Blockchain.

Bạn có thể nhận ra ý nghĩa của bức tranh sau khi chúng ta giải thích cách hoạt động của DEX.

Mạng Cardano có thể xác thực các giao dịch theo bất kỳ thứ tự nào vì các giao dịch độc lập với nhau. Đây là một lợi thế xét từ quan điểm thông lượng mạng vì sự đồng thuận không phụ thuộc vào việc xử lý tuần tự.

Làm cách nào để tạo một ứng dụng song song?

Lý tưởng nhất là các nhà phát triển ứng dụng nên tạo logic hợp đồng thông minh hoạt động song song tương tự như khi 100 người gửi (Alices) gửi giao dịch. Tuy nhiên, điều này gần như là không thể.

Hãy làm rõ điều này bằng một ví dụ về DEX sử dụng pool thanh khoản.

Pool thanh khoản được lấp đầy bởi nhiều giao dịch tạo ra UTxO đầu ra. Các UTxO này đại diện cho các token trong pool thanh khoản. Với mỗi khối mới được thêm vào sổ cái, thành phần của UTxO trong pool thanh khoản có thể thay đổi.

Trong hình, bạn thấy pool thanh khoản có một cặp token X và Y. Trong pool thanh khoản, có một số UTxO có token X và Y. Trong khối tiếp theo, Alice, Bob và Carol đặt UTxO mới bằng token X vào pool thanh khoản và Dave, Eve và Frank đưa một số UTxO bằng token Y. Vì không có trao đổi nào xảy ra nên không có UTxO nào bị xóa khỏi pool.

Để thực hiện hoán đổi, DEX phải chi tiêu UTxO (hoặc nhiều UTxO) từ pool thanh khoản làm đầu vào cho từng loại token. Những UTxO này phải được sử dụng hoàn toàn. Nếu hoán đổi không yêu cầu tất cả các token trong UTxO thì các token còn lại phải được trả lại pool thanh khoản dưới dạng UTxO mới.

Trong trường hợp của DEX, nhiều hoạt động đang diễn ra đồng thời. Người dùng gửi token (nhà cung cấp thanh khoản) đến pool thanh khoản. Nhà cung cấp là người gửi và DEX là người nhận. Đồng thời, những người dùng khác có thể gửi yêu cầu hoán đổi. Họ là những người gửi token X cho DEX và muốn nhận token Y. Hoặc ngược lại.

Nhiều người tham gia có thể gửi yêu cầu hoán đổi trong một khoảng thời gian ngắn. Các giao dịch hoán đổi này có thể liên quan đến một pool thanh khoản riêng lẻ. Vì vậy, có sự phụ thuộc lẫn nhau giữa những người tham gia.

Bạn cũng nên làm rõ chính xác DEX là gì. Hợp đồng thông minh phức tạp trong Cardano (như DEX) bao gồm hai phần: logic on-chain được thực thi trên Blockchain và logic off-chain được thực thi trên máy chủ (hoặc trong ví cục bộ).

Trong hình, bạn có thể thấy DEX bao gồm logic on-chain và off-chain.

Mặc dù việc thực thi logic on-chain được Phi tập trung một cách tự nhiên khi nó diễn ra trong mạng Cardano, nhưng pool chịu trách nhiệm Phi tập trung logic off-chain của DEX. Phần off-chain của DEX không chỉ bao gồm (không nên) chỉ một tác nhân mà là một số tác nhân.

Trong trường hợp DEX, những tác nhân này được gọi là batchers (Giao dịch theo lô). Họ chịu trách nhiệm thực hiện các giao dịch hoán đổi. Người bán hàng tạo ra các giao dịch đáp ứng các điều kiện chi tiêu UTxO trong pool thanh khoản và chuyển tài sản theo tỷ lệ mà cả hai người tham gia hoán đổi yêu cầu.

Cardano không cho phép duy trì trạng thái ứng dụng toàn cầu đồng nhất (uniform global application state) trong phần on-chain của hợp đồng thông minh. Tuy nhiên, về mặt kỹ thuật thì điều đó là có thể.

Nếu các nhà phát triển lưu trữ toàn bộ trạng thái của dApps trong một UTXO duy nhất, thì về cơ bản là họ đã tạo ra một trạng thái tổng thể (global state) tương tự như những gì tồn tại trong mô hình dựa trên tài khoản của Ethereum. Nhưng điều này có thể sẽ hạn chế tính đồng thời và thông lượng của dApps của bạn. Cách tiếp cận này sẽ không phát huy hết lợi ích của mô hình EUTxO.

Trong phần on-chain của DEX, UTxO và Datum liên quan đại diện cho trạng thái ứng dụng. Do đó, trạng thái được phân bổ trên các UTxO. Nếu DEX muốn có trạng thái ứng dụng toàn cầu đồng nhất thì nó phải được duy trì off-chain trên các bộ xử lý.

Trong hình, bạn có thể thấy pool thanh khoản với các token X và Y và 3 bộ Batcher. Trạng thái ứng dụng toàn cầu và đồng bộ hóa trạng thái giữa các bộ xử lý được biểu thị bằng màu xanh lam. Trạng thái ứng dụng bao gồm dữ liệu on-chain là Datums được liên kết với UTxO và trạng thái ứng dụng off-chain được duy trì bởi bộ xử lý (tác nhân). Các bộ xử lý giao tiếp với nhau để đồng bộ hóa trạng thái ứng dụng toàn cầu đồng nhất.

Điều này là cần thiết bởi vì các nhà phân phối (tác nhân) truy cập vào cùng một tài nguyên và đó là pool thanh khoản. Họ cần sử dụng UTxO đầu vào từ pool thanh khoản (để thực hiện hoán đổi) và có thể xảy ra trường hợp hai (hoặc nhiều) tác nhân muốn sử dụng cùng một UTxO. Một vấn đề tranh chấp có thể xảy ra.

Bây giờ là lúc bạn nhớ lại ví dụ đầu tiên trong bài viết. Khi 100 người gửi gửi giao dịch, họ không cần cạnh tranh với nhau để dùng cùng một UTxO, vì mỗi người gửi đều sử dụng UTxO của riêng họ. UTxO trong pool thanh khoản là tài nguyên được chia sẻ, tức là tài nguyên được nhiều tác nhân truy cập.

Nói chung, tranh chấp đề cập đến tình huống trong đó nhiều luồng hoặc tiến trình (trong trường hợp của chúng ta là tác nhân) đang cố gắng truy cập vào cùng một tài nguyên theo cách mà ít nhất một trong số chúng chạy chậm hơn so với khi những luồng khác không chạy.

Trong trường hợp của chúng ta, có nguy cơ hai tác nhân sẽ xây dựng một giao dịch trong đó họ sử dụng cùng một UTxO đầu vào từ pool thanh khoản. Trong trường hợp này, Cardano chỉ chấp nhận một giao dịch. Cái thứ hai thất bại.

Trong hình, bạn có thể thấy rằng Batcher 1 và Batcher 3 đang cố gắng sử dụng cùng một UTxO với token X. tính đồng thời đã xảy ra. Các bộ điều phối dường như được đồng bộ hóa kém và không biết ý định sử dụng UTxO cụ thể này của nhau. Nếu 2 giao dịch hoán đổi được xây dựng thì một giao dịch sẽ thành công và giao dịch còn lại sẽ thất bại.

Mục tiêu của DEX là cho phép các giao dịch hoán đổi được thực hiện đồng thời, tức là để các tác nhân riêng lẻ có thể xây dựng các giao dịch đồng thời và tính đồng thời không xảy ra khi họ chọn UTxO.

Để ngăn giao dịch không thành công, phải có liên lạc off-chain giữa các tác nhân hoặc một số hình thức đồng bộ hóa khác. Nói cách khác, các tác nhân này phải duy trì trạng thái tổng thể nhất quán của DEX.

Các tác nhân riêng lẻ bằng cách nào đó phải dự trữ UTxO trong pool để tác nhân khác không sử dụng cùng một UTxO. Ngoài ra, nó có thể hoạt động theo cách trong mỗi khối tiếp theo (20 giây), tất cả các giao dịch sẽ được xây dựng bởi một tác nhân riêng lẻ (được chọn ngẫu nhiên). Mặc dù cách tiếp cận này được Phi tập trung nhưng nó ít đồng thời hơn.

Bạn có thể thấy trong hình rằng Batcher 1 và Batcher 3 đã chọn UTxO với token X và Y theo kiểu độc quyền để hoán đổi nên không có tranh chấp. Hoán đổi 1 và 2 chạy đồng thời. Không có tính đồng thời vì tất cả các bộ phân phối đã đồng bộ hóa trạng thái tổng thể với nhau.

Lưu ý rằng token X có giá trị chính xác gấp đôi giá cả thị trường của token Y và trùng hợp là có UTxO phù hợp trong pool thanh khoản để ghép nối. Hoán đổi 1 chi tiêu 100 token X và 50 token Y. Hoán đổi 2 chi tiêu 200 token X và 100 token Y. Nếu không có UTxO với 100 token X trong pool thì phù hợp thứ hai sẽ là UTxO với 114 token X. Điều này có nghĩa là 14 token X sẽ phải được trả lại pool thanh khoản dưới dạng UTxO mới.

Một trong những thách thức khác sẽ chưa được thảo luận thêm trong bài viết này là việc lựa chọn UTxO thích hợp cho các giao dịch hoán đổi. Với Ethereum, đây không phải là vấn đề gì lớn vì với Ethereum chỉ có số dư tài khoản được cập nhật.

Có thể nghĩ về vấn đề theo một cách hoàn toàn khác so với việc sử dụng pool thanh khoản. Thay vì đặt UTxO vào một pool, có thể kết nối các ứng cử viên hoán đổi riêng lẻ. Tuy nhiên, để đơn giản, chúng ta hãy tập trung vào pool thanh khoản trong bài viết này.

Thiết kế DEX trên Cardano có thể xử lý song song UTxO trong khi duy trì tính Phi tập trung liên quan đến việc giải quyết vấn đề đồng thời. Đây là một trong những thách thức đối với các nhà phát triển.

Trong bài viết, chúng ta đã chỉ ra một trong những giải pháp khả thi, tức là sử dụng các thành phần off-chain và on-chain. Thành phần off-chain có thể được sử dụng để hình thành chính xác các giao dịch nhằm tương tác với mã on-chain. Tính chính xác được đảm bảo thông qua giao tiếp off-chain cho phép đồng bộ hóa trạng thái tổng thể của ứng dụng.

Một trong những cách tiếp cận khả thi khác là tạo ra một thuật toán cung cấp cho người dùng quyền truy cập độc quyền để gửi hành động mong muốn. Thuật toán sau đó có thể hợp nhất tất cả các hành động lại với nhau, tôn trọng thời gian và sự công bằng.

Các nhà phát triển có thể duy trì một trạng thái riêng lẻ trong phần on-chain của ứng dụng hoặc chia nó thành nhiều UTxO. Dễ dàng có một trạng thái on-chain riêng lẻ vì việc duy trì tính nhất quán dễ dàng hơn. Tất cả các phần của ứng dụng đều hoạt động với cùng một dữ liệu. Việc chia nhỏ trạng thái on-chain trên nhiều UTXO có thể làm tăng tính đồng thời nhưng nó đi kèm với một số thách thức. Việc quản lý nhiều UTxO làm tăng thêm độ phức tạp cho logic hợp đồng thông minh. Cần phải đảm bảo một số hình thức đồng bộ hóa để đảm bảo tính chính xác (tránh tranh chấp).

Cốt lõi của vấn đề nằm ở việc đạt được sự song song trong một môi trường phi tập trung.

Logic ứng dụng luôn được liên kết với UTxO. Mỗi UTxO đại diện cho một phần trạng thái độc lập có thể được xử lý song song. Như chúng ta đã giải thích trong bài viết, điều này chỉ có thể thực hiện được nếu một số hình thức đồng bộ hóa đáng tin cậy được triển khai.

Nếu chỉ có một batchers hoặc tác nhân off-chain, nó có thể quản lý trạng thái của DEX và chuẩn bị các giao dịch mà không phải lo lắng về các vấn đề đồng thời. Điều này có thể nói dẫn đến xử lý giao dịch nhanh hơn và thông lượng cao hơn.

Tuy nhiên, cách tiếp cận này về cơ bản sẽ tập trung hóa phần off-chain của DEX, đi ngược lại nguyên tắc Phi tập trung. Do đó, thách thức là đạt được sự Phi tập trung off-chain trong khi vẫn duy trì hiệu suất cao và tránh các vấn đề tranh chấp.

Các nhà phát triển Ethereum cũng phải đối mặt với những thách thức nào?

Ethereum sử dụng mô hình dựa trên tài khoản và hợp đồng thông minh có trạng thái tổng thể (global state) được cập nhật theo giao dịch. Trạng thái tổng thể là mã (hàm) và dữ liệu (trạng thái) cư trú tại một địa chỉ cụ thể trên blockchain Ethereum.

Trạng thái tổng thể của DEX có thể đại diện cho trạng thái hiện tại của danh sách lệnh (order book), bao gồm tất cả các lệnh mua và bán đang mở. Khi một giao dịch hoán đổi mới được gửi đi, nó thể hiện một sự thay đổi tiềm ẩn đối với trạng thái tổng thể này. Tuy nhiên, thay đổi này chỉ được chấp nhận khi giao dịch được đưa vào một khối và được mạng xác thực.

Các giao dịch trong Ethereum được xử lý tuần tự, từng giao dịch một. Điều này có nghĩa là không có tính đồng thời trong blockchain Ethereum, do đó không có vấn đề tranh chấp. Quá trình xử lý tuần tự này giúp việc thiết kế DEX trên Ethereum trở nên đơn giản hơn khi nói đến tính đồng thờisong song vì các nhà phát triển không phải đối mặt với sự phức tạp của việc quản lý các giao dịch đồng thời.

Tuy nhiên, xác thực tuần tự này không khai thác được tính đồng thời. Việc thực hiện các giao dịch song song sẽ không an toàn vì có thể có sự phụ thuộc giữa các hợp đồng. Nếu một hợp đồng phụ thuộc vào kết quả của một hợp đồng khác thì các hợp đồng đó phải được thực hiện theo cùng một thứ tự bởi mọi người xác thực.

Thứ tự của các giao dịch trong một khối của Ethereum lại được xác định bởi người xác thực. Họ có thể lụa chọn và sắp xếp các giao dịch dựa trên các yếu tố như mức phí GAS, số lần sử dụng hoặc giao dịch đến sớm. Do đó, mặc dù DEX có thể tạo một hàng gồm nhiều giao dịch hoán đổi nhưng không ai có thể chắc chắn các giao dịch hoán đổi này sẽ được thực hiện theo thứ tự nào.

Sự không chắc chắn này có thể dẫn đến tình huống giao dịch thất bại do điều kiện cạnh tranh, trong đó các giao dịch khác nhau cạnh tranh để chi tiêu cùng một thanh khoản. Để xử lý vấn đề này, một số DEX triển khai các cơ chế như khả năng chịu trượt giá (slippage) và thời hạn giao dịch để tăng khả năng thực hiện giao dịch thành công.

Tình trạng đua tranh có thể xảy ra khi nhiều người dùng cố gắng trao đổi token cùng một lúc. Ví dụ: giả sử cả hai người dùng đều muốn đổi ETH lấy USDT và chỉ có đủ USDT trong pool thanh khoản để một trong các giao dịch hoán đổi được thực hiện. Cả hai người dùng đều gửi giao dịch hoán đổi của họ gần như cùng một lúc. Người xác thực Ethereum sẽ có quyền quyết định thứ tự đưa các giao dịch này vào một khối.

Nếu giao dịch của người dùng A được đưa vào trước, giao dịch hoán đổi của họ sẽ được thực hiện và sẽ không còn đủ USDT trong pool cho giao dịch hoán đổi của người dùng B. Khi mạng Ethereum cố gắng xử lý giao dịch của người dùng B, nó sẽ thất bại vì không thể thực hiện hoán đổi.

Kết quả phụ thuộc vào thời gian tương đối của hai hoặc nhiều thao tác (hoán đổi). Mặc dù Ethereum xử lý các giao dịch một cách tuần tự, nhưng điều kiện cạnh tranh vẫn có thể xảy ra khi nhiều giao dịch phụ thuộc vào một tài nguyên được chia sẻ (như pool thanh khoản trong DEX) và được gửi cùng một lúc.

Lưu ý rằng tình trạng chạy đua có thể xảy ra ngay cả khi pool thanh khoản chỉ được quản lý bởi một DEX. Điều này là do tình trạng chạy đua không phải do chính DEX gây ra mà do bản chất của quá trình xử lý giao dịch.

Nói cách khác, các ứng dụng trên Ethereum có thể ưu tiên một số thứ tự xử lý giao dịch, nhưng điều này không thuộc quyền kiểm soát của chính chúng. Trong trường hợp của Cardano, các giao dịch được xử lý trên cơ sở ai đến trước được phục vụ trước. Tuy nhiên, cần phải đề cập rằng các pool không phải tuân theo quy tắc này và không có cơ chế nào buộc pool phải chọn các giao dịch từ mem-pool một cách chính xác.

Hãy so sánh ngắn gọn những thách thức đối với các nhà phát triển trên cả hai nền tảng.

Khi xây dựng DEX hoặc bất kỳ ứng dụng phi tập trung nào khác trên Cardano, một trong những thách thức là quản lý và đồng bộ hóa các phần trạng thái trên nhiều UTXO và tác nhân. Điều này cho phép thông lượng và khả năng mở rộng cao hơn nhưng cũng gây ra sự phức tạp bổ sung liên quan đến việc quản lý các giao dịch đồng thời.

Ứng dụng có thể quản lý và cập nhật trạng thái off-chain của nó, sau đó đưa trạng thái đó vào Blockchain theo định kỳ. Cách tiếp cận này có thể giúp giảm tải cho Blockchain và tăng tốc độ giao dịch. Hơn nữa, đồng bộ hóa off-chain cũng có thể tạo điều kiện thực hiện song song các giao dịch on-chain. DEX có thể chuẩn bị song song nhiều giao dịch và sau đó gửi chúng tới Blockchain để thực hiện.

Đồng bộ hóa nhanh off-chain có thể nói dẫn đến khả năng mở rộng cao và tính song song on-chain. Các nhà phát triển cố gắng đạt được khả năng song song hóa tối đa có thể thông qua đồng bộ hóa.

Điều này khác với mô hình dựa trên tài khoản của Ethereum, trong đó trạng thái của toàn bộ ứng dụng được lưu trữ ở một trạng thái tổng thể riêng lẻ. Trạng thái tổng thể có thể lưu giữ tất cả dữ liệu cần thiết cho DEX và những thay đổi thông qua giao dịch. Vì Ethereum xử lý các giao dịch (cuộc gọi) một cách tuần tự nên các nhà phát triển hoàn toàn không phải lo lắng về tính đồng thời.

Tuy nhiên, vấn đề của Ethereum lại là một số dạng song song được thể hiện qua hành vi của người dùng có thể cố gắng chi tiêu cùng một thanh khoản trong DEX trên Ethereum. Về cơ bản, họ đang đấu tranh để giành lấy một nguồn tài nguyên riêng lẻ tương tự như những người phân phối có thể muốn sử dụng cùng một UTxO.

Các nhà phát triển Ethereum DEX không thể ngăn chặn hoàn toàn các điều kiện chạy đua liên quan đến nhiều người dùng cố gắng chi tiêu cùng một thanh khoản. Trạng thái của pool thanh khoản (tức là mức thanh khoản sẵn có) được xác định bởi các giao dịch đã được đưa vào Blockchain. Người dùng không biết trong thời gian thực liệu giao dịch của họ có thành công hay không vì Ethereum xử lý các giao dịch một cách tuần tự và thứ tự được quyết định bởi người xác thực.

Các nhà phát triển trên nền tảng Ethereum có thể cố gắng tạo ra một số cơ chế để ngăn người dùng gửi giao dịch với khá năng thất bại cao. Tuy nhiên, đây là một nhiệm vụ rất khó khăn.

Lưu ý rằng, cách thức sắp xếp và xử lý giao dịch của Cardano không giống như Ethereum.

Lời kết

Để tận dụng tối đa mô hình UTxO và khả năng song song hóa, cần phải cải thiện Bằng chứng cổ phần của Ouroboros. Mạng Cardano phải có thể nói xác thực và phê duyệt trước một số lượng lớn giao dịch cùng một lúc. Nếu cứ sau 20 giây lại có vài chục giao dịch được chèn vào khối thì việc có thể xử lý các giao dịch song song cũng chưa thành vấn đề gì lớn đối với Cardano. Tuy nhiên, khả năng mở rộng vẫn sẽ tương đối thấp. Input Endorsers sẽ mang lại sự cải thiện cần thiết về sự đồng thuận PoS, trong đó mô hình UTxO sẽ tỏa sáng hơn đáng kể.

Nguồn bài viết tại đây


Picture


Đọc thêm các bài viết liên quan tại thẻ Tags bên dưới