보안 모델
암호학적 기본 요소
| 기본 요소 | 알고리즘 | 사용 |
|---|---|---|
| 서명 | Ed25519 (ed25519-dalek) | 트랜잭션 서명, 블록 서명 |
| 블록 해시 | SHA-512 | 도메인 태그 "BLK"를 사용한 블록 해시 |
| 트랜잭션 해시 | SHA-256 | 서명 메시지 해시 |
| 상태 해시 | BLAKE3 | 상태 루트 계산 |
| 스토리지 해시 | Keccak256 | 컨트랙트 스토리지 슬롯 파생 |
| 압축 | snap, lz4 | P2P 메시지 압축 |
전송 보안
P2P 계층
- 암호화: libp2p의 Noise 프로토콜 (인증된 암호화)
- 멀티플렉싱: Yamux
- 신원: Ed25519 피어 키
- 최대 전송 크기: 메시지당 256KB
RPC 계층
- TLS: RPC 서버에서 종료되지 않습니다. 프로덕션 배포는 TLS 종료가 있는 역방향 프록시를 사용해야 합니다.
- CORS: localhost 출처로 제한됩니다. 프로덕션을 위해 허용된 출처를 설정하세요.
- 본문 제한: 최대 요청 본문 1MB.
속도 제한
| 수준 | 한도 | 창 |
|---|---|---|
| RPC 전역 | 초당 200 요청 | 1초 슬라이딩 창 |
| RPC IP별 | 초당 50 요청 | 1초 슬라이딩 창 |
| 배치 크기 | 100 요청 | HTTP 요청당 |
| 블록 해시 스캔 | 1000 블록 | chain_getBlockByHash 호출당 |
입력 검증
RPC
- JSON-RPC 버전은 정확히
"2.0"이어야 합니다 - 오류 메시지는 클라이언트에 반환 전 정제됩니다
- 내부 오류는 일반적인 메시지를 반환합니다 (스택 추적 또는 내부 형식 없음)
- 멤풀 거부 세부 사항은 오류 응답에서 제거됩니다
멤풀
- 논스 검증: 순차적 논스 필요 (버스트 복구를 위한 최대 5000 간격 허용)
- 잔액 확인: 발신자는 금액 + 수수료에 충분한 잔액이 필요합니다
- 서명 검증: 승인 전 Ed25519 서명 검증
- 할당량 시스템: 클래스별 제한 (금융: 50K, IoT: 100K, 전역: 100K)
- 발신자별 제한: 발신자당 최대 512개의 대기 트랜잭션
트랜잭션 파이프라인
상태 비저장 가드 (먼저 실행):
- 서명 형식 검증
- Ed25519 서명 검증
- 공개 키 → 주소 파생 확인
상태 저장 가드 (상태 비저장 통과 후 실행):
- 논스 >= 계정 논스
- 잔액 >= 금액 + 수수료
- 계정이 블랙리스트에 없음
원자적 커밋: 잔액 공제와 논스 증가가 원자적으로 발생합니다.
합의 보안
BFT 쿼럼
- 쿼럼: 검증자의 2f+1 (67%)이 블록 수락 인증서에 서명해야 합니다
- 비잔틴 허용: 최대 f = (n-1)/3 비잔틴 노드
- 인증서 검증: Masternode가 모든 증명 서명을 검증합니다
PoU 게임 방지
- 점수 댐핑: 지수이동평균이 일시적 동작을 통한 점수 조작을 방지합니다
- 제안자 순환: 50블록 후 제안자가 교체되어야 합니다 (독점 방지)
- 최소 점수 임계값: 점수 < 300은 보상에서 제외됩니다
선거 보안
- 결정론적 그룹 ID: 시스템 시간이 아닌 에포크 기반 (MN 간 불일치 방지)
- 선거 중복 제거: 라운드당 첫 번째 결과만 커밋됩니다
- 알 수 없는 그룹의 소프트 거부: Masternode가 알 수 없는 그룹 ID에 대해 경고하지만 처리를 계속합니다
키 관리
SDK Wallet
- 제로화: 개인 키는
Drop시 제로화됩니다 (zeroize크레이트를 통해) - 영속성 없음: SDK wallet은 키를 디스크에 저장하지 않습니다
- HTTPS 강제: 원격 RPC 엔드포인트는 기본적으로 HTTPS를 요구합니다
파우셋
- 라운드 로빈 키: 논스 경쟁을 방지하기 위해 10개의 키 쌍을 순환합니다
- 직렬화된 청구:
faucet_lock뮤텍스가 TOCTOU 경쟁 조건을 방지합니다 - 청구 제한: 청구당 5 SAVT, 주소당 24시간 쿨다운
노드 보안
피어 활성 상태
- Gossipsub 킵얼라이브: PoU 점수 공유가
last_seen을 업데이트하기 위해 gossipsub을 통해 발행됩니다 - 비활동 타임아웃: 피어 제거 전 600초 (설정 가능)
- SlowPeer 연결 해제: gossipsub 전송 큐가 가득 찬 경우 노드가 연결 해제됩니다
리소스 제한
- 연결 관리자 큐: 50,000 메시지 (LN + MN)
- Gossipsub 메시: mesh_n=8, mesh_n_high=12, mesh_n_low=4
- 스택 크기: 스택 오버플로우 방지를 위한 8MB
- 메모리: 백프레셔가 있는 멤풀 풀 제한
책임감 있는 공개
보안 취약점은 프로젝트의 책임감 있는 공개 절차를 통해 신고하세요. 보안 버그에 대한 공개 이슈를 열지 마세요.