For the complete documentation index, see llms.txt
Compact reference
Overview
Compact는 강타입, 정적 타입의 바운드 스마트 컨트랙트 언어로, Midnight의 3중 구조 스마트 컨트랙트를 TypeScript와 함께 작성하도록 설계되었습니다. 컨트랙트는 다음 구성 요소로 이루어집니다:
- 공개 ledger의 복제 구성 요소,
- 컨트랙트 로직에 따라 복제 구성 요소가 유효하게 생성되었음을 기밀로 증명하는 영지식 circuit 구성 요소, 그리고
- 임의의 코드를 실행할 수 있는 로컬 오프체인 구성 요소.
각 Compact 프로그램(컨트랙트라고도 함)은 여러 종류의 프로그램 요소를 포함할 수 있습니다:
- 네임스페이스 및 별도 파일 관리를 위한 모듈과 import 형식,
- 프로그램 정의 타입의 선언,
- 컨트랙트가 공개 ledger에 저장하는 데이터의 선언,
- TypeScript 러너가 제공하는 콜백 함수인 witness 선언,
- 스마트 컨트랙트의 운영 핵심인 circuit 정의, 그리고
- 최대 하나의 constructor 정의로, 컨트랙트 생성 시 호출되며 공개 및 비공개 상태를 초기화하는 데 사용할 수 있습니다.
Compact는 TypeScript와 유사합니다: JavaScript와 유사한 구문을 가지며, JavaScript 구문 위에 타입 시스템을 계층화합니다. 그러나 Compact는 여러 중요한 면에서 의도적으로 TypeScript와 다릅니다:
- TypeScript와 달리 Compact는 강타입입니다. 프로그램은 누락된 타입 선언이나 안전하지 않은 캐스트를 통해 정적 타입 시스템을 우회할 수 없습니다. 또한 Compact 컴파일러가 생성하는 JavaScript 코드에는 Compact 외부에서 오는 값의 정적 타입을 강제하는 런타임 검사와, Compact circuit의 선언된 인수 수보다 많거나 적은 인수로의 외부 적용을 방지하는 검사가 포함됩니다.
- Compact는 동적이 아닌 정적 모듈을 통해 네임스페이스 관리를 제공하며, 이러한 모듈은 타입 매개변수뿐만 아니라 크기 매개변수를 포함하는 컴파일 타임 제네릭 매개변수를 통해 매개변수화할 수 있습니다.
- 모든 Compact 프로그램은 유한한 proving circuit 세트로 컴파일되어야 하므로, 언어는 바운드됩니다: 모든 Compact 타입은 컴파일 타임에 고정되는 크 기를 가지며, 루프는 상수 바운드 또는 상수 크기 객체의 크기로 바운드되며, 재귀는 허용되지 않습니다.
- Compact 숫자 값은 프로그램에서 선언된 범위 또는 대상 proving 시스템의 필드 크기에 의해 결정되는 범위의 부호 없는 정수로 제한됩니다.
- Compact는 특정 값을 비공개 데이터를 잠재적으로 포함하는 것으로 구분하며
일반적으로 보호되어야 하고,
disclose()래퍼를 통해 잠재적 비공개 데이터의 공개를 명시적으로 선언하도록 요구합니다. 이에 대한 기본 사항은disclose설명에서 논의되며, 더 자세한 설명과 논의는 별도의 문서 Compact에서의 명시적 공개에 있습니다.
TypeScript와 마찬가지로 Compact는 JavaScript로 컴파일되지만, TypeScript 정의 파일도 생성하므로 효과적으로 TypeScript로도 컴파일됩니다. 단순히 TypeScript를 생성하는 대신 별도의 TypeScript 정의 파일과 JavaScript 구현 파일을 생성하는 이유는 세 가지입니다:
- 컴파일된 Compact 프로그램을 추가 TypeScript 컴파일 단계 없이 사용할 수 있도록,
- 생성된 코드가 TypeScript에서 호출될 때 컴파일 타임 인수 타입 검사를 비활성화하지 않으면서 함수 인수 수를 검사할 수 있도록, 그리고
- 생성된 JavaScript 코드의 요소(예: 변수 바인딩 및 참조)를 소스 Compact 코드의 해당 요소에 올바르게 매핑하는 source-map 파일을 생성할 수 있도록.
공개 ledger를 건드리므로 온체인 실행을 위한 proof가 필요한 각 circuit에 대해, Compact 컴파일러는 영지식 중간 언어(zkir)로 proving circuit도 생성하며, zkir 컴파일러를 사용하여 각 circuit에 대한 proving 키를 생성합니다.
마지막으로, Compact 컴파일러는 프로그램과 컴파일된 표현에 대한 정보를 포함하는 JSON 형식의 contract info 파일도 생성합니다. 여기에는 버전 번호와 컨트랙트의 내보낸 circuit의 타입 및 특성이 포함됩니다.
이 문서는 각 구문 범주를 개별적으로 설명합니다. 먼저 다양한 컨텍스트에서 사용되는 구성 요소인 식별자, 상수, 타입, 제네릭 매개변수, 패턴을 소개합니다. 그런 다음 Compact 프로그램의 구조, 각 종류의 프로그램 요소, circuit 및 constructor 본문에 나타날 수 있는 문장과 표현식을 설명합니다. 마지막으로 TypeScript에서 Compact와의 상호작용에 대해 논의합니다.
컨트랙트 작성하기에서는 Compact 프로그램이 어떻게 생겼는지의 작은 예제를 보여줍니다. 또한 Compact 컨트랙트의 기본 구성 요소도 소개합니다. Compact의 전체 문법은 별도로 제공됩니다.
Notation
Compact 프로그램의 구문은 다음 표기 규칙을 사용하는 EBNF 문법 조각으로 제공됩니다:
- 키워드와 구두점은
고정폭글꼴입니다. - 터미널 및 비터미널 이름은 강조 글꼴입니다.
- 대안은 세로 막대(
|)로 표시됩니다. - 선택적 항목은 위첨자 opt로 표시됩니다.
- 반복은 줄임표로 지정됩니다.
X ... X 표기법(여기서 X는 문법 기호)은 X의
0개 이상의 발생을 나타냅니다.
X
,...,X 표기법(여기서 X는 문법 기호이고,는 리터럴 쉼표)은 쉼표로 구분된 X