Skip to content

Commit a815f2a

Browse files
committed
docs: add optimism l2 local setup guide
1 parent 346b600 commit a815f2a

File tree

3 files changed

+252
-0
lines changed

3 files changed

+252
-0
lines changed

docs/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ AI 모델을 활용한 모니터링, 스케일링, 보안, 예측, 운영 자동
5858
| [Redis 설정](guide/redis-setup.md) | 개발자 | InMemory vs Redis 선택, 설정/제거 방법 |
5959
| [EC2 설치 가이드](guide/ec2-setup-guide.md) | 비개발자/운영자 | AWS EC2 + Docker Compose + Cloudflare Tunnel 배포 |
6060
| [L1 Proxyd Failover](guide/proxyd-failover-setup.md) | 운영자 | **[필수]** L2 블록 생성 보호: Paid L1 RPC quota 초과 시 자동 failover |
61+
| [Optimism L2 로컬 연결](guide/optimism-l2-sentinai-local-setup.md) | 개발자/운영자 | Optimism L2 실행부터 SentinAI 연동 및 검증까지 |
6162
| [데모 시나리오](guide/demo-scenarios.md) | 테스트/데모 | 다양한 시나리오별 L2 메트릭 시뮬레이션 |
6263
| [프로덕션 로드 테스트](guide/production-load-testing-guide.md) | QA/운영 | 실제 EKS 환경에서의 부하 테스트 및 검증 |
6364
| [스케일링 정확도 테스트](guide/scaling-accuracy-testing-guide.md) | 개발자/운영자 | 스케일링 알고리즘 백테스트 원리, 사용법, 시나리오 추가 방법 |
Lines changed: 249 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,249 @@
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`

docs/lessons.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## 2026-02-20
44

5+
- create-l2-rollup 예제의 컨테이너 태그가 최신 op-deployer 산출물과 불일치할 수 있다.
6+
- 규칙: L2 부트스트랩 실패 시 `op-node/op-geth` 버전과 `rollup-rpc` 포트(8547 vs 9545) 정합을 먼저 점검하고, 제네시스 변경 시 `docker-compose down -v`로 데이터 볼륨을 초기화한다.
57
- 체인 플러그인이 추가되어도 레지스트리가 환경 변수 기반 선택을 하지 않으면 실제 운영에서 신규 플러그인이 절대 활성화되지 않는다.
68
- 규칙: 새 플러그인 추가 시 `registry`의 선택 분기(`CHAIN_TYPE`)와 대응 테스트를 같은 변경셋에 포함한다.
79
- OP Stack 계열 체인은 컴포넌트/의존성/플레이북이 대부분 동일하다.

0 commit comments

Comments
 (0)