Skip to main content

Tìm hiểu về Mem-Pool của Cardano

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

Mem-pool là nơi các giao dịch chờ trước khi được chèn vào một khối. Mỗi node sản xuất khối cần duy trì mem-pool của riêng nó. Node có quyền kiểm soát mem-pool là một lợi thế có thể bị lạm dụng. Trong bài viết, bạn sẽ tìm hiểu mem-pool được sử dụng để làm gì. Chúng tôi sẽ giải thích cách hoạt động của một cuộc tấn công front-running.

Mem-Pool là gì?

Trong mạng phân tán, không có điểm trung tâm nào kiểm soát việc sản xuất các khối. Trong mạng Cardano, một node (slot leader) được chọn ngẫu nhiên khoảng 20 giây một lần và có quyền đúc một khối mới. Các nhà sản xuất khối (hoặc pool) có mặt trên khắp thế giới và một pool mới có thể được tạo ra bất kỳ lúc nào và ở bất kỳ đâu.

Khi người dùng gửi một giao dịch tới mạng, giao dịch đó phải được phát tán tới tất cả các pool. Điều này là do không biết trước Slot leader nào sẽ được rút thăm ở vòng tiếp theo. Trong trường hợp lý tưởng, giao dịch đến được tất cả các node, do đó có thể nói Slot leader tiếp theo sẽ chèn nó vào một khối mới.

Tại bất kỳ thời điểm nào, người dùng trên toàn thế giới đều gửi giao dịch. Các node xác thực các giao dịch, nhưng đó là điều duy nhất chúng có thể làm với chúng tại một thời điểm nhất định. Nếu các giao dịch hợp lệ, chúng phải đợi ở đâu đó trước khi được chèn vào một khối mới.

Mem-pool đóng vai trò như một kiểu phòng chờ cho các giao dịch trước khi chúng được thêm vào sổ cái.

Bạn có thể coi mem-pool như một bộ nhớ tạm thời trên mỗi node nơi các giao dịch được lưu trữ tạm thời trước khi chúng đi vào khối. Khi các giao dịch được đưa vào khối, chúng sẽ được lưu trữ vĩnh viễn trong sổ cái (trừ khi Blockchain được tổ chức lại).

Mỗi pool (node) có thể có thành phần khác nhau của mem-pool vì chúng nhận giao dịch theo một thứ tự khác nhau.

Nếu Alice từ Châu Âu, Bob từ Hoa Kỳ và Carol từ Trung Quốc gửi giao dịch cùng lúc, các node ở các khu vực khác nhau trên thế giới sẽ nhận được giao dịch theo thứ tự khác nhau.

Trong hình, bạn có thể thấy 3 người dùng đã gửi giao dịch cùng một lúc. Mỗi người dùng sử dụng một node khác nhau (ví dụ: vì họ sử dụng một ví nhẹ khác nhau). Mỗi giao dịch đạt đến node gần nhất, node này sẽ chèn nó vào mem-pool của nó. Các node sau đó sẽ phát giao dịch tới các node mạng ngang hàng. Tùy thuộc vào chất lượng kết nối mạng, các giao dịch rất có thể đến các node theo một thứ tự khác. Các node mạng ngang hàng xác thực các giao dịch và đặt chúng vào mem-pool nơi các giao dịch khác đang chờ. Như bạn có thể thấy, mỗi mem-pool trông rất khác nhau. Tất cả các pool ghi nhớ chứa tất cả các giao dịch đã được gửi nhưng theo một thứ tự khác.

Để đơn giản, các node relayer không được vẽ trong hình này.

Các giao dịch có sẵn trong pool ghi nhớ trên tất cả các node, vì vậy việc node nào trở thành Slot leader tiếp theo không quan trọng. Nếu các giao dịch vừa với khối mới, tất cả chúng sẽ được chèn vào đó.

Trong hình, bạn có thể thấy node 1 đã được bầu làm slot leader. Node 1 nhận tất cả các giao dịch từ pool ghi nhớ và chèn chúng vào một khối mới. Node 1 đúc một khối mới và thêm nó vào sổ cái của nó. Node 1 phát khối tới các node mạng ngang hàng (node 2 và node 3). Các node ngang hàng chưa biết về khối mới nên các giao dịch vẫn nằm trong mem-pool của họ.

