> 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-4.md).

# 보안 모델

### 풀 결제 아키텍처

NovaCont는 수신자에게 자금을 강제로 전송하지 않습니다. 대신 모든 자금 분배는 `pendingWithdrawals` 매핑에 크레딧으로 기록되며 수신자가 명시적으로 자신의 출금을 시작합니다.

이것은 의도적인 보안 선택입니다. 푸시 기반 결제 시스템 — 컨트랙트가 수신자 주소로 직접 ETH를 전송하는 — 은 수신자가 상태가 업데이트되기 전에 전송 함수에 재진입하는 악의적인 컨트랙트인 경우 재진입 공격에 취약합니다. 크레딧 단계를 출금 단계와 분리함으로써 NovaCont는 이 공격 표면을 완전히 제거합니다.

각 출금 함수는 추가적으로 이차 방어 레이어로서 `nonReentrant` 수정자로 보호됩니다.

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

### 재진입 보호

ETH 또는 ERC-20 잔액과 상호 작용하는 모든 함수는 OpenZeppelin의 ReentrancyGuard의 `nonReentrant` 수정자로 표시됩니다. 이 수정자는 잠금 변수를 사용하여 컨트랙트의 어떤 함수도 재귀적으로 호출될 수 없도록 보장합니다 — 재진입 호출이 시도되면 거래가 즉시 되돌아갑니다.

ERC-20 전송은 비표준 토큰 구현을 우아하게 처리하고 잘못된 반환 값으로 조용히 성공하는 대신 실패한 전송에서 되돌아가는 OpenZeppelin의 `SafeERC20` 래퍼를 사용합니다.

### 접근 제어

**소유자** — 배포 주소. 컨트랙트를 일시 중지하고, 수수료를 업데이트하고, 토큰을 등록하고, 가격 피드를 설정하고, 해결사 및 배심원 시스템 구성을 관리할 수 있습니다. 소유권 이전은 우발적인 이전을 방지하기 위해 두 단계가 필요합니다.

**해결사** — 관리자 모드에서 분쟁을 해결할 권한이 있는 지정된 주소. 배포 시 기본값은 소유자입니다. 소유자가 언제든지 변경할 수 있습니다. 배심원 시스템이 활성화되면 해결사가 자동으로 NovaJury 컨트랙트 주소로 설정됩니다.

**onlyJuryContract** — 특정 정산 함수를 등록된 NovaJury 주소로만 제한하는 수정자. 소유자, 해결사 또는 외부 행위자가 호출할 수 없습니다.

**당사자 기반 접근** — 대부분의 워크플로우 함수는 컨트랙트 생성 시 고객 또는 서비스 제공자로 등록된 특정 주소로 제한됩니다. 다른 어떤 주소도 당사자를 대신하여 수락, 납품, 승인, 분쟁 또는 취소할 수 없습니다.

### 비상 일시 중지

컨트랙트 소유자는 발견된 취약점이나 진행 중인 공격의 경우 비상 조치로 언제든지 `pause()`를 호출하여 모든 상태 수정 작업을 중단할 수 있습니다.

일시 중지 시:

* 새 컨트랙트를 생성할 수 없습니다
* 상태 전환을 트리거할 수 없습니다
* `pendingWithdrawals`에서의 출금은 완전히 기능적으로 유지됩니다 — 사용자는 항상 적립된 자금을 회수할 수 있습니다

컨트랙트는 소유자가 언제든지 `unpause()`를 통해 재개할 수 있습니다.

### 알려진 제한 사항 및 가정

**의사 무작위 배심원 선택:** 배심원 배정은 `blockhash`, `prevrandao`, `gasleft` 및 증가하는 논스를 기반으로 한 온체인 의사 무작위 메커니즘을 사용합니다. 이것은 암호학적으로 안전한 무작위성이 아닙니다. 블록 생성에 충분한 제어권을 가진 검증자는 이론적으로 배심원 선택 결과에 영향을 미칠 수 있습니다. 프로토콜의 현재 규모에서 이 위험은 허용 가능한 것으로 간주되지만 제한 사항으로 인정됩니다. Chainlink VRF와 같은 검증 가능한 무작위성 솔루션과의 통합이 잠재적인 미래 업그레이드입니다.

**오라클 의존성:** NovaCont는 보증금 계산을 위해 Chainlink 가격 피드에 의존합니다. 컨트랙트는 각 오라클 호출에서 다중 검증을 수행합니다: 가격이 0보다 큰지, 라운드 데이터가 완전한지, 가격이 24시간을 초과하지 않는지 확인합니다. 장기간의 오라클 다운타임이나 손상된 피드는 여전히 USD에서 토큰으로의 변환 정확도에 영향을 미칠 수 있지만 이러한 다중 검사는 위험을 크게 줄입니다.

