Optimism Bedrock Wrap Up Series 2 [KR]

Bedrock 업그레이드 핵심 변경 사항

Aaron Lee
Tokamak Network
20 min readOct 11, 2023

--

(2024.01.17) Optimism에서 EIP-1559의 소각 과정이 어떻게 다르게 동작하는지에 대한 부정확한 정보를 업데이트했습니다.

포스팅을 작성하는 데에 도움을 주신 Theo L. Suah K. Steven L. Austin O. Justin G. Ethan K. 에게 감사를 표합니다.

Fig. ‘Bedrock(기반암)’을 여러 계층으로 표현한 일러스트. (Source: OpLabs)

본 글은 Onther에서 기획한 ‘Optimism Bedrock Wrap Up 시리즈’ 총 5편의 2번째 글로 Bedrock 업그레이드 이후 핵심 변경 사항을 다룹니다. 시리즈의 구성이 서로 연관되어 있으므로, 차례대로 읽어보시는 것을 추천해 드립니다.

1. Bedrock 업그레이드 개요 및 계층별 구성요소: Bedrock 버전의 새로운 구조를 이해하기 위해 Bedrock 업그레이드의 개요를 살펴보고, 각 계층의 핵심 구성요소와 배포된 스마트 컨트랙트를 간략히 살펴봅니다.

3. 입·출금 프로세스 분석: 입·출금 프로세스의 흐름을 계층별 핵심 코드 로직을 통해 순차적으로 분석합니다.

4. 블록의 파생(Block Derivation): Optimism은 OP 메인넷(레이어2)에서 블록이 생성된 후, 해당 블록을 다시 레이어1으로 rollup 하는 과정을 거칩니다. 그리고 그 rollup 된 데이터만을 활용하여 L2 블록을 재생성하는 프로세스를 Block Derivation이라고 하며, 이프로세스를 단계별로 분석합니다.

5. Optimism Bedrock 구성 요소들의 역할 및 동작: 해당 시리즈의 마지막 구성으로 Op-Batcher와 Op-Proposer의 역할과 동작 로직을 종합적으로 살펴봅니다.

Legacy → Bedrock 업그레이드 이후 핵심 변경 사항

Bedrock 업그레이드는 Optimism 네트워크의 확장성과 성능을 크게 향상하는 핵심 업그레이드로 L1과 L2 모든 네트워크에 새로운 변화를 불러왔다. 특히, Optimism은 Ethereum을 데이터 가용성 계층으로 활용함으로써 Ethereum 사용자 및 개발자 경험을 개선하고, 플랫폼의 성능을 향상해 금융, 게임, DeFi, NFT 등 다양한 분야에서 혁신과 발전을 주도할 것으로 전망된다.

이번 시리즈에서는 Bedrock 업그레이드 이후의 핵심 변경 사항을 간략히 설명하고자 한다.

블록 생성

Fig. L1에서 12초 간격으로 생성된 블록이 L2로 전달되는 경로

위 그림에서는 간단한 예시를 통해 L1에서 발생한 L2 트랜잭션의 전달 경로를 간단히 요약했다. L1에서는 12초 간격으로 블록이 생성되며, L1에서 12초 동안 모인 30개의 L2 트랜잭션이 Mempool에 전달되어 저장된다. 다음으로 L2의 Sequencer는 Mempool에 모여있는 각 트랜잭션의 우선순위와 블록 사이즈를 기반으로 트랜잭션을 재정렬하여 2초에 하나씩 블록을 생성하기 위한 ‘pending transaction’을 사전 세팅하게 된다. (재정렬을 위한 우선순위에 대한 내용은 Mempool 섹션에서 보다 상세히 다룬다.)

Ethereum과 Optimism의 블록 생성 과정을 비교할 때 가장 큰 차이점은 Mempool과 Sequencer의 탈중앙화 여부이다.

