feat(dave): pass arbiter gate 1 — selfbot joins DAVE/MLS E2EE voice group
Fail-fast checkpoint the arbiter mandated before committing to option A (protocol-level selfbot stream receive). dave/gate.mjs proves, live against Discord, that a user token can pass the voice DAVE/MLS handshake: - voice GW v8 IDENTIFY with max_dave_protocol_version=1 -> NO close 4017 - dave_protocol_version=1 negotiated (E2EE active on the channel) - @snazzah/davey drives full MLS membership: op25 external_sender -> op26 key_package -> op27 proposals -> op28 commit_welcome -> op29 announce_commit -> MLS session ready=true, stable 5s, voicePrivacyCode derived Confirms option A is viable: the selfbot can join the E2EE group as a full member, which is the prerequisite for receiving+decrypting the video RTP. PLAN.md updated with gate result, exact binary framing, and next A steps. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
24
PLAN.md
24
PLAN.md
@@ -23,12 +23,32 @@
|
||||
### 1단계 · 눈: 화면공유 스트림 수신 ← 지금
|
||||
- [x] 호스트 도구 확인 (Node 22/ffmpeg/libsodium 가능)
|
||||
- [x] 수신 방법 조사 확정: 셀프봇 프로토콜 레벨 비디오 RTP 수신
|
||||
- [ ] **[블로킹] 버리는 디스코드 유저 계정 + 토큰 확보, ToS/밴 위험 수용 확인**
|
||||
- [x] **버리는 디스코드 유저 계정 + 토큰 확보, ToS/밴 위험 수용 확인** (`.env`, burner tkrmagid_bot)
|
||||
- [x] **[관문 1 통과] DAVE/MLS(E2EE) 게이트웨이 4017 검증** — 아래 참조
|
||||
- [ ] 셀프봇으로 음성채널 join → 상대 Go Live 스트림 watch/구독 (비디오 SSRC 획득)
|
||||
- [ ] 들어오는 비디오 RTP 수신 → 복호화 → depayload(VP8/H264)
|
||||
- [ ] 들어오는 비디오 RTP 수신 → **DAVE 복호화(daveSession.decrypt)** → depayload(VP8/H264)
|
||||
- [ ] ffmpeg로 디코드 → 프레임(JPEG/PNG) 추출 PoC (진짜 공유화면 수신 검증)
|
||||
- [ ] 프레임 변화 감지(동일 화면 반복 전송 방지) + 소스 인터페이스
|
||||
|
||||
#### 관문 1 (arbiter 지정 fail-fast) — 통과 확정 2026-08-09
|
||||
DAVE(MLS) E2EE가 전면 강제라 "토큰만 꽂으면 됨"이 깨졌다는 게 핵심 리스크였음.
|
||||
`dave/gate.mjs` 로 실측 검증 → **통과**:
|
||||
- 셀프봇 유저토큰으로 메인 GW IDENTIFY → 음성채널 join → 보이스 GW v8 IDENTIFY(`max_dave_protocol_version=1`).
|
||||
- 결과: **close 4017 없음**. `SESSION_DESCRIPTION`에서 `dave_protocol_version=1` 협상됨(= 해당 채널 E2EE 활성).
|
||||
- `@snazzah/davey`(Rust NAPI, DAVE 구현)로 MLS 멤버십 핸드셰이크 완주:
|
||||
op25 external_sender 수신 → op26 key_package 송신 → op27 proposals 처리(commit+welcome 생성)
|
||||
→ op28 commit_welcome 송신 → op29 announce_commit → `processCommit` → **MLS session ready=true**.
|
||||
- 5초간 서버 disconnect 없이 멤버십 유지, voicePrivacyCode 산출됨(실제 E2EE 그룹 참여 증명).
|
||||
- 결론: 셀프봇이 DAVE E2EE 보이스 그룹에 **정식 멤버로 합류 가능**. 옵션 A(직접 수신) 실현 가능 확정.
|
||||
- 바이너리 프레이밍 확정: 수신 `[u16 seq][u8 op][payload]`; op29/30 payload는 `[u16 transition_id][blob]`;
|
||||
op27 payload는 `[u8 op_type][proposals]`; 송신 op26/28은 `[u8 op][blob(+welcome)]`.
|
||||
processProposals에는 채널 내 인식 유저ID(op11 clients_connect)를 넘겨야 함(안 넘기면 UnexpectedUser).
|
||||
|
||||
#### 다음 (관문 통과 후 A 강행)
|
||||
- 상대의 Go Live 스트림 구독: op **video** 스트림 SSRC 확보(스트림 시청 시그널링) — Go Live 중인 소스 필요.
|
||||
- UDP로 들어오는 SRTP 비디오 패킷 수신 → RTP 헤더 파싱 → `daveSession.decrypt(userId, VIDEO, packet)` E2EE 복호화 →
|
||||
전송암호(aead_aes256_gcm_rtpsize) 복호 → VP8/H264 depayload → ffmpeg 디코드 → 프레임.
|
||||
|
||||
### 3단계 · 두뇌 (하이브리드 비전)
|
||||
- [ ] 로컬 VLM(예: moondream2 / Qwen2-VL-2B) 프레임 1차 이해 + 변화 감지
|
||||
- [ ] Claude OAuth(Haiku)로 어려운 프레임 에스컬레이션
|
||||
|
||||
Reference in New Issue
Block a user