> For the complete documentation index, see [llms.txt](https://novacont.gitbook.io/nova-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://novacont.gitbook.io/nova-docs/novacont-docs/korean/undefined-5/novacont-lite.md).

# NovaCont Lite 보안 검토

**범위**

* NovaCont\_Lite.tact

**방법론**

* 수동 코드 검토, 두 라운드로 수행: 첫 번째 라운드는 아키텍처와 상태 전환 로직을 검토하고 발견 사항은 개발자가 처리했습니다. 두 번째 라운드는 소스 코드 수준에서 수정 사항을 검증했습니다.
* 정적 분석: Misti

| 심각도             | 수량 | 범주                                                                                                                                                                         |
| --------------- | -- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Critical / High | 0  | 없음                                                                                                                                                                         |
| Medium          | 9  | SuboptimalSend: 더 가스 효율적인 message()를 send() 대신 사용 제안, 기능적 위험 없음                                                                                                            |
| Low             | 29 | PreferredStdlibApi (require -> throwUnless), PreferSenderFunction (context().sender -> sender()), EtaLikeSimplifications, UnusedMethodArgument. 모두 가스 최적화 또는 스타일, 동작 차이 없음 |

Misti를 통한 정적 분석은 코드베이스에서 기능적 보안 취약점을 발견하지 못했습니다. 표시된 모든 것은 가스 최적화 또는 API 선호도 수준입니다.

**수동 검토**

첫 번째 검토 라운드에서 식별되고 개발자가 처리하며 소스 코드 수준에서 검증된 발견 사항:

**CancelEscrow 상태 변경 순서 버그 \[수정됨]**

초기 버전에서 로컬 변수 "escrow\.state"가 "escrow\.state == STATE\_CREATED" 검사가 평가되기 *전에* "STATE\_CANCELLED"로 업데이트되었습니다. 따라서 변수가 이미 변경되었기 때문에 이 검사는 항상 "false"로 평가되었습니다. "acceptTime == 0" 조건만 실제로 유효했으며, 이 조건은 "STATE\_CREATED" 상태의 안전한 대리 역할을 했기 때문에 버그는 실질적인 영향이 없었습니다. 그러나 죽은 조건은 향후 리팩토링에서 조용히 실제 버그로 변할 수 있는 잠재적 위험이었습니다. 원래 상태는 이제 "wasNotYetAccepted: Bool" 변수에 미리 캡처되며, 이 미리 캡처된 값이 상태 변경 후에 사용됩니다.

**SendIgnoreErrors를 통한 자금 자동 손실 위험 \[수정됨]**

모든 "send()" 호출이 "SendIgnoreErrors"(실패한 전송을 조용히 삼킴)에서 "SendBounceIfActionFail"로 전환되었습니다. 실패한 전송은 이제 거래를 반송하여 상태 업데이트가 전송 성공과 일관되게 유지됩니다. 코드베이스의 모든 "send()" 호출에서 검증되었습니다.

**자금 분배 로직의 중앙화 \[수정됨]**

초기 버전에서 "CancelEscrow"의 패널티 취소 분기는 "distributeFunds"와 독립적인 자체 자금 분할 로직을 포함했습니다. 이 중복은 한 경로에 적용된 수정이 다른 경로에 반영되지 않을 위험을 수반했습니다(실제로 이전 버그는 이 한 분기에만 한정되어 있었습니다). "CancelEscrow"는 이제 "distributeFunds(escrowId, escrow, 5000 or 10000)"를 통해 단일 중앙 함수로 라우팅됩니다. 이는 코드 중복을 제거하고 모든 자금 분배 시나리오에서 STORAGE\_RESERVE 계산이 일관되도록 보장합니다.

**분쟁 해결의 단일 장애 지점 \[수정됨]**

초기 버전에서 분쟁은 단일 개인 계정에 의존하여 해결되었습니다. 이제 "AddSupport"/"RemoveSupport"를 통해 관리되는 지원 풀이 있으며, "nextSupportAssign"을 통한 라운드 로빈 분배가 이루어집니다. 분쟁이 제기("RaiseDispute")되면 순서대로 지원 멤버에게 할당됩니다. "RemoveSupport"의 마지막 요소와의 교환 패턴은 index/count/nextAssign 동기화를 올바르게 유지합니다.

> 참고: 이것은 버그 수정이 아니라 아키텍처 탄력성 개선입니다. 중앙화 위험을 줄이지만 제거하지는 않습니다.

**EscrowId 충돌 위험 \[수정됨]**

초기 버전에서 클라이언트가 자신의 에스크로 ID를 선택할 수 있어 두 다른 클라이언트가 같은 ID를 선택하면 충돌 위험이 있었습니다. "escrowId"는 이제 "self.escrowCount"를 통해 자동으로 순차적으로 할당됩니다.

| 발견                                      | 상태                                                                       |
| --------------------------------------- | ------------------------------------------------------------------------ |
| 정수 나눗셈 반올림 손실                           | 먼지 수준, 측정 가능한 영향 없음                                                      |
| description/evidenceUrl 필드의 최대 길이 검사 없음 | 낮은 우선순위, 가스 예측 가능성에 관련                                                   |
| 이벤트 명명 일관성 (EscrowCreated 대 기타)         | 외관상, 기능적 위험 없음                                                           |
| agreedTon에 대한 최소 하한 미정의                 | distributeFunds의 > STORAGE\_RESERVE 조건 검사가 이미 암묵적으로 음수/유효하지 않은 전송 위험을 방지 |

**결론**

초기 검토의 모든 여섯 가지 발견 사항(High 1개 및 Medium 1개 심각도 발견 포함)이 v1.1.0에서 수정된 것으로 검증되었습니다. Misti의 정적 분석은 코드베이스에서 기능적 보안 취약점을 발견하지 못했습니다. 이 검증 라운드 이후 NovaCont Lite는 메인 NovaCont 계약에 필적하는 성숙도 수준에 도달했습니다. 독립적인 제3자 감사가 여전히 권장되지만, 내부 검토 프로세스의 엄격성과 속도는 긍정적인 신호입니다.