Ethereum: 탈중앙화된 여러 노드로 구성된 네트워크에서 블록을 생성한다.

  1. 사용자가 스마트 컨트랙트 실행, 자산 전송 등 다양한 트랜잭션을 발생시키면, 해당 트랜잭션은 Ethereum 네트워크의 Mempool에 저장되어 대기열에 들어가게 된다.
  2. 네트워크에 ETH를 스테이킹한 모든 검증자는 Mempool에 대기 중인 트랜잭션을 검증하고 유효성(예: 트랜잭션 형식, 서명 등)을 확인한다.
  3. ETH를 스테이킹한 검증자 중에서 블록 Proposer(제안자)가 랜덤으로 선정되고, 선정된 Proposer는 다음 블록을 생성할 권한을 갖게 된다.
  4. 새로운 블록은 Ethereum 네트워크에 브로드캐스트되며, 다른 노드들은 해당 블록을 검증하여 자신의 블록체인에 추가한다.

Optimism: 프로토콜에서 운영하는 중앙화된 Sequencer가 블록을 생성한다.

  1. 중앙화된 Sequencer가 Mempool을 통해 사용자의 트랜잭션을 전달받으면, Sequencer는 해당 트랜잭션의 유효성 검사를 거친다. 그리고 검사 결과에 대한 즉각적인 허용이나 거부를 진행한다.
  2. 검사가 끝난 후 해당 트랜잭션은 local state로 정의되며, pending transaction으로 등록된다. 여기서 pending transaction은 L2의 Execution Engine에서 실제로 거래가 처리되기 이전에 대기하는 상태를 뜻한다.
  3. 그리고 Execution Engine은 가장 최신 pending transaction을 연계 받아 실제 트랜잭션을 처리하여 L2 체인의 State를 업데이트한다.

Mempool

Fig. 작성일 기준 OP 메인넷의 Priority Fee(우선순위 수수료)와 Base Fee(기본 수수료)(Source: optimistic.grafana.net)

Legacy 버전에서는 모든 트랜잭션과 블록 간에 1대 1 매칭 관계를 맺으며 블록을 생성하기 때문에 새로 생성되는 트랜잭션에 대해 순차적으로 처리했다. 하지만 Bedrock 버전에서는 EIP-1559를 지원하기에 고정된 간격으로 블록을 생성하는 과정에서 보류 중인 트랜잭션을 저장할 ‘mempool이 필요하다.

트랜잭션이 mempool 안에 저장될 때는 단순히 저장만 하는 것이 아니라 블록 처리 순서에도 영향을 미친다.

  • Priority Fee 즉, 높은 수수료를 지정하여 해당 트랜잭션이 다음 L2 블록에서 처리될 확률을 높일 수 있다.
  • Priority Fee는 실시간 네트워크 사용량을 기반으로 측정된 수수료로 네트워크 사용자는 Slow(느림), Medium(중간), 그리고 Fast(빠름) 중 하나를 수수료로 고르거나 자신이 원하는 만큼의 Priority Fee를 낼 수 있다. 여기서 Mempool은 네트워크 사용량을 계산하여 Priority Fee의 예상치(Slow, Medium, Fast)를 높게 책정하거나 낮게 책정할 수 있으며, 이렇게 예상치를 조정하는 것으로도 네트워크의 혼잡도를 어느 정도 제어할 수 있다.
  • 만일 Priority Fee가 너무 낮으면 트랜잭션이 계속 해서 Mempool안에 묶여 있을 수 있다. 이 경우에는 동일한 nonce로 트랜잭션을 다시 제출하여 취소하거나, 다른 nonce를 사용해 Priority Fee를 높여 트랜잭션을 다시 제출하여 보다 우선순위를 높일 수 있다.

(Optimism의 Mempool은 비공개이므로 트랜잭션이 실제로 L2 블록에 포함되기 전까지는 누구와도 공유되지 않는다.)

EIP-1559

Fig. “이더리움은 EIP-1559로 디플레이션이 될까요?”라고 쓰인 일러스트. (Source: moralismoney)

Optimism은 Bedrock 업그레이드를 통해 EIP-1559를 지원토록 네트워크를 업데이트했다. EIP-1559는 Ethereum과 Optimism의 기본 수수료 메커니즘을 개선하여 생성되는 블록의 모든 트랜잭션에 대한 수수료와 트래픽을 실시간으로 계산하고 예측 가능하게 했다.

EIP-1559에서 가스 단위 비용은 두 가지 요소로 구성된다(Mempool에서의 설명과 이어진다).

