เครือข่ายเพียร์ทูเพียร์: จาก Kademlia ถึง Discv5
หมายเหตุบรรณาธิการ: บทความนี้มาจากผู้ที่ชื่นชอบ Ethereum (ID: ethfans)หมายเหตุบรรณาธิการ: บทความนี้มาจาก
ผู้ที่ชื่นชอบ Ethereum (ID: ethfans)
ผู้เขียน: คณบดี แปลและพิสูจน์อักษร: Pei Qi & A Jian พิมพ์ซ้ำโดยได้รับอนุญาตจาก Odaily
หากคุณเคยทำงานกับ Ethereum หรือเทคโนโลยีที่เกี่ยวข้อง คุณอาจเคยได้ยินเกี่ยวกับ discv4 หรือ discv5 แต่สิ่งเหล่านี้คืออะไรกันแน่? พวกเขาทำงานอย่างไร? ความเป็นเลิศของพวกเขาอยู่ที่ไหน? เพื่อตอบคำถามเหล่านี้ เราต้องเริ่มจากศูนย์ โพสต์บล็อกนี้สันนิษฐานว่าผู้อ่านค่อนข้างใหม่สำหรับสาขานี้ ดังนั้นผู้ที่ไม่มีพื้นฐานทางเทคนิคก็สามารถอ่านได้
ชื่อเรื่องรอง
จุดเริ่มต้นของเรื่องราว: ในเครือข่าย P2P (เพียร์ทูเพียร์) การค้นพบโหนดร่วมกันและกระบวนการสร้างเครือข่ายจะประสบปัญหาบางประการ
เทคโนโลยีการแชร์ไฟล์แบบ P2P ในยุคแรกๆ เช่น Napster ใช้เซิร์ฟเวอร์เดียวในการแชร์ข้อมูลที่บันทึกว่าใครเป็นเจ้าของไฟล์ใดบ้าง โหนดเริ่มต้นการเชื่อมต่อกับเซิร์ฟเวอร์กลางและส่งรายการไฟล์ที่เป็นเจ้าของ จากนั้นโหนดอื่นจะเริ่มการเชื่อมต่อกับเซิร์ฟเวอร์กลางเดียวกัน ค้นหาโหนดที่เก็บข้อมูลของไฟล์ที่ต้องการ จากนั้นสร้างการเชื่อมต่อกับโหนดที่พบ อย่างไรก็ตาม นี่เป็นระบบที่มีข้อบกพร่อง - ระบบมีความเสี่ยงที่จะถูกโจมตี และโหนดเซิร์ฟเวอร์แบบรวมศูนย์อาจถูกฟ้องร้องได้ (หมายเหตุผู้แปล: ความสัมพันธ์ที่สอดคล้องกันระหว่างเนื้อหาไฟล์และโหนดจะถูกจัดเก็บไว้ในเซิร์ฟเวอร์เครื่องเดียว หากมีการระบุลิงก์ไปยังเนื้อหาที่มีลิขสิทธิ์ ผู้ให้บริการของเซิร์ฟเวอร์ส่วนกลางนี้จะต้องรับผิดชอบโดยตรงจากเจ้าของลิขสิทธิ์เดิม)
ดังนั้น โซลูชันอื่นจึงมีความจำเป็นอย่างเร่งด่วนสำหรับเครือข่ายเพียร์ทูเพียร์ หลังจากการวิจัยและการทดลองเป็นเวลาหลายปี นักวิจัยได้เสนอตารางแฮชแบบกระจาย (DHT)
ชื่อเรื่องรอง
ตารางแฮชแบบกระจาย
DHT ได้รับการกล่าวถึงข้างต้น แล้ว DHT คืออะไรกันแน่?
Kademlia
ตารางแฮชแบบกระจาย (DHT) เป็นรายการคีย์-ค่าแบบกระจาย โหนดที่เข้าร่วมใน DHT สามารถดึงค่าที่เกี่ยวข้องกับคีย์ที่ต้องการได้อย่างง่ายดาย
สมมติว่ามีคู่คีย์-ค่า 9 คู่และ 3 โหนดในเครือข่าย ตามหลักแล้ว แต่ละโหนดต้องการเก็บคู่คีย์-ค่า 3 คู่เท่านั้น (วิธีที่ดีที่สุดคือเก็บคู่คีย์-ค่า 6 คู่เพื่อให้สำรองไว้) หมายความว่าถ้า ต้องอัปเดตคู่คีย์-ค่า จำเป็นต้องอัปเดตโหนดเครือข่ายบางโหนดเท่านั้น แนวคิดทั่วไปคือโหนดใดๆ ในเครือข่ายสามารถทราบตำแหน่งที่จะค้นหาคู่คีย์-ค่าเฉพาะที่ต้องการ โดยพิจารณาจากวิธีการกระจายข้อมูลระหว่างโหนดต่างๆ
ชื่อเรื่องรอง
XOR 10011001 00110010 -------- 10101011
ตอนนี้เรารู้แล้วว่า DHT คืออะไร มาดู Kademlia ซึ่งเป็นบรรพบุรุษของ discv4 กัน Kademlia เป็นโปรโตคอล DHT ที่คิดค้นขึ้นในปี 2545 โดย Petar Maymounkov และ David Mazières ฉันคิดว่าโปรโตคอลนี้อาจเป็นโปรโตคอล DHT ที่ได้รับความนิยมและใช้กันอย่างแพร่หลาย วิธีการทำงานง่าย ๆ มาดูกัน
ใน Kademlia โหนดและค่าต่างๆ จะจัดเรียงตามระยะทาง (การจัดเรียงนั้นกำหนดไว้ในทางคณิตศาสตร์อย่างเคร่งครัด) ระยะทางในที่นี้ไม่ใช่ระยะทางทางภูมิศาสตร์ แต่เป็นการแทนตามตัวระบุ เมื่อใช้ฟังก์ชันระยะทาง ระยะทางระหว่างตัวระบุสองตัวสามารถคำนวณได้
Kademlia ใช้ XOR (ตัวดำเนินการพิเศษ OR) เป็นฟังก์ชันระยะทาง ลักษณะเฉพาะของฟังก์ชัน XOR คือเอาต์พุตจะเป็นจริงก็ต่อเมื่ออินพุตต่างกันเท่านั้น ต่อไปนี้คือตัวอย่างที่แสดงในตัวระบุไบนารี
ตัวอย่างข้างต้นบอกว่าระยะห่างระหว่างเลขทศนิยม 153 และ 50 คือ 171
มีหลายเหตุผลที่จะใช้ XOR เป็นฟังก์ชันระยะทาง ได้แก่ :
ID มีระยะห่างจากตัวมันเองเป็น 0
ระยะทางสมมาตร ระยะทางจาก A ถึง B เท่ากับระยะทางจาก B ถึง A
ตามอสมการสามเหลี่ยม ถ้า A, B, C เป็นจุดสามจุดบนรูปสามเหลี่ยม ระยะห่างจาก A ถึง B จะน้อยกว่าหรือเท่ากับระยะทางจาก A ถึง C บวกระยะทางจาก B ถึง C
โดยสรุป โหนดสามารถระบุได้ว่าโหนดใดเข้าใกล้โหนดมากขึ้นตามฟังก์ชันระยะทาง และตัดสินใจตาม "ระยะทาง" นี้
โหนด Kademlia เก็บตารางเส้นทาง ตารางเส้นทางประกอบด้วยหลายรายการ โหนดที่บันทึกไว้ในแต่ละรายการที่ตามมาจะอยู่ห่างจากโหนดในรายการก่อนหน้าเล็กน้อย แต่ละโหนดจะรักษาข้อมูลเกี่ยวกับโหนดที่อยู่ใกล้ตัวเองที่สุด ยิ่งมีโหนดอื่นอยู่ไกลออกไป โหนดโลคัลจะเก็บข้อมูลที่มีความเกี่ยวข้องน้อยกว่า
สมมติว่าฉันต้องการค้นหาโหนดเฉพาะ สิ่งที่ฉันต้องทำคือส่งคำขอไปยังโหนดที่รู้จักซึ่งส่งคืนเพื่อนบ้านในบันทึกที่ใกล้กับโหนดเป้าหมายของฉันมากขึ้น ฉันทำขั้นตอนนี้ซ้ำจนกว่าเพื่อนบ้านบางกลุ่มจะช่วยฉันค้นหาโหนดเป้าหมาย
กระบวนการเดียวกันนี้ใช้ได้กับค่าต่างๆ ระยะห่างระหว่างค่าและโหนดเป็นตัวกำหนด เนื่องจาก ID ตัวระบุของค่าและโหนดได้รับการจัดระเบียบในลักษณะเดียวกัน เราจึงคำนวณระยะทางนี้ได้ ถ้าฉันต้องการค้นหาค่า ฉันจะมองหาโหนดข้างเคียงที่ใกล้ที่สุดกับคีย์ของค่านั้นจนกว่าฉันจะพบโหนดที่เก็บค่านั้น
เพื่อให้โหนด Kademlia รองรับฟังก์ชันเหล่านี้ โปรโตคอลจะสื่อสารผ่านข้อความต่อไปนี้
PING - ใช้เพื่อตรวจสอบว่าโหนดยังคงทำงานอยู่หรือไม่
FINDNODE - ส่งคืนโหนดที่ใกล้เคียงที่สุดที่ร้องขอไปยัง ID ที่กำหนด
Discv4
FINDVALUE - เหมือนกับ FINDNODE ยกเว้นว่าถ้าโหนดเก็บค่าใดค่าหนึ่งไว้ ก็จะคืนค่าโดยตรง
นี่เป็นคำอธิบายที่เรียบง่ายมากเกี่ยวกับ Kademlia โดยข้ามรายละเอียดที่สำคัญต่างๆ เพื่อความเข้าใจที่ครอบคลุมยิ่งขึ้น ฉันขอแนะนำกระดาษต้นฉบับหรือข้อกำหนดการออกแบบที่ละเอียดยิ่งขึ้น
ชื่อเรื่องรอง
หลังจากปูทางสำหรับพื้นหลังแล้ว ในที่สุดเราก็มาถึง discv4 (หมายถึงการค้นพบ v4) ซึ่งเป็นโปรโตคอลการค้นหาโหนดปัจจุบันของ Ethereum โปรโตคอล Discv4 นั้นใช้ Kademlia แต่มีการเปลี่ยนแปลงบางอย่าง ตัวอย่างเช่น ส่วนค่าใน DHT จะไม่ใช้ใน discv4 อีกต่อไป
Kademlia ส่วนใหญ่จะใช้สำหรับการจัดระเบียบเครือข่าย ดังนั้นเราจึงสามารถใช้ตารางเส้นทางเพื่อค้นหาโหนดอื่นๆ แต่ discv4 ไม่ได้ใช้ส่วนของค่าใน DHT เลย เราจึงเลิกใช้คำสั่ง FINDVALUE และ STORE ที่ใช้ใน Kademlia ได้
ก่อนหน้านี้ วิธีการสืบค้นของ Kademlia อธิบายว่าโหนดรับเพียร์ได้อย่างไร โหนดเริ่มต้นคำขอไปยังโหนดอื่นเพื่อให้โหนดเข้าใกล้ตัวเองมากขึ้น ทำกระบวนการร้องขอนี้ซ้ำจนกว่าจะไม่พบโหนดใหม่
นอกจากนี้ discv4 ยังเพิ่มการรับรองความถูกต้องของเทอร์มินัลร่วมกัน นี่คือเพื่อให้แน่ใจว่าโหนดที่เริ่มต้นคำขอ FINDNODE เข้าร่วมในโปรโตคอลการค้นหาโหนดเดียวกัน
สุดท้าย โหนด discv4 ทั้งหมดควรรักษาบันทึก ENR ที่เป็นปัจจุบัน บันทึกประกอบด้วยข้อมูลเกี่ยวกับโหนด โหนดใดๆ สามารถใช้แพ็คเกจเฉพาะของ discv4 ที่เรียกว่า ENRRequest เพื่อขอบันทึก ENR
หากคุณต้องการทราบรายละเอียดเพิ่มเติมเกี่ยวกับ ENR โปรดไปที่โพสต์บล็อกอื่นของฉัน ที่อยู่เครือข่ายใน Ethereum
อย่างไรก็ตาม discv4 ยังแนะนำปัญหาบางอย่าง ลองมาดูบางส่วนของพวกเขา
ประการที่สอง เพื่อป้องกันการโจมตีซ้ำ discv4 ใช้การประทับเวลา ซึ่งอาจทำให้เกิดปัญหาได้ทุกประเภทเมื่อนาฬิกาของโฮสต์ทำงานผิดพลาด ดูส่วน "ปัญหาที่ทราบ" ของข้อกำหนด discv4 สำหรับรายละเอียดเพิ่มเติม
Discv5
ท้ายที่สุด ยังมีปัญหาในการยืนยันตัวตนร่วมกันของเทอร์มินัลอีกด้วย เนื่องจากมีความเป็นไปได้ที่แพ็กเก็ตจะสูญหาย จึงไม่มีทางบอกได้ว่าเพียร์สองคนได้รับรองความถูกต้องของกันและกันหรือไม่ นั่นคือ เราอาจคิดว่าเราได้รับการพิสูจน์ตัวตนแล้ว แต่เพื่อนที่เรากำลังสื่อสารด้วยไม่เป็นเช่นนั้น พวกเขาอาจปล่อยแพ็กเก็ต FINDNODE ของเราเป็นผล
ท้ายที่สุด ยังมีปัญหาในการยืนยันตัวตนร่วมกันของเทอร์มินัลอีกด้วย เนื่องจากมีความเป็นไปได้ที่แพ็กเก็ตจะสูญหาย จึงไม่มีทางบอกได้ว่าเพียร์สองคนได้รับรองความถูกต้องของกันและกันหรือไม่ นั่นคือ เราอาจคิดว่าเราได้รับการพิสูจน์ตัวตนแล้ว แต่เพื่อนที่เรากำลังสื่อสารด้วยไม่เป็นเช่นนั้น พวกเขาอาจปล่อยแพ็กเก็ต FINDNODE ของเราเป็นผล
ชื่อเรื่องรอง
สุดท้ายลองดูที่ discv5 Discv5 เป็นเวอร์ชันซ้ำของ discv4 และจะทำหน้าที่เป็นโปรโตคอลการค้นหาโหนดสำหรับ Eth 2.0 Discv5 มีจุดมุ่งหมายเพื่อแก้ไขปัญหาต่างๆ ที่มีอยู่ใน discv4
การเปลี่ยนแปลงแรกคือวิธีการทำงานของ FINDNODE ทั้ง Kademlia ดั้งเดิมและ discv5 ใช้ตัวระบุ ใน discv5 เราใช้ระยะทางลอการิทึม นั่นคือ หลังจากส่งคำขอ FINDNODE แล้ว โหนดที่อยู่ในการตอบสนองทั้งหมดจะอยู่ภายในระยะลอการิทึมเฉพาะจากโหนดผู้ส่ง
ระยะทางลอการิทึมหมายถึง: คำนวณระยะทางก่อน จากนั้นใช้ฟังก์ชันล็อกกับฐาน 2 เช่น log2(A xor B)
การเปลี่ยนแปลงที่สำคัญอย่างที่สองคือ discv5 มุ่งมั่นที่จะแก้ปัญหาที่ใหญ่ที่สุดใน discv4 นั่นคือความแตกต่างของโปรโตคอลรอง Discv5 เพิ่มตารางหัวข้อ ตารางหัวข้อคือรายการเข้าก่อนออกก่อนของโหนดที่ให้บริการเฉพาะ โหนดเพิ่มตัวเองในรายการนี้โดยการลงทะเบียนโฆษณากับเพื่อน
ในขณะที่เขียนนี้ ยังมีปัญหาบางอย่างเกี่ยวกับการดำเนินการเขียนในรูปแบบการสร้างความแตกต่างของโปรโตคอลย่อยนี้ ขณะนี้ไม่มีวิธีที่มีประสิทธิภาพสำหรับโหนดในการโฆษณาบนเพียร์หลายเครื่อง ดังนั้น จำเป็นต้องส่งคำขอแยกต่างหากไปยังแต่ละเพียร์ ซึ่งไม่มีประสิทธิภาพสำหรับเครือข่ายขนาดใหญ่
นอกจากนี้ยังไม่ชัดเจนว่าโหนดโฆษณาไปยังเพียร์จำนวนเท่าใด และไปยังเพียร์ใดบ้างที่โฆษณา ดู devp2p#136 สำหรับรายละเอียดเพิ่มเติม
มีการเปลี่ยนแปลงเล็กๆ น้อยๆ อื่นๆ อีกมากมายใน Discv5 แต่การเปลี่ยนแปลงเหล่านี้ไม่สำคัญนัก ดังนั้นจึงไม่ได้กล่าวถึงการเปลี่ยนแปลงเหล่านี้ในข้อมูลสรุปนี้


