분산 소셜 네트워크 - 웹 스케일 소셜 P2P 프로토콜

TLDR:

  • 솔셜은 웹3 기술을 활용하면서, 웹2 소셜 미디어 플랫폼에 최대한 가까운 경험을 사용자에게 제공하기 위해 구축되었습니다.
  • 블록체인 기반 플랫폼이 직면하는 한 가지 장애물은 사용료입니다. 솔셜은 개인 정보 보호 및 합의를 유지하면서 토큰이 아닌 관련 작업에 대한 사용료를 제거하기 위해 솔라나에 고정된 P2P(피이 투 피어) 계층을 구축하고 자체 호스팅 및 피어 복제를 통해 콘텐츠(피드, 좋아요 등)를 제공하는 libp2p를 기반으로 구축합니다.
  • 또한 일반 데스크톱 또는 모바일 앱과 동일한 외부 프로토콜을 사용하는 특별한 유형의 노드를 개발했으며, 비콘 노드라고 하는 수만 개의 동시 피어를 처리하도록 설계된 추가 최적화 기능도 갖추고 있습니다. 비콘은 기본적으로 작성자가 오프라인으로 이동할 때 사용자 컨텐츠를 보존하고 다른 사용자가 사용할 수 있도록 하는 고정 서비스 집합입니다. 모든 사용자 컨텐츠는 IPFS에 저장되고 검열 가능한 서버나 게이트웨이에 의존하지 않고 P2P 계층을 통해 액세스됩니다.

도입

솔셜 프로토콜의 내부 작업이 합리적인 데이터 교환 성능을 유지하면서 고유한 검열 저항 특성을 제공하는 방법에 대해 설명하는 일련의 노트의 첫 번째 게시물입니다.

네트워크 토폴로지

노드는 공용 인터넷을 통해 통신하며, 수정된 버전의 HyparView 프로토콜1을 사용하여 솔셜 고유의 오버레이 네트워크를 형성합니다.

각 노드는 크기가 log2(N)+1인 활성 피어 목록을 유지 관리합니다. 여기서 N은 전체 네트워크의 예상 크기입니다. N의 값은 현재까지 가입된 사용자 계정 수를 찾아 블록체인에서 빼낸 것이며, 사용자가 증가함에 따라 주기적으로 업데이트됩니다. 활성 피어에 대한 연결은 안정적이고 양방향이며 지속적이며 가십 또는 기타 P2P 활동 중에 직접 통신하는 노드입니다. 또한 각 노드는 활성 피어의 연결이 끊기거나 응답이 없을 경우를 대비하여 백업 피어로 사용되는 크기가 6⋅(log2(N)+1)인 수동 피어 목록을 유지합니다. 활성 피어 간 연결의 기본 프로토콜은 NOISE 암호화를 사용하는 QUIC²이며, 모두 libp2p3로 구동됩니다.

NAT 트래버설은 피어의 네트워크 상황에 따라 사용되는 3가지 방법을 사용하여 수행됩니다. 첫 번째 방법은 가능한 경우 NAT이 필요하지 않으므로 IPv4 대신 IPv6을 사용하는 것입니다. 그러나 통계에 따르면 인터넷의 40% 미만만 IPv64에 있습니다.

대체 메커니즘은 네트워크의 다른 노드에 시스템의 표시 가능한 주소를 묻는 libp2p의 ID 프로토콜을 사용하여 AutoNAT을 사용하는 것입니다. NAT 뒤에 있는 피어에 의해 시작되는 이 주소는 이미 라우터의 대상 시스템에 등록되어 있지만, 이 주소가 작동하지 않는 경우가 있습니다. 그런 다음 가장 안정적이지만 비용이 많이 드는 세 번째 옵션으로 돌아갑니다.

세 번째 옵션은 NAT 뒤에 있는 두 피어 간에 패킷을 릴레이하는 중간 노드를 두어 TURN6 프로토콜의 작동을 모방하는 libp2p 회로 릴레이5 프로토콜을 사용하는 것입니다. 이 역할은 비콘 노드 및 구성된 제한이 있는 릴레이로 선택되는 공용 IP를 가진 일부 피어에서 가정할 수 있습니다. 비컨 노드에 대한 자세한 내용은 이 포스트 뒷부분에서 확인할 수 있습니다.

