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
시작하기 전에 다음을 확인하세요:
- Toolchain 설치 가이드 완료
- Node.js v22 이상
Set up project
스타터 레포를 클론하세요:
git clone https://github.com/midnightntwrk/example-hello-world.git
의존성을 설치하세요:
yarn install
Create the contract file
contracts 디렉토리에 hello-world.compact라는 새 파일을 생성하세요:
touch contracts/hello-world.compact
VS Code에서 이 파일을 여세요:
code .
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에 직접 할당하면 컴파일러 오류가 발생합니다.
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)
컴파일 과정에서 수행되는 작업:
- Compact 코드를 파싱하고 유효성을 검사합니다.
- 로직에서 zero-knowledge circuit을 생성합니다.
- Circuit용 proving key와 verifying key를 생성합니다.
- 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 출력.
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의 간략한 워크스루는 예제에서 확인할 수 있습니다.