Fig. Tx의 크기에 따라 달라지는 블록 사이즈
  • Base Fee: EIP-1559에서 블록 사이즈는 업데이트 이전 최대 블록 사이즈의 2배 범위 내에서 유동적으로 조절된다. 이에 트랜잭션 요청에 따른 수요가 증가한다면 블록의 사이즈(수용량)도 증가하고, 반대로 수요가 감소한다면 블록 사이즈 또한 감소하게 된다. Base Fee도 마찬가지로 블록 사이즈의 변화에 따라 ±12.5% 범위에서 측정되며, 시스템이 목표로 하는 블록 사이즈보다 더 많은 트랜잭션이 발생하면 수요를 억제하기 위해 Base Fee가 상승하게 되고, 반대로 목표 블록 사이즈 대비하여 트랜잭션 수요가 낮아지면 트랜잭션 발생을 장려하기 위해 Base Fee가 낮아진다. 이는 단순히 네트워크의 TPS(Transaction Per Seconds)로 수수료가 조정되던 때보다 블록의 크기를 보면 변화를 예측해 갈 수 있기에 수수료의 급격한 변동을 줄여주는 효과가 있다.
  • Priority Fee: 사용자는 자신이 최대로 지불할 만큼의 Priority Fee를 지불하고 자신의 트랜잭션 우선순위를 높일 수 있다. 그리고, Sequencer는 우선순위가 가장 높은 수수료를 먼저 채택하여 트랜잭션을 처리해 간다.

또한, EIP-1559ETH 공급량이 늘어날수록 ETH의 가치는 하락하는 공급량 문제를 해소하기 위해 이용자가 지불하는 수수료가 더 이상 채굴자에게 돌아가지 않고 소각되도록 바뀌었다. 만일 채굴되는 ETH보다 소각되는 ETH가 더 많아지게 되면 ETH 시세에 디플레이션이 발생하여, ETH의 가치 상승으로 이어진다. 따라서 이는 네트워크 사용량이 활발하면 할수록 ETH가 더 많이 소각되는 구조이다.

[Optimism에서는 소각이라는 절차가 없기에, 채굴자에게 돌아갈 수수료는 브릿지에 영원히 Lock(잠김)] ➠Optimism에서는 Base Fee가 소각되지 않고, baseFeeVault 컨트랙트에 보관된다. 그리고, 보관된 fee는 _minWithdrawalAmount 임계값에 도달할 때마다 출금이 진행되며, 이때 recipient는 multi-sig로 된 simpleWallet으로 지정된다. 이러한 방식은 기존 EIP-1559의 소각 메커니즘과는 다르게, Optimism chain에서 Ethereum chain으로 ETH를 전송하는 결과를 낳는다[수정 2024.01.17].

EIP-1559 업데이트 관련 Opcode와 API는 다음과 같다.

Opcode

  • BASEFEE: 현재 블록의 Base Fee를 리턴한다.

API

  • eth_maxPriorityFeePerGas: 현재 Ethereum 블록에 트랜잭션을 포함시키기 위한 ‘Priority Fee’가 가스당 얼마에 책정되어 있는지를 리턴한다.
  • eth_feeHistory: Priority Fee를 책정하는데 이전 블록의 gas fee가 기준이 되는데 그때 참조할 이전 블록의 gas fee 정보를 리턴한다.

(EIP-1559의 자세한 내용을 보고 싶다면 링크를 통해서 확인할 수 있다.)

L1 Attributes Deposited Transaction

  • L1에서 트랜잭션이 시작되어 L2에서 생성될 모든 블록에는 ‘L1 Attributes Deposited Transaction’이라는 새로운 컨셉의 System Transaction(시스템 트랜잭션)을 적용했다.
Fig. 109880905번째 블록 내 8개의 트랜잭션 (Source: optimistic.etherscan.io)

위 optimistic.etherscan.io 캡처 사진을 보면 109,880,905번째 블록 내 8개의 트랜잭션을 확인할 수 있다. 그중에서 맨 밑에 트랜잭션이 L1 Attributes Deposited Transaction에 해당하며, 해당 트랜잭션의 Input Data’를 보면 함수 안에 L1BlockNumber, timestamp. basefee, hash 등과 같은 블록의 전반적인 정보를 담고 있는 것을 확인할 수 있다.