Trong hình, bạn có thể thấy node 2 và node 3 đã nhận được một khối mới từ node 1. Node 2 và 3 đã xác thực khối và thêm nó vào sổ cái của chúng. Trong quá trình này, các node này đã xóa khỏi pool ghi nhớ những giao dịch nằm trong khối mới. Lưu ý rằng người dùng đã gửi giao dịch mới trong thời gian chờ đợi. Những giao dịch đã có trong sổ cái đã bị xóa khỏi tất cả các pool ghi nhớ. Tuy nhiên, mem-pool liên tục chứa đầy các giao dịch mới.

Trong hình cuối cùng, tất cả các node đều có trạng thái sổ cái giống nhau, nhưng thứ tự giao dịch khác nhau trong mem-pool ghi nhớ. Trong vòng tiếp theo, một slot leader mới sẽ được bầu và toàn bộ quá trình sẽ được lặp lại.

Trước khi có thể viết bất cứ thứ gì lên một khối, trước tiên các thông tin phải di chuyển qua mem-pool. Đó là một phần không thể thiếu trong cách thức hoạt động của node Blockchain. Điều tương tự xảy ra với các giao dịch cũng ứng dụng cho các chứng chỉ (chứng chỉ ủy quyền, chứng chỉ đăng ký pool, v.v.). Khi xác thực các giao dịch, các tập lệnh có thể được thực thi.

Mem-pool lưu trữ các giao dịch ứng viên (trong bộ nhớ cục bộ) trước khi chúng được chèn vào một khối mới. Mỗi node cố gắng duy trì sự đồng bộ hóa với các node khác qua mạng. Vì giao tiếp mạng không phải lúc nào cũng đáng tin cậy hoặc kịp thời nên mỗi node có một mem-pool khác nhau một chút (hoặc đôi khi đáng kể). Các node xếp hàng các giao dịch theo thứ tự chúng đến.

Mem-pool hoạt động như một loại bộ đệm mạng. Nếu không thể đặt tất cả các giao dịch vào một khối mới thì các giao dịch đó có thể đợi trong mem-pool. Nhưng chỉ đến một giới hạn cố định. Kích thước mem-pool không lớn hơn đáng kể so với kích thước khối. Lý tưởng nhất là mem-pool sẽ trống sau khi một khối mới được tạo ra (trạng thái toàn bộ giao dịch chờ được xác thực).

Các giao dịch rời khỏi mem-pool của node vì chúng được trèn vào trong một khối. Mem-pool cũng có thể bị dùng hết công suất. Trong trường hợp này, mem-pool sẽ không thể chấp nhận thêm các giao dịch mới đến. Đây là cơ chế tạo áp suất ngược. Người dùng có thể gặp phải trường hợp giao dịch của họ không được mạng lưới chấp nhận. Họ phải cố gắng gửi lại giao dịch sau một thời gian (hoặc ví/đại lý có thể thực hiện việc đó cho họ).

Hiện tại, kích thước của mem-pool của Cardano là 145 kb. Kích thước khối là 90 kb. Một giao dịch thông thường là khoảng 300 byte. Như vậy, có khoảng 500 giao dịch phổ thông có thể chứa trong một mem-pool.

Mục tiêu của mem-pool không phải là lưu trữ tất cả các giao dịch đã gửi trong trường hợp mạng bị quá tải. Mục tiêu của mem-pool là chứa số lượng giao dịch đủ lớn cho một khối mới. Nói cách khác, để đảm bảo thông lượng tối đa có thể. Tăng mem-pool không thể giải quyết được khả năng mở rộng thấp.

Nói chung, mem-pool lớn hơn chỉ tạo ra nhiều công việc hơn và độ trễ lớn hơn. Cardano được thiết kế không phải để đệm nhiều giao dịch mà để tạo áp lực lên các biên của hệ thống. Đây dường như là một cách tiếp cận tốt hơn so với việc sử dụng mem-pool lớn vì nó cung cấp phản hồi tốt hơn và sử dụng ít tài nguyên hơn để quản lý công việc đang chờ xử lý.

tấn công front-running

Mỗi người bận hành node kiểm soát mem-pool của họ. Tuy nhiên, không ai có quyền kiểm soát mem-pool của các nhà khai thác khác. Các giao dịch trong mem-pool không được mã hóa. Người vận hành pool có thể phân tích chúng. Thậm chí có thể xuất bản các giao dịch trong mem-pool của một người.

Có quyền kiểm soát mem-pool có thể là một lợi thế của người vận hành node. Đặc biệt trong trường hợp một node cụ thể là cổng cho các giao dịch của người dùng. Người vận hành có thể xác định một giao dịch cụ thể và tác động của nó lên sổ cái trong trường hợp giao dịch đó được chèn vào một khối mới.

