
Nâng cấp Ethereum: Kiến thức cơ bản về đồng thuận (Phần dưới)
Tuyển chọn TechFlowTuyển chọn TechFlow

Nâng cấp Ethereum: Kiến thức cơ bản về đồng thuận (Phần dưới)
Đây là một cuốn sách kỹ thuật tác giả về giao thức Proof-of-Stake của Ethereum. Sách sẽ bắt đầu với một số nội dung sơ bộ, bao gồm các kiến thức nền tảng về đồng thuận không chỉ giới hạn trong Ethereum.
Tác giả: Ben Edgington
Biên dịch: tiao
Bài viết này là phần hai của chương "Kiến thức nền tảng về đồng thuận". Phần một xem tại: Nâng cấp Ethereum: Kiến thức nền tảng về đồng thuận
Quy tắc chọn nhánh (fork choice rule)
Như chúng ta đã thấy, do nhiều nguyên nhân như độ trễ mạng, gián đoạn mạng, thứ tự nhận tin nhắn sai lệch hay hành vi độc hại từ các nút ngang hàng, các nút trên mạng cuối cùng sẽ có những quan điểm khác nhau (view) về trạng thái mạng. Cuối cùng, chúng ta mong muốn mỗi nút đúng trên mạng đều đạt được cái nhìn tuyến tính thống nhất về lịch sử, qua đó hình thành quan điểm chung về trạng thái hệ thống. Quy tắc chọn nhánh (fork choice rule) của giao thức được thiết kế để đạt được sự thống nhất này.
Khi đưa ra một cây khối và một số tiêu chí quyết định dựa trên quan điểm cục bộ của nút về mạng, quy tắc chọn nhánh nhằm mục đích chọn ra nhánh có khả năng cao nhất trở thành chuỗi chuẩn tuyến tính cuối cùng trong tất cả các nhánh khả dụng. Nói cách khác, khi nút cố gắng hướng tới quan điểm chuẩn, nó sẽ chọn nhánh ít có khả năng bị cắt tỉa khỏi cây khối nhất.

Quy tắc chọn nhánh ngầm chọn một nhánh bằng cách chọn một khối ở đỉnh nhánh đó (gọi là khối đầu - head block).
Đối với bất kỳ nút đúng nào, tiêu chí đầu tiên của mọi quy tắc chọn nhánh là: khối được chọn phải hợp lệ, tuân thủ các quy tắc giao thức, và tất cả tổ tiên của nó cũng phải hợp lệ. Mọi khối không hợp lệ sẽ bị bỏ qua, và mọi khối xây dựng trên khối không hợp lệ cũng tự động không hợp lệ.
Với điều kiện này, có rất nhiều ví dụ khác nhau về quy tắc chọn nhánh.
-
Giao thức Proof-of-Work (PoW) trong Bitcoin và Ethereum sử dụng "quy tắc chuỗi nặng nhất" [4] (đôi khi gọi là "chuỗi dài nhất", dù điều này không hoàn toàn chính xác). Khối đầu là đỉnh của chuỗi tích lũy nhiều "công việc" nhất theo PoW.
-
Quy tắc chọn nhánh trong giao thức Proof-of-Stake Casper FFG của Ethereum là "theo dõi chuỗi chứa điểm kiểm tra (checkpoint) hợp lý cao nhất", và không bao giờ lùi lại một khối đã được xác định cuối cùng.
-
Quy tắc chọn nhánh trong giao thức Proof-of-Stake LMD GHOST của Ethereum được thể hiện rõ trong tên gọi: áp dụng "cây con quan sát được tham lam nhất, nặng nhất". Nó liên quan đến việc tính toán phiếu bầu tích lũy của các trình xác thực đối với khối và các khối hậu duệ. Nó cũng tuân theo các quy tắc giống như Casper FFG.
Chúng ta sẽ giải thích chi tiết hai ví dụ thứ hai và thứ ba trong các chương riêng biệt.
Bạn có thể đã nhận ra rằng các quy tắc chọn nhánh này đều là các phương pháp gán điểm số cho từng khối. Khối chiến thắng – khối đầu – là khối có điểm cao nhất. Ý tưởng đằng sau là khi tất cả các nút đúng cuối cùng đều nhìn thấy một khối cụ thể, họ sẽ hoàn toàn đồng ý rằng đây là khối đầu và chọn theo nhánh của nó, bất kể quan điểm cá nhân nào khác về mạng. Do đó, tất cả các nút đúng cuối cùng sẽ đạt được quan điểm chung duy nhất về một chuỗi chuẩn đơn lẻ truy ngược về khối khởi nguyên.
Tái tổ chức (Reorgs) và hoàn tác (reversions)
Khi một nút nhận được khối mới (và trong PoS là các phiếu bầu mới cho khối), nó sẽ đánh giá lại quy tắc chọn nhánh dựa trên thông tin mới. Trường hợp phổ biến nhất là khối mới sẽ là khối con của khối đầu mà nút hiện đang coi là đầu, và sẽ trở thành khối đầu mới.
Tuy nhiên, đôi khi khối mới có thể là hậu duệ của một khối khác trong cây khối (lưu ý rằng nếu nút chưa có khối cha của khối mới, nó cần hỏi các nút ngang hàng để lấy khối cha, cũng như mọi khối nào khác mà nó biết mình đang thiếu).
Trong mọi trường hợp, việc chạy lại quy tắc chọn nhánh trên cây khối cập nhật có thể chỉ đến một khối đầu nằm trên một nhánh khác với khối đầu trước đó. Khi điều này xảy ra, nút phải thực hiện tái tổ chức (reorg, viết tắt của reorganisation), còn gọi là hoàn tác (rollback). Nó sẽ loại bỏ (hoàn tác) các khối trước đó đã được đưa vào chuỗi của mình và chuyển sang các khối trên nhánh mới của khối đầu.
Trong biểu đồ dưới đây, nút đánh giá khối F là khối đầu, do đó chuỗi của nó gồm các khối A, B, D, E, F. Nút biết về khối C, nhưng nó không nằm trong quan điểm chuỗi của nút; khối C nằm trên một nhánh phụ.

