이 섹션을 읽기 전에, 결함 증명 프로그램 환경 섹션을 먼저 읽고
PreimageOracle IO 패턴에 익숙해지는 것을 권장합니다.
- OP Stack 상태 전이 로직(
kona-derive,kona-executor,kona-mpt) - OP Stack 상태 전이 증명 SDK(
kona-preimage,kona-proof) - Fault Proof VM IO 및 유틸리티
(
kona-std-fpvm,kona-std-fpvm-proc)
kona-std-fpvm과 kona-preimage를 사용하는 방법에 초점을 맞춥니다.
Host와 Client 통신 API
FPVM 시스템 API는 여러 계층으로 구성됩니다. 이 문서에서는 가장 낮은 수준부터 가장 높은 수준의 API까지 이 계층들을 차례로 다룹니다.kona-std-fpvm
kona-std-fpvm은 원시 syscall 디스패치, 기본 전역 메모리 allocator, 그리고 blocking async 런타임을 구현합니다.
kona-std-fpvm은 동작을 위해 최소한의 linux 백엔드에 의존하며, PreimageOracle ABI를 구현하는 데
필요한 syscall(read, write, exit_group)만 지원합니다.
이러한 syscall은 io 모듈을 통해 사용자에게 직접 노출되며, 지원되는 각 플랫폼은
BasicKernelInterface trait을 구현합니다.
이러한 syscall을 직접 디스패치할 수 있도록 io 모듈은
안전한 API를 제공합니다.
stdout에 직접 출력하는 것과 같은
특별한 필요가 없는 한, FPVM을 대상으로 하는 프로그램을 개발할 때 kona-preimage를
사용할 것을 권장합니다.
kona-preimage
kona-preimage는 PreimageOracle ABI의 구현입니다. 이 crate는 FPP Dev 환경 섹션의
Host - Client 통신에서 설명한 것처럼
host와 client 프로그램 간의 동기식 통신을 가능하게 합니다.
이 crate는 양방향 파이프의 한쪽 끝 역할을 하는 Channel trait을
중심으로 구성됩니다(pipe manpage 참고).
이 핸들을 통해 상위 수준의 구성 요소는 아래 프로토콜에 따라 채널의 반대편 끝을 가진 상대방과
데이터를 읽고 쓸 수 있습니다.
위 프로토콜의 각 부분에 대한 인터페이스는 다음 trait으로 정의됩니다.
PreimageOracleClient- 명세 준수 구현:
OracleReader
- 명세 준수 구현:
HintWriterClient- 명세 준수 구현:
HintWriter
- 명세 준수 구현:
PreimageOracleServer- 명세 준수 구현:
OracleServer
- 명세 준수 구현:
HintReaderServer- 명세 준수 구현:
HintReader
- 명세 준수 구현:
kona-proof - Oracle 기반 소스 (예시)
마지막으로, kona-proof에는 PreimageKey를 사용해 host로부터 타입이 지정되지 않은 데이터를 가져오는 kona-derive 및 kona-executor 데이터 소스 trait의
구현이 제공됩니다. 이러한 데이터 소스 trait은 커스텀 백엔드 섹션에서
더 자세히 다루지만, 여기서는 직관을 얻기 위해 간단히 살펴보겠습니다.
예를 들어 OracleL1ChainProvider를 살펴보겠습니다.
kona-derive의 ChainProvider trait은
L1 체인에 대한 정보를 가져오기 위한 간단한 인터페이스를 정의합니다. OracleL1ChainProvider에서는 이 정보를
PreimageOracle ABI를 통해 가져옵니다. 이 외에도 L2ChainProvider, BlobProvider, TrieProvider, TrieHinter 등
다양한 데이터 소스 trait이 있으며, 이를 통해 서로 다른 데이터 소스 백엔드를 만들 수 있습니다.
예시로, 앞서 설명한 PreimageOracleClient + HintWriterClient trait을 조합한 CommsClient trait 위에 구축된
OracleL1ChainProvider::header_by_hash를 살펴보겠습니다.
HintType::L1BlockHeader.with_data(...).send(...)는 HintWriterClient를 통해 힌트를 쓰고, self.oracle.get(...)은 PreimageOracleClient를 통해 준비된 preimage를 읽습니다.
header_by_hash에서는 내부의 HintWriter를 사용해 host에 블록 해시 preimage를 준비하라는 힌트를 보냅니다.
그런 다음 host로부터 preimage가 준비되었다는 확인 응답을 받으면, RLP(해시의 preimage)를 요청합니다.
RLP를 받은 후에는 이를 Header 타입으로 디코딩하여 사용자에게 반환합니다.