Cơ chế Proof of Work của Monero: Cách RandomX bảo vệ sự phi tập trung

04 tháng 5, 2026·9 phút đọc

Monero sử dụng thuật toán RandomX để đảm bảo việc đào tiền mã hóa vẫn nằm trong tầm tay của người dùng phổ thông thay vì các thiết bị chuyên dụng. Bài viết này đi sâu vào cách thức hoạt động của RandomX, từ việc tạo bộ nhớ lớn đến việc thực thi các chương trình ngẫu nhiên trên máy ảo.

Cơ chế Proof of Work của Monero: Cách RandomX bảo vệ sự phi tập trung

Cơ chế Proof of Work của Monero: Cách RandomX bảo vệ sự phi tập trung

Monero nổi tiếng vì sự chú trọng vào quyền riêng tư, nhưng một khía cạnh quan trọng khác của dự án này là thuật toán đồng thuận. Cơ chế Proof of Work (PoW) của Monero được gọi là RandomX, một thiết kế đặc biệt nhằm chống lại sự thống trị của các thiết bị đào chuyên dụng (ASIC) và giữ cho việc khai thác coin trở nên công bằng hơn.

Khác với Bitcoin yêu cầu các thợ đào chạy cùng một hàm băm nhỏ lặp đi lặp lại, Monero yêu cầu họ chạy một chương trình ngẫu nhiên nhỏ trên máy ảo, đánh mạnh vào bộ nhớ và sau đó băm kết quả đó. Bài viết dưới đây sẽ giải thích cách RandomX hoạt động và lý do tại sao nó lại "thân thiện" với CPU đến vậy.

Tại sao Monero không sử dụng hàm băm đơn giản?

Nếu cơ chế PoW chỉ đơn giản là "chạy hàm cố định này trên các đầu vào mới cho đến khi bạn nhận được kết quả may mắn", các nhà thiết kế phần cứng sẽ có một nhiệm vụ rõ ràng: xây dựng chip chạy chính xác hàm đó càng rẻ và càng nhanh càng tốt. Đó chính là điều đã xảy ra với Bitcoin và các thiết bị ASIC SHA-256.

Monero không muốn đi theo con đường đó. Dự án nhận định rõ ràng rằng phần cứng đào chuyên dụng tạo ra áp lực tập trung hóa. Ít nhà sản xuất hơn sẽ có quyền lực lớn hơn, các trang trại đào quy mô lớn sẽ trở nên quan trọng hơn, trong khi người dùng phổ thông sẽ bị bỏ lại phía sau. Trước khi RandomX ra đời, Monero đã sử dụng thuật toán CryptoNight. Tuy nhiên, vào cuối năm 2019, họ chuyển sang RandomX, được mô tả là một thuật toán PoW mới "dựa trên các lệnh ngẫu nhiên, thích ứng với CPU".

Ý tưởng cốt lõi đằng sau RandomX

RandomX bắt đầu từ một quan sát: CPU không chỉ là những hộp tính toán. Chúng là những máy tính linh hoạt được xây dựng để chạy các mã code thay đổi và xử lý nhiều tính năng phần cứng cùng một lúc. Một CPU hiện đại có nhiều cấp độ bộ nhớ đệm (cache), các đơn vị số nguyên, đơn vị dấu phẩy động, xử lý nhánh, thực thi ngoài thứ tự và thực thi suy đoán.

Các hàm băm mật mã thông thường không sử dụng nhiều sự đa dạng này. Chúng chủ yếu đẩy dữ liệu qua một đường ống cố định. RandomX cố gắng gắn kết PoW với những điểm mạnh rộng hơn của CPU. Tài liệu thiết kế của nó yêu cầu công việc phải động, nghĩa là người đào không chỉ nạp dữ liệu mới mà còn nhận được mã code mới để chạy. Đó là lý do RandomX dựa trên việc thực thi mã ngẫu nhiên.

Người đào thực sự tính toán cái gì?

Tại cấp độ Monero, RandomX nhận hai đầu vào quan trọng: một khóa K và một đầu vào băm H.

