기술 · 시스템 구조

앱, 노드, 노드 네트워크

Gather는 두 부분으로 이루어집니다. 휴대폰에 설치하는 앱과, 서로 대등하게 연결된 노드입니다. 앱은 입구 노드 하나에만 연결하고, 노드끼리 네트워크를 이루어 암호문을 중계하고 임시로 보관합니다.

앱

  • Flutter로 작성해 하나의 코드로 Android와 iOS를 모두 지원합니다.
  • 모든 암호화와 복호화는 앱 안에서 이루어지며, 키는 시스템 보안 저장소에 보관됩니다.
  • 그룹, 차단 목록, 즐겨찾기, 태그 같은 사용자 데이터는 앱 본체나 암호화된 백업에만 저장되며 노드에 넘기지 않습니다.
  • 브랜드별 빌드를 지원합니다. 같은 코드로 서로 다른 브랜드의 앱을 만들 수 있습니다.

앱이 노드에 연결되는 방식

  • 암호화된 WebSocket(TLS)으로 입구 노드에 연결합니다.
  • 앱은 노드를 식별하는 데 TLS 인증서를 쓰지 않습니다. 앱이 노드에 난수를 보내면 노드가 자신의 Ed25519 키로 서명하고, 앱은 공개 키에서 노드 ID가 도출되는지 확인한 뒤 운영자 귀속 증명과 릴리스 매니페스트를 검증합니다.
  • 앱에는 여러 입구가 내장되어 있으며, 현재 노드를 쓸 수 없으면 자동으로 다음 노드로 전환합니다.

노드 사이

  • go-libp2p와 Kademlia DHT. 연결은 TLS 또는 Noise로 암호화하며, NAT 탐지, 홀 펀칭, 중계를 지원합니다.
  • 자체 개발한 gossip으로 하트비트와 릴리스 매니페스트를 노드 간에 전파하며, 전파 범위에는 상한이 있습니다.
  • 노드 탐색은 샤딩되어 있어 네트워크 전체가 같은 노드에 질의하지 않습니다.
  • 코드에는 시드 노드가 전혀 내장되어 있지 않으며, 시드는 설정에서만 읽습니다.

운영

  • 운영자는 자신의 노드끼리 비공개 집계를 할 수 있습니다. 허용 목록에 있는 수치와 열거값만 보고하고 주소나 IP는 담지 않으며, 보고서는 서명 검증과 재전송 방지를 거칩니다.
  • 노드 바이너리는 재현 가능한 빌드 절차로 만들어지며 소프트웨어 자재 명세서(SBOM)가 함께 제공됩니다.