Một thời gian sau, nút nhận được khối G, không xây dựng trên khối đầu hiện tại F của nút, mà xây dựng trên nhánh của khối C. Tùy vào chi tiết quy tắc chọn nhánh, nút có thể vẫn đánh giá F tốt hơn G và bỏ qua G. Nhưng trong tình huống hiện tại, chúng ta giả định rằng quy tắc chọn nhánh cho thấy G là khối đầu tốt hơn.
Các khối D, E và F không phải là tổ tiên của khối G, vì vậy chúng cần bị loại khỏi chuỗi chuẩn của nút. Mọi giao dịch hoặc thông tin trong các khối này sẽ bị hoàn tác, như thể chúng chưa từng được nhận. Nút phải hoàn toàn lùi trạng thái về sau khi xử lý khối B.
Sau khi lùi về khối B, nút có thể thêm các khối C và G vào chuỗi của mình và xử lý tương ứng. Khi xong, nút đã hoàn thành việc tái tổ chức chuỗi.

Sau đó, có thể xuất hiện khối H xây dựng trên khối F. Nếu quy tắc chọn nhánh cho thấy khối đầu mới nên là H, thì nút sẽ lại thực hiện tái tổ chức, hoàn tác chuỗi về B và xây dựng lại các khối trên nhánh H.
Trong các giao thức PoW và PoS của Ethereum, tái tổ chức ngắn hạn một hoặc hai khối không hiếm do độ trễ mạng trong việc lan truyền khối. Trừ khi chuỗi bị tấn công, hoặc quy tắc chọn nhánh có lỗi trong thiết kế hoặc triển khai, tái tổ chức dài nên cực kỳ hiếm.
Tính an toàn và tính sống động
Khi thảo luận về cơ chế đồng thuận, hai khái niệm quan trọng thường được nhắc đến: tính an toàn (safety) và tính sống động (liveness).
Tính an toàn
Theo nghĩa thông thường, một thuật toán được coi là an toàn nếu «không có chuyện xấu xảy ra» [5].
Các ví dụ về chuyện xấu có thể xảy ra trong môi trường blockchain bao gồm việc dùng lại tiền điện tử (double-spend), hoặc việc xác định cuối cùng hai điểm kiểm tra mâu thuẫn nhau.
Một khía cạnh quan trọng của tính an toàn trong hệ thống phân tán là «sự nhất quán». Nghĩa là, nếu chúng ta hỏi các nút (trung thực) khác nhau về trạng thái của chuỗi tại một thời điểm phát triển nhất định, ví dụ như số dư tài khoản ở một chiều cao khối cụ thể, thì bất kể hỏi nút nào, chúng ta luôn nhận được câu trả lời giống nhau. Trong một hệ thống an toàn, mọi nút đều có cùng một cái nhìn không đổi về lịch sử chuỗi.
Thực tế, tính an toàn có nghĩa là hệ thống phân tán của chúng ta «hoạt động như một thực thể tập trung, thực hiện từng thao tác nguyên tử một lần». (trích Castro và Liskov). Trong phân loại tập trung của Vitalik, một hệ thống an toàn là tập trung về mặt logic.
Tính sống động
Một lần nữa, theo nghĩa thông thường, một thuật toán được coi là có tính sống động nếu «cuối cùng sẽ có chuyện tốt xảy ra».
Trong môi trường blockchain, chúng ta thường hiểu điều này có nghĩa là chuỗi luôn có thể thêm một khối mới; nó sẽ không bao giờ rơi vào bế tắc không thể tạo ra khối mới chứa giao dịch.
«Khả dụng (Availability)» là một cách nhìn khác về vấn đề này. Tôi mong muốn chuỗi luôn sẵn sàng, nghĩa là nếu tôi gửi một giao dịch hợp lệ tới một nút trung thực, cuối cùng nó sẽ được đưa vào một khối mở rộng chuỗi.
Không thể có cả hai!
Định lý CAP là một kết quả nổi tiếng trong lý thuyết hệ thống phân tán, khẳng định không có hệ thống phân tán nào có thể đồng thời cung cấp (1) tính nhất quán (consistency), (2) tính sẵn sàng (availability) và (3) khả năng chịu lỗi phân vùng (partition tolerance). Khả năng chịu lỗi phân vùng là khả năng hoạt động bình thường khi việc giao tiếp giữa các nút không đáng tin cậy. Ví dụ, lỗi mạng có thể chia các nút thành hai hoặc nhiều nhóm không thể giao tiếp với nhau.
Dễ dàng minh chứng định lý CAP trong ngữ cảnh blockchain. Giả sử dịch vụ Amazon Web Services (AWS) ngừng hoạt động, khiến tất cả các nút được lưu trữ bởi AWS có thể giao tiếp với nhau nhưng không nút nào có thể giao tiếp với bên ngoài; hoặc một quốc gia chặn mọi kết nối ra vào, khiến không có lưu lượng gossip nào đi qua. Cả hai tình huống này đều chia các nút thành hai nhóm rời rạc, như A và B.