Đối với Monero, K đến từ băm của một khối cũ hơn, được gọi là khối khóa. RandomX khuyến nghị thay đổi khóa này mỗi 2048 khối với độ trễ 64 khối. Chi tiết này quan trọng vì người đào không cần xây dựng lại các cấu trúc bộ nhớ chia sẻ nặng nề cho mỗi nonce. Họ chỉ xây dựng lại chúng khi khóa thay đổi, khoảng mỗi 2,8 ngày một lần.

H là dữ liệu băm khối ứng viên với một nonce đã chọn. Đây là phần người đào thay đổi liên tục. Vì vậy, bạn có thể hình dung việc đào Monero như sau: mạng lưới cung cấp cho bạn một môi trường trung hạn thông qua K, và khối ứng viên của bạn cung cấp một đầu vào cho mỗi lần thử thông qua H.

Quy trình hoạt động chi tiết của RandomX

Bước 1: Xây dựng bộ nhớ đệm từ khóa

RandomX đầu tiên lấy khóa K và chạy thuật toán Argon2d trên nó. Argon2d được biết đến nhiều hơn như một hàm băm mật khẩu và dẫn xuất khóa. Nó hữu ích ở đây vì lý do tương tự: nó phụ thuộc vào bộ nhớ (memory-hard). Nó buộc máy phải chạm vào nhiều bộ nhớ theo một cách khó gian trá. Trong các tham số mặc định của RandomX, điều này tạo ra bộ nhớ đệm 256 MiB.

Bước 2: Mở rộng bộ nhớ đệm thành tập dữ liệu (Dataset)

Từ bộ nhớ đệm 256 MiB đó, RandomX xây dựng tập dữ liệu. Kích thước tập dữ liệu mặc định là khoảng 2080 MiB, hơi trên 2 GiB. Kích thước trông kỳ lạ này là có chủ đích. Nó đủ lớn để tràn ra khỏi bộ nhớ trên chip và vào DRAM, và phần đuôi không phải là lũy thừa của 2 làm cho cuộc sống của các nhà thiết kế phần cứng trở nên khó khăn hơn.

Tập dữ liệu này chỉ đọc khi băm. RandomX sử dụng nó để ép buộc lưu lượng DRAM thường xuyên.

Bước 3: Khởi tạo scratchpad từ đầu vào khối

Bây giờ RandomX chuyển sang đầu vào băm mỗi lần H. Nó tính toán Hash512(H) sử dụng Blake2b. Kết quả 64 byte này làm hạt giống cho một trình tạo dựa trên AES, lấp đầy scratchpad. Scratchpad là bộ nhớ làm việc của VM. Khác với tập dữ liệu lớn, nó được dự định để sống trong bộ nhớ cache của CPU, không phải DRAM. Kích thước mặc định của nó là 2 MiB, được chia để mô phỏng các cấp độ cache của CPU.

Bước 4: Tạo chương trình ngẫu nhiên

Sau khi scratchpad sẵn sàng, RandomX tạo một chương trình cho máy ảo của nó. Mỗi lệnh dài 8 byte và bất kỳ từ 8 byte nào cũng là một lệnh hợp lệ. Điều này có nghĩa là RandomX có thể tạo chương trình chỉ bằng cách điền một bộ đệm với các byte ngẫu nhiên.

Mỗi chương trình chứa 256 lệnh. Những lệnh này được chọn để trông giống như công việc mà CPU thực sự được xây dựng để thực hiện: toán học số nguyên, nhân 64 bit, phép toán dấu phẩy động, thao tác vector 128 bit, tải/lưu bộ nhớ và các nhánh thỉnh thoảng.

Bước 5: Chạy vòng lặp chương trình

VM thực thi chương trình 256 lệnh trong một vòng lặp trong 2048 lần lặp. Trong mỗi lần lặp, nó đọc và ghi bộ nhớ scratchpad, tải trước và tải các mục tập dữ liệu, trộn trạng thái thanh ghi số nguyên và dấu phẩy động, và thực hiện một nhánh xác suất thấp khi điều kiện cho phép.

