Skip to main content

Bulletin board CLI

이 튜토리얼에서는 게시판 컨트랙트 튜토리얼에서 생성한 게시판 스마트 컨트랙트와 상호작용하는 명령줄 인터페이스를 구축하는 방법을 설명합니다.

Prerequisites

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

  • 게시판 컨트랙트 튜토리얼을 완료하고 컨트랙트가 contract/src/managed/bboard/에 컴파일되어 있어야 합니다
  • Docker Desktop이 설치되어 실행 중이어야 합니다
  • Node.js 버전 22 이상

Architecture overview

게시판 CLI는 세 개의 패키지로 구성된 모노레포 구조를 사용합니다:

  • contract: Compact 스마트 컨트랙트 (이전 튜토리얼에서 작성)
  • api: 컨트랙트 상호작용을 위한 재사용 가능한 추상화 계층
  • bboard-cli: 명령줄 애플리케이션

API 패키지는 컨트랙트 배포, 상태 관리, 트랜잭션 제출을 처리하면서 실시간 업데이트를 위한 반응형 상태 observable을 노출하는 고수준 인터페이스(BBoardAPI)를 제공합니다. CLI 패키지는 지갑 관리, 사용자 상호작용 및 메인 애플리케이션 로직을 구현합니다.

Set up the root package

example-bboard 루트 디렉터리에서 package.json을 생성하거나 업데이트합니다:

{
"name": "@midnight-ntwrk/example-bboard",
"version": "0.1.0",
"author": "IOG",
"license": "MIT",
"private": true,
"type": "module",
"workspaces": {
"packages": [
"bboard-cli",
"api",
"contract"
]
},
"dependencies": {
"@midnight-ntwrk/dapp-connector-api": "^4.0.0",
"@midnight-ntwrk/ledger-v8": "^8.0.0",
"@midnight-ntwrk/midnight-js-compact": "^4.0.0",
"@midnight-ntwrk/midnight-js-contracts": "^4.0.0",
"@midnight-ntwrk/midnight-js-fetch-zk-config-provider": "^4.0.0",
"@midnight-ntwrk/midnight-js-http-client-proof-provider": "^4.0.0",
"@midnight-ntwrk/midnight-js-indexer-public-data-provider": "^4.0.0",
"@midnight-ntwrk/midnight-js-level-private-state-provider": "^4.0.0",
"@midnight-ntwrk/midnight-js-node-zk-config-provider": "^4.0.0",
"@midnight-ntwrk/midnight-js-types": "^4.0.0",
"@midnight-ntwrk/midnight-js-utils": "^4.0.0",
"@midnight-ntwrk/testkit-js": "^4.0.0",
"@midnight-ntwrk/wallet-sdk-address-format": "^3.0.0",
"@midnight-ntwrk/wallet-sdk-facade": "^3.0.0",
"@midnight-ntwrk/wallet-sdk-hd": "^3.0.0",
"axios": "^1.13.5",
"buffer": "^6.0.3",
"fp-ts": "^2.16.11",
"pino": "^10.3.0",
"pino-pretty": "^13.1.3",
"rxjs": "^7.8.2",
"semver": "^7.7.3",
"testcontainers": "^11.11.0",
"ws": "^8.19.0"
},
"devDependencies": {
"@eslint/js": "^9.39.2",
"@originjs/vite-plugin-commonjs": "^1.0.3",
"@types/babel__core": "^7.20.5",
"@types/semver": "^7.7.1",
"@types/ws": "^8.18.1",
"@typescript-eslint/eslint-plugin": "^8.54.0",
"@typescript-eslint/parser": "^8.54.0",
"eslint": "^9.39.2",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.5",
"eslint-plugin-react": "^7.37.5",
"http-server": "^14.1.1",
"prettier": "^3.8.1",
"ts-node": "^10.9.2",
"typescript": "^5.9.3",
"typescript-eslint": "^8.54.0",
"vite": "^7.3.1",
"vite-plugin-top-level-await": "^1.6.0",
"vite-plugin-wasm": "^3.5.0"
}
}

workspaces 설정은 npm에게 contract, API, bboard-cli를 연결된 패키지로 관리하도록 지시합니다. 루트 수준에서 정의된 의존성은 모든 workspace에서 공유되어 중복을 줄이고 버전 일관성을 보장합니다.

버전 호환성

호환되는 버전을 사용하고 있는지 확인하려면 항상 릴리스 호환성 매트릭스를 참조하세요.

루트에서 모든 의존성을 설치합니다:

npm install

이 명령은 루트 패키지와 모든 workspace 패키지의 의존성을 설치하고, 로컬 개발을 위한 심볼릭 링크를 생성합니다.

Implementation guides

게시판 CLI를 구축하려면 다음 구현 가이드를 순서대로 따르세요:

  1. API 구현: 컨트랙트 배포, 상태 관리, 트랜잭션 제출을 처리하는 BBoardAPI 클래스로 API 패키지를 설정합니다.

  2. CLI 구현: 지갑 관리, DUST 생성, 대화형 명령줄 인터페이스로 CLI 패키지를 설정합니다.

Project structure

완성된 example-bboard 프로젝트는 npm workspaces를 사용하는 모노레포 구조를 사용합니다:

example-bboard/
├── package.json # 루트 패키지 (workspaces 포함)
├── contract/ # Compact 컨트랙트
│ ├── src/
│ │ ├── bboard.compact
│ │ ├── managed/
│ │ ├── witnesses.ts
│ │ └── index.ts
│ └── package.json
├── api/ # 공유 API 계층
│ ├── src/
│ │ ├── index.ts # BBoardAPI 구현
│ │ ├── common-types.ts # 타입 정의
│ │ └── utils/
│ │ └── index.ts # 유틸리티 함수
│ └── package.json
└── bboard-cli/ # 게시판 CLI
├── src/
│ ├── config.ts # 네트워크 설정
│ ├── index.ts # 메인 CLI 로직
│ ├── logger-utils.ts # 로깅 설정
│ ├── wallet-utils.ts # 지갑 동기화
│ ├── generate-dust.ts # DUST 생성
│ ├── midnight-wallet-provider.ts # 지갑 프로바이더
│ └── launcher/
│ └── preprod.ts # Preprod 진입점
├── proof-server.yml # proof 서버용 Docker Compose
└── package.json

모노레포 구조에서 workspace 참조를 사용하면 패키지 간 코드를 쉽게 공유할 수 있습니다.

Run the CLI

두 구현 가이드를 모두 완료한 후, bboard-cli 디렉터리에서 다음 명령으로 CLI를 실행합니다:

npm run preprod

preprod 명령은 CLI를 시작하고 Preprod 네트워크에 연결하며, undeployed 명령은 CLI를 시작하고 로컬 머신에서 실행 중인 로컬 Midnight 네트워크에 연결합니다.

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

You can do one of the following:
1. Build a fresh wallet
2. Build wallet from a seed
3. Exit
Which would you like to do?

여기에서 새 지갑을 생성하거나 시드에서 지갑을 복원할 수 있습니다. 3을 입력하여 CLI를 종료할 수도 있습니다. CLI 실행에 대한 자세한 정보는 게시판 DApp 예제를 참조하세요.

Next steps

프라이버시를 보호하는 메시지 게시 기능이 있는 완전한 게시판 CLI를 구축했습니다:

  • UI 구축: DApp 커넥터 API를 사용하여 게시판의 브라우저 기반 인터페이스를 만드세요.
  • 기능 확장: 메시지 이력, 다중 게시판 또는 시간 제한 게시 등의 기능을 추가하세요.