피어 ID

피어는 솔셜 온체인 계약에 등록된 솔라나의 지갑 주소 공개키와 동일한 다중 해시7 형태의 공개키를 사용하여 식별됩니다. 지정된 공용 피어 ID를 가정하는 유일한 방법은 ED25519 키 쌍의 비밀 키를 소유하는 것입니다.

또한 이 키 쌍은 피어 간에 전달되는 모든 메시지에 대해 암호화된 채널을 설정하고 지갑 소유자가 생성하는 것으로 추정되는 메시지의 진위를 확인하는 데도 사용됩니다.

구성원 자격 오버레이

체인에 등록되지 않은 공용 키가 있는 피어는 HyparView 네트워크 오버레이에 가입할 수 없으며, 이 오버레이에 의해 솔셜 P2P 네트워크에서 자동으로 제외됩니다.

솔셜 p2p에 가입하려는 모든 피어는 /solicial/public 항목에 대한 부트스트랩 노드 중 하나(부트스트랩 노드 중 일부는 비콘 노드)로 JOIN 메시지를 보냅니다. HyparView에 주제를 소개하는 것은 원본 논문을 수정한 것 중 하나입니다.

피어로부터 JOIN 요청을 수신하는 노드는 먼저 다중 해시가 체인에 존재하는지 확인하고 솔셜 계정과 연결된 다음 활성 랜덤 워크가 3으로 설정된 활성 피어 중 하나에 FORWARDJOIN 메시지를 전송하여 해당 메시지를 모든 활성 피어에 전파하여 현재 홉 번호를 늘립니다. 3홉이 될 때까지 한 번 씩요 이는 부트스트랩 노드에 대한 DDoS 공격을 완화할 뿐만 아니라 노드 간 연결을 최대한 분산시키고 랜덤화할 수 있는 효과적인 분산 기술입니다.

초기 JOIN 수신기에서 3홉 이내에 있는 노드는 NEIGHOR를 초기 JOIN 요청자에게 전송하여 이들 사이에 활성 영구 연결을 설정합니다.

15초마다 노드가 활성 및 수동 피어의 임의 샘플과 함께 임의 활성 피어로 SHUFFLE 메시지를 브로드캐스트하고 이 메시지의 임의 보행 길이를 4로 설정합니다. 따라서 네트워크의 모든 피어는 활성 피어가 응답하지 않거나 명시적으로 연결이 끊어질 때마다 네트워크 복구를 위해 수동 보기에 저장할 수 있는 다른 피어에 대한 새로운 정보를 항상 갖게 됩니다.

효율적인 가십

피어 간 메시지 배포에는 활성 피어만 참여합니다. 활성 피어는 공용 인터넷을 통해 오버레이 네트워크를 형성하며 노드 간 연결 그래프에는 주기가 있습니다. 네트워크에서 피어 간에 메시지를 효율적으로 가십할 수 있도록 하려면 먼저 피어 간의 중복 메시지 전파를 최소화하고 두 번째로 최적의 메시지 경로를 찾아야 합니다.

이 작업은 피어를 빠르게 푸시하는 노드 그룹과 느리게 푸시되는 노드 그룹으로 분할하여 피어 간에 최소 스패닝 트리를 구성하는 전염성 브로드캐스트 트리8 알고리즘을 사용하여 수행됩니다. 빠르게 푸시하는 노드는 항상 노드가 메시지를 수신하는 즉시 메시지를 전달합니다.

느린 푸시 노드는 500ms마다 정기적으로 현재 노드에서 볼 수 있는 메시지 ID 배치를 얻습니다. 업스트림 상위 노드에서 수신되지 않은 메시지 ID가 lazy-push 배치에 있는 것을 노드에서 확인할 때마다 연결을 다시 빌드(GRAFT)하고 active-push 상태를 복원합니다. 노드 중 하나가 중단되고 분리 그래프가 형성되는 경우 최소 스패닝 트리 복구 메커니즘을 구성합니다. GRAFT 메시지는 전체 네트워크 연결을 복원합니다.