Kẻ điều hành lừa đảo có thể trì hoãn giao dịch của người dùng và chèn giao dịch của hắn vào trước giao dịch đó. Giao dịch của kẻ tấn công sẽ có thông số tương tự như giao dịch của người dùng. Hắn ta có thể kiếm lợi từ nó. Người dùng có thể muốn thực hiện một số giao dịch có lợi nhuận trên DEX. Nhà điều hành có thể giữ giao dịch của người dùng và nhanh chóng gửi giao dịch của mình. Giao dịch gian lận đến được các mem-pool khác trước giao dịch của người dùng. Do đó, nhà điều hành sẽ thực hiện giao dịch có lợi nhuận trước mặt người dùng.

Trong hình, bạn có thể thấy rằng người dùng đã gửi giao dịch T1 tại thời điểm N. Nhà điều hành đã phân tích giao dịch trước khi chèn nó vào mem-pool của mình và phát nó tới các node ngang hàng. Ông đánh giá đây là một giao dịch có lãi. Do đó, tại thời điểm N+1 (một lát sau), anh ấy đã gửi giao dịch (lừa đảo) T0 và phát nó lên mạng trước khi người dùng giao dịch. Các máy mạng ngang hàng nhận giao dịch T0 trước rồi đến T1. Node 2 đã có giao dịch trong pool ghi nhớ. Node 3 nhận các giao dịch theo thứ tự do người vận hành node 1 chọn.

Người dùng nên suy nghĩ nhiều hơn về node mà qua đó giao dịch của họ được gửi tới mạng. Tuy nhiên, về mặt lý thuyết, bất kỳ operator node nào trong hình trên đều có thể thực hiện một cuộc tấn công front-running tương tự. Vì vậy, operator của node 2 và 3.

Nếu người điều hành node 1 trung thực và không muốn thực hiện một cuộc tấn công trực diện thì giao dịch của người dùng sẽ được phát lên mạng. Nếu người vận hành node 2 và 3 muốn thực hiện một cuộc tấn công front-running thì họ sẽ gặp khó khăn hơn vì giao dịch của người dùng đã đến được phần của các node trong mạng (sẽ phát lại). Sự thành công của cuộc tấn công sẽ là vấn đề may rủi và nó sẽ phụ thuộc vào node nào được bầu làm Slot leader trong vòng tiếp theo.

Việc có số lượng lớn node sản xuất khối trong mạng có thể giúp giảm thiểu các cuộc tấn công front-running (và kiểm duyệt giao dịch). Điều này là do mạng càng phi tập trung thì một thực thể duy nhất càng khó kiểm soát hoặc thao túng lệnh giao dịch. Tuy nhiên, điều quan trọng cần lưu ý là chỉ biện pháp này có thể không đủ để ngăn chặn hoàn toàn các cuộc tấn công như vậy.

Ở Cardano, phí giao dịch không được sử dụng làm yếu tố quyết định việc đưa các giao dịch vào một khối. Điều này có nghĩa là người dùng (bao gồm cả người vận hành pool) không thể trả phí cao hơn để ưu tiên các giao dịch của họ.

Thiết kế này có thể khiến các cuộc tấn công front-running trở nên khó khăn hơn so với các mạng sử dụng khái niệm thị trường phí. Trong các mạng sử dụng thị trường phí, người dùng có thể trả phí cao hơn để giao dịch của họ được xử lý nhanh hơn, điều này có thể bị kẻ tấn công khai thác.

Lời kết

Người vận hành xem các giao dịch của người dùng và có thể chọn giao dịch nào sẽ chèn vào khối mới nếu họ trở thành Slot leader, nhưng họ không thể đánh cắp tài sản của người dùng. Tuy nhiên, họ có thể thao túng các giao dịch theo hướng có lợi cho mình. Ví dụ: làm chậm quá trình phát sóng của họ tới các node ngang hàng.

Hiểu chức năng của mem-pool rất quan trọng trong bối cảnh vòng đời giao dịch. Có hai giai đoạn quan trọng giữa việc gửi giao dịch và thời điểm giao dịch trở nên bất biến: độ trễ giao dịch và tính chất hoàn tất của giao dịch.

Độ trễ giao dịch là khoảng thời gian từ khi giao dịch được gửi đến khi nó xuất hiện trong sổ cái (trong một khối mới). Tính chất hoàn tất của giao dịch là khoảng thời gian từ khi xuất hiện trong khối đầu tiên cho đến khi giao dịch không thể thay đổi được. Một giao dịch sẽ không thể thay đổi ngay khi có đủ số lượng khối mới được thêm vào phía sau khối chứa nó (ít nhất là 5).

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