**항소 메커니즘 없음:** 분쟁 판결 — 관리자 또는 배심원에 의해 발행되든 — 은 온체인에서 실행되면 최종적이고 되돌릴 수 없습니다. 항소 프로세스가 없습니다. 사용자는 처음부터 완전하고 잘 정리된 증거로 분쟁에 접근해야 합니다.

**체인 외부 증거:** 증거 URI는 체인 외부 리소스를 가리킵니다. NovaCont는 이러한 리소스의 영속성이나 무결성을 보장할 수 없습니다. 나중에 접근 불가능해지는 링크를 제출한 서비스 제공자 또는 고객은 모든 분쟁 평가에서 그 접근 불가능성의 결과를 부담합니다.

### 공격 표면 분석

스마트 컨트랙트가 가장 취약한 곳을 이해하는 것은 그것이 무엇을 하는지 이해하는 것만큼 중요합니다. 다음은 NovaCont의 주요 공격 표면과 각각에 대한 완화 조치에 대한 솔직한 평가입니다.

#### **cancelContract — 소유자 접근 경로 및 납품 후 로직**

`cancelContract` 함수는 두 가지 중요한 동작을 가집니다:

**소유자 취소 권한.** 컨트랙트 소유자는 상태나 당사자 동의에 관계없이 언제든지 어떤 계약도 취소할 수 있습니다:

```
require(canCancel || msg.sender == owner(), "Cannot cancel");
```

이것은 의도적인 관리 기능입니다 — 제재된 주소, 법적 의무 또는 수동 개입이 필요한 중요한 버그와 같은 엣지 케이스를 처리하기 위해 존재합니다. 그러나 사용자가 인식해야 하는 중앙화 가정을 나타냅니다. 소유자가 시작한 취소는 항상 패널티 없이 고객에게 전액 환불로 이어집니다.

#### **settleDispute — 분할 검증**

관리자 정산 함수는 엄격한 불변성을 적용합니다:

```
require(_clientRefund + _grossProviderPayment == c.totalLocked)
```

이는 총 분배 금액이 항상 총 잠긴 금액과 같도록 보장합니다 — 정산 중에 자금을 생성하거나 소멸시킬 수 없습니다. 잠긴 잔액의 모든 wei를 설명하지 않는 어떤 해결책도 되돌아갈 것입니다. 이것은 분쟁 해결 중 우발적이고 악의적인 자금 오배분을 모두 방지하는 중요한 정확성 검사입니다.

#### **claimTimeout — 시간 의존성**

타임아웃 메커니즘은 7일 기간 확인을 위해 `block.timestamp`에 의존합니다. 채굴자와 검증자는 블록 타임스탬프에 약간의 영향을 미칩니다 — 일반적으로 몇 초에서 몇 분 범위. 이것은 7일 기간에 대한 의미 있는 공격 벡터가 아니지만 타임스탬프 의존 로직의 일반적인 특성으로 언급할 가치가 있습니다. NovaCont는 초 수준의 정밀도가 보안에 중요한 어떤 것에도 타임스탬프를 사용하지 않습니다.

### 프론트러닝 고려 사항

프론트러닝은 악의적인 행위자가 멤풀에서 보류 중인 거래를 관찰하고 먼저 처리되도록 더 높은 가스 수수료로 자신의 거래를 제출할 때 발생합니다.

**오라클 가격 프론트러닝:** 고객이 `createContract`를 호출하면 ETH/USD 가격이 정확히 그 블록에서 Chainlink에서 가져옵니다. 정교한 행위자는 이론적으로 보류 중인 `createContract` 거래를 관찰하고, 포함 시점의 오라클 가격을 예측하며, 그 주위에 공격을 설계할 수 있습니다. 그러나 여기서 의미 있는 이용 가능한 익스플로잇이 없습니다 — 고객은 자신의 자금을 잠그는 사람이며 오라클 가격은 그들이 얼마나 많은 ETH를 보내야 하는지에만 영향을 미치고 자금이 도난당할 수 있는지 여부에는 영향을 미치지 않습니다.

