P2P 네트워킹
Savitri Network는 모든 피어 간 통신에 libp2p 0.55를 사용합니다.
전송 스택
| 레이어 | 기술 |
|---|---|
| 전송 | TCP |
| 암호화 | Noise 프로토콜 |
| 멀티플렉싱 | Yamux |
| 탐색 | Kademlia DHT |
| Pub/Sub | Gossipsub |
| 신원 | Ed25519 피어 키 |
Gossipsub 토픽
| 토픽 | 발행자 | 구독자 | 목적 |
|---|---|---|---|
/savitri/tx/1 | Lightnode | Lightnode, Masternode | 트랜잭션 브로드캐스트 |
/savitri/block/1 | Lightnode | 모든 노드 | 블록 브로드캐스트 |
/savitri/consensus/cert/1 | Lightnode | Masternode, Observer | 블록 수락 인증서 |
/savitri/peer_registry/1 | 모든 노드 | Masternode | 피어 킵얼라이브 / 등록 |
/savitri/lightnode/group/announce/1 | Masternode | Lightnode | 그룹 배정 |
/savitri/group/{id}/election | 그룹 구성원 | 그룹 구성원 | 그룹별 선거 |
Gossipsub 설정
| 매개변수 | Lightnode | Masternode |
|---|---|---|
mesh_n | 8 | 8 |
mesh_n_high | 12 | 12 |
mesh_n_low | 4 | 4 |
mesh_outbound_min | 3 | 3 |
connection_handler_queue_len | 50,000 | 50,000 |
max_transmit_size | 256 KB | 256 KB |
flood_publish | false | true (모든 구독자) |
메시지 압축
| 형식 | 상태 | 사용 사례 |
|---|---|---|
| snap | 활성화 | 일반 P2P 메시지 |
| lz4 | 활성화 | 고처리량 경로 |
| zstd | MSVC에서 비활성화 | Windows에서 미사용 |
피어 활성 상태
Lightnode
- PoU 점수 공유: 60초마다 gossipsub을 통해 발행
- 지연 프로브: 직접 P2P로 30초마다
- 하트비트:
/savitri/peer_registry/1에 gossipsub 발행
Masternode
last_seen업데이트: 피어로부터 gossipsub 메시지를 받을 때마다 업데이트- 비활성 타임아웃: 600초 (MN 설정에서 구성 가능)
cleanup_inactive(): 타임아웃을 초과한 노드 제거- SlowPeer 핸들러: 전송 큐가 포화된 피어 연결 해제
Observer
- 30초마다 하트비트:
/savitri/peer_registry/1에 발행 - 구독:
/savitri/consensus/cert/1및/savitri/block/1
부트스트랩
부트스트랩 피어는 config/bootstrap_nodes.json에서 설정합니다:
[
{
"peer_id": "12D3KooW...",
"address": "/ip4/3.120.x.x/tcp/4001"
}
]
노드는 시작 시 부트스트랩 피어에 연결하고 Kademlia DHT를 통해 추가 피어를 발견합니다.
직접 P2P (요청-응답)
일부 작업은 gossipsub 대신 직접 피어 간 통신을 사용합니다:
| 작업 | 프로토콜 |
|---|---|
| 지연 프로브 | 직접 요청-응답 |
| PoU ACK | 점대점 응답 |
| 선거 후보자 | 직접 P2P |
이를 통해 특정 피어에만 도달하면 되는 작업에서 브로드캐스트의 O(N^2) 비용을 피할 수 있습니다.
네트워크 포트
| 포트 | 프로토콜 | 서비스 |
|---|---|---|
| 4001 | TCP | P2P (libp2p) 기본값 |
| 8333 | TCP | P2P (대안) |
| 8545 | HTTP | RPC (JSON-RPC 2.0) |
| 8546 | WS | WebSocket |
| 9090 | HTTP | Prometheus 메트릭 |
설정
config/development.toml
[network]
max_peers = 10
block_time_secs = 2
max_tps = 100
group_size = 3
config/production.toml
[network]
max_peers = 50
block_time_secs = 5
max_tps = 1000
group_size = 7
slashing_enabled = true
로그 필터링
gossipsub의 장황한 로그를 줄이려면:
RUST_LOG=info,libp2p_gossipsub::behaviour=error
이렇게 하면 전체 메시지 페이로드를 포함하는 전송 큐 경고(각 1-2 KB, 120MB+ 로그 유발)가 억제됩니다.