devops

Optimism Smart Contract의 기본 구성 정리 본문

Layer2

Optimism Smart Contract의 기본 구성 정리

vata500 2023. 5. 11. 21:15
반응형

Layer 2를 구축하기 위해선 L1과 동시에 몇가지 Contract를 배포해야한다. OP stack으로 테스트하는 과정에서도 먼저 L1에 여러 contract를 배포하는데, 생각보다 배포되는 게 많다.

L1에 배포되는 컨트랙트는 L2와 오프체인에서 계산된 Tx, 결과값(State)가 저장되는데 주로 사용된고,  L2는 L1과의 매핑 혹은 연결과 수수료에 관련된 컨트랙트들이 배포된다고 볼 수 있다. 그도 그럴 것이, L1의 보안(데이터 가용성)을 위한 컨트랙트와 이를 바라보는 L2의 증명, 확인이 중요하기 때문.

이 Contract들의 역할과 구성을 알아보면, 좀 더 구체적으로 Layer2가 어떻게 작동하는지 이해할 수 있기 때문에 한번 정리해보려 한다. (코드는 파헤치는건 다음에...)

L1에 배포되는 Contract들

배포되는 컨트랙트는 크게 4가지 종류로 나뉜다고 볼 수 있다.

  • Chain : Layer1의 contract로 Layer2의 트랜잭션들의 주문을 홀드하거나, Layer2 루트 스테이트와 연관되어있다.
  • Verification : 트랜잭션 결과에 이의를 제기하는 Layer 1의 컨트랙트
  • Bridge : Layer 1과 Layer 2 사이의 메시지 전달을 담당
  • Predeploys : 초기에 배포되어 사용가능한 필수적인 컨트랜트들로 이 컨트랙트는 이더리움의 Precompile과 비슷하지만 solidity로 작성되었으며 0x42가 붙은 주소에서 찾을 수 있음

Chain Contracts (L1)

체인은 이더리움 메인넷 혹은 L1에서 작동하는 컨트랙트 세트로 구성된다. 이 컨트랙트는 다음 리스트들을 저장한다.

  • L2 state에 적용되는 모든 트랜잭션의 리스트
  • 각 트랜잭션이 실행되어 제안된 state root
  • Pending 상태를 포함하여 L1에서 L2로 보내진 트랜잭션들

더 구체적인 Contract는 다음과 같다.

CTC(Canonical Transaction Chain)

CTC 컨트랙트는 OVM state에 적용되는 트랜잭션 로그만 추가되는 컨트랙트다. ChainStorageContainer의 인스턴스에 트랜잭션을 작성하여 순서를 정의하고, CTC는 모든 어카운트가 L2 트랜잭션을 추가할 수 있게 하는, 시퀀서가 최종적으로 rollup state를 추가하는데 사용된다.

SCC(State Commitment Chain)

SCC 컨트랙트는 Propose된 state root들의 리스트를 포함하고 있다. 이 state root는 Proposer가 CTC에 제출(assert)한 트랜잭션의 결과물들이다. 모두 고유한 state root로써 트랜잭션이 하나씩 적용되어 off-chain에서 계산된다.

Chain Storage Container

재사용가능한 Storage를 제공한다. 여기서 데이터 구조는 'Ring Buffer'며, 3개의 Chain Storage Container가 배치되어 있고 2개는 CTC, 1개는 SCC가 제어한다.

Predeploy Contracts (L2)

Predeploy는 초기상태에 배포되어 사용되는 필수적인 L2의 컨트랙트를 말한다. 이 컨트랙트는 0x42 접두사가 붙은 주소의 OVM에서 찾을 수 있다. (eth-optimism/contracts에서 predeploys)

OVM_L1MessageSender

L1MessageSender는 L2에서 실행되는 Predeploy 컨트랙트다. L1에서 L2로 크로스 도메인 트랜잭션을 실행하는 동안 CTC를 통해서 L2로 메시지를 보낸 L1 계정의 주소를 반환한다.

이 컨트랙트는 Solidity로 작성되지않았으며, EVM의 Precompile과 유사하다.

OVM_L2ToL1MessagePasser

이 컨트랙트는 L2 메시지의 L1 증명을 용이하게하는 유틸리티 컨트랙트다.L1 도메인 간 메신저는 이 컨트랙트의 mapping에서 트랜잭션 hash의 존재를 확인하는 기능이 있어 이 증명을 수행한다.

OVM_SequencerFeeVault

이 컨트랙트는 L1 트랜잭션 비용(L1에 Calldata로 게시하는 비용)을 지불하는 데 사용되는 비용을 충당하기 위해 시퀀서에의해 지불된 비용들을 홀딩한다.

Lib_AddressManager

이 라이브러리는 이름과 그들의 주소를 매핑하여 저장한다. 이는 L1CrossDomainMessenger가 사용한다.

반응형
Comments