Skip to main content

Compact Compiler Manual Page

NAME

compactc

OVERVIEW

The Compact compiler, compactc, takes as input a Compact source program in a specified source file and translates it into several target files in a specified directory.

SYNOPSYS

compactc flag ... sourcepath targetpath

DESCRIPTION

The flags flag ... are optional. They are described under FLAGS later in this document.

sourcepath should identify a file containing a Compact source program, and targetpath should identify a target directory into which the target files are to be placed. The target directory is created if it does not already exist.

compactc compiles the source file and produces from it the following target files, where sourceroot is the name of the file identified by sourcepath without any extension.

  • a Typescript type-definition file targetdir/contract/index.d.cts

  • a Javascript source file targetdir/contract/index.cjs

  • a Javascript source-map file targetdir/contract/index.cjs.map

  • one Zk/ir circuit file for each exported circuit circuitname in targetdir/zkir/circuitname.zkir, and

  • a pair of proving keys for each exported circuit circuitname in targetdir/keys/circuitname.prover and targetdir/keys/circuitname.verifier.

Compact source files can include other Compact source files via an include form:

include 'name';

They can also import externally defined modules via an import form:

import name; import 'name';

By default, the compiler looks for include files and externally defined modules in the current working directory under the full filename name.compact. When the environment variable COMPACT_PATH is set to a colon-separated (semicolon-separated on Windows) list of directory pathnames dirpath:...:dirpath (dirpath;...;dirpath under Windows), the compiler looks instead under the full pathname dirpath/name.compact for each dirpath until the file is found or the set of dirpath entries is exhausted.

Every Compact source program should import the standard library CompactStandardLibrary. This is typically done by placing the following line at the top of the program:

import CompactStandardLibrary;

FLAGS

The following flags, if present, affect the compiler's behavior as follows:

--help

prints help text and exits.

--version

prints the compiler version and exits.

--language-version

prints the language version and exits.

--vscode

causes the compiler to omit newlines from error messages, so that they are rendered properly within the VS Code extension for Compact.

--skip-zk

causes the compiler to skip the generation of proving keys. Generating proving keys can be time-consuming, so this option is useful when debugging only the Typescript output. The compiler also skips, after printing a warning message, the generation of proving keys when it cannot find zkir.

--no-communications-commitment

omits the contract communications commitment that enables data integrity for contract-to-contract calls.

--sourceRoot sourceRoot-value

overrides the compiler's setting of the soureRoot field in the generated source-map (.cjs.map) file. By default, the compiler tries to determine a useful value based on the source and target-directory pathnames, but this value might not be appropriate for the deployed structure of the application.

--trace-passes

causes the compiler to print tracing information that is generally useful only to compiler developers.

EXAMPLES

Assuming src/test.compact contains a well-formed Compact program exporting circuits foo and bar:

compactc src/test.compact obj/test

produces:

obj/test/contract/index.d.cts
obj/test/contract/index.cjs
obj/test/contract/index.cjs.map

obj/test/zkir/foo.zkir
obj/test/zkir/bar.zkir

obj/test/keys/foo.prover
obj/test/keys/foo.verifier
obj/test/keys/bar.prover
obj/test/keys/bar.verifier

compactc --skip-zk src/test.compact obj/test

produces the same, except without the keys.