Tài liệu thiết kế cho biết một lần lặp trung bình đọc khoảng 504 byte từ bộ nhớ và ghi khoảng 256 byte. Con số này là manh mối cho những gì RandomX thực sự đang làm. Nó không phải là "một hàm băm với các bước thêm vào". Nó đang cố gắng hoạt động giống như phần mềm thực tế lộn xộn, hỗn hợp.

Bước 6: Thu gọn trạng thái cuối cùng thành băm

Sau khi chương trình cuối cùng trong số 8 chương trình kết thúc, RandomX biến toàn bộ trạng thái máy thành một bản tóm tắt cuối cùng. Nó lấy dấu vân của toàn bộ scratchpad bằng một hàm băm dựa trên AES. Sau đó, nó kết hợp điều đó với tệp thanh ghi VM và chạy một băm cuối cùng dựa trên Blake2b 256-bit.

Kết quả 256-bit cuối cùng là đầu ra của RandomX. Tại cấp độ Monero, người đào kiểm tra xem kết quả đó có thấp hơn mục tiêu khó khăn hiện tại hay không. Nếu có, khối thắng. Nếu không, người đào thay đổi nonce và thử lại.

Chế độ Nhanh và Chế độ Nhẹ

RandomX có hai chế độ: chế độ nhanh sử dụng tập dữ liệu đầy đủ 2080 MiB và chế độ nhẹ chỉ sử dụng bộ nhớ đệm 256 MiB và tính toán các mục tập dữ liệu theo thời gian thực.

Cả hai chế độ đều cho ra cùng một câu trả lời. Tuy nhiên, hai chế độ này không tốn cùng một lượng công việc. Chế độ nhanh dành cho đào. Chế độ nhẹ dành cho xác minh. Sự phân chia này là một trong những lựa chọn thiết kế tốt nhất của RandomX, đảm bảo việc xác thực khả thi nhưng không đủ rẻ để trở thành lối tắt để đào.

Tại sao điều này thân thiện với CPU?

"Thân thiện với CPU" có thể nghe giống như tiếp thị, nhưng đáng để cụ thể hóa. RandomX ưu tiên CPU vì nó dựa vào những thứ tốt CPU đã có: bộ nhớ đệm lớn, băng thông DRAM ổn định, phần cứng AES, toán học 64 bit nhanh, phần cứng dấu phẩy động và thực thi ngoài thứ tự.

Việc triển khai tham chiếu thậm chí bao gồm các trình biên dịch JIT cho x86-64, ARM64 và RISCV64, để các chương trình VM có thể được dịch sang mã máy gốc ngay lập tức thay vì được diễn giải từng lệnh một. Điều đó không làm cho ASICs trở nên bất khả thi, nhưng nó làm cho công việc xây dựng chip tùy chỉnh trở nên khó khăn hơn nhiều. Một ASIC RandomX tốt sẽ trông giống như một chiếc CPU đắt tiền với nhiều bộ nhớ đệm hơn là một động cơ băm hàm cố định nhỏ gọn.

Kết luận

RandomX của Monero không chủ yếu về tốc độ thô. Nó về kinh tế phần cứng. Monero muốn Proof of Work giữ cho việc khai thác mở hơn cho phần cứng thông thường, giảm lợi thế từ các ASIC chức năng cố định và tránh việc gắn kết sự đồng thuận với một vài nhà cung cấp phần cứng.

Đó là lý do RandomX trông kỳ lạ nếu bạn mong đợi một hàm băm khai thác bình thường. Nó không cố gắng trở nên thanh lịch theo nghĩa của Bitcoin. Nó cố gắng trở nên khó khăn cho sự chuyên môn hóa. Nếu đào Bitcoin là "chạy chiếc máy nhỏ này mãi mãi", thì đào Monero là "tiếp tục tạo ra các khối lượng công việc có hương vị CPU và sống sót qua lưu lượng bộ nhớ".

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