devops

Optimism L2 Derivation & rollup node 본문

Layer2

Optimism L2 Derivation & rollup node

vata500 2023. 8. 15. 21:52
반응형

Optimism의 Opstack은 약간의 코드 수정을 통해서 다양한 L1의 롤업을 지원할 수 있다고 생각한다. 여기서 L2의 트랜잭션 배치를 전송해야하기 때문에 L1의 정보를 derive할 필요가 있고, 그 과정을 이해해야한다.

최대한 이해할 수 있도록 정리해본다.

L2 chain derivation

이는 간단히 말해서 L1의 데이터를 L2 블록으로 불러오는 것이라고 볼 수 있다. 이는 op-node(롤업노드)의 가장 중요한 역할이다.

validate와 sequence하는 과정에서 L1의 데이터가 활용된다. 특히 L1의 re-org 이슈가 발생하면 L2에서 빠르게 대응해야하기 때문에 op-node의 역할이 더욱 강조된다.

각 L1 block은 L2의 시퀀싱 에포크에 맵핑되어 있다. 각 에포크 숫자는 L1의 blockNumber다.

L2 체인을 처음부터 derive하기 위해서는 L2 genesis state부터 시작한다.

L2 Genesis Block

L2 제네시스 블록은 L2의 첫번째 블록이다. 만약 이전버전의 Optimism 체인이었다면 상속된 상태며, 새로 구축된다면 predeploy contract로 구성된다.

  • L2 제네시스 블록의 타임스탬프는 Block Time의 배수로써, 2배수로 구성된다.
  • 롤업 프로토콜이 새로운 버전으로 업데이트될때, 새로운 L2 Genesis Block을 생성한다. 새 L2 Genesis Block은 X + 1의 Block Number를 가진다. 여기서 X는 업데이트 전 마지막 L2 Block Number다.

Batcher Transaction Format

배처의 트랜잭션은 다음과 같은 포맷으로 인코딩된다.

Unknown 버전은 배처 트랜잭션이 유효하지 않는 것으로 해석되며, 모든 frame은 반드시 파싱할 수 있는 형태여야한다. 만약 파싱에 실패하면 해당하는 트랜잭션은 모두 거절된다.

배치 트랜잭션은 수신하는 컨트랙트인 batch inbox address가 일치하는지, from 주소이자 system configuration의 batch-sender의 일치를 검증하면서 인증된다.

frame format

frame = channel_id ++ frame_number ++ frame_data_length ++ frame_data ++ is_last

channel_id        = bytes16
frame_number      = uint16
frame_data_length = uint32
frame_data        = bytes
is_last           = bool

여기서 frame_data만 제외하곤 나머지 frame 데이터는 고정된 사이즈로 인코딩된다. 

channel format

rlp_batches = []
for batch in batches:
    rlp_batches.append(batch)
channel_encoding = compress(rlp_batches)

batch format

Rollup node 

롤업 노드는 L1 Block(receipt)로부터 L2 체인을 derive하는 역할을 담당한다. L2 체인을 derive하는 롤업노드의 파트를 'rollup driver'라고 한다. 

Driver

롤업 노드에서 driver 작업은 derivation process를 관리하는 것이라고 볼 수 있다.

  • L1 head block을 추적한다.
  • L2 체인의 동기화 상황을 추적한다.
  • 새 input이 사용가능하게 되면 derivation 단계를 반복한다.

Derivation

이 프로세스는 3가지 단계로 진행된다.

1. 마지막 L2 Block 상단에 L1 체인으로 부터의 input을 선택 (데이터와 receipts 그리고 트랜잭션이 포함된 블록의 리스트)

2. Payload attribute를 생성하기 위해서 L1 정보와 Deposit, 그리고 sequencing batch를 읽는다.

3. L2 Block이 계산될 수 있도록 Payload attribute를 실행 엔진에 전달한다.

L2 체인은 새 L1에 새 블록이 추가될 때 마다 확장됨과 동시에 L1 체인이 re-org될 때마다 L2 체인도 re-org된다.

L2 Output RPC method

롤업 노드는 자체 RPC 메소드 'optimism_outputAtBlock'을 가지고 있다. 이 메소드는 L2 output root인 32 바이트를 리턴한다. 참고로 L2 output root는 L2 체인의 현재 상태의 커밋 값이다.

  • method : optimism_outputAtBlock
  • params : blocknumber
반응형
Comments