For the complete documentation index, see llms.txt
Bulletin board CLI
이 튜토리얼에서는 게시판 컨트랙트 튜토리얼에서 생성한 게시판 스마트 컨트랙트와 상호작용하는 명령줄 인터페이스를 구축합니다.
Prerequisites
시작하기 전에 다음 사항을 확인하세요:
- 게시판 컨트랙트 튜토리얼을 완료하고 컨트랙트가
contract/src/managed/bboard/에 컴파일되어 있어야 합니다 - Docker Desktop이 설치되어 실행 중이어야 합니다
- Node.js 버전 24 이상
Architecture overview
게시판 CLI는 세 개의 패키지로 구성된 모노레포 구조를 사용합니다:
- 컨트랙트: Compact 스마트 컨트랙트 (이전 튜토리얼에서 작성)
- api: 컨트랙트 상호작용을 위한 재사용 가능한 추상화 계층
- bboard-cli: 명령줄 애플리케이션
API 패키지는 컨트랙트 배포, 상태 관리, 트랜잭션 제출을 처리하는 고수준 인터페이스(BBoardAPI)이며, 실시간 업데이트를 위한 반응형 상태 observable도 포함합니다.
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",
"engines": {
"node": ">=24.11.1"
},
"workspaces": {
"packages": [
"bboard-cli",
"api",
"contract"
]
},
"dependencies": {
"@midnight-ntwrk/dapp-connector-api": "4.0.1",
"@midnight-ntwrk/midnight-js-contracts": "4.1.1",
"@midnight-ntwrk/midnight-js-fetch-zk-config-provider": "4.1.1",
"@midnight-ntwrk/midnight-js-http-client-proof-provider": "4.1.1",
"@midnight-ntwrk/midnight-js-indexer-public-data-provider": "4.1.1",
"@midnight-ntwrk/midnight-js-level-private-state-provider": "4.1.1",
"@midnight-ntwrk/midnight-js-network-id": "4.1.1",
"@midnight-ntwrk/midnight-js-node-zk-config-provider": "4.1.1",
"@midnight-ntwrk/midnight-js-protocol": "4.1.1",
"@midnight-ntwrk/midnight-js-types": "4.1.1",
"@midnight-ntwrk/midnight-js-utils": "4.1.1",
"@midnight-ntwrk/testkit-js": "4.1.1",
"@midnight-ntwrk/wallet-sdk": "1.0.0",
"axios": "^1.17.0",
"buffer": "^6.0.3",
"fp-ts": "^2.16.11",
"pino": "^10.3.1",
"pino-pretty": "^13.1.3",
"rxjs": "^7.8.2",
"semver": "^7.8.4",
"testcontainers": "^12.0.1",
"ws": "^8.21.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.61.0",
"@typescript-eslint/parser": "^8.61.0",
"eslint": "^9.39.2",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.6",
"eslint-plugin-react": "^7.37.5",
"http-server": "^14.1.1",
"prettier": "^3.8.4",
"ts-node": "^10.9.2",
"typescript": "^5.9.3",
"typescript-eslint": "^8.61.0",
"vite": "^8.0.14",
"vite-plugin-top-level-await": "^1.6.0",
"vite-plugin-wasm": "^3.6.0"
}
}
workspaces 설정은 npm에게 컨트랙트, API, bboard-cli를 연결된 패키지로 관리하도록 지시합니다. 루트 수준에서 정의된 의존성은 모든 workspace에서 공유되어 중복을 줄이고 버전 일관성을 보장합니다.
Midnight.js 4.1.x는 번들된 @midnight-ntwrk/wallet-sdk 패키지와 새로운 @midnight-ntwrk/midnight-js-protocol 통합 패키지를 통해 지갑 스택을 사용합니다. 이 통합 패키지는 @midnight-ntwrk/midnight-js-protocol/ledger, @midnight-ntwrk/midnight-js-protocol/compact-runtime 같은 서브패스 임포트를 제공합니다. 이전 예제에서는 독립형 @midnight-ntwrk/wallet-sdk-*와 @midnight-ntwrk/ledger-v8 패키지를 직접 사용했습니다.
호환되는 버전을 사용하고 있는지 확인하려면 항상 릴리스 호환성 매트릭스를 참조하세요.
루트에서 모든 의존성을 설치합니다:
npm install
이 명령은 루트 패키지와 모든 workspace 패키지의 의존성을 설치하고, 로컬 개발을 위한 심볼릭 링크를 생성합니다.
Implementation guides
게시판 CLI를 구축하려면 다음 구현 가이드를 순서대로 따르세요:
-
API 구현: 컨트랙트 배포, 상태 관리, 트랜잭션 제출을 처리하는
BBoardAPI클래스로 API 패키지를 설정합니다. -
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 # 지갑 provider
│ └── launcher/
│ ├── preprod.ts # Preprod 진입점
│ ├── preview.ts # Preview 진입점
│ └── standalone.ts # Standalone 진입점
├── proof-server-local.yml # 로컬 proof 서버용 Docker Compose
├── proof-server.yml # testcontainers용 Docker Compose
└── package.json
모노레포 구조에서 workspace 참조를 사용하면 패키지 간 코드를 쉽게 공유할 수 있습니다.
Run the CLI
두 구현 가이드를 모두 완료한 후, 로컬 proof server를 시작한 다음 bboard-cli 디렉터리에서 CLI를 실행합니다:
docker compose -f proof-server-local.yml up -d
- preprod
- preview
- standalone
npm run preprod-remote
npm run preview-remote
npm run standalone
preprod-remote와 preview-remote 명령은 CLI를 시작하고 해당하는 Midnight 원격 testnet에 연결하며, standalone 명령은 genesis-mint wallet seed를 사용하여 로컬 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를 사용하여 게시판의 브라우저 기반 인터페이스를 만드세요.
- 기능 확장: 메시지 이력, 다중 게시판 또는 시간 제한 게시 등의 기능을 추가하세요.