Skip to main content
For the complete documentation index, see llms.txt

Troubleshoot compiler errors

이 가이드는 Compact 컴파일러에서 자주 발생하는 오류와 그 원인, 해결 방법을 설명합니다.

Exit codes

Compact 컴파일러는 다음 종료 코드를 반환합니다.

CodeMeaningFix
0컴파일 성공별도 조치 불필요
1잘못된 명령줄 인자compact compile --help로 올바른 플래그를 확인하세요
255컴파일 실패보고된 소스 오류를 수정한 뒤 다시 컴파일하세요

Error severity levels

Compact 컴파일러는 다음 오류 심각도 수준을 사용합니다.

MechanismSeverityDescription
source-errorfFatal소스 위치가 포함된 사용자 노출 오류
source-warningfWarning소스 위치가 포함된, 진행 가능한 경고
pending-errorfDeferred모아 두었다가 해당 패스 이후 함께 표시되는 오류
internal-errorfFatal컴파일러 내부 버그. Compact 팀에 보고하세요
external-errorfFatal외부 도구 또는 파일 시스템 오류

Lexer errors

토큰화 과정에서, 파싱이 시작되기 전에 발생하는 오류입니다.

Unexpected end of file

Message: "unexpected end of file"

Triggers: 닫히지 않은 문자열 리터럴이나 block comment 안에서 파일 끝에 도달한 경우입니다.