수신된 메시지가 활성 노드에서 이전에 수신된 메시지와 중복된 것으로 확인될 때마다 해당 노드에 대한 연결은 그래프에서 사이클로 간주되어 PRUNE 메시지를 전송하여 Lazy-Push로 변환됩니다.

활성 연결을 끊고 Lazy 목록의 연결로 대체하는 또 다른 경우는 느린 노드를 통해 당사에 도달하기 위해 이동한 메시지의 홉 수가 열성적인 활성 피어의 메시지보다 4홉 미만임을 관찰하는 것입니다. 그것이 브로드캐스트 트리 최적화 알고리즘을 구성합니다.

콘텐츠 전파

이전 섹션에서 설명한 p2p 프로토콜을 통해 가십을 하는 메시지는 솔셜 용자가 제작한 콘텐츠의 CID가 포함된 IPFS Bitswap9 메시지입니다. 솔셜에서 Bitswap 및 IPFS가 어떻게 사용되는지 더 잘 이해하기 위해 먼저 사용자 프로필의 구조에 대해 설명하겠습니다.

네트워크의 각 사용자 계정에는 프로필 인덱스라는 것이 있습니다. 이 색인은 컨텐츠의 최신 버전에 대한 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를 가지며 /solcial/content HyparView 오버레이 항목에 IPFS PB-DAG10 개체로 브로드캐스트됩니다. 이 항목은 연결된 CID를 재귀적으로 쿼리하여 이전 항목 및 추가 콘텐츠에 연결되어 전체 계정 내역과 콘텐츠를 가져올 수 있습니다.

내용의 서명이 작성자의 공용 키와 일치하는 경우 수신 피어에 의해 이 오브젝트가 먼저 확인됩니다. 서명 검증에 실패한 경우 송신자 피어는 프로토콜을 위반하여 현재 노드에서 영구적으로 금지됩니다. 서명 유효성 검사에 성공하면 이 계정에 의해 작성된 콘텐츠에 관심 있는 다른 모든 피어로 콘텐츠가 전파됩니다.

피어가 이러한 CID를 수신하면 작성자의 작업 로그에 추가됩니다. 작성자가 수행한 모든 작업의 합계가 프로파일의 현재 상태를 구성합니다.

기본적으로 각 노드는 자체 계정 컨텐츠와 친구 컨텐츠를 고정하고 시드합니다. 인프라의 일부로 구축하고 있는 특별한 피어가 있는데, 이를 "비콘 노드"라고 부릅니다. 이들은 모든 사용자의 컨텐츠에 관심이 있고 모든 현재 시드들이 오프라인 상태일 경우 모든 컨텐츠에 대한 일종의 소셜 특정 IPFS 고정 서비스 역할을 한다는 점을 제외하면 일반 사용자 피어입니다. 그들을 모두의 친구라고 생각하세요. 네트워크는 네트워크 없이도 작동할 수 있지만, 추가 콘텐츠 가용성 계층을 제공합니다.

읽기 액세스

솔셜 P2p 오버레이에 있는 모든 사용자는 IWANT 및 IHAVE Bitswap 메시지를 계정의 최상위 루트 인덱스의 CID로 /solcial/content 항목에 브로드캐스트한 다음 연결된 모든 CID를 재귀적으로 요청하여 사용자 컨텐츠를 쿼리, 다운로드 및 제공할 수 있습니다.

계정의 초기 동기화 또는 계정의 최근 항목 가져오기는 /solcial/sync 항목에 HEAD 메시지를 브로드캐스트하여 수행됩니다. 여기서 시더(비컨 노드 포함)인 다른 피어는 자신이 알고 있는 최신 콘텐츠의 CID로 응답합니다. 사용자 핸들과 사용자 공개 키 사이의 변환은 Solana 블록체인을 쿼리하여 수행됩니다.

이전 입력 필드를 사용하여 충돌하는 HEAD를 해결하고 가장 최근의 항목을 결정할 수 있습니다.

쓰기 엑세스

