|
| 1 | +# Optimism L2 실행부터 SentinAI 연결까지 (로컬 가이드) |
| 2 | + |
| 3 | +이 문서는 Optimism 공식 튜토리얼 기반 예제를 로컬에서 실행하고, SentinAI를 해당 L2에 연결하는 전체 절차를 다룹니다. |
| 4 | + |
| 5 | +기준 날짜: 2026-02-20 |
| 6 | + |
| 7 | +--- |
| 8 | + |
| 9 | +## 1. 목표 |
| 10 | + |
| 11 | +- OP Stack L2를 로컬에서 실행 |
| 12 | +- L2 RPC(`http://localhost:8545`)가 정상 응답하는지 검증 |
| 13 | +- SentinAI를 로컬 L2에 연결 |
| 14 | +- SentinAI API(`/api/metrics`)에서 정상 메트릭 확인 |
| 15 | + |
| 16 | +--- |
| 17 | + |
| 18 | +## 2. 사전 준비 |
| 19 | + |
| 20 | +필수 도구: |
| 21 | + |
| 22 | +- Docker / Docker Compose |
| 23 | +- Git |
| 24 | +- `make` |
| 25 | +- `jq` |
| 26 | + |
| 27 | +확인: |
| 28 | + |
| 29 | +```bash |
| 30 | +docker --version |
| 31 | +docker compose version |
| 32 | +git --version |
| 33 | +make --version |
| 34 | +jq --version |
| 35 | +``` |
| 36 | + |
| 37 | +L1(Sepolia) 준비: |
| 38 | + |
| 39 | +- Sepolia RPC URL |
| 40 | +- 배포용 지갑 Private Key (충분한 Sepolia ETH 필요) |
| 41 | + |
| 42 | +--- |
| 43 | + |
| 44 | +## 3. Optimism L2 생성 |
| 45 | + |
| 46 | +### 3.1 예제 코드 가져오기 |
| 47 | + |
| 48 | +```bash |
| 49 | +cd /Users/theo/workspace_tokamak/SentinAI |
| 50 | +mkdir -p external |
| 51 | +cd external |
| 52 | +git clone --depth 1 https://github.com/ethereum-optimism/docs.git |
| 53 | +cd docs/create-l2-rollup-example |
| 54 | +``` |
| 55 | + |
| 56 | +### 3.2 환경 파일 설정 |
| 57 | + |
| 58 | +```bash |
| 59 | +cp .example.env .env |
| 60 | +``` |
| 61 | + |
| 62 | +`.env`에서 최소 항목 수정: |
| 63 | + |
| 64 | +- `L1_RPC_URL` |
| 65 | +- `L1_BEACON_URL` |
| 66 | +- `PRIVATE_KEY` (0x prefix 제거된 키) |
| 67 | +- `L2_CHAIN_ID` (예: 42069) |
| 68 | + |
| 69 | +### 3.3 배포 및 기동 |
| 70 | + |
| 71 | +```bash |
| 72 | +make init |
| 73 | +make setup |
| 74 | +``` |
| 75 | + |
| 76 | +성공 후: |
| 77 | + |
| 78 | +```bash |
| 79 | +make up |
| 80 | +``` |
| 81 | + |
| 82 | +--- |
| 83 | + |
| 84 | +## 4. 최신 이미지 호환성 체크 (중요) |
| 85 | + |
| 86 | +2026-02 기준, 기본 `docker-compose.yml`의 버전 조합으로 아래 이슈가 발생할 수 있습니다. |
| 87 | + |
| 88 | +- `op-node`가 `rollup.json` 신규 필드를 파싱하지 못함 |
| 89 | +- `op-geth`가 `invalid eip-1559 params in extradata`로 종료 |
| 90 | +- `op-node` RPC 포트가 `9545`인데 서비스들이 `8547`을 참조 |
| 91 | + |
| 92 | +아래를 반영하면 안정적으로 동작합니다. |
| 93 | + |
| 94 | +### 4.1 `op-node`/`op-geth` 이미지 최신화 |
| 95 | + |
| 96 | +`docker-compose.yml`에서: |
| 97 | + |
| 98 | +- `op-node` 이미지: `.../op-node:latest` |
| 99 | +- `op-geth` 이미지: `.../op-geth:latest` |
| 100 | + |
| 101 | +### 4.2 `op-node` RPC 포트 정합 |
| 102 | + |
| 103 | +`docker-compose.yml`에서: |
| 104 | + |
| 105 | +- `op-node` 포트 매핑: `8547:9545` |
| 106 | +- `op-node` 실행 인자: `--rpc.port=9545` |
| 107 | +- `op-node` healthcheck URL: `http://localhost:9545` |
| 108 | +- `proposer/challenger`의 `--rollup-rpc=http://op-node:9545` |
| 109 | + |
| 110 | +추가로 아래 파일도 `8547 -> 9545`로 수정: |
| 111 | + |
| 112 | +- `batcher/.env`의 `OP_BATCHER_ROLLUP_RPC` |
| 113 | +- `dispute-mon/.env`의 `ROLLUP_RPC` |
| 114 | + |
| 115 | +### 4.3 dispute-mon 주소 변수 반영 |
| 116 | + |
| 117 | +루트 `.env`에 아래 값이 있어야 `dispute-mon`이 재시작 루프 없이 뜹니다. |
| 118 | + |
| 119 | +- `ROLLUP_RPC=http://op-node:9545` |
| 120 | +- `PROPOSER_ADDRESS=...` |
| 121 | +- `CHALLENGER_ADDRESS=...` |
| 122 | +- `GAME_FACTORY_ADDRESS=...` |
| 123 | + |
| 124 | +값은 `dispute-mon/.env`와 `deployer/.deployer/intent.toml`에서 확인할 수 있습니다. |
| 125 | + |
| 126 | +### 4.4 볼륨 초기화 후 재기동 |
| 127 | + |
| 128 | +```bash |
| 129 | +docker-compose down -v |
| 130 | +docker-compose up -d --wait |
| 131 | +``` |
| 132 | + |
| 133 | +--- |
| 134 | + |
| 135 | +## 5. L2 실행 검증 |
| 136 | + |
| 137 | +```bash |
| 138 | +make status |
| 139 | +make test-l1 |
| 140 | +make test-l2 |
| 141 | +``` |
| 142 | + |
| 143 | +추가 검증: |
| 144 | + |
| 145 | +```bash |
| 146 | +curl -s http://localhost:8545 \ |
| 147 | + -H 'content-type: application/json' \ |
| 148 | + --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}' |
| 149 | + |
| 150 | +curl -s http://localhost:8545 \ |
| 151 | + -H 'content-type: application/json' \ |
| 152 | + --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' |
| 153 | +``` |
| 154 | + |
| 155 | +예상: |
| 156 | + |
| 157 | +- `eth_chainId` = `0xa455` (42069) |
| 158 | +- `eth_blockNumber` 값이 시간에 따라 증가 |
| 159 | + |
| 160 | +--- |
| 161 | + |
| 162 | +## 6. SentinAI 연결 |
| 163 | + |
| 164 | +`/Users/theo/workspace_tokamak/SentinAI/.env.local`에 아래를 반영합니다. |
| 165 | + |
| 166 | +```bash |
| 167 | +# L2 RPC |
| 168 | +L2_RPC_URL=http://localhost:8545 |
| 169 | +CHAIN_TYPE=optimism |
| 170 | + |
| 171 | +# Docker orchestrator |
| 172 | +ORCHESTRATOR_TYPE=docker |
| 173 | +DOCKER_COMPOSE_FILE=external/docs/create-l2-rollup-example/docker-compose.yml |
| 174 | +DOCKER_COMPOSE_PROJECT=create-l2-rollup-example |
| 175 | + |
| 176 | +# EOA (intent.toml 기준) |
| 177 | +BATCHER_EOA_ADDRESS=0x... |
| 178 | +PROPOSER_EOA_ADDRESS=0x... |
| 179 | +CHALLENGER_EOA_ADDRESS=0x... |
| 180 | + |
| 181 | +# 로컬에서는 proxyd 경로 비활성 권장 |
| 182 | +L1_PROXYD_ENABLED=false |
| 183 | +``` |
| 184 | + |
| 185 | +--- |
| 186 | + |
| 187 | +## 7. SentinAI 연결 검증 |
| 188 | + |
| 189 | +### 7.1 서버 실행 |
| 190 | + |
| 191 | +```bash |
| 192 | +cd /Users/theo/workspace_tokamak/SentinAI |
| 193 | +npm run dev |
| 194 | +``` |
| 195 | + |
| 196 | +### 7.2 메트릭 API 확인 |
| 197 | + |
| 198 | +```bash |
| 199 | +curl -s 'http://localhost:3002/api/metrics' | jq '{ |
| 200 | + status: .status, |
| 201 | + blockHeight: .metrics.blockHeight, |
| 202 | + errors: (.errors // []) |
| 203 | +}' |
| 204 | +``` |
| 205 | + |
| 206 | +예상: |
| 207 | + |
| 208 | +- `status: "healthy"` |
| 209 | +- `blockHeight`가 null이 아님 |
| 210 | +- `errors`가 비어 있음 |
| 211 | + |
| 212 | +--- |
| 213 | + |
| 214 | +## 8. 자주 겪는 문제 |
| 215 | + |
| 216 | +1. `unknown field "minBaseFee"` 또는 `daFootprintGasScalar` |
| 217 | +- 원인: `op-node` 버전이 오래됨 |
| 218 | +- 조치: `op-node:latest` 사용 |
| 219 | + |
| 220 | +2. `invalid eip-1559 params in extradata` |
| 221 | +- 원인: `op-geth` 버전 불일치 |
| 222 | +- 조치: `op-geth:latest` 사용 후 `down -v` |
| 223 | + |
| 224 | +3. `op-node`는 떠 있는데 `batcher/proposer`가 `op-node:8547` 연결 실패 |
| 225 | +- 원인: 최신 `op-node` 내부 RPC 포트가 `9545` |
| 226 | +- 조치: 관련 모든 `rollup-rpc` 값을 `op-node:9545`로 통일 |
| 227 | + |
| 228 | +4. `dispute-mon`이 `invalid address`로 재시작 |
| 229 | +- 원인: 루트 `.env`의 주소 변수 미설정 |
| 230 | +- 조치: `PROPOSER_ADDRESS`, `CHALLENGER_ADDRESS`, `GAME_FACTORY_ADDRESS` 설정 |
| 231 | + |
| 232 | +--- |
| 233 | + |
| 234 | +## 9. 종료 및 정리 |
| 235 | + |
| 236 | +L2 중지: |
| 237 | + |
| 238 | +```bash |
| 239 | +cd /Users/theo/workspace_tokamak/SentinAI/external/docs/create-l2-rollup-example |
| 240 | +docker-compose down |
| 241 | +``` |
| 242 | + |
| 243 | +볼륨까지 제거: |
| 244 | + |
| 245 | +```bash |
| 246 | +docker-compose down -v |
| 247 | +``` |
| 248 | + |
| 249 | +SentinAI 종료: 실행 터미널에서 `Ctrl+C` |
0 commit comments