Fix: 소스 파일에서 닫히지 않은 문자열("…)과 닫히지 않은 block comment(/* …)가 없는지 확인하세요.

Unexpected newline

Message: "unexpected newline"

Triggers: 단일 행 문자열 리터럴 안처럼 줄바꿈이 허용되지 않는 위치에서 줄바꿈을 만난 경우입니다.

Fix: 문자열 리터럴이 여러 줄에 걸치지 않도록 하세요. 대신 문자열 연결이나 지원되는 여러 줄 구문을 사용하세요.

Unexpected character

Message: "unexpected character '<c>'"

Triggers: Compact 소스 코드에서 허용되지 않는 문자를 만난 경우입니다.

Fix: 잘못된 문자를 제거하거나 다른 문자로 바꾸세요. 외부에서 복사한 비 ASCII 문자, 잘못 들어간 문장 부호, 보이지 않는 유니코드 문자가 없는지 확인하세요.

Nested block comment

Message: "attempt to nest block comment"

Triggers: 이미 열려 있는 /* */ block comment 안에서 /*를 다시 사용한 경우입니다.

Fix: Compact는 중첩된 block comment를 지원하지 않습니다. 내부 주석에는 line comment(//)를 사용하거나, 중첩이 생기지 않도록 구조를 바꾸세요.

Numeric literal out of Field range

Message: "<value> is out of Field range"

Triggers: 숫자 리터럴이 표현 가능한 최대 Field 값을 초과한 경우입니다.

Fix: 더 작은 숫자를 사용하세요. Field 값은 ZK 증명 시스템에 사용되는 소수(prime)로 그 범위가 제한됩니다.

Invalid digit in binary literal

Message: "unexpected digit <d> (expected 0 or 1)"

Triggers: 0b… 리터럴에 0 또는 1이 아닌 숫자가 들어간 경우입니다.

Fix: 이진 리터럴에는 숫자 01만 사용할 수 있습니다.

Invalid digit in octal literal

Message: "unexpected digit <d> (expected 0 through 7)"

Triggers: 0o… 리터럴에 숫자 8 또는 9가 들어간 경우입니다.

Fix: 8진수 리터럴에는 0부터 7까지의 숫자만 사용할 수 있습니다.

Parser errors

토큰화 이후 컴파일러가 AST를 구성하는 동안 발생하는 오류입니다.

Parse error

Message: "parse error: found <token> looking for <expected>"

Triggers: 현재 파싱 위치에서 Compact 문법과 일치하지 않는 모든 구문에서 발생합니다.

Fix: 오류 위치를 꼼꼼히 확인하세요. 흔한 원인은 다음과 같습니다.

  • 문장 끝의 세미콜론 누락
  • 짝이 맞지 않는 중괄호 { / }
  • 잘못되거나 철자가 틀린 키워드
  • 인자 목록에 콤마가 더 있거나 빠진 경우

Unrecognized pragma setting

Message: "unrecognized pragma setting <value>"

Triggers: pragma 지시문에 컴파일러가 인식하지 못하는 값을 사용한 경우입니다.

Fix: 지원되는 pragma 지시문을 확인하세요. 올바른 pragma 예시는 다음과 같습니다.

pragma language_version >= 0.23;

File I/O errors

컴파일러는 다음 메시지를 반환합니다.

  • "error opening source file"
  • "error reading source file"
  • "<path> is a directory"

Triggers: 지정한 소스 파일을 열거나 읽는 과정에서 오류가 발생했거나, 경로가 디렉터리를 가리키는 경우입니다.

Fix: 파일 경로가 올바른지, 파일이 존재하는지, 확장자가 .compact인지 확인하세요. 컴파일러가 파일을 기대하는 자리에 디렉터리 경로를 전달하지 마세요.

Witness and disclosure errors

witness 값에 대한 Compact의 프라이버시 모델을 강제하는 오류입니다.

Undeclared witness disclosure

Message: "potential witness-value disclosure must be declared but is not"

Triggers: witness 값이 disclose() 래퍼 없이 ledger나 공개 출력으로 전달된 경우입니다.

Fix: witness 값이 ledger 상태나 공개 출력에 도달하기 전에 disclose()로 감싸세요.

disclose(witnessValue)

disclose() 래퍼는 비공개 데이터를 공개 ledger 상태에 기록해도 안전하다고 선언합니다.

Witness returns contract-typed value

Message: "invalid type <T> for witness <W> return value: witness return values cannot include contract values"

Triggers: witness 함수가 컨트랙트 타입 값을 포함하는 반환 타입을 선언한 경우입니다.

Fix: witness 반환 타입에서 컨트랙트 타입 값을 모두 제거하세요. witness는 struct, enum 등 일반 타입은 반환할 수 있지만 컨트랙트 값은 반환할 수 없습니다. 컨트랙트 관련 정보는 개별 필드로 나눠 전달하세요.

ZKIR generation errors

타입 검사를 마친 AST에서 컴파일러가 ZK 중간 표현(ZKIR)을 생성할 때 발생하는 오류입니다.

Cross-contract calls not yet supported

Message: "cross-contract calls are not yet supported"

Triggers: 컨트랙트가 cross-contract 호출을 시도했으나 ZKIR 출력 단계가 아직 이를 지원하지 않는 경우입니다.

Fix: 현재 컴파일러의 제약 사항입니다. 해당 기능이 제공될 때까지 cross-contract 호출을 사용하지 않도록 구조를 바꾸세요.

ZKIR non-zero exit status

Message: "zkir returned a non-zero exit status <N>"

Triggers: 외부 ZKIR 컴파일 도구가 오류로 종료된 경우입니다.

Fix: 지원되지 않는 연산에 대한 자세한 내용은 출력을 확인하세요. circuit 안에 ZKIR 백엔드가 아직 지원하지 않는 연산이 없는지 점검하세요.

Runtime errors

컴파일러가 아니라, 컴파일된 컨트랙트가 Midnight 런타임에서 실행될 때 발생하는 오류입니다.

Base error class

Class: CompactError

Description: CompactError는 모든 컨트랙트 런타임 오류의 기반 클래스입니다. 이 타입을 catch하면 어떤 Compact contract 오류든 일괄적으로 처리할 수 있습니다.

Failed assertion

Message: "failed assert: <message>"

Triggers: Compact assert 식이 런타임에 false로 평가된 경우입니다.

Fix: assertion 조건을 점검하세요. <message> 텍스트는 assert에 전달한 문자열입니다. 이를 단서로 컨트랙트 소스에서 해당 assertion을 찾아 조건이 충족되지 않은 이유를 확인하세요.

Runtime type error

Message: "type error: <who> <what> at <where>; expected value of type <type> but received <value>"

Triggers: 생성된 코드에서 런타임 타입 불일치가 발생한 경우로, 보통 선언된 witness 반환 타입과 런타임에 실제로 생성된 값이 어긋날 때 나타납니다.

Fix: witness 반환 타입을 확인하세요. TypeScript witness 구현이 Compact contract에 선언된 타입에 맞는 값을 반환하는지 점검하세요.

Version mismatch

Message: "version mismatch: compiled code expects X.Y.Z, runtime is A.B.C"

Triggers: 스마트 컨트랙트를 컴파일한 Compact 컴파일러 버전과, 실행에 사용한 @midnight-ntwrk/compact-runtime 버전이 다른 경우입니다.

Fix: 프로젝트의 @midnight-ntwrk/compact-runtime을 컨트랙트 빌드에 사용한 컴파일러 버전에 맞게 업데이트하세요. 또는 런타임 버전에 맞는 컴파일러로 컨트랙트를 다시 컴파일하세요.

Version compatibility

호환성 매트릭스를 참조하여 어떤 버전끼리 호환되는지 항상 확인하세요.