L1 Attributes Deposited Transaction은 모든 L1 블록의 최신 정보를 담아 op-geth에게 전달하여 L2 어카운트의 State를 업데이트하는 역할을 한다. (작성자는 처음에 ‘Deposited Transaction’이라고 해서 ETH나 ERC-20을 입금하는 트랜잭션이 전부라고 생각했는데, Bedrock에서는 L1에 의해서 트리거된 모든 L2 트랜잭션과 이벤트를 ‘Deposit Transaction’이라고 지칭한다. 물론 Deposit transaction에는 ETH나 ERC-20 같은 자산이 입금되는 경우가 대부분이지만 자산의 이동 없이 L2에 배포된 컨트랙트 호출만을 담을 수도 있다.)

결국, L1 Attributes Deposited Transaction은 Sequencer가 첨부한 L1 블록 정보의 정확성을 인증할 수 있게 해주어 신뢰할 수 있는 reference(참조)를 제공한다. 이는 L1 블록 정보를 트랜잭션마다 직접 포함함으로, L2에 배포된 컨트랙트는 최신 L1 블록 데이터를 전달받을 수 있고, 이를 위한 크로스체인 호출이 필요하지 않게 된다.

Rollup Node의 Block Derivation

Fig. Rollup Node의 Block Derivation 과정 요약

Rollup Node를 사용하는 중요한 이유 중 하나는 L2 체인의 진행 상황과 State를 추적하는 것에 있다. 따라서 Sequencer가 L2 블록을 만들고, Batch Submitter가 L1(BatchInbox)에 L2 블록에 대한 데이터를 제출하면 Verifier는 제출한 데이터를 가지고 다시 L2 체인을 구성할 수 있어야 한다. 그리고, 이렇게 L1에 제출된 data를 기반으로 L2 체인을 다시 구성하는 것을 ‘Block Derivation(블록의 파생)’ 이라고 한다.

이와 관련해서 Bedrock에서는 블록의 타입을 3가지 종류로 나누어서 unsafe, safe, 그리고 finalize로 구분했는데, 이 차이를 알기 위해서는 먼저 두 가지 개념을 이해해야 한다. 하나는 위에서 말씀드린 ‘Block Derivation’ 부분이고, 다른 하나는 Ethereum 메인넷 체인에서의 ‘Finality(완결성)’ 부분이다.

  • Ethereum에서 Finality는 트랜잭션이 처리된 후 일정 블록 간격의 체크 포인트를 통한 Confirmation(검증) 과정을 거침으로써, 해당 트랜잭션이 유효하고 돌이킬 수 없는 상태임을 보장하는 중요한 단계이다. 만일 revert(되돌리다)가 발생하면, 이는 블록체인의 재구성인 ‘re-org(재조정)’이 발생할 수 있어 해당 트랜잭션이 아직 finalize(확정)되지 않았다는 의미이다. 반대로 finalize가 되면 해당 트랜잭션은 돌이킬 수 없는 상태로 확정되며, re-org도 발생하지 않음으로 블록체인 내 완전히 신뢰할 수 있는 트랜잭션이 검증된 상태를 나타낸다.
  • 더불어, L1에서 re-org가 발생하면, L2에서 이미 처리된 OP 체인의 블록 순서가 변경되거나 일부 트랜잭션이 누락될 수 있다. 따라서 아직 finality가 달성되지 않은 블록은 re-org의 영향을 받을 수 있으며, 이는 L2에서도 영향을 미칠 수 있다. 이러한 이유로 Optimism에서도 L1 re-org에 따른 대비책인 L2 re-org를 준비한 것이다.

