no-std 및 std Rust
컴포넌트 모음을 하나로 묶습니다. 이 생태계의 중심에는
kona-node가 있습니다. kona-node는 현대적이고 모듈화된 rollup node(L2 합의 node)로,
바로 교체 가능한 바이너리로 사용하거나 사용자 지정 서비스의 기반으로 사용할 수 있습니다.
kona-node는 “Rollup Node”
사양을 완전히 준수하는 구현체이며, kona 저장소에서
바이너리로 릴리스됩니다. 프로덕션 네트워크를 운영하든,
새로운 rollup 기능을 개발하든, OP Stack을 실험하든,
kona-node는 견고하면서도 확장 가능하도록 설계되었습니다.
배경
rollup node는 L1 블록과 해당 receipt로부터 정규(canonical) L2 체인을 도출하는 역할을 합니다. rollup node는 Engine API를 사용하여 이러한 블록을 검증하고, 처리를 위해 실행 계층에 전달합니다. op-reth나 op-geth와 같은 실행 엔진과 함께 사용되는kona-node는
L2 OP Stack 체인의 unsafe, safe, finalized tip을 추적하여
node가 항상 최신 상태와 동기화되도록 보장합니다.
rollup node는 최소한의 상태만 보유합니다. unsafe 및 safe payload는 모두
체인의 db를 보유한 실행 엔진 클라이언트로 전송됩니다. 이 방식으로
rollup node는 체인 tip에 대한 뷰, 즉 unsafe, safe, finalized 블록 정보를
보유합니다. 그 외에 필요한 모든 데이터는 메모리에 보관됩니다.
kona-node에는 몇 가지 핵심 아키텍처 구성 요소가 있습니다.
- Derivation Pipeline: L1 블록으로부터 L2 payload attributes를 구성하며, rollup 로직의 근간을 이룹니다.
- 실행 엔진 통합: Engine API를 통해 L2 payload attributes를 실행하며, 서로 다른 EL 클라이언트를 추상화합니다.
- P2P 네트워킹: 블록 gossip과 피어 탐색을 지원합니다.
kona-node의 상세 설계는
Node 설계 섹션을 참조하십시오.
또한 RPC 서버는 L2 Output RPC 메서드를 포함한
필수 메서드를 제공합니다.
동기화
kona-node는 두 가지 주요 단계로 L2 체인을 동기화합니다.
-
실행 계층(EL) 동기화:
시작 시 node의 engine task queue는 처음에 비어 있습니다.
P2P gossip으로부터 unsafe 블록을 수신하면
InsertTask가 실행됩니다. 이 task는 payload를 삽입하고 engine API를 통해 forkchoice 업데이트를 보냅니다. engine 상태는 지연 초기화되므로(safe 및 finalized head가 0) forkchoice 업데이트는 실행 계층(EL) 클라이언트(op-reth나 op-geth 등)에서 EL 동기화를 시작합니다. EL 동기화는 실행 클라이언트가 피어로부터 직접 L2 블록을 가져와 동기화하도록 지시합니다. 이 단계에서kona-node는 사실상 EL 클라이언트가 체인 tip에 도달하여synced를 반환할 때까지 대기합니다. 이 기간에는 L1으로부터 L2 블록이 도출되지 않습니다. -
합의 계층(CL) 동기화:
EL 클라이언트가 tip까지 완전히 동기화되면 node는 합의 계층(CL)
동기화로 전환합니다. 이 단계에서
kona-node는 rollup 도출 과정에 따라 L1 체인으로부터 새로운 L2 payload attributes를 도출하기 시작합니다. 이렇게 도출된OpAttributesWithParent값은 engine task로 실행되며, 이 task는 검증 및 실행을 위해 payload를 실행 엔진에 제출합니다.
kona-node는 과거 체인 기록에 대한 히스토리 CL 동기화나 L1으로부터의 L2 블록 백필(backfill)을 지원하지 않습니다. L2 체인의 초기 동기화는 EL 클라이언트에 의존합니다.- EL이 완전히 동기화된 후에야 node는 L1으로부터 새로운 L2 블록을 도출하고 따라가기 시작합니다.
확장성
kona-node는 모듈화된 actor 기반 node SDK로 설계되어,
새로운 actor를 추가하거나 기존 actor를 교체하여 node 동작을
확장하거나 사용자 지정할 수 있습니다. 이 확장성은
현재 베타 단계이지만, 아키텍처는 고급 사용 사례와 사용자 지정 통합을
지원하도록 의도적으로 설계되었습니다.
Actor 모델
kona-node의 핵심에는 actor 개념이 있습니다. actor는 채널을 통해
통신하는 독립적인 비동기 서비스입니다. 각 actor는
NodeActor trait를 구현합니다. 이 trait는 단일 step 메서드만
가진 최소한의 인터페이스로, 서비스는 actor가 치명적인 오류를 보고하거나
node가 종료될 때까지 루프에서 이 메서드를 구동합니다.
RollupNode 서비스는 derivation, 실행 엔진과 읽기 전용
engine RPC, L1 watcher, P2P 네트워킹, node의 RPC 서버, 그리고
sequencer 모드에서는 블록 빌딩을 담당하는 고정된 actor 집합을
빌드하고 생성합니다.
Node 설계 섹션은
이 actor 집합과 각 actor의 역할에 대한 공식 설명입니다.
사용자 지정 Actor로 확장하기
NodeActor trait를 구현하여 직접 actor를 작성할 수 있습니다.
이를 통해 새로운 백그라운드 서비스, 이벤트 프로세서 또는 외부 시스템과의
통합을 도입할 수 있습니다.
이 trait에는 하나의 연관 타입과 하나의 메서드가 있습니다. step을
호출할 때마다 하나의 인바운드 요청, 이벤트 또는 예약된 tick을 처리합니다.
Ok(())를 반환하면 actor가 다시 step을 수행할 준비가 되었음을 의미하며,
오류를 반환하면 치명적인 것으로 간주되어 actor가 중지됩니다. 취소는
루프를 구동하는 호출자가 처리하므로 actor 자체는 취소 토큰을
소유하지 않습니다.
예시: 사용자 지정 Actor 정의하기
사용자 지정 Actor 실행하기
현재 표준 node에 actor를 교체해 넣을 수 있는 trait 기반 확장 지점은 없습니다.RollupNode는 trait가 아닌 구체 타입이며,
actor 집합은 해당 타입의 start 메서드에 고정되어 있고,
이러한 actor를 생성하고 감독하는 헬퍼는 kona-node-service
crate 내부에 있습니다.
따라서 사용자 지정 actor를 실행하려면 node를 직접 구성해야 합니다.
내장 actor는 kona-node-service crate의 공개 API입니다.
actor들이 채널을 통해 주고받는 요청 및 payload 타입도 공개되어 있으며,
kona-node-service, kona-rpc 및 kona-gossip과 같은 형제 kona crate,
그리고 공유 alloy engine 타입에 분산되어 있습니다. 따라서
사용자 지정 바이너리는 필요한 actor를 구성하고, 채널로 서로 연결하고,
자체 NodeActor 구현을 추가하고, 각 actor의 step 메서드를
별도의 task에서 구동할 수 있습니다.
프로그래밍 방식의 Node 구성
RollupNodeBuilder는 표준 node를 편리하게 구성하는 방법을
제공하지만, 고급 사용 사례에서는 actor를 직접 조합하거나
자체 빌더 패턴을 구현하여 자신만의 node를 빌드할 수 있습니다.
현재 제한 사항
- actor 및 서비스 API는 베타 단계이며 변경될 수 있습니다.
- 표준
RollupNode는 개별 actor나 pipeline을 재정의하는 hook을 제공하지 않으므로, node를 확장하려면RollupNode를 래핑하는 대신 자체 바이너리에서 actor를 조합해야 합니다. - 고급 확장성에 대한 문서와 예시는 계속 발전 중입니다. 기여와 피드백을 환영합니다!
더 알아보기
- actor 구현에 대한 자세한 내용은
NodeActortrait 문서를 참조하십시오. - 소스 코드와 더 많은 예시는 kona-node-service crate에서 살펴보십시오.