**분쟁 프론트러닝:** 멤풀에서 고객의 `disputeWork` 거래를 보는 서비스 제공자는 자신에게 유리한 방식으로 프론트러닝할 수 없습니다 — 컨트랙트 상태는 하나의 분쟁만 열리도록 허용하며 분쟁은 "납품됨" 상태에 있는 동안에만 열 수 있습니다. 서비스 제공자가 합법적인 분쟁을 선제적으로 막을 수 있는 경쟁 조건이 없습니다.

### ERC-20 엣지 케이스

**승인 경쟁 조건:** 표준 ERC-20 `approve` 함수는 기술적으로 지출자가 변경되는 승인을 관찰하고 이전 한도와 새 한도 모두를 지출하기 위해 프론트러닝할 수 있는 경쟁 조건에 취약합니다. NovaCont는 `SafeERC20`을 통해 `safeTransferFrom`을 사용하여 이 위험을 완화하며 사용자는 애플리케이션 인터페이스를 통하지 않고 컨트랙트와 직접 상호 작용하는 경우 한도를 늘리기 전에 0으로 설정하도록 권장됩니다.

**비표준 반환 값:** 일부 ERC-20 토큰은 EIP-20 사양에 반하여 `transfer` 및 `transferFrom`에서 불리언 값을 반환하지 않습니다. OpenZeppelin의 `SafeERC20` 래퍼는 반환 데이터 길이를 확인하고 호출 자체가 되돌아가지 않은 경우에만 누락된 반환 값을 성공으로 처리함으로써 이를 우아하게 처리합니다. 이는 더 광범위한 토큰 구현과의 호환성을 보장합니다.

### 중앙화 위험

NovaCont는 현재 형태로 완전히 신뢰가 필요 없지 않습니다. 다음 소유자 기능은 사용자가 프로토콜을 사용하기 전에 평가해야 하는 중앙화 가정을 나타냅니다:

| 기능              | 함수                                                | 영향                                                            |
| --------------- | ------------------------------------------------- | ------------------------------------------------------------- |
| 모든 작업 일시 중지     | `pause()`                                         | 컨트랙트 생성 및 상태 전환을 중단합니다. 출금은 영향을 받지 않습니다.                      |
| 어떤 컨트랙트도 취소     | `cancelContract()`                                | 소유자가 어떤 계약도 강제로 취소할 수 있습니다. 고객은 항상 전액 환불을 받습니다.               |
| 플랫폼 수수료 변경      | `setPlatformFee()`                                | 수수료는 최대 10%까지 변경할 수 있습니다. 미래 정산에만 영향을 미칩니다.                   |
| 해결사 변경          | `setResolver()`                                   | 분쟁 해결 권한을 어떤 주소로도 리디렉션할 수 있습니다.                               |
| 배심원 활성화 또는 비활성화 | `activateJurySystem()` / `deactivateJurySystem()` | 언제든지 관리자와 탈중앙화 분쟁 모드 사이를 전환할 수 있습니다.                          |
| 지원 토큰 추가 또는 제거  | `addSupportedToken()` / `removeSupportedToken()`  | 결제 옵션을 확장하거나 제한할 수 있습니다. ETH 또는 USDT는 제거할 수 없습니다.             |
| 가격 피드 업데이트      | `setPriceFeed()`                                  | 어떤 토큰에 대한 오라클 소스도 변경할 수 있습니다. 악의적인 피드는 보증금 계산에 영향을 미칠 수 있습니다. |

이러한 기능은 현재 개발 단계에서 프로토콜이 안전하게 운영되는 데 필요합니다. 프로토콜이 성숙해짐에 따라 타임락, 멀티시그 요구 사항 및 궁극적으로 온체인 거버넌스를 통해 소유자 권한을 점진적으로 줄이는 것이 의도입니다. 소유자 권한 모델의 모든 변경 사항은 미리 문서화되고 발표될 것입니다.

### 감사 상태

NovaCont는 아직 공식적인 제3자 보안 감사를 받지 않았습니다. 컨트랙트는 확립된 보안 모범 사례를 따라 개발되었으며 감사된 OpenZeppelin 라이브러리를 광범위하게 사용하지만 공식 감사의 부재는 알려지지 않은 취약점이 존재할 수 있다는 것을 의미합니다.

사용자는 공식 감사가 완료되고 결과가 발표될 때까지 프로토콜을 실험적인 것으로 취급해야 합니다. 잃을 여유가 없는 자금을 예치하지 마세요.

감사 참여는 프로토콜의 메인넷 배포 경로의 일부로 계획되어 있습니다. 감사 보고서는 이용 가능할 때 완전히 발표되고 이 문서에서 링크될 것입니다.
