client(프로그램)와 host(FPVM) 간의 통신, 기타 구현별 기능을 지원하기 위해
기반이 되는 명령어 세트와 메모리의 내부 표현을 수정하는 경우가 많습니다.
Host와 Client 간 통신
프로그램이 FPVM 위에서 실행되는 동안 프로그램은client 역할로 간주되고, VM은 host 역할로 간주됩니다. client와 host가
서로 통신하는 유일한 방법은 Preimage ABI(명세)를 통한 동기식 통신입니다.
client가 host로부터 데이터를 읽을 수 있도록, FPVM 내에서 read 및 write syscall이 수정되어 client가 외부 데이터의 준비를 요청하고 이를 읽을 수 있습니다.
읽기
client가 host로부터 데이터를 읽으려면 먼저 hint 파일 디스크립터를 통해 host에 “hint”를 보내야 합니다. 이는 host에 읽기용 데이터를 준비하라는 요청을 알리는 신호입니다. 그러면 host는
데이터를 준비하고 client에 hint 확인 응답(acknowledgement)을 보냅니다. 그런 다음 client는 지정된 파일 디스크립터를 통해 host로부터 데이터를 읽을 수 있습니다.
준비 단계(“hinting”)는 host가 client의 의도와 실행에 필요한 데이터를 미리 알 수 있게 해 주는 최적화입니다. 이를 통해
데이터를 지연 로딩(lazy loading)할 수 있으며, host의 메모리 내에서 불필요한 할당이 필요하지 않게 됩니다. 이 단계는 onchain에서는 no-op이며,
host가 FPVM의 네이티브 구현인 경우에만 로컬에서 실행됩니다.
전체 예시
아래는 OP Stack 결함 증명 프로그램의 원래 Go 구현인op-program(op-program/v1.9.0 기준, 출처: 결함 증명 명세)의 전체 아키텍처 다이어그램입니다.
이 프로그램의 목적은 OP Stack layer two의 상태에 관한 claim을 검증하는 것입니다. op-program은 지원 종료되었으며 현재 유지 관리되는 결함 증명 프로그램은 kona-client입니다(op-geth 및 op-program 지원 종료 참고). 하지만 여기에 표시된 아키텍처는 둘 다에 적용됩니다.
host와 통신합니다.
- L1 및 L2 상태 데이터 preimage의 준비를 요청하기 위해
- 위 요청 이후 준비된 L1 및 L2 상태 데이터 preimage를 읽기 위해
host는 다음을 담당합니다.
- L1 및 L2 상태 데이터 preimage와 로컬 부트스트랩 k/v 쌍의 저장소를 준비하고 유지 관리합니다.
client가 읽을 수 있도록 L1 및 L2 상태 데이터 preimage를 제공합니다.
client)은 host와의 통신에 대해 요구 사항이 다를 수 있지만, 위 방식은 FPVM 위에 구축된 프로그램의 일반적인 패턴입니다. 일반적으로 다음과 같습니다.
client프로그램은 입력으로부터 자신을 부트스트랩하고, 프로그램 로직을 실행하고, 결과를 검증하는 상태 머신입니다.host는client가 부트스트랩 시 받지 못한 데이터를client에 제공하고, 프로그램 자체를 실행하는 역할을 합니다.