Bedrock 업그레이드를 통해 L2 re-org가 지원된 이후부터는 L1에서 re-org가 발생하면, L2는 L1에 맞춰서 스스로 re-org를 진행하게 된다. 이에 따라 Optimism 네트워크는 이전에 제출된 배치나 출력 루트도 다시 생성해야 하므로, 블록을 3가지 타입으로 나누어 설정하고 네트워크 운영에 관한 기준을 제시했다.

  • Unsafe(안전하지 않은): L2에서는 블록이 생성되었지만, 이더리움에서 finalize 되지도, RollupNode에서 Block Derivation이 발생하지 않았다는 의미이다. 이는 블록이 생성된 지 얼마 안 되어서 아직 롤업이 안 되었거나 롤업은 됐지만 Block Derivation이 진행이 안 된 상태이다. 따라서, Unsafe 블록은 L1이 re-org 된다면 그에 따라서 같이 re-org 될 수 있다.
  • Safe(안전한): 블록의 Batch가 L1에 제출되고, Block Derivation까지 이루어졌지만, 아직 해당 블록이 L1에서 finalize는 안 되어서 unsafe 블록보다는 re-org 되기 어렵지만 아직까지는 될 수 있는 확률이 존재한다.
  • Finalize(확정된): 블록이 최종적으로 확정된 것으로 간주하여 이미 충분한 깊이에 도달했음을 의미한다. 이는 Block Derivation도 완료됐고, L1 Ethereum 체인에서도 해당 블록이 finalize 된 것이다. 따라서 finalize 된 블록은 re-org 될 수 없다.

Two-Phase Withdrawals(2단계 출금)

“Bedrock 업그레이드는 Optimism 메인넷 브릿지에 새로운 2단계 출금 프로세스를 도입하여 보안을 개선하고 취약점 공격을 훨씬 더 어렵게 만들 것입니다.

-Optimism Labs-

Bedrock 버전 이후 Optimism 메인넷에 있는 자금을 L1으로 출금하면 L2에서 출금 프로세스가 시작되어 ‘증명(proveWithdrawalTransaction)’과 ‘완료(finalizeWithdrawalTransaction)’ → 총 2단계에 걸쳐서 출금이 확정된다.

  • Legacy 버전에서의 출금 프로세스는 챌린지 기간인 7일이 지난 후에 ‘증명’과 ‘완료’ 두 단계가 동시에 진행되는 하나의 프로세스로 이루어졌다. 그러나 이러한 방식은 공격자가 ‘머클 증명’을 위조할 수 있다면, 머클 증명에 대한 모니터링 과정 없이 출금 프로세스의 버그를 악용하여 이용자의 자산을 탈취할 수 있는 취약점이 존재했다.
  • 따라서, Bedrock에서 업그레이드된 ‘증명’ 단계에서는 출금 메시지와 해당 증명을 함께 머클 패트리샤 트리에 저장하는 것으로 시작한다. 이는 증명을 사전에 게시함으로써 온체인 모니터링 도구가 사기성 출금 증명을 탐지하고 적절한 수정 조치를 취할 충분한 시간을 제공한다.
Fig. 2단계 출금: 1단계

먼저 사용자는 출금 트랜잭션이 포함된 L2 블록의 output(출력)이 L1의 L2OutputOracle에서 append(추가)되는 즉시 출금에 대한 증거를 제출해야 한다.

  1. 사용자가 L2에서 출금 메시지를 보낸다.
  2. 사용자가 온체인에서 상태 출력될 때까지 기다린다(최대 1시간 소요).
  3. 사용자는 OptimismPortal에서 proveWithdrawalTransaction을 호출하여 자신의 증명을 게시하고 검증한다.
  4. 사용자는 챌린지 기간인 7일 동안 해당 출금 증명에 대한 ‘이의제기’를 받고 해당 기간이 끝날 때까지 증명에 대한 이의가 제기되지 않았다면, 옳은 출금으로 간주하고 출금이 허용된다.
Fig. 2단계 출금: 2단계

5. 챌린지 기간이 지난것을 확인한 사용자는 OptimismPortal에서 finalizeWithdrawal 함수를 호출하여 자산을 출금 받는다.

(출금에 대한 상세한 코드 레벨 분석은 3번째 시리즈에서 다룰 예정이다.)

마치며

여기까지 Bedrock 업그레이드에서 진행된 주요 변화를 간단히 정리해 보았습니다. 정리하면서 다시 한번 느낀 것은 Bedrock 업그레이드가 많은 변화를 불러왔고, 이에 따라 Optimism 생태계에 대한 기대감이 크게 높아졌다는 점입니다. 이어서 다음 시리즈에서는 입금과 출금의 흐름을 코드 레벨에서 자세히 분석하여 설명드리도록 하겠습니다.

Reference:

--

--