계정 로그에 쓰려면 사용자가 계정 ID에 해당하는 ED25519 키 쌍의 개인 키를 가지고 있어야 합니다. 이 키를 사용하면 네트워크의 다른 피어에 의해 거부되지 않는 로그에 추가하고 있는 항목의 유효한 서명을 생성할 수 있습니다.

권한 콘텐츠 액세스

사용자가 게시한 일부 콘텐츠는 티어-1 또는 티어-2 구독 피드와 같은 선택된 수신인 그룹만을 대상으로 합니다. 이러한 게시물은 먼저 대칭 AES-256 암호화 키를 사용하여 암호화됩니다. 해당 키의 해시는 원본 게시물의 콘텐츠 메타데이터에 첨부됩니다.

키는 libp2p 핸드셰이크 중에 설정된 NOISE 암호화 채널을 통해 적격 피어의 임의 하위 집합으로 전파됩니다. 포스트 작성자는 모든 사용자에게 거의 즉각적인 프로세스를 제공하기 위해 비콘 노드도 이 키 교환 체계에 참여하도록 허용할 수 있지만, 컨텐츠가 매우 민감하다고 생각하는 경우에는 그렇지 않아도 됩니다. 자격 있는 사용자가 내용을 해독하려는 경우 암호화 키의 해시가 포함된 GETKEY 메시지를 /solcial/keyexchange 오버레이 항목으로 보냅니다.

온라인 상태인 해당 키를 보유한 모든 피어는 블록체인을 쿼리하고 사용자가 콘텐츠에 액세스하는 데 필요한 토큰을 보유하고 있는지 확인하여 피어가 해당 키를 받을 수 있는지 여부를 확인합니다. 검증에 성공하면 가십 프로토콜을 우회하는 직접 quick/noise 연결을 사용하여 키가 요청 피어로 전송됩니다.

플랫폼의 지원

검열 저항 콘텐츠에 대한 이 피어 투 피어 프로토콜은 데스크톱 및 모바일 클라이언트에서만 사용할 수 있으며 웹 인터페이스를 통해 사용할 수 없습니다. 이는 브라우저 제한 때문입니다. 브라우저는 본질적으로 서버에서 호스팅되는 콘텐츠 소비자로 설계되며 보안 모델은 다른 컴퓨터로부터의 임의 연결을 허용하지 않습니다.

브라우저가 작동하는 방식과 브라우저 탭의 수명이 짧기 때문에 웹 버전은 거의 항상 중앙 집중화되며, 웹 인터페이스를 통해 생성된 모든 콘텐츠는 비콘 노드에 의해 p2p에 미러링됩니다. 웹 클라이언트가 사용하는 모든 콘텐츠는 p2p의 복사본이 됩니다. P2p는 진실의 근원입니다.

기본 기술 스택은 Rust, libp2p와 Resp Native 및 Tauri11에 대한 바인딩을 사용하여 구현됩니다.

[1] Leitao, Joao, José Pereira, and Luis Rodrigues. “HyParView: A membership protocol for reliable gossip-based broadcast.”
[2] https://en.wikipedia.org/wiki/QUIC
[3] https://libp2p.io/
[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
[11] https://tauri.studio/


솔셜 정보

솔셜은 검열을 두려워하지 않고 서로 교류할 수 있도록 함으로써 사용자에게 웹3의 힘을 주고, 콘텐츠 제작자가 시장 가치로 공정하게 보상받을 수 있도록 하는 것을 목표로 하는 탈중앙화된 소셜 네트워크입니다.

연락하기

텔레그램: https://t.me/solcial
디스코드: https://discord.gg/solcial
트위터: https://twitter.com/solcialofficial
미디움: http://blog.solcial.io/
웹 사이트: https://solcial.io
솔셜 이메일: [email protected]


You've successfully subscribed to Solcial Blog
Great! Next, complete checkout to get full access to all premium content.
Error! Could not sign up. invalid link.
Welcome back! You've successfully signed in.
Error! Could not sign in. Please try again.
Success! Your account is fully activated, you now have access to all content.
Error! Stripe checkout failed.
Success! Your billing info is updated.
Error! Billing info update failed.