Mạng ngang hàng: Từ Kademlia đến Discv5
Lưu ý của biên tập viên: Bài viết này đến từNhững người đam mê Ethereum (ID: ethfans)Lưu ý của biên tập viên: Bài viết này đến từ
Những người đam mê Ethereum (ID: ethfans)
, Tác giả: trưởng khoa, dịch & hiệu đính: Pei Qi & A Jian, được Odaily tái bản với sự cho phép.
Nếu bạn đang làm việc trên Ethereum hoặc các công nghệ liên quan, có lẽ bạn đã nghe nói về đĩav4 hoặc đĩav5. Nhưng những gì chính xác là những gì? Họ làm việc như thế nào? Sự xuất sắc của họ ở đâu? Để trả lời những câu hỏi này, chúng ta cần bắt đầu lại từ đầu. Bài đăng trên blog này giả định rằng người đọc tương đối mới trong lĩnh vực này, vì vậy những người không có nền tảng kỹ thuật cũng có thể đọc được.
tiêu đề phụ
Mở đầu câu chuyện: Trong mạng P2P (ngang hàng), việc phát hiện lẫn nhau của các nút và quá trình hình thành mạng sẽ gặp phải một số vấn đề.
Các công nghệ chia sẻ tệp P2P ban đầu, chẳng hạn như Napster, đã sử dụng một máy chủ duy nhất để chia sẻ thông tin ghi lại ai sở hữu tệp nào. Một nút bắt đầu kết nối với máy chủ trung tâm và gửi danh sách các tệp mà nó sở hữu. Sau đó, một nút khác sẽ khởi tạo kết nối đến cùng một máy chủ trung tâm, tìm kiếm nút lưu trữ của tệp mà nó cần, sau đó thiết lập kết nối với nút được tìm thấy. Tuy nhiên, đây là một hệ thống thiếu sót - hệ thống dễ bị tấn công và các nút máy chủ tập trung có thể bị kiện. (Ghi chú của người dịch: Mối quan hệ tương ứng giữa nội dung tệp và các nút được lưu trữ trên một máy chủ. Nếu một số liên kết đến nội dung có bản quyền được cung cấp, nhà cung cấp máy chủ tập trung này sẽ chịu trách nhiệm trực tiếp bởi chủ sở hữu bản quyền ban đầu.)
Do đó, một giải pháp khác là rất cần thiết cho các mạng ngang hàng. Sau vài năm nghiên cứu và thử nghiệm, các nhà nghiên cứu đã đề xuất một bảng băm phân tán (DHT).
tiêu đề phụ
bảng băm phân tán
DHT đã được đề cập ở trên. Vậy chính xác thì DHT là gì?
Kademlia
Bảng băm phân tán (DHT) là danh sách khóa-giá trị được phân phối. Các nút tham gia DHT có thể dễ dàng truy xuất giá trị tương ứng với một khóa nhất định.
Giả sử có 9 cặp khóa-giá trị và 3 nút trong một mạng, lý tưởng nhất là mỗi nút chỉ cần lưu trữ 3 cặp khóa-giá trị (cách tốt nhất là lưu trữ 6 cặp khóa-giá trị để dự phòng), Điều đó có nghĩa là nếu một cặp khóa-giá trị sẽ được cập nhật, chỉ cần cập nhật một số nút mạng. Ý tưởng chung là bất kỳ nút nào trong mạng đều có thể biết nơi tìm kiếm cặp khóa-giá trị cụ thể mà nó cần dựa trên cách thông tin được phân phối giữa các nút.
tiêu đề phụ
XOR 10011001 00110010 -------- 10101011
Bây giờ chúng ta đã biết DHT là gì, hãy xem Kademlia, tiền thân của discv4. Kademlia là một giao thức DHT được phát minh vào năm 2002 bởi Petar Maymounkov và David Mazières. Tôi nghĩ giao thức này có thể là giao thức DHT phổ biến và được sử dụng rộng rãi nhất. Cách thức hoạt động rất đơn giản, hãy cùng tìm hiểu nhé.
Trong Kademlia, các nút và giá trị được sắp xếp theo khoảng cách (sự sắp xếp được xác định chính xác về mặt toán học). Khoảng cách ở đây không phải là khoảng cách địa lý mà là sự thể hiện dựa trên định danh. Bằng cách sử dụng một số chức năng khoảng cách, khoảng cách giữa hai số nhận dạng có thể được tính toán.
Kademlia sử dụng XOR (toán tử OR độc quyền) làm hàm khoảng cách. Đặc điểm của hàm XOR là đầu ra chỉ đúng nếu các đầu vào khác nhau. Sau đây là một ví dụ được thể hiện bằng mã định danh nhị phân.
Ví dụ trên nói rằng khoảng cách giữa các số thập phân 153 và 50 là 171.
Có nhiều lý do để sử dụng XOR làm hàm khoảng cách, bao gồm:
ID có khoảng cách bằng 0 với chính nó.
Khoảng cách là đối xứng, khoảng cách từ A đến B giống như khoảng cách từ B đến A.
Theo bất đẳng thức tam giác, nếu A, B, C là ba điểm nằm trên một tam giác thì khoảng cách từ A đến B nhỏ hơn hoặc bằng khoảng cách từ A đến C cộng với khoảng cách từ B đến C.
Tóm lại, một nút có thể xác định nút nào gần nó hơn theo chức năng khoảng cách và đưa ra quyết định dựa trên "khoảng cách" này.
Các nút Kademlia lưu trữ một bảng định tuyến. Bảng định tuyến chứa nhiều danh sách. Các nút được ghi trong mỗi danh sách tiếp theo xa hơn một chút so với các nút trong danh sách trước đó. Mỗi nút duy trì thông tin về nút gần chính nó nhất; nút khác càng ở xa thì thông tin liên quan mà nút cục bộ giữ lại càng ít.
Giả sử tôi muốn tìm một nút cụ thể. Tất cả những gì tôi phải làm là gửi yêu cầu đến các nút đã biết của mình, các nút này sẽ trả về các nút lân cận trong bản ghi của họ gần với nút mục tiêu của tôi hơn. Tôi lặp lại quá trình này cho đến khi một số nhóm hàng xóm giúp tôi tìm nút đích.
Quá trình tương tự làm việc cho các giá trị. Khoảng cách giữa giá trị và nút là xác định, vì ID định danh của giá trị và nút được tổ chức theo cùng một cách, vì vậy chúng tôi có thể tính toán khoảng cách này. Nếu tôi muốn tra cứu một giá trị, tôi chỉ cần tìm nút lân cận gần nhất với khóa của giá trị đó cho đến khi tôi tìm thấy nút lưu trữ giá trị đó.
Để các nút Kademlia hỗ trợ các chức năng này, giao thức sẽ giao tiếp thông qua các thông báo sau.
PING - Được sử dụng để kiểm tra xem một nút có còn chạy hay không.
FINDNODE - Trả về nút gần nhất được yêu cầu cho ID đã cho.
Discv4
FINDVALUE - Tương tự như FINDNODE, ngoại trừ việc nếu một nút lưu trữ một giá trị cụ thể, nó sẽ trả về giá trị đó trực tiếp.
Đây là một lời giải thích rất đơn giản về Kademlia, bỏ qua nhiều chi tiết quan trọng. Để hiểu toàn diện hơn, tôi thực sự khuyên bạn nên đọc bài báo gốc hoặc thông số kỹ thuật thiết kế sâu hơn.
tiêu đề phụ
Sau khi mở đường cho nền tảng, cuối cùng chúng ta cũng đến với discv4 (có nghĩa là khám phá v4), đây là giao thức khám phá nút hiện tại của Ethereum. Bản thân giao thức Discv4 dựa trên Kademlia, nhưng có một số thay đổi. Ví dụ: phần giá trị trong DHT không còn được sử dụng trong discv4.
Kademlia chủ yếu được sử dụng cho việc tổ chức mạng, vì vậy chúng ta có thể sử dụng bảng định tuyến để định vị các nút khác. Nhưng discv4 hoàn toàn không sử dụng phần giá trị trong DHT, vì vậy chúng ta có thể bỏ các lệnh FINDVALUE và STORE được sử dụng trong Kademlia.
Trước đây, phương thức truy vấn của Kademlia đã mô tả cách các nút nhận được các nút ngang hàng. Một nút khởi tạo một yêu cầu đến các nút khác để có được một nút gần hơn với chính nó. Lặp lại quy trình yêu cầu này cho đến khi không tìm thấy nút mới nào.
Ngoài ra, discv4 thêm xác thực thiết bị đầu cuối lẫn nhau. Điều này là để đảm bảo rằng nút khởi tạo yêu cầu FINDNODE đang tham gia vào cùng một giao thức khám phá nút.
Cuối cùng, tất cả các nút discv4 phải duy trì các bản ghi ENR cập nhật. Một bản ghi chứa thông tin về một nút. Bất kỳ nút nào cũng có thể sử dụng gói dành riêng cho discv4 có tên là ENRRequest để yêu cầu bản ghi ENR.
Nếu bạn muốn biết thêm chi tiết về ENR, vui lòng chuyển sang bài đăng trên blog khác của tôi Địa chỉ mạng trong Ethereum.
Tuy nhiên, đĩav4 cũng đưa ra một số vấn đề. Chúng ta hãy nhìn vào một vài trong số họ.
Thứ hai, để chống lại các cuộc tấn công phát lại, đĩav4 sử dụng dấu thời gian. Điều này có thể gây ra tất cả các loại vấn đề khi đồng hồ của máy chủ chạy sai. Xem phần "Các vấn đề đã biết" của đặc tả discv4 để biết thêm chi tiết.
Discv5
Cuối cùng, cũng có những vấn đề trong việc xác thực lẫn nhau của các thiết bị đầu cuối. Do khả năng mất gói, không có cách nào để biết liệu hai đồng nghiệp đã xác thực lẫn nhau hay chưa. Nghĩa là, chúng tôi có thể nghĩ rằng chúng tôi đã được xác thực, nhưng các đồng nghiệp mà chúng tôi đang giao tiếp thì không; kết quả là họ có thể bỏ các gói FINDNODE của chúng tôi.
Cuối cùng, cũng có những vấn đề trong việc xác thực lẫn nhau của các thiết bị đầu cuối. Do khả năng mất gói, không có cách nào để biết liệu hai đồng nghiệp đã xác thực lẫn nhau hay chưa. Nghĩa là, chúng tôi có thể nghĩ rằng chúng tôi đã được xác thực, nhưng các đồng nghiệp mà chúng tôi đang giao tiếp thì không; kết quả là họ có thể bỏ các gói FINDNODE của chúng tôi.
tiêu đề phụ
Cuối cùng, hãy xem đĩav5. Discv5 là phiên bản lặp lại của discv4 và sẽ đóng vai trò là giao thức khám phá nút cho Eth 2.0. Discv5 nhằm mục đích khắc phục nhiều sự cố tồn tại trong đĩav4.
Thay đổi đầu tiên là cách FINDNODE hoạt động. Cả Kademlia và discv5 truyền thống đều sử dụng số nhận dạng. Trong đĩav5, chúng tôi sử dụng khoảng cách logarit, nghĩa là sau khi gửi yêu cầu FINDNODE, các nút có trong phản hồi đều nằm trong một khoảng cách logarit cụ thể từ nút người gửi.
Khoảng cách logarit có nghĩa là: trước tiên hãy tính khoảng cách, sau đó sử dụng hàm log với cơ số 2, tức là log2(A xor B).
Thay đổi rất quan trọng thứ hai là đĩav5 đã được cam kết giải quyết vấn đề lớn nhất trong đĩav4: sự khác biệt của các giao thức thứ cấp. Discv5 thêm các bảng chủ đề. Bảng chủ đề là danh sách các nút nhập trước xuất trước cung cấp một dịch vụ cụ thể. Các nút tự thêm vào danh sách này bằng cách đăng ký quảng cáo với các nút ngang hàng.
Khi viết bài này, vẫn còn một số vấn đề với các thao tác ghi trong lược đồ phân biệt giao thức con này. Hiện tại không có cách nào hiệu quả để một nút quảng cáo trên nhiều thiết bị ngang hàng, do đó, một yêu cầu riêng biệt cần được gửi đến từng thiết bị ngang hàng, điều này không hiệu quả đối với các mạng quy mô lớn.
Hơn nữa, không rõ có bao nhiêu nút mà một nút quảng cáo tới và nó quảng cáo tới những nút nào. Xem devp2p#136 để biết thêm chi tiết.
Còn nhiều thay đổi nhỏ khác trong Discv5 nhưng những thay đổi này không quá quan trọng nên được lược bỏ trong bản tóm tắt này.


