โปรโตคอลเครือข่ายสังคมแบบเพียร์ทูเพียร์
TLDR:
- Solcial ถูกสร้างขึ้นเพื่อให้ผู้ใช้ได้รับประสบการณ์ที่ใกล้เคียงที่สุดกับแพลตฟอร์มโซเชียลมีเดีย Web2 ในขณะที่ใช้ประโยชน์จากเทคโนโลยี Web3
- อุปสรรคอย่างหนึ่งที่แพลตฟอร์มที่ใช้บล็อคเชนต้องเผชิญคือค่าธรรมเนียมผู้ใช้ เพื่อขจัดค่าธรรมเนียมผู้ใช้สำหรับการดำเนินการที่ไม่เกี่ยวกับโทเค็นในขณะที่ยังคงความเป็นส่วนตัวและความเป็นเอกฉันท์ Solcial กำลังสร้างเพียร์ทูเพียร์ (P2P) ที่ยึดใน Solana และสร้างขึ้นบน libp2p ที่ส่งเนื้อหา (ฟีด ชอบ ฯลฯ ) ผ่านการควบคุมด้วยตนเองและการจำลองแบบเพียร์
- เรายังได้พัฒนาโหนดประเภทพิเศษที่มีโปรโตคอลภายนอกเหมือนกับแอปเดสก์ท็อปหรือมือถือทั่วไป พร้อมการเพิ่มประสิทธิภาพเพิ่มเติมที่ออกแบบมาเพื่อจัดการกับเพียร์ที่ทำงานพร้อมกันนับหมื่นที่เรียกว่า Beacon Nodes บีคอนเป็นชุดของบริการปักหมุดที่จะรักษาเนื้อหาของผู้ใช้เมื่อผู้สร้างออฟไลน์และทำให้ผู้ใช้รายอื่นสามารถใช้งานได้ เนื้อหาของผู้ใช้ทั้งหมดถูกจัดเก็บบน IPFS และเข้าถึงได้ผ่านเลเยอร์ P2P โดยไม่ต้องอาศัยเซิร์ฟเวอร์หรือเกตเวย์ที่เซ็นเซอร์ได้
โทโพโลยีเครือข่าย
โหนดสื่อสารผ่านอินเทอร์เน็ตสาธารณะ สร้างเครือข่ายโอเวอร์เลย์เฉพาะสำหรับ Solcial โดยใช้โปรโตคอล HyparView¹ เวอร์ชันดัดแปลง
แต่ละโหนดรักษารายการเพียร์ที่ใช้งานอยู่ด้วยขนาด
log2 (N)+1 โดยที่ N คือขนาดโดยประมาณของเครือข่ายทั้งหมด มูลค่าของ N ถูกดึงออกจากบล็อคเชนโดยการค้นหาจำนวนบัญชีผู้ใช้ที่ลงทะเบียนเป็นปัจจุบัน และอัปเดตเป็นระยะเมื่อจำนวนผู้ใช้เพิ่มขึ้น การเชื่อมต่อกับเพียร์ที่ทำงานอยู่นั้นเสถียร แบบสองทิศทางและต่อเนื่อง และเป็นโหนดที่พวกเขาสื่อสารด้วยโดยตรงในระหว่างการพูดถึงหรือกิจกรรม p2p อื่นๆ แต่ละโหนดยังรักษารายการเพียร์แบบพาสซีฟด้วยขนาด 6(log2(N)+1)ที่ใช้เป็นตัวสำรองในกรณีที่เพียร์ที่ใช้งานอยู่ขาดการเชื่อมต่อหรือไม่ตอบสนอง โปรโตคอลพื้นฐานสำหรับการเชื่อมต่อระหว่างเพียร์ที่ใช้งานอยู่คือ QUIC² พร้อมการเข้ารหัส NOISE ซึ่งทั้งหมดขับเคลื่อนโดย libp2p³
การข้ามผ่าน NAT ทำได้โดยใช้สามวิธีที่ใช้ขึ้นอยู่กับสถานการณ์เครือข่ายของเพียร์ วิธีแรกคือการใช้ IPv6 แทน IPv4 ทุกครั้งที่ทำได้ เพราะในกรณีนี้ไม่จำเป็นต้องใช้ NAT อย่างไรก็ตาม ตามสถิติมีเพียง 40% ของอินเทอร์เน็ตที่ใช้ IPv6⁴
กลไกทางเลือกคือการใช้ AutoNAT โดยใช้โปรโตคอลการระบุตัวตนของ libp2p ที่ถามโหนดอื่นๆ ในเครือข่ายเกี่ยวกับที่อยู่ที่มองเห็นได้ของเครื่องของเรา ที่อยู่นั้นซึ่งเริ่มต้นโดยเพียร์ที่อยู่เบื้องหลัง NAT นั้นได้ลงทะเบียนกับเราเตอร์ของตนไปยังเครื่องเป้าหมายแล้ว
อย่างไรก็ตาม มีสถานการณ์ที่วิธีนี้ใช้ไม่ได้ผล เราจึงถอยกลับไปใช้ตัวเลือกที่สามและน่าเชื่อถือที่สุดแต่มีราคาแพง
ตัวเลือกที่สามคือการใช้โปรโตคอลรีเลย์วงจร libp2p ที่เลียนแบบการทำงานของโปรโตคอล TURN⁶ โดยมีโหนดระดับกลางที่ถ่ายทอดแพ็กเก็ตระหว่างสองเพียร์หลัง NAT บทบาทนี้สามารถสันนิษฐานได้โดยโหนดบีคอนและเพียร์บางตัวที่มี IP สาธารณะที่เลือกใช้รีเลย์ที่มีขีดจำกัดที่กำหนดค่าไว้ ข้อมูลเพิ่มเติมเกี่ยวกับโหนดบีคอนในโพสต์นี้
ตัวตนของเพียร์
เพียร์จะถูกระบุโดยใช้กุญแจสาธารณะของพวกเขาในรูปแบบของ multihash⁷ ที่เท่ากับกุญแจสาธารณะของที่อยู่กระเป๋าเงินของพวกเขาบน Solana ที่ลงทะเบียนกับสัญญา Solcial on-chain วิธีเดียวที่จะถือว่า ID เพียร์สาธารณะที่กำหนดคือการครอบครองคีย์ลับของคู่คีย์ ED25519
คู่คีย์นี้ยังใช้เพื่อสร้างช่องทางที่เข้ารหัสสำหรับข้อความทั้งหมดที่ส่งผ่านระหว่างเพื่อน ตลอดจนวิธีการตรวจสอบความถูกต้องของข้อความที่คาดว่าเจ้าของกระเป๋าเงินจะสร้างขึ้น
การซ้อนทับของสมาชิก
เพียร์ที่มีกุญแจสาธารณะที่ไม่ได้ลงทะเบียนในเครือข่ายจะไม่ได้รับอนุญาตให้เข้าร่วมการซ้อนทับเครือข่าย HyparView และจะถูกแยกออกจากเครือข่าย Solcial Peer-to-Peer โดยอัตโนมัติ
เพียร์ทั้งหมดที่ต้องการเข้าร่วม Solcial p2p จะส่งข้อความ JOIN ไปยังหนึ่งในโหนดบูตสแตรป (โหนดบูตสแตรปบางอันเป็นโหนดบีคอนด้วย) ในหัวข้อ /solcial/public การแนะนำหัวข้อสู่ HyparView เป็นหนึ่งในการแก้ไขของเราในบทความต้นฉบับ
โหนดใด ๆ ที่ได้รับคำขอ JOIN จากเพียร์จะตรวจสอบก่อนว่า multihash มีอยู่ในสายโซ่และเชื่อมโยงกับบัญชี Solcial จากนั้นจะส่งข้อความ FORWARDJOIN ไปยังหนึ่งในเพียร์ที่ใช้งานอยู่โดยตั้งค่าการเดินสุ่มแบบแอ็คทีฟเป็น 3 เทิร์นจะเผยแพร่ข้อความนั้นไปยังเพื่อนร่วมงานที่แอ็คทีฟทั้งหมด โดยเพิ่มจำนวนฮ็อพปัจจุบันทีละหนึ่งจนกว่าจะถึง 3 ฮ็อพ นี่เป็นการบรรเทาการโจมตี DDoS ต่อโหนดบูตสแตรป ตลอดจนเทคนิคการกระจายอำนาจที่มีประสิทธิภาพเพื่อกระจายและสุ่มการเชื่อมต่อระหว่างโหนดให้มากที่สุด
โหนดใด ๆ ที่อยู่ภายใน 3 ฮ็อพของตัวรับ JOIN เริ่มต้นจะส่งข้อความ NEIGHBOR ไปยังผู้ร้องขอ JOIN เริ่มต้นซึ่งสร้างการเชื่อมต่อถาวรระหว่างกัน
ทุกๆ 15 วินาที โหนดจะมีข้อความ SHUFFLE ไปยังเพียร์ที่ใช้งานแบบสุ่มโดยสุ่มตัวอย่างจากเพียร์ที่ทำงานและพาสซีฟ และตั้งค่าความยาวสุ่มเดินของข้อความนี้เป็น 4 เพื่อให้แน่ใจว่าเพียร์ทั้งหมดในเครือข่ายมีข้อมูลใหม่ๆ อยู่เสมอ เพียร์อื่น ๆ ที่พวกเขาสามารถเก็บไว้ในมุมมองแบบพาสซีฟเพื่อวัตถุประสงค์ในการซ่อมแซมเครือข่าย เมื่อใดก็ตามที่เพียร์ที่ใช้งานอยู่ไม่ตอบสนองหรือยกเลิกการเชื่อมต่ออย่างชัดเจน
การพูดถึงอย่างมีประสิทธิภาพ
เฉพาะเพื่อนร่วมงานที่กระตือรือร้นเท่านั้นที่มีส่วนร่วมในการเผยแพร่ข้อความระหว่างเพื่อน เพียร์ที่ใช้งานจะสร้างเครือข่ายโอเวอร์เลย์บนอินเทอร์เน็ตสาธารณะ และมีวงจรอยู่ในกราฟการเชื่อมต่อระหว่างโหนด เพื่อให้การกล่าวถึงข้อความระหว่างเพื่อนในเครือข่ายเป็นไปอย่างมีประสิทธิภาพ เราต้องลดการแพร่กระจายข้อความที่ซ้ำกันระหว่างเพื่อนและคนที่สองก่อน ให้ค้นหาเส้นทางที่เหมาะสมที่สุดสำหรับข้อความ
สิ่งนี้ทำได้โดยใช้อัลกอริธึม Epidemic Broadcast Trees8 ที่สร้างแผนผังการแผ่ขยายขั้นต่ำระหว่างเพียร์ โดยแยกเพียร์ออกเป็นกลุ่มของโหนดแบบกดกระตือรือร้นและโหนดแบบพุชที่ขี้เกียจ Eager-push nodes มักจะได้รับข้อความที่ส่งต่อทันทีที่ได้รับจากโหนดใดๆ
Lazy push nodes จะได้รับเป็นระยะ ๆ ทุกๆ 500ms เป็นกลุ่มของรหัสข้อความที่โหนดปัจจุบันเห็น เมื่อใดก็ตามที่โหนดสังเกตว่ามี id ข้อความในชุด lazy-push ที่ไม่ได้รับจากโหนดหลักต้นน้ำ โหนดจะสร้างการเชื่อมต่อใหม่ (GRAFT) และกู้คืนสถานะแอ็คทีฟพุช นี่ถือเป็นกลไกการซ่อมแซมต้นไม้ขยายขั้นต่ำในกรณีที่โหนดใดโหนดหนึ่งหยุดทำงานและเกิดกราฟที่ไม่ต่อเนื่องกัน ข้อความ GRAFT จะคืนค่าการเชื่อมต่อเครือข่ายทั้งหมด
เมื่อใดก็ตามที่พบว่าข้อความที่ได้รับซ้ำกับข้อความที่ได้รับก่อนหน้านี้จากโหนดที่ทำงานอยู่ การเชื่อมต่อกับโหนดนั้นถือเป็นวงจรในกราฟและเปลี่ยนเป็น Lazy-Push โดยการส่งข้อความ PRUNE
อีกกรณีหนึ่งสำหรับการตัดการเชื่อมต่อที่แอ็คทีฟและแทนที่ด้วยการเชื่อมต่อจากรายการที่ข้าลง คือเมื่อเราสังเกตว่าจำนวนการกระโดดของข้อความที่ส่งถึงเราผ่านโหนดที่ช้านั้นน้อยกว่า 4 ฮ็อพจากข้อความเพียร์ที่กระตือรือร้นที่กระตือรือร้น ที่ประกอบเป็นอัลกอริธึมการเพิ่มประสิทธิภาพแผนผังการกระจายข่าว
การเผยแพร่เนื้อหา
ข้อความที่พูดคุยผ่านโปรโตคอล p2p ที่อธิบายไว้ในส่วนก่อนหน้านี้คือข้อความ IPFS Bitswap⁹ ที่มี CID ของเนื้อหาที่สร้างโดยผู้ใช้ Solcial เพื่อให้เข้าใจวิธีการใช้ Bitswap และ IPFS ใน Solcial ได้ดีขึ้น อันดับแรก เรามาอธิบายโครงสร้างของโปรไฟล์ผู้ใช้กันก่อน
บัญชีผู้ใช้แต่ละรายในเครือข่ายมีสิ่งที่เรียกว่าดัชนีโปรไฟล์ ดัชนีนี้ชี้ไปที่ CID ของเนื้อหาเวอร์ชันล่าสุด ดัชนีนี้เป็น CRDT ลำดับที่สม่ำเสมอในที่สุด ซึ่งสร้างบันทึกการดำเนินการที่ไม่เปลี่ยนรูปของการดำเนินการที่ดำเนินการโดยบัญชี
ดัชนีโปรไฟล์ถือเป็นรายการที่เชื่อมโยง โดยองค์ประกอบแต่ละส่วนจะชี้ไปที่ CID ขององค์ประกอบก่อนหน้า และเพื่อนร่วมงานจะยอมรับเป็นองค์ประกอบถัดไปตามลำดับก็ต่อเมื่อลงนามโดยคีย์ส่วนตัวของเจ้าของบัญชีเท่านั้น ตัวอย่างเชิงตรรกะระดับสูงของฟีดโปรไฟล์ที่โพสต์ซึ่งเข้ารหัสในรูปแบบนี้มีลักษณะดังนี้:
{
“author”: “12D3KooWSoeYKbpkb5UoL2T5eiomWRHdxR9cPC4tk11gKU89fFwT”,
“prev”: “QmYtUc4iTCbbfVSDNKvtQqrfyezPPnFvE33wFmutw9PBBk”,
“action”: “append-feed-post”,
“timestamp”: “2022–01–11T15:58Z”,
“params”: {
“content”: “QmV8cfu6n4NT5xRr2AHdKxFMTZEJrA44qgrBCr739BN9Wb”
“enckey”: “z2DhMLJmV8kNQm6zeWUrXQKtmzoh6YkKHSRxVSibscDQ7nq”
},
“signature”: “2Lpnvt23H6qHswCNPmwCCUSas7YNP[…]jV1dC9qdNPR4zDqsCuBX”
}
รายการเช่นนั้นมี CID ของตัวเองและเผยแพร่เป็นวัตถุ IPFS PB-DAG¹⁰ ไปยังหัวข้อ /solcial/content HyparView ซ้อนทับ รายการนี้เชื่อมโยงกับรายการก่อนหน้าและเนื้อหาเพิ่มเติมโดยการค้นหา CID ที่เชื่อมโยงซ้ำ ๆ ผู้ใช้สามารถรับประวัติบัญชีและเนื้อหาทั้งหมดได้
ออบเจ็กต์นี้ได้รับการตรวจสอบก่อนโดยเพียร์ผู้รับใดๆ หากลายเซ็นของเนื้อหาตรงกับคีย์สาธารณะของผู้เขียน ในกรณีที่การตรวจสอบลายเซ็นล้มเหลว ผู้ส่งจะถูกแบนถาวรจากโหนดปัจจุบันเนื่องจากละเมิดโปรโตคอล การตรวจสอบลายเซ็นที่ประสบความสำเร็จจะเผยแพร่เนื้อหาไปยังเพื่อนคนอื่นๆ ทั้งหมดที่สนใจเนื้อหาที่เขียนโดยบัญชีนี้
เมื่อเพียร์ได้รับ CID ดังกล่าว จะถูกเพิ่มลงในบันทึกการดำเนินงานของผู้เขียน ผลรวมของการดำเนินการทั้งหมดที่ดำเนินการโดยผู้เขียนถือเป็นสถานะปัจจุบันของโปรไฟล์
โดยค่าเริ่มต้น แต่ละโหนดจะปักหมุดและเริ่มต้นเนื้อหาในบัญชีของตนเองและเนื้อหาเพื่อน มีเพียร์พิเศษที่เรากำลังสร้างโดยเป็นส่วนหนึ่งของโครงสร้างพื้นฐานของเราซึ่งเราเรียกโหนดบีคอนและพวกมันก็เหมือนกับเพียร์ผู้ใช้ทั่วไป ยกเว้นว่าพวกเขาสนใจในเนื้อหาของทุกคนและทำหน้าที่เป็นบริการปักหมุด IPFS เฉพาะโซเชียลสำหรับเนื้อหาทั้งหมด ในกรณีที่ seeders ปัจจุบันทั้งหมดออฟไลน์ คิดว่าเป็นโหนดของทุกคน เครือข่ายจะสามารถทำงานได้โดยไม่ต้องมีก็ได้ แต่จะมีความใงานของเนื้อหาเพิ่มเติมเสมอ
การเข้าถึงการอ่าน
ทุกคนบนโอเวอร์เลย์ Solcial p2p สามารถสืบค้น ดาวน์โหลด และจัดเตรียมเนื้อหาของผู้ใช้โดยกระจายข้อความ IWANT และ IHAVE Bitswap ไปยังหัวข้อ /solcial/content ด้วย CID ของดัชนีรูทระดับบนสุดของบัญชี จากนั้นจึงขอ CID ที่เชื่อมโยงทั้งหมดซ้ำๆ
การซิงค์เริ่มต้นของบัญชีหรือการรับรายการล่าสุดของบัญชีทำได้โดยการกระจายข้อความ HEAD ไปยังหัวข้อ /solcial/sync โดยที่เพียร์อื่น ๆ ที่เป็น seeders (รวมถึง beacon nodes) ตอบสนองด้วย CID ของเนื้อหาล่าสุดที่พวกเขาทราบ ของ. การแปลระหว่างตัวจัดการผู้ใช้และกุญแจสาธารณะของผู้ใช้ทำได้โดยการสอบถาม Solana blockchain
ฟิลด์รายการก่อนหน้าสามารถใช้เพื่อแก้ไข HEADs ที่ขัดแย้งกันและตัดสินใจเลือกรายการปัจจุบัน
การเข้าถึงการเขียน
เพื่อให้สามารถเขียนบันทึกบัญชี ผู้ใช้ต้องมีคีย์ส่วนตัวของคู่คีย์ ED25519 ที่สอดคล้องกับรหัสบัญชีของตน การมีคีย์นั้น ผู้ใช้สามารถสร้างลายเซ็นที่ถูกต้องของรายการที่พวกเขากำลังต่อท้ายบันทึกที่จะไม่ถูกปฏิเสธโดยเพียร์อื่น ๆ ในเครือข่าย
สิทธิ์การเข้าถึงเนื้อหา
เนื้อหาบางส่วนที่โพสต์โดยผู้ใช้มีไว้สำหรับกลุ่มผู้รับที่เลือกเท่านั้น เช่น ฟีดการสมัครรับข้อมูลระดับ Tier-1 หรือ Tier-2 โพสต์เหล่านี้ได้รับการเข้ารหัสก่อนโดยใช้คีย์การเข้ารหัส AES-256 แบบสมมาตร แฮชของคีย์นั้นแนบมากับข้อมูลเมตาของเนื้อหาในโพสต์ต้นฉบับ
คีย์จะกระจายไปยังชุดย่อยแบบสุ่มของเพียร์ที่มีสิทธิ์ผ่านช่องสัญญาณที่เข้ารหัส NOISE ที่สร้างขึ้นระหว่างแฮนด์เชค libp2p ผู้เขียนโพสต์อาจเลือกที่จะอนุญาตให้โหนดบีคอนเข้าร่วมในโครงการแลกเปลี่ยนคีย์เพื่อให้กระบวนการนี้อยู่ใกล้ทันทีสำหรับผู้ใช้ทั้งหมด แต่ไม่จำเป็นต้องทำหากเชื่อว่าเนื้อหาของพวกเขามีความละเอียดอ่อนมาก เมื่อผู้ใช้ที่มีสิทธิ์ต้องการถอดรหัสเนื้อหา พวกเขาจะส่งข้อความ GETKEY ไปยังหัวข้อโอเวอร์เลย์ /solcial/keyexchange ด้วยแฮชของคีย์การเข้ารหัส
เพื่อนร่วมงานทุกคนที่อยู่ในความครอบครองของคีย์นั้นที่ออนไลน์จะตรวจสอบคุณสมบัติของเพียร์ในการรับคีย์นั้นโดยสอบถามบล็อคเชนและตรวจสอบว่าผู้ใช้ถือโทเค็นที่จำเป็นสำหรับการเข้าถึงเนื้อหาหรือไม่ หลังจากการตรวจสอบยืนยันสำเร็จแล้ว คีย์จะถูกส่งไปยังเพียร์ที่ร้องขอโดยใช้การเชื่อมต่อ quic/noise โดยตรงที่ข้ามโปรโตคอลการนินทา
รองรับแพลตฟอร์ม
โปรโตคอลเพียร์ทูเพียร์นี้สำหรับเนื้อหาที่ต่อต้านการเซ็นเซอร์มีให้เฉพาะสำหรับเดสก์ท็อปและไคลเอนต์มือถือ และไม่มีให้บริการผ่านอินเทอร์เฟซเว็บ นี่เป็นเพราะข้อจำกัดของเบราว์เซอร์ เบราว์เซอร์ได้รับการออกแบบมาโดยเนื้อแท้ในฐานะผู้บริโภคเนื้อหาที่โฮสต์บนเซิร์ฟเวอร์และรูปแบบการรักษาความปลอดภัยของเบราว์เซอร์นั้นห้ามรับการเชื่อมต่อแบบสุ่มจากเครื่องอื่น
เวอร์ชันของเว็บจะถูกรวมศูนย์เกือบทุกครั้งเนื่องจากวิธีการทำงานของเบราว์เซอร์และอายุการใช้งานของแท็บเบราว์เซอร์นั้นสั้น และเนื้อหาใดๆ ที่สร้างผ่านอินเทอร์เฟซเว็บจะถูกมิเรอร์บน p2p โดยโหนดบีคอน เนื้อหาใดๆ ที่เว็บไคลเอ็นต์ใช้จะเป็นสำเนาของ p2p P2P คือที่มาของความจริง
เทคนิคพื้นฐานถูกนำมาใช้โดยใช้ Rust, libp2p พร้อมการผูกกับ React Native และ Tauri¹¹
[1] Leitao, Joao, José Pereira, and Luis Rodrigues. “HyParView: A membership protocol for reliable gossip-based broadcast.”
[2] https://en.wikipedia.org/wiki/QUIC
[4] https://www.google.com/intl/en/ipv6/statistics.html
[5] https://docs.libp2p.io/concepts/circuit-relay/
[6] https://datatracker.ietf.org/doc/html/rfc5766
[7] https://docs.libp2p.io/reference/glossary/#multihash
[8] Leitao, Joao, Jose Pereira, and Luis Rodrigues. “Epidemic broadcast trees.” 2007 26th IEEE International Symposium on Reliable Distributed Systems (SRDS 2007). IEEE, 2007.
[9] https://docs.ipfs.io/concepts/bitswap/
[10] https://github.com/ipld/ipld/blob/master/specs/codecs/dag-pb/spec.md
เกี่ยวกับ Solcial
Solcial เป็นเครือข่ายโซเชียลแบบกระจายอำนาจที่ให้ผู้ใช้พลังของ web3 โดยอนุญาตให้ผู้คนโต้ตอบกันโดยไม่ต้องกลัวการเซ็นเซอร์ และอนุญาตให้ผู้สร้างเนื้อหาได้รับรางวัลอย่างยุติธรรมตามมูลค่าตลาด
ติดต่อกับ Solcial
Telegram: https://t.me/solcial
Discord: https://discord.gg/solcial
Twitter: https://twitter.com/solcialofficial
Blog: http://blog.solcial.io/
Website: https://solcial.io
Email: [email protected]
Linktree: https://linktr.ee/solcial