v0.2
Layer 1 핵심 서명 플로우 (Core Signing Flow)¶
1. Executive Summary¶
본 문서는 D'CENT Enterprise의 Layer 1 핵심 서명 플로우를 정의한다. Phase 12에서 확정된 3계층 레이어드 문서 구조(Layer 1 Core Flow / Layer 2 Segment Delta / Layer 3 Environment Annotation)의 첫 번째 레이어로서, 모든 시나리오(S1~S8)에 공통 적용되는 환경/세그먼트 중립 디지털 플로우를 상세 설계한다.
v0.0 airgap-signing-flow.md와의 관계:
v0.0에서 설계한 Request-Approve-Sign-Broadcast 4단계 파이프라인을 기반으로, 다음을 확장한다:
- 4단계 파이프라인의 각 단계를 번호부 스텝(Step 1~9)으로 상세화
- 3개 서명 프로토콜(MuSig2/Safe/MPC-TSS)별 절차 분기를 명시
- WYSIWYS 하드웨어 검증을 독립 필수 스텝으로 격상 (Bybit 사건 교훈)
- QR + USB-C 통신 변종(대용량 TX, 다수 서명자)을 프로토콜 수준에서 설계
본 문서는 v0.0 문서의 확장이지 대체가 아니다. v0.0의 상태 머신, 에러 핸들링, 컴플라이언스 매핑은 그대로 유효하며, 본 문서는 서명 실행 절차의 상세도를 높인다.
적용 범위: S1~S8 전체 시나리오. 물리 환경(콜드룸/비콜드룸)이나 고객 세그먼트(셀프 커스터디/수탁/토큰 발행)에 대한 언급은 포함하지 않는다. 물리 절차는 Layer 3 어노테이션(signing-coldroom-annotation.md, signing-noncoldroom-annotation.md)에서, 세그먼트 차이는 Phase 14의 Layer 2 델타에서 처리한다.
Step 참조 체계: 본 문서의 Step 1~9 번호는 Layer 2 델타와 Layer 3 어노테이션이 [Delta] Step N:, [CR Annotation] Before Step N:, [NCR Annotation] After Step N: 형식으로 참조하는 기준 번호이다.
2. 공통 서명 파이프라인¶
2.1. 파이프라인 개요¶
v0.0의 4단계 파이프라인을 9개 번호부 스텝으로 상세화한다.
REQUEST 단계 APPROVE 단계 SIGN 단계 BROADCAST 단계
┌─────────────┐ ┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ Step 1 │ │ Step 2 │ │ Step 3 │ │ Step 8 │
│ TX 생성 │───▶│ 정책 검증 │───▶│ 에어갭 전달 │ │ 서명 집계 │
│ │ │ │ │ │ │ │
│ Step 9 │ │ │ │ Step 4 │ │ │
│ 확인 및 완료 │◀───│ │ │ 오프라인 수신 │ │ │
└─────────────┘ └─────────────┘ │ │ └──────▲──────┘
│ Step 5 │ │
│ WYSIWYS 검증 │ │
│ │ │
│ Step 6 │ │
│ SE 서명 실행 │───────────┘
│ │ (via Step 7)
│ Step 7 │
│ 서명 반환 │
└──────────────┘
2.2. 스텝별 요약¶
| Step | v0.0 단계 | 컴포넌트 | 역할 | 핵심 액션 | 데이터 흐름 |
|---|---|---|---|---|---|
| Step 1 | Request | 온라인 대시보드 | Initiator | TX 생성 및 승인 요청 | -> 미서명 TX |
| Step 2 | Approve | 온라인 대시보드 | Approver x M | 정책 검증 + 승인 결정 | 미서명 TX -> 승인된 TX |
| Step 3 | Sign (준비) | 온라인 대시보드 | 시스템 | 에어갭 전달용 QR 생성 | 승인된 TX -> QR 코드 |
| Step 4 | Sign (수신) | 오프라인 서명 앱 | Approver | QR 스캔으로 TX 수신 + USB-C로 콜드월렛 전달 | QR -> 서명 요청 |
| Step 5 | Sign (검증) | D'CENT X 콜드월렛 | Approver | WYSIWYS 하드웨어 검증 | 서명 요청 -> SE 표시 |
| Step 6 | Sign (실행) | D'CENT X 콜드월렛 | Approver | 물리 버튼 승인 + SE 서명 | SE 표시 -> 부분 서명 |
| Step 7 | Sign (반환) | 오프라인 서명 앱 -> 대시보드 | Approver | 서명 결과 에어갭 반환 | 부분 서명 -> QR -> 대시보드 |
| Step 8 | Broadcast | 온라인 대시보드 | 시스템 | 서명 집계 + 블록체인 전파 | M개 부분 서명 -> 완성 TX |
| Step 9 | Broadcast | 온라인 대시보드 | 시스템/Initiator | 확인 대기 + 완료 처리 | TX Hash -> CONFIRMED |
Step 5(WYSIWYS 하드웨어 검증)는 모든 프로토콜에서 독립된 필수 스텝이다. 다른 스텝과 합쳐지거나 생략될 수 없다.
2.3. 스텝별 상세¶
Step 1: TX 생성 [대시보드] [Initiator]¶
- 시작 조건: Initiator가 대시보드에 MFA 로그인 완료
- 액션:
- 출금 월렛 선택 (BTC / EVM / Warm 월렛 유형에 따라 프로토콜 자동 결정)
- 수신 주소 입력 (화이트리스트 검증 자동 수행)
- 금액 및 자산 유형 선택
- 수수료 추정 (BTC: fee rate 기반, EVM: gas 추정)
- TX 데이터 구성:
- BTC: PSBT(BIP-174/370) 생성 -- UTXO 선택, 입출력 구성
- EVM: EIP-712 TypedData 또는 RLP 인코딩 전 구조체 구성
- Warm(MPC-TSS): 내부 TX 요청 객체 구성
- M-of-N 서명자 풀 결정 (정책 기반 자동 배정)
- 승인 요청 생성 + 승인자 알림 발송
- 종료 조건: TX 상태 = PENDING_APPROVAL
- 에러 처리: 화이트리스트 미등록 -> 즉시 차단 / 잔액 부족 -> 거부 / 중복 TX 감지 -> 경고 후 사용자 확인
- 타임아웃: 해당 없음 (사용자 주도)
Step 2: 정책 검증 + 승인 [대시보드] [Approver x M]¶
- 시작 조건: TX 상태 = PENDING_APPROVAL, 승인자에게 알림 도달
- 액션:
- 각 Approver가 대시보드에서 TX 상세 확인 (수신 주소, 금액, 수수료, 정책 검증 결과)
- 승인/거부/보류 결정
- 순차 모드: 지정 순서대로 승인 / 병렬 모드: 동시에 M개 승인 수집
- M개 승인 도달 시 TX 상태 전이
- 종료 조건: M개 승인 완료, TX 상태 = READY_TO_SIGN
- 에러 처리: 승인 타임아웃 -> 자동 만료(기본 24시간) / 승인자 비가용 -> 대체 승인자 지정 또는 에스컬레이션
- 타임아웃: 24시간 (설정 가능). 초과 시 TX 상태 = EXPIRED
Step 3: 에어갭 전달 준비 [대시보드] [시스템]¶
- 시작 조건: TX 상태 = READY_TO_SIGN
- 액션:
- 서명 요청 데이터 패키징:
- BTC MuSig2: PSBT + MuSig2 세션 컨텍스트(참여자 공개키 목록, 세션 ID)
- EVM Safe: TX Hash + Safe 주소 + nonce + 서명자 목록
- Warm MPC-TSS: (Step 3-7 에어갭 불필요, 별도 경로 -- 섹션 4.3 참조)
- UR(Uniform Resources) 프레임워크로 인코딩:
- CBOR 직렬화 -> UR 타입 래핑 -> Animated QR 시퀀스 생성
- Fountain code 적용 (에러 복구 지원)
- 대시보드 화면에 Animated QR 표시
- 종료 조건: QR 코드가 화면에 표시되어 스캔 준비 완료
- 에러 처리: QR 생성 실패 -> 재시도 / 페이로드 크기 초과 -> 분할 QR 또는 압축 적용
- 타임아웃: QR 표시 후 30분 (스캔 미완료 시 세션 갱신 필요)
Step 4: 오프라인 수신 [오프라인 서명 앱] [Approver]¶
- 시작 조건: 오프라인 서명 앱 실행, 카메라 활성화 + D'CENT X USB-C 연결
- 액션:
- 대시보드 화면의 Animated QR을 오프라인 앱 카메라로 스캔
- UR 디코딩 -> CBOR 역직렬화 -> 서명 요청 데이터 복원
- 오프라인 앱 화면에 TX 내용 표시 (수신 주소, 금액, 수수료 -- 1차 확인)
- 오프라인 앱에서 D'CENT X 콜드월렛으로 서명 요청 전달:
- 오프라인 앱 -> D'CENT X (USB-C 케이블 연결)
- 종료 조건: D'CENT X가 서명 요청 데이터를 수신하여 처리 시작
- 에러 처리: QR 스캔 실패 -> Animated QR 속도 조절 / USB-C 통신 오류 -> 케이블 재연결 / 데이터 무결성 실패 -> 재전송
- 타임아웃: 10분 (스캔 미완료 시 오프라인 앱 세션 리셋)
Step 5: WYSIWYS 하드웨어 검증 [D'CENT X 콜드월렛] [Approver]¶
이 스텝은 독립된 필수 단계이다. 어떤 프로토콜에서도 생략하거나 다른 스텝과 합칠 수 없다.
- 시작 조건: D'CENT X SE(Secure Element)가 서명 요청 데이터 파싱 완료
- 액션:
- D'CENT X 하드웨어 디스플레이에 TX 상세를 SE가 직접 렌더링:
- 수신 주소 (전체 표시, 축약 금지)
- 전송 금액 및 자산 유형
- 네트워크 수수료
- 체인 ID (EVM 계열)
- 컨트랙트 정보 (스마트 컨트랙트 호출 시)
- 서명자가 D'CENT X 디스플레이와 대시보드/오프라인 앱 화면을 독립적으로 대조 확인
-
"SE 표시 != 대시보드 표시"이면 즉시 서명 거부 (중간자 공격 의심)
-
WYSIWYS 4단계 경고 레벨 (v0.0 참조):
| 레벨 | 명칭 | SE 파싱 범위 | 디스플레이 표시 | 사용자 안내 |
|---|---|---|---|---|
| Level 0 | 완전 파싱 | TX 전체 구조를 SE가 파싱 | 수신 주소, 금액, 수수료, 체인 전체 표시 | "확인 후 승인" |
| Level 1 | 부분 파싱 | 주요 필드 파싱, calldata 미파싱 | 주소, 금액 표시 + "추가 데이터 포함" 경고 | "추가 데이터 존재, 주의하여 확인" |
| Level 2 | 메타데이터 표시 | TX 해시 + 기본 정보만 | TX 해시 + 금액 표시 + "전체 파싱 불가" 경고 | "외부 검증 권장" |
| Level 3 | Raw Hex | 파싱 불가 | Raw 데이터 해시만 표시 | "높은 위험: 반드시 외부 검증 후 서명" |
- Bybit 사건 교훈: 2025년 Bybit 해킹에서 공격자는 Safe UI를 위변조하여 서명자에게 정상 TX로 보이게 한 후, 실제로는 악의적 delegatecall을 실행시켰다. WYSIWYS는 이러한 공격을 방어하는 핵심 메커니즘이다:
- 대시보드/앱 UI는 소프트웨어이므로 위변조 가능
- D'CENT X SE는 하드웨어이므로 UI와 독립적으로 TX 내용을 파싱·표시
-
서명자는 반드시 D'CENT X 디스플레이에 표시된 내용만 신뢰하고, SE 표시 내용이 기대와 다르면 서명을 거부해야 한다
-
종료 조건: 서명자가 D'CENT X 디스플레이 내용을 확인 완료 (승인 또는 거부 결정 준비)
- 에러 처리: 파싱 실패(Level 3) -> "외부 검증 필수" 경고 + 서명 거부 권장 / 디스플레이 장애 -> 해당 디바이스 서명 불가, 대체 디바이스 사용
- 타임아웃: 5분 (확인 미완료 시 SE가 세션 초기화)
Step 6: SE 서명 실행 [D'CENT X 콜드월렛] [Approver]¶
- 시작 조건: Step 5 WYSIWYS 확인 완료, 서명자가 승인 결정
- 액션:
- 서명자가 D'CENT X 물리 버튼으로 승인 (소프트웨어 승인 불가)
- SE 내부에서 서명 알고리즘 실행:
- BTC MuSig2: Schnorr 부분 서명 생성 (BIP-340 기반, 해당 라운드의 nonce 사용)
- EVM Safe: ECDSA secp256k1 서명 (ecRecover 호환, v/r/s 생성)
- Warm MPC-TSS: 해당 없음 (에어갭 경로 미사용)
- 서명 결과를 SE 외부로 출력 (서명값만 출력, 프라이빗 키는 SE 내부에 잔류)
- 종료 조건: 부분 서명 생성 완료
- 에러 처리: 서명 거부(물리 버튼 취소) -> 거부 이유 기록 + 오프라인 앱에 거부 전달 / PIN 오류 -> 재입력(10회 한도, 초과 시 SE 자동 삭제) / SE 장애 -> 디바이스 교체 필요
- 타임아웃: 2분 (물리 버튼 미입력 시 SE 세션 초기화)
Step 7: 서명 반환 [오프라인 서명 앱 -> 대시보드] [Approver]¶
- 시작 조건: D'CENT X에서 부분 서명 생성 완료
- 액션:
- D'CENT X -> 오프라인 앱 USB-C 전송 (서명 결과)
- 오프라인 앱이 부분 서명 데이터 수신 및 검증
- 오프라인 앱 화면에 서명 결과 QR 표시 -> 대시보드 카메라 스캔
- 대시보드가 부분 서명 수신, 공개키 매칭 검증, 저장
- 종료 조건: 대시보드에 해당 서명자의 부분 서명 저장 완료
- 에러 처리: USB-C 통신 실패 -> 케이블 재연결 후 재전송 / 서명 검증 실패 -> 해당 서명 폐기, 재서명 요청 / 통신 중단 -> 부분 서명은 D'CENT X에 잔류, USB-C 재연결로 재전송 가능
- 타임아웃: 15분 (반환 미완료 시 해당 서명 세션 만료, 재서명 필요)
M명의 서명자에 대해: Step 3~7은 M명의 서명자가 각각 수행한다. 순차(릴레이) 방식 또는 병렬(동시) 방식 선택 가능. 상세는 섹션 5.3 참조.
Step 8: 서명 집계 + 블록체인 전파 [대시보드] [시스템]¶
- 시작 조건: M개의 유효한 부분 서명이 대시보드에 수집 완료
- 액션:
- 프로토콜별 서명 집계:
- BTC MuSig2: M개 부분 서명 -> 단일 Schnorr 집계 서명 생성 -> PSBT 완성
- EVM Safe: M개 ECDSA 서명을 주소 오름차순 정렬 -> Safe 컨트랙트 호출 데이터 구성
- Warm MPC-TSS: 부분 서명 집계 -> 표준 ECDSA/Schnorr 서명 복원
- 최종 TX 무결성 검증 (해시 비교, 서명 유효성)
- 블록체인 노드에 TX 전파 (다중 노드 제출 -- 안정성)
- 종료 조건: TX가 mempool에 진입, TX 상태 = BROADCASTING
- 에러 처리: 서명 집계 실패 -> 개별 서명 재검증 / 노드 연결 실패 -> 대체 노드 자동 전환 / TX 거부(nonce 충돌 등) -> 에러 분석 후 재구성
- 타임아웃: 전파 시도 5분, 3회 재시도 후 BROADCAST_FAILED
Step 9: 확인 대기 + 완료 처리 [대시보드] [시스템/Initiator]¶
- 시작 조건: TX가 mempool에 진입
- 액션:
- 블록 포함 대기:
- BTC: 1-6 확인 (보안 수준별 설정)
- EVM: 12-64 블록 (체인별 finality 기준)
- CONFIRMED 상태 전이
- 감사 로그 기록 (전체 라이프사이클: 생성 -> 승인 -> 서명 -> 전파 -> 확인)
- 관련자 알림 발송 (Initiator, Approver, Admin)
- 잔액 업데이트
- 종료 조건: TX 상태 = CONFIRMED, 감사 로그 기록 완료
- 에러 처리: 장시간 미확인 -> BTC: RBF 제안, EVM: gas 인상 제안 / TX 실패(revert 등) -> 실패 원인 분석 + 재시도 안내
- 타임아웃: BTC 24시간, EVM 1시간 (초과 시 수수료 조정 권고)
3. WYSIWYS 하드웨어 검증 단계¶
3.1. WYSIWYS의 필요성: Bybit 사건 교훈¶
2025년 2월 Bybit 해킹 사건은 엔터프라이즈 서명 보안의 근본적 취약점을 드러냈다:
- 공격자는 Safe{Wallet} UI 프론트엔드를 위변조하여, 서명자에게 정상적인 트랜잭션으로 보이도록 속임
- 실제 서명된 TX는 악의적인
delegatecall로, 콜드월렛의 implementation 주소를 공격자 컨트랙트로 변경 - 약 $1.4B 규모의 자산이 유출됨
- 근본 원인: 서명자가 소프트웨어 UI만을 신뢰하고, 실제 서명 대상 데이터를 독립적으로 검증하지 않음
D'CENT Enterprise의 WYSIWYS 대응:
WYSIWYS(What You See Is What You Sign)는 서명 대상 TX의 내용을 소프트웨어(대시보드/앱)가 아닌 하드웨어(D'CENT X SE)가 독립적으로 파싱하여 디스플레이에 표시하는 메커니즘이다. SE는 네트워크에 연결되지 않으므로 원격 위변조가 불가능하며, 서명자는 하드웨어 디스플레이만을 신뢰 기준으로 사용한다.
3.2. Step 5 상세: WYSIWYS 필수 검증 항목¶
모든 프로토콜(MuSig2/Safe/MPC-TSS)에서 Step 5는 다음을 필수적으로 수행한다:
SE가 디스플레이에 표시하는 항목:
| 항목 | BTC (MuSig2) | EVM (Safe) | 표시 방식 |
|---|---|---|---|
| 수신 주소 | BTC 주소 전체 | 이더리움 주소 전체 (0x 포함) | 축약 없이 전체 표시, 스크롤 지원 |
| 전송 금액 | BTC 단위 (satoshi 병기) | ETH/토큰 단위 (wei 병기) | 자릿수 구분 표시 |
| 네트워크 수수료 | fee rate (sat/vB) + 총 수수료 | gas price + gas limit + 총 수수료 | 과도한 수수료 시 경고 |
| 체인 정보 | 메인넷/테스트넷 | Chain ID + 네트워크명 | 테스트넷 시 명확한 경고 |
| 컨트랙트 정보 | 해당 없음 | 함수명 + 주요 파라미터 (파싱 가능 시) | Level 0/1에서만 표시 |
| TX 해시 | PSBT 해시 | TX 해시 (EIP-712 도메인 포함) | 항상 표시 (외부 교차 검증용) |
서명자 확인 절차:
- D'CENT X 디스플레이에 표시된 수신 주소를 독립적으로 확인 (대시보드 화면과 비교하되, 두 화면이 일치해도 D'CENT X 표시를 최종 기준으로 삼음)
- 금액과 수수료가 의도한 값인지 확인
- 체인 정보가 올바른지 확인 (메인넷/테스트넷 혼동 방지)
- Level 1 이상 경고 시 추가 검증 수행 여부 결정
- 모든 항목 확인 후 물리 버튼으로 승인 (또는 이상 발견 시 물리 버튼으로 거부)
"SE 표시 != 대시보드 표시" 원칙:
D'CENT X 디스플레이에 표시된 내용과 대시보드/오프라인 앱에 표시된 내용이 하나라도 다르면, 이는 중간자 공격 또는 소프트웨어 위변조의 징후이다. 서명자는 즉시 서명을 거부하고, 보안 사고 프로토콜을 발동해야 한다.
3.3. WYSIWYS와 프로토콜별 상호작용¶
| 프로토콜 | WYSIWYS 시점 | SE 파싱 대상 | 특이사항 |
|---|---|---|---|
| BTC MuSig2 | Round 2 (부분 서명 직전) | PSBT 입출력 전체 | 다중 출력 TX 시 각 출력 별도 스크롤 확인 |
| EVM Safe | 서명 직전 | EIP-712 TypedData 또는 Raw TX | 스마트 컨트랙트 calldata 파싱 범위에 따라 Level 0~3 분기 |
| Warm MPC-TSS | 해당 없음 | 해당 없음 | Hot zone 실행, D'CENT X 미사용 |
4. 프로토콜별 서명 절차 상세¶
4.1. BTC MuSig2 서명¶
MuSig2는 BIP-327 기반 Schnorr 다중 서명 프로토콜로, M-of-N 서명자가 2라운드 통신으로 단일 집계 서명을 생성한다.
4.1.1. 사전 조건¶
- M-of-N 서명자 각각이 D'CENT X 콜드월렛을 보유
- 각 D'CENT X SE에 개별 키 쌍이 생성되어 있음 (키 세레모니 완료)
- 집계 공개키(Aggregated Public Key)가 대시보드에 등록되어 있음
4.1.2. MuSig2 2-라운드 서명 절차¶
Round 1: Nonce 교환
Step 3~4에서 수행:
- [대시보드] MuSig2 세션 시작, 세션 ID 생성
- [대시보드] PSBT + 세션 컨텍스트를 QR로 인코딩 (Step 3)
- [오프라인 앱] QR 스캔으로 수신 (Step 4)
- [오프라인 앱 -> D'CENT X] 서명 요청 전달 (USB-C)
- [D'CENT X SE] nonce 쌍 (R_i) 생성 (결정적 nonce, RFC 6979 기반 확장)
- [D'CENT X] nonce 커밋먼트를 QR로 출력
- [오프라인 앱] D'CENT X의 nonce QR 스캔
- [오프라인 앱 -> 대시보드] nonce 커밋먼트 QR 전달 (Step 7 경로)
- [대시보드] M명의 nonce 커밋먼트 수집 완료 대기
- [대시보드] Aggregated nonce(R) 계산
Round 2: 부분 서명 생성 (Step 5~7 포함)
- [대시보드] Aggregated nonce(R) + PSBT를 QR로 인코딩 (Step 3 반복)
- [오프라인 앱] QR 스캔 (Step 4 반복)
- [오프라인 앱 -> D'CENT X] Round 2 데이터 전달
- [D'CENT X SE] WYSIWYS 표시 (Step 5):
- PSBT의 모든 입출력을 SE가 파싱
- 수신 주소, 금액, 수수료를 하드웨어 디스플레이에 표시
- 서명자 확인 대기
- [D'CENT X] 물리 버튼 승인 (Step 6):
- SE가 부분 서명 s_i = k_i + H(R, P, m) * x_i 계산
- 부분 서명을 QR로 출력
- [오프라인 앱 -> 대시보드] 부분 서명 반환 (Step 7)
서명자 순서 독립성: MuSig2에서 각 서명자의 nonce 커밋먼트와 부분 서명은 순서에 독립적이다. M명의 서명자가 어떤 순서로 참여하든 동일한 집계 서명이 생성된다. 다만 Round 1(nonce 교환)은 M명 모두 완료되어야 Round 2로 진행할 수 있다.
4.1.3. MuSig2 서명 집계 (Step 8)¶
- [대시보드] M개 부분 서명 {s_1, ..., s_M} 수집 확인
- [대시보드] 집계 서명 S = sum(s_i) 계산
- [대시보드] 최종 Schnorr 서명 (R, S)를 PSBT에 삽입
- [대시보드] PSBT 완성 (finalize) -> Raw TX 추출
- [대시보드] 블록체인 노드에 전파
4.2. EVM Safe 서명¶
Gnosis Safe(현 Safe{Wallet})는 스마트 컨트랙트 기반 다중 서명으로, 각 서명자가 독립적으로 ECDSA 서명을 생성하고, Safe 컨트랙트가 온체인에서 검증한다.
4.2.1. 사전 조건¶
- M-of-N Safe 컨트랙트가 배포되어 있음
- 각 서명자의 EOA 주소가 Safe 소유자(owner)로 등록되어 있음
- 각 서명자가 D'CENT X에 해당 EOA의 프라이빗 키를 보유
4.2.2. Safe 서명 절차¶
Step 3~7에서 수행:
- [대시보드] Safe TX Hash 계산:
safeTxHash = keccak256(encodeTransactionData(to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, nonce))- EIP-712 TypedData 구성 (domain: Safe 주소 + chainId)
- [대시보드] safeTxHash를 QR로 인코딩 (Step 3)
- [오프라인 앱] QR 스캔 (Step 4)
- [오프라인 앱 -> D'CENT X] 서명 요청 전달
- [D'CENT X SE] WYSIWYS 표시 (Step 5):
- EIP-712 데이터에서 to, value, data 파싱
- 수신 주소, 금액 표시
- calldata가 알려진 함수 시그니처와 매칭되면 함수명 + 파라미터 표시 (Level 0)
- 매칭 불가 시 Level 1~3 경고 표시
- [D'CENT X] 물리 버튼 승인 (Step 6):
- SE가 ECDSA 서명 (v, r, s) 생성
- ecRecover(safeTxHash, v, r, s) = 서명자 EOA 주소 확인 가능
- [오프라인 앱 -> 대시보드] 서명 반환 (Step 7)
서명 순서 제약: Safe 컨트랙트의 checkNSignatures 함수는 서명을 서명자 주소 오름차순으로 정렬하여 검증한다. 따라서 서명 수집은 순서 무관하나, Step 8에서 집계 시 주소 순서로 재배열해야 한다.
4.2.3. Safe 서명 집계 및 실행 (Step 8)¶
- [대시보드] M개 ECDSA 서명 {(v_1, r_1, s_1), ..., (v_M, r_M, s_M)} 수집
- [대시보드] 서명자 주소 오름차순으로 정렬
- [대시보드] 서명을 연결하여
signatures바이트 배열 구성 - [대시보드] Safe 컨트랙트의
execTransaction(to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, signatures)호출 - [온체인] Safe 컨트랙트가
checkNSignatures로 M개 서명 검증 -> 통과 시 TX 실행
4.3. Warm MPC-TSS (CGGMP21) 서명¶
MPC-TSS(Multi-Party Computation Threshold Signature Scheme)는 CGGMP21 프로토콜 기반으로, Warm 월렛(5-15% 자산, 신속 처리용)에 적용된다.
4.3.1. 핵심 차이: 에어갭 미사용¶
Warm MPC-TSS는 Hot zone에서 실행되므로, Step 3~7의 에어갭 QR + USB-C 통신이 불필요하다. 대신 mTLS(상호 TLS) 채널로 서명 노드 간 통신한다.
- D'CENT X 콜드월렛을 사용하지 않음 -> WYSIWYS 하드웨어 검증 미적용
- 키 셰어는 서명 노드의 HSM 또는 TEE에 저장
- Step 1(TX 생성) -> Step 2(승인) -> MPC 서명 프로토콜 -> Step 8(전파) -> Step 9(확인)
4.3.2. CGGMP21 서명 절차¶
- [대시보드] TX 생성 + 정책 검증 + M개 승인 (Step 1~2 동일)
- [대시보드] MPC 서명 세션 시작, 참여 노드 선택 (t-of-n 임계값)
- [서명 노드 x t] 사전 서명 프로토콜 (Pre-Signing):
- 각 노드가 로컬 랜덤 값 생성
- mTLS 채널로 상호 교환
- Paillier 암호화 기반 연산 수행
- [서명 노드 x t] 부분 서명 생성:
- 각 노드가 자신의 키 셰어로 부분 서명 계산
- 부분 서명을 코디네이터에게 전송
- [코디네이터] 부분 서명 집계 -> 표준 ECDSA 서명 복원
- [대시보드] 서명된 TX 블록체인 전파 (Step 8~9)
4.3.3. Warm 월렛 보안 보상 통제¶
WYSIWYS 하드웨어 검증이 없으므로 다음 보상 통제를 적용한다:
| 보상 통제 | 설명 |
|---|---|
| 금액 상한 | Warm 월렛 단일 TX 상한 설정 (예: $50K) |
| 일일 한도 | Warm 월렛 일일 누적 한도 설정 |
| 화이트리스트 필수 | Warm 월렛 출금은 화이트리스트 주소만 허용 |
| 지연 전파 | 일정 금액 이상 TX는 대기 시간 적용 (예: 1시간) |
| 이상 탐지 | 패턴 이탈 TX에 대한 자동 알림 + 수동 확인 |
| Cold 자동 리밸런싱 | Warm 잔액이 상한 초과 시 Cold로 자동 이체 |
5. 에어갭 통신 프로토콜 변종¶
5.1. 표준 QR (UR 프레임워크)¶
적용 범위: 단일 TX, 1-2명 서명자. 가장 일반적인 사용 패턴.
기술 스택: - Blockchain Commons UR(Uniform Resources) v2 - CBOR(Concise Binary Object Representation) 직렬화 - Fountain code 기반 Animated QR (에러 복구)
표준 QR 통신 절차:
- 송신 측: TX 데이터 -> CBOR 인코딩 -> UR 타입 래핑 -> QR 시퀀스 분할 -> Animated QR 표시
- 수신 측: 카메라로 QR 시퀀스 스캔 -> Fountain code 복원 -> UR 디코딩 -> CBOR 역직렬화 -> TX 데이터 복원
성능 기준:
| 항목 | 값 |
|---|---|
| 단일 QR 용량 | ~300 bytes (JSON) / ~600 bytes (binary) |
| Animated QR 프레임 수 | 일반 TX: 3-10 프레임 |
| 스캔 시간 | 3-15초 (프레임 수에 비례) |
| Fountain code 오버헤드 | ~10% (에러 복구용 중복 프레임) |
5.2. 대용량 TX 변종¶
적용 범위: 복수 UTXO 입력 BTC TX, 복잡한 스마트 컨트랙트 calldata, 배치 트랜잭션.
대용량 TX의 특성:
| TX 유형 | 예상 페이로드 크기 | QR 프레임 수 | 예상 스캔 시간 |
|---|---|---|---|
| BTC 단일 입출력 | 200-500 bytes | 3-5 프레임 | 3-5초 |
| BTC 10+ UTXO 입력 | 2-5 KB | 15-30 프레임 | 15-30초 |
| BTC 50+ UTXO 배치 | 10-20 KB | 50-100 프레임 | 1-2분 |
| EVM 단순 전송 | 200-400 bytes | 3-5 프레임 | 3-5초 |
| EVM 복잡 calldata | 2-10 KB | 15-50 프레임 | 15-50초 |
| EVM 다중 출력 배치 | 5-20 KB | 30-100 프레임 | 30초-2분 |
대용량 TX QR 전송 한계:
- 30 프레임 초과 시 Fountain code 중복률 증가 권장 (에러 복구율 향상)
- 100 프레임 초과 시 분할 QR 세션 또는 압축 적용 필수 (QR 스캔 신뢰성 저하)
- 앱↔콜드월렛 구간은 USB-C 연결이므로 대용량 TX 전송에 제약 없음
대용량 QR 최적화 기법:
- 프레임 속도 조절: 기본 10fps -> 대용량 시 5fps로 감속 (스캔 안정성 향상)
- Fountain code 중복률 증가: 기본 10% -> 대용량 시 20% (에러 복구율 향상)
- 분할 전송: 하나의 대용량 TX를 복수 QR 세션으로 분할 (극단적 경우)
- 압축: CBOR 인코딩 자체의 바이너리 효율 + 선택적 zlib 압축
5.3. 다수 서명자 변종¶
적용 범위: 3-of-5 이상 서명자 구성.
5.3.1. 순차 서명 (디바이스 릴레이)¶
하나의 오프라인 앱으로 서명자가 차례로 서명하는 방식:
- 서명자 1이 오프라인 앱에서 TX 수신 -> D'CENT X로 전달 -> WYSIWYS 확인 -> 서명 -> 오프라인 앱에 부분 서명 저장
- 서명자 2가 같은 오프라인 앱에서 자신의 D'CENT X로 전달 -> WYSIWYS 확인 -> 서명 -> 부분 서명 추가 저장
- M명 완료 시 오프라인 앱에서 대시보드로 M개 부분 서명 일괄 반환
장점: 오프라인 앱 1대면 충분, QR + USB-C 세션 수 = 2M+2 (각 서명자 2회 USB-C + 최초 QR 수신 + 최종 QR 반환) 단점: 총 소요 시간 = M * (단일 서명 시간), 서명자가 물리적으로 같은 위치에 있어야 효율적
5.3.2. 병렬 서명 (각자 오프라인 앱)¶
각 서명자가 자신의 오프라인 앱으로 독립 서명하는 방식:
- 대시보드에서 M명 각각에게 서명 요청 QR 제공 (동일 TX, 동일 세션 ID)
- 각 서명자가 자신의 오프라인 앱 + D'CENT X로 독립 서명 수행 (Step 3~7)
- 각 서명자가 자신의 부분 서명을 개별적으로 대시보드에 반환
장점: 총 소요 시간 = max(개별 서명 시간), 서명자가 다른 위치에 있어도 가능 단점: 오프라인 앱 M대 필요, 각 서명자가 독립적으로 에어갭 통신 수행
5.3.3. MuSig2 nonce 라운드의 다수 서명자 처리¶
MuSig2에서는 Round 1(nonce 교환)에서 M명 모두의 nonce가 필요하다:
- 순차 모드: 서명자 1 nonce 제출 -> 서명자 2 nonce 제출 -> ... -> M명 완료 -> aggregated nonce 계산 -> Round 2 시작
- 병렬 모드: M명이 동시에 nonce 제출 -> 대시보드에서 M개 nonce 수집 -> aggregated nonce 계산 -> Round 2 시작
Round 2(부분 서명)는 순차/병렬 모두 가능하며, 각 서명자의 부분 서명은 순서에 독립적이다.
주의: MuSig2의 nonce는 한 번만 사용 가능하다(nonce reuse = 키 유출). 서명 세션이 중단되면 새 nonce로 세션을 재시작해야 한다.
5.3.4. Safe의 다수 서명자 처리¶
Safe에서는 각 서명자의 ECDSA 서명이 완전히 독립적이므로:
- nonce 라운드 불필요
- M명이 순차/병렬 어떤 순서로든 서명 가능
- 대시보드에서 M개 서명 수집 후 주소 순서로 정렬하여
execTransaction호출
5.4. USB-C 디바이스 통신 채널¶
적용 범위: 오프라인 앱 ↔ D'CENT X 콜드월렛 간 모든 서명 통신.
5.4.1. USB-C 통신 사양¶
| 항목 | 사양 |
|---|---|
| 표준 | USB 2.0/3.0, USB-C 커넥터 |
| 연결 방식 | 유선 (USB-C 케이블) |
| 전송 속도 | USB 2.0: 480 Mbps / USB 3.0: 5 Gbps |
| 페이로드 제한 | 무제한 (USB 대역폭 내) |
| 전원 공급 | USB-C를 통해 콜드월렛 충전 가능 |
참고: D'CENT X는 엔터프라이즈 모드에서 Bluetooth를 비활성화한다. NFC는 R3covery 카드 전용이다.
5.4.2. USB-C 사용 시나리오¶
| 시나리오 | 설명 |
|---|---|
| 서명 요청 전달 | 오프라인 앱 → D'CENT X로 서명 요청 페이로드 전달 |
| 서명 결과 반환 | D'CENT X → 오프라인 앱으로 부분 서명 데이터 반환 |
| 대용량 TX | PSBT 다중 입력 등 대용량 페이로드도 제약 없이 전송 |
| 정책 동기화 | 오프라인 앱 → D'CENT X로 정책 업데이트 전달 |
| 펌웨어 업데이트 | 오프라인 앱 → D'CENT X로 서명된 펌웨어 바이너리 전달 |
5.4.3. USB-C 보안 고려사항¶
| 위협 | 대응 |
|---|---|
| USB 데이터 가로채기 | 오프라인 전용 디바이스에서만 연결, 네트워크 격리 환경 |
| 악성 USB 디바이스 | SE 독립 검증 (서명 데이터 무결성), WYSIWYS 하드웨어 표시 |
| USB 프로토콜 공격 | SE가 수신 데이터를 독립 파싱·검증, 외부 소프트웨어 신뢰하지 않음 |
5.4.4. 통신 채널 배치 정리¶
에어갭 경계 통과 (대시보드 ↔ 오프라인 앱):
└── QR (Animated QR, UR 표준) — 시각적 관찰 가능, 물리 격리 보장
오프라인 서명 유닛 내부 (오프라인 앱 ↔ 콜드월렛):
└── USB-C (유선 연결) — 빠르고 안정적, 대용량 제약 없음
R3covery 카드 통신 (본체 SE ↔ 카드 SE):
└── NFC — SE-to-SE 상호 인증, 시드 백업/복구 전용
5.5. 에러 복구¶
5.5.1. QR 스캔 실패 복구¶
| 실패 유형 | 복구 절차 |
|---|---|
| 부분 프레임 누락 | Fountain code 자동 복구 (중복 프레임으로 재구성) |
| 전체 스캔 실패 | Animated QR 속도 감속(10fps -> 5fps) 후 재시도 |
| 반복 실패 (3회) | Animated QR 속도 감속(5fps) + 재시도 안내 |
| 데이터 무결성 오류 | QR 재생성 요청 (세션 유지, 데이터 재전송) |
5.5.2. USB-C 통신 실패 복구¶
| 실패 유형 | 복구 절차 |
|---|---|
| 연결 끊김 | USB-C 케이블 재연결 (세션 유지 시 이어서 전송) |
| 데이터 오류 | 해당 데이터 블록 재전송 |
| SE 무응답 | D'CENT X 재시작 후 USB-C 재연결 |
| 케이블 불량 | USB-C 케이블 교체 후 재시도 |
5.5.3. 프로토콜별 타임아웃 및 재서명¶
| 항목 | MuSig2 | Safe | MPC-TSS |
|---|---|---|---|
| Nonce 유효 시간 | 세션 종료 시까지 (최대 4시간) | 해당 없음 | 해당 없음 |
| 부분 서명 유효 시간 | 세션 종료 시까지 | 48시간 (Safe nonce 기준) | 세션 종료 시까지 |
| 세션 타임아웃 | 4시간 | 48시간 | 1시간 |
| 타임아웃 시 조치 | 새 nonce로 세션 재시작 (nonce 재사용 금지) | 새 safeTxHash 생성 (nonce 변경 가능성) | 새 세션 시작 |
| 부분 서명 분실 | 해당 서명자 재서명 (다른 서명자 영향 없음) | 해당 서명자 재서명 | 전체 세션 재시작 |
5.5.4. 정족수 미달 복구¶
M명 중 일부 서명자의 서명을 수집하지 못한 경우:
- 대시보드에서 미서명 서명자 목록 확인
- 미서명 서명자에게 추가 알림 발송
- 서명 기한 연장 (관리자 승인 필요)
- 대체 서명자 지정 (N명 풀에서 다른 서명자 선택, 사전 설정 시)
- 기한 초과 시 TX 만료 -> 새 TX 생성 필요
6. 타임아웃 및 에러 처리 통합¶
6.1. 프로토콜별 타임아웃 정책 비교¶
| Step | 타임아웃 | MuSig2 특이사항 | Safe 특이사항 | MPC-TSS 특이사항 |
|---|---|---|---|---|
| Step 1 (TX 생성) | 없음 | -- | -- | -- |
| Step 2 (승인) | 24시간 | -- | -- | -- |
| Step 3 (QR 준비) | 30분 | nonce 세션 시작 | -- | 해당 없음 |
| Step 4 (수신) | 10분 | -- | -- | 해당 없음 |
| Step 5 (WYSIWYS) | 5분 | PSBT 전체 파싱 | calldata Level 분기 | 해당 없음 |
| Step 6 (서명) | 2분 | 부분 Schnorr 서명 | ECDSA 서명 | 해당 없음 |
| Step 7 (반환) | 15분 | nonce 재사용 불가 주의 | -- | 해당 없음 |
| Step 8 (집계) | 5분 | 집계 서명 검증 | 주소 순서 정렬 | 부분 서명 집계 |
| Step 9 (확인) | BTC 24h / EVM 1h | -- | -- | -- |
6.2. 에러 유형별 복구 절차 매트릭스¶
| 에러 유형 | 영향 범위 | 복구 절차 | 재서명 필요 여부 |
|---|---|---|---|
| 서명 거부 (Step 6) | 해당 서명자만 | 거부 사유 기록, 다른 서명자 정상 진행. N풀에서 대체 서명자 지정 가능 | 거부 서명자만 재서명 (또는 대체) |
| 통신 실패 (Step 3-4, 7) | 해당 서명자만 | QR 재시도(대시보드↔앱), USB-C 재연결(앱↔디바이스) | 아니오 (부분 서명은 SE에 잔류) |
| WYSIWYS 불일치 (Step 5) | 전체 세션 | 즉시 중단, 보안 사고 프로토콜 발동, 모든 서명 폐기 | 원인 해결 후 전체 재서명 |
| 정족수 미달 (Step 8) | 전체 TX | 추가 서명 수집 또는 대체 서명자 | 미서명자만 |
| 집계 실패 (Step 8) | 전체 TX | 개별 서명 재검증, 무효 서명 식별 후 해당 서명자 재서명 | 무효 서명자만 |
| 전파 실패 (Step 8) | 전체 TX | 대체 노드 전환, nonce/UTXO 충돌 시 TX 재구성 | 아니오 (서명 유지) |
| nonce 만료 (MuSig2) | 전체 MuSig2 세션 | 새 nonce로 세션 재시작 (nonce 재사용 = 키 유출 위험) | 전원 재서명 |
| SE PIN 잠금 (Step 6) | 해당 디바이스 | 대체 디바이스 사용, 잠긴 디바이스 복구 절차 | 해당 서명자만 (대체 디바이스로) |
6.3. 보안 사고 트리거 조건¶
다음 조건 발생 시 자동으로 보안 사고 프로토콜을 발동한다:
| 트리거 | 심각도 | 즉시 조치 |
|---|---|---|
| WYSIWYS 불일치 (SE 표시 != 대시보드 표시) | Critical | 전체 서명 세션 중단, 모든 서명 폐기, 보안팀 알림 |
| 동일 nonce 재사용 시도 | Critical | 해당 세션 즉시 종료, 키 손상 조사 시작 |
| PIN 10회 연속 실패 (SE 자동 삭제) | High | 디바이스 격리, 백업 복구 절차 시작 |
| 미등록 디바이스 attestation 실패 | High | 서명 거부, 디바이스 인벤토리 확인 |
| 서명자 동시 거부 (M명 중 과반 거부) | Medium | 세션 중단, TX 내용 재검토 |
7. Phase 14/15 참조 가이드¶
7.1. Layer 2 (세그먼트 델타) 참조 방식¶
Phase 14에서 작성할 Layer 2 세그먼트 델타 문서는 본 문서의 Step 번호를 다음과 같이 참조한다:
[SC Delta] Step 2: 셀프 커스터디 기업의 정책 검증 오버라이드
금액별 티어: <$50K = 2-of-5, $50K-$200K = 3-of-5, >$200K = 4-of-5
(Layer 1 Step 2의 "M-of-N 서명자 풀 결정"을 세그먼트별로 상세화)
[CSP Delta] Step 2: 수탁 사업자의 고객사 승인 참여 Level에 따른 서명자 풀 구성
Level 0: 내부 Approver만 (고객 미참여)
Level 1: 고객 1인이 M명 중 1인으로 참여
...
참조 규칙:
- [XX Delta] Step N: 형식으로 해당 Step의 세그먼트별 변형을 기술
- 차이가 없는 Step은 생략 (Layer 1이 그대로 적용)
- Layer 1의 Step 순서를 변경하지 않음 (삽입/삭제 없이 오버라이드만)
7.2. Layer 3 (환경 어노테이션) 참조 방식¶
본 Plan의 후속 문서인 signing-coldroom-annotation.md와 signing-noncoldroom-annotation.md는 본 문서의 Step 번호를 다음과 같이 참조한다:
[CR Annotation] Before Step 1: 콜드룸 입장 절차
듀얼 컨트롤 기반 2인 이상 동시 입장, 신원 확인, CCTV 녹화 시작...
[CR Annotation] Before Step 3: 디바이스 반출 및 체인-오브-커스터디
금고에서 D'CENT X 반출, 봉인 확인...
[NCR Annotation] Before Step 1: 개인 서명 환경 준비
보안 등급별 디바이스 반출 절차, 봉인 확인...
참조 규칙:
- [XX Annotation] Before/After Step N: 형식으로 물리 절차 삽입
- Layer 1의 디지털 플로우를 변경하지 않음 (물리 절차 삽입만 허용)
- 보안 등급별(Grade A/B/C/콜드룸) 분기가 있으면 등급별로 표기
- 보완 조치 ID(CC-PHY-xx, CC-PROC-xx, CC-TECH-xx, CC-ORG-xx) 인라인 참조
7.3. Phase 15 도입 여정에서의 서명 플로우 참조¶
Phase 15의 도입 여정(Day-0/Day-1/Day-N) 문서는 Day-N(안정 운영) 단계에서 본 문서의 서명 플로우를 참조한다:
- Day-N 일상 운영의 "출금 트랜잭션 서명" = 본 문서의 Step 1~9 전체
- Day-1 설정의 "테스트 트랜잭션" = 본 문서의 Step 1~9를 테스트넷에서 실행
- Day-0 평가의 "서명 플로우 데모" = 본 문서의 Step 5(WYSIWYS) 중심 시연
본 문서는 Phase 13 서명 플로우 설계의 Layer 1으로, v0.0 airgap-signing-flow.md의 4단계 파이프라인을 환경/세그먼트 독립 상세 플로우로 확장한다. Layer 3 환경 어노테이션(signing-coldroom-annotation.md, signing-noncoldroom-annotation.md)과 함께 모든 시나리오(S1~S8)의 서명 단계를 완전히 커버한다.