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

Create your first Midnight contract

이 튜토리얼에서는 첫 번째 Compact smart contract를 작성하고, 로컬 테스트 네트워크에 배포한 뒤, 프라이버시를 보장하는 방식으로 blockchain에 Hello World 메시지를 기록합니다.

완료하면 다음을 수행할 수 있습니다:

  • 상태를 저장하는 Compact smart contract 작성
  • Contract를 zero-knowledge circuit으로 컴파일
  • 로컬 테스트 네트워크에 contract 배포
  • Blockchain에 Hello World 메시지 기록

Prerequisites

시작하기 전에 다음을 확인하세요:

1

Set up project

스타터 레포를 클론하세요:

git clone https://github.com/midnightntwrk/example-hello-world.git

의존성을 설치하세요:

yarn install
2

Create the contract file

contracts 디렉토리에 hello-world.compact라는 새 파일을 생성하세요:

touch contracts/hello-world.compact

VS Code에서 이 파일을 여세요:

code .
3

Create the Compact Smart Contract

pragma language_version >= 0.23;

export ledger message: Opaque<"string">;

export circuit storeMessage(newMessage: Opaque<"string">): [] {
message = disclose(newMessage);
}
  • pragma language_version은 contract가 사용하는 Compact 버전을 지정합니다.
  • ledger message는 온체인 상태에 문자열 값을 저장하는 message라는 state variable을 생성합니다. 온체인 상태는 blockchain에서 공개적이고 영구적입니다.
  • circuit storeMessage는 온체인 상태를 수정하는 로직을 정의하는 Compact circuit입니다.
  • newMessage: Opaque<"string">는 입력 파라미터입니다. Circuit 파라미터는 기본적으로 비공개입니다. disclose() 함수는 비공개 값을 공개 상태로 저장하겠다고 명시적으로 선언하는 역할을 합니다. 이 함수 없이 newMessage를 ledger에 직접 할당하면 컴파일러 오류가 발생합니다.
4

Compile the contract

컴파일은 Compact 코드를 zero-knowledge circuit으로 변환하고, 암호화 키를 생성하며, DApp에서 사용할 TypeScript API와 JavaScript 구현을 만들어 줍니다.

contracts 폴더에서 컴파일러를 실행하세요:

compact compile hello-world.compact managed/hello-world.compact

다음과 같은 출력이 표시됩니다:

Compiling 1 circuits:
circuit "storeMessage" (k=6, rows=26)

컴파일 과정에서 수행되는 작업:

  1. Compact 코드를 파싱하고 유효성을 검사합니다.
  2. 로직에서 zero-knowledge circuit을 생성합니다.
  3. Circuit용 proving key와 verifying key를 생성합니다.
  4. Contract용 TypeScript API와 JavaScript 구현을 생성합니다.

컴파일이 완료되면 새로운 디렉토리 구조가 나타납니다:

contracts/
├── managed/
| └── hello-world/
| ├── compiler/
| ├── contract/
| ├── keys/
| └── zkir/
└── hello-world.compact
└── index.ts

각 디렉토리의 역할:

  • contract/: JavaScript 구현과 타입 정의가 포함된 컴파일된 contract artifact.
  • keys/: Zero-knowledge proof 생성에 필요한 암호화 proving key와 verifying key.
  • zkir/: Zero-Knowledge Intermediate Representation. Compact와 ZK 백엔드 사이의 중간 표현.
  • compiler/: 다른 도구에서 contract 구조를 파악하는 데 활용할 수 있는 컴파일러 생성 JSON 출력.
5

Deploy Contract to Local Devnet

Contract 컴파일이 완료되었으므로 blockchain에 배포합니다.

Docker 엔진이 실행 중인지 확인하고, 별도의 터미널에서 프로젝트 루트에서 proof server를 시작하세요:

yarn env:up

다음 단계를 위해 proof server를 실행 상태로 유지하세요.

Contract 배포에는 wallet이 필요합니다. 로컬 devnet 패키지에는 미리 자금이 충전된 3개의 wallet이 포함되어 있습니다.

Hello World 테스트 스크립트를 실행하세요:

yarn test:local

테스트 스크립트가 로컬 devnet의 출력을 표시하면서 contract 배포와 상호작용을 자동으로 진행합니다:

[12:46:12.694] INFO (22064): Wallet sync complete after 23 emissions
[12:46:12.703] INFO (22064): Providers initialized. Ready to test
[12:46:12.707] INFO (22064): Creating private state...
[12:46:32.347] INFO (22064): Setting the contract address...
[12:46:32.347] INFO (22064): Contract deployed at: bba6579743ae23b44301d4a9f8df30dbd5244d63a59d8fbc2c9fc7ea521a04f8
✓ src/test/hw.test.ts (2 tests) 39112ms
✓ Hello World Contract > Deploys the contract 19649ms
✓ Hello World Contract > Stores Hello World! 18184ms

Next steps

Midnight DApp 빌드에 대해 더 알아보려면 튜토리얼을 살펴보세요. 다양한 DApp의 간략한 워크스루는 예제에서 확인할 수 있습니다.