Giả sử một tài khoản kết nối với mạng nhóm A gửi một giao dịch. Nếu các nút trong nhóm A xử lý giao dịch đó, thì trạng thái cuối cùng của họ sẽ khác với các nút trong nhóm B không nhìn thấy giao dịch đó. Vì vậy, tổng thể, chúng ta mất tính nhất quán giữa tất cả các nút, do đó mất tính an toàn. Cách duy nhất để tránh điều này là các nút trong nhóm A từ chối xử lý giao dịch, trong trường hợp này chúng ta mất tính sẵn sàng, và mất tính sống động.
Tóm lại, định lý CAP có nghĩa là chúng ta không thể hy vọng thiết kế một giao thức đồng thuận vừa an toàn vừa sống động trong mọi trường hợp, vì chúng ta buộc phải vận hành trên một mạng không đáng tin cậy, tức là Internet [6].
Ethereum ưu tiên tính sống động
Trong điều kiện mạng tốt, giao thức đồng thuận Ethereum cung cấp cả tính an toàn và sống động, nhưng khi mạng hoạt động kém, nó ưu tiên tính sống động. Trong trường hợp phân vùng mạng, các nút ở cả hai phía của phân vùng sẽ tiếp tục tạo ra khối. Tuy nhiên, tính xác định cuối cùng (finality, một thuộc tính của tính an toàn) sẽ không còn xảy ra đồng thời ở cả hai phía. Tùy theo tỷ lệ cổ phần quản lý ở mỗi phía, hoặc một phía tiếp tục đạt được tính xác định cuối cùng, hoặc cả hai phía đều không tiếp tục.
Cuối cùng, trừ khi phân vùng được giải quyết, cả hai phía sẽ lấy lại tính xác định cuối cùng nhờ cơ chế phạt lười biếng (inactivity leak) sáng tạo. Nhưng điều này cuối cùng cũng dẫn đến sự cố an toàn. Mỗi chuỗi sẽ xác định một lịch sử khác nhau, và hai chuỗi sẽ mãi mãi trở nên không thể hòa giải và độc lập.
Tính xác định cuối cùng (Finality)
Chúng ta sẽ thảo luận nhiều hơn về tính xác định cuối cùng trong các chương tiếp theo, đây là thuộc tính an toàn của chuỗi.
Tính xác định cuối cùng có nghĩa là một số khối sẽ không bao giờ bị hoàn tác. Khi một khối được xác định cuối cùng, tất cả các nút trung thực trên mạng đều đồng ý rằng khối đó sẽ mãi mãi tồn tại trong lịch sử chuỗi, do đó tất cả tổ tiên của nó cũng sẽ tồn tại mãi mãi. Tính xác định cuối cùng khiến việc thanh toán một chiếc bánh pizza trở nên không thể đảo ngược, giống như dùng tiền mặt. Đây là biện pháp bảo vệ tối thượng chống lại việc dùng lại tiền [7].
Một số giao thức đồng thuận, như PBFT cổ điển hoặc Tendermint, xác định cuối cùng mỗi vòng (mỗi khối). Một khi một vòng giao dịch được đưa vào chuỗi, tất cả các nút đều đồng ý rằng nó sẽ tồn tại mãi mãi. Về một mặt, các giao thức này rất «an toàn»: một khi giao dịch được đưa vào chuỗi, nó sẽ không bao giờ bị hoàn tác. Mặt khác, chúng dễ gặp sự cố sống động: nếu các nút không thể đạt được sự đồng thuận — ví dụ, nếu hơn một phần ba nút tắt hoặc không khả dụng — thì không giao dịch nào có thể được thêm vào chuỗi, chuỗi sẽ dừng hoạt động.
Các giao thức đồng thuận khác, như đồng thuận Nakamoto của Bitcoin, hoàn toàn không có cơ chế xác định cuối cùng. Luôn tồn tại khả năng ai đó đưa ra một chuỗi thay thế nặng hơn. Khi điều này xảy ra, tất cả các nút trung thực phải tương ứng tái tổ chức chuỗi của họ, hoàn tác mọi giao dịch đã xử lý trước đó. Các phương pháp ước lượng như «số lần xác nhận của khối bạn» chỉ là gần đúng của tính xác định cuối cùng, chứ không đảm bảo [8].
Lớp đồng thuận của Ethereum ưu tiên tính sống động, nhưng cũng nỗ lực cung cấp đảm bảo an toàn theo kiểu xác định cuối cùng trong điều kiện thuận lợi. Đây là nỗ lực cố gắng có cả hai. Vitalik biện hộ như sau [9]:
Nguyên tắc chung là bạn muốn mang lại cho người dùng «nhiều sự đồng thuận nhất có thể»: nếu các nút đạt đồng thuận > 2/3, thì chúng ta có đồng thuận thông thường. Nhưng nếu < 2/3, thì cũng không cần dừng lại làm gì cả, rõ ràng là, mặc dù mức độ an toàn của khối mới tạm thời giảm, chuỗi vẫn có thể tiếp tục phát triển. Nếu ứng dụng riêng lẻ không hài lòng với mức an toàn thấp hơn, nó có quyền tự do bỏ qua các khối đó cho đến khi chúng được xác định cuối cùng.
Trong lớp đồng thuận của Ethereum, tính xác định cuối cùng được cung cấp bởi cơ chế Casper FFG, chúng ta sẽ sớm tìm hiểu cơ chế này. Nguyên lý là tất cả các trình xác thực trung thực định kỳ đạt được sự đồng thuận về khối điểm kiểm tra gần đây nhất, và họ sẽ không bao giờ rút lại các khối này. Sau đó, khối đó và tất cả các tổ tiên của nó trở thành các khối «được xác định cuối cùng» — chúng sẽ không bao giờ thay đổi, và nếu bạn hỏi bất kỳ nút trung thực nào trong mạng về chúng hoặc tổ tiên của chúng, bạn luôn nhận được cùng một câu trả lời.

