> 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-6/undefined-1.md).

# 컨트랙트 아키텍처

NovaCont의 프로토콜은 두 개의 별도 스마트 컨트랙트로 분할됩니다. 이 관심사 분리는 의도적입니다 — 자금 관리를 분쟁 해결로부터 격리하여 한 레이어의 장애 또는 업그레이드가 다른 레이어를 손상시키지 않도록 보장합니다.

<figure><img src="/files/xSnSpj4aaZpDJ9UCPI6L" alt=""><figcaption></figcaption></figure>

### NovaCont — 에스크로 레이어

NovaCont는 기본 컨트랙트입니다. 다음을 담당합니다:

* 컨트랙트 생성 시 고객 자금 수락 및 잠금
* 엄격한 상태 전환을 통한 계약 생명주기 적용
* 완료, 취소 또는 분쟁 해결 시 자금 분배 관리
* 분쟁이 탈중앙화 배심원 시스템으로 에스컬레이션될 때 NovaJury와의 인터페이스

NovaCont는 세 개의 OpenZeppelin 기본 컨트랙트를 상속합니다:

**ReentrancyGuard** — 자금을 이동하는 모든 함수에서 재진입 공격을 방지합니다. ETH 또는 ERC-20 잔액을 건드리는 모든 외부 호출은 `nonReentrant` 수정자로 감싸져 있습니다.

**Ownable2Step** — 2단계 소유권 이전 메커니즘을 구현합니다. 새 소유자는 이전이 확정되기 전에 명시적으로 소유권을 수락해야 하며, 유효하지 않은 주소로의 우발적이거나 악의적인 소유권 이전을 방지합니다.

**Pausable** — 컨트랙트 소유자가 중요한 취약점이나 비상 사태 발생 시 모든 상태 수정 작업을 일시 중지할 수 있도록 합니다. 일시 중지는 자금 출금에 영향을 미치지 않습니다 — 컨트랙트가 일시 중지된 경우에도 사용자는 항상 자금을 회수할 수 있습니다.

### NovaJury — 중재 레이어

NovaJury는 분쟁 해결 컨트랙트입니다. NovaCont와 독립적으로 운영되며 다음을 담당합니다:

* 스테이킹, 경고, 삭감 및 제외를 포함한 배심원 풀 관리
* NovaCont가 전달한 분쟁 사건 수신
* 당사자와 배심원 사이의 분쟁 수수료 수집 및 분배
* 사건에 배심원 무작위 배정 및 투표 생명주기 관리
* 온체인 실행을 위해 최종 판결을 NovaCont에 반환

NovaJury는 동일한 보안 이유로 동일한 세 개의 OpenZeppelin 기본 컨트랙트 — ReentrancyGuard, Ownable2Step 및 Pausable — 를 상속합니다.

### 두 컨트랙트는 어떻게 통신하나요

NovaCont와 NovaJury는 엄격하게 제어된 인터페이스 세트를 통해 통신합니다. 어떤 컨트랙트도 다른 컨트랙트에서 임의의 함수를 호출할 수 없습니다 — 특정하고 명시적으로 정의된 진입점만 노출됩니다.

**NovaCont → NovaJury:** 배심원 모드에서 분쟁이 열리면 NovaCont는 NovaJury 컨트랙트에서 `INovaJury.createCase()`를 호출하여 컨트랙트 ID, 당사자 주소, 합의된 가격, 증거 URI 및 분쟁 이유 URI를 포함한 모든 관련 사건 데이터를 전달합니다. NovaCont는 또한 전송을 시작하기 전에 올바른 수수료를 결정하기 위해 `INovaJury.computeDisputeFeePerParty()`를 호출합니다.

**NovaJury → NovaCont:** 판결이 확정되면 NovaJury는 NovaCont에서 `settleDisputeByJury()`를 호출하여 컨트랙트 ID, 사건 ID 및 서비스 제공자의 기준점 할당을 전달합니다. NovaJury는 또한 상대방이 분쟁 수수료의 자신의 몫을 지불했을 때 NovaCont에 알리기 위해 `onCounterFeePaid()`를 호출합니다.

**접근 제어:** NovaJury에서 NovaCont로의 모든 호출은 `onlyJuryContract` 수정자로 보호됩니다 — 등록된 NovaJury 주소만 이러한 함수를 호출할 수 있습니다. 대칭적으로 NovaCont에서 NovaJury로의 호출만이 사건을 생성할 수 있는 유일한 방법입니다 — 외부 행위자는 NovaJury에 직접 사건을 주입할 수 없습니다.