Tính xác định cuối cùng của Ethereum là «tính xác định cuối cùng kinh tế». Về mặt lý thuyết, giao thức có thể xác định cuối cùng hai điểm kiểm tra mâu thuẫn, tức là hai quan điểm mâu thuẫn về lịch sử chuỗi. Tuy nhiên, điều này chỉ có thể xảy ra với chi phí khổng lồ và có thể lượng hóa. Ngoài các tình huống tấn công hoặc thất bại cực đoan nhất, thì xác định cuối cùng là vĩnh viễn.
Phần Casper FFG đi sâu vào cách thức hoạt động của cơ chế xác định cuối cùng này.
Xem thêm
Bất cứ nội dung nào có sự tham gia của Leslie Lamport luôn đáng đọc, bài báo gốc năm 1982 của ông cùng Shostak và Pease, «Vấn đề các tướng Byzantine» (The Byzantine Generals Problem), chứa đựng nhiều hiểu biết sâu sắc. Mặc dù thuật toán họ đề xuất đã quá kém hiệu quả trong điều kiện hiện nay, bài báo này là một cách giới thiệu tuyệt vời để suy luận về các giao thức đồng thuận nói chung. Cũng vậy với bài báo đột phá năm 1999 của Castro và Liskov, «Bảo mật Byzantine thực tiễn» (Practical Byzantine Fault Tolerance), có ảnh hưởng lớn đến thiết kế giao thức Casper FFG của Ethereum. Tuy nhiên, bạn có thể muốn so sánh các phương pháp «cổ điển» này với sự giản dị tinh tế của bằng chứng công việc (proof-of-work) mô tả trong bản trắng Bitcoin năm 2008 của Nakamoto. Nếu proof-of-work có điểm mạnh gì, thì đó chính là sự giản dị.
Ở trên, chúng ta đã nhắc đến bài báo năm 2012 của Gilbert và Lynch, «Cái nhìn về định lý CAP» (Perspectives on the CAP Theorem). Bài báo này đi sâu vào các khái niệm nhất quán và sẵn sàng (hoặc trong ngữ cảnh của chúng ta là an toàn và hiệu lực), rất dễ đọc.
Do sự khác biệt trong việc triển khai quy tắc chọn nhánh giữa các client, chuỗi beacon Ethereum đã trải qua một tái tổ chức bảy khối vào tháng 5 năm 2022. Những khác biệt này lúc đó được biết đến rộng rãi và được coi là vô hại. Hóa ra không phải vậy. Mô tả sự kiện này của Barnabé Monnot rất mang tính minh họa.
Bài blog của Vitalik «Về tính xác định cuối cùng trong thanh toán» (On Settlement Finality) cung cấp khám phá sâu sắc và tinh tế hơn về khái niệm tính xác định cuối cùng.
Đối với các hệ thống chúng ta đang xây dựng, lý tưởng của chúng ta là chúng phi tập trung về mặt chính trị (để đạt được khả năng không cần phép và kháng kiểm duyệt), phi tập trung về kiến trúc (để đạt được khả năng kháng lỗi không điểm hỏng đơn), nhưng tập trung về mặt logic (để đạt được kết quả nhất quán). Những tiêu chuẩn này ảnh hưởng lớn đến cách chúng ta thiết kế giao thức đồng thuận. Vitalik thảo luận các vấn đề này trong bài «Ý nghĩa của sự phi tập trung» (The Meaning of Decentralization).
Chào mừng tham gia cộng đồng chính thức TechFlow
Nhóm Telegram:https://t.me/TechFlowDaily
Tài khoản Twitter chính thức:https://x.com/TechFlowPost
Tài khoản Twitter tiếng Anh:https://x.com/BlockFlow_News














