devops

Optimism Bedrock 업데이트 특징 정리 본문

Layer2

Optimism Bedrock 업데이트 특징 정리

vata500 2023. 8. 15. 16:19
반응형

옵티미즘의 베드락은 OP 메인넷의 주요 릴리즈 버전이다.  몇 가지 특징을 추려보자.

Block Production

Bedrock 버전 이후로 2초마다 새 블록을 생성한다. 기존에는 하나의 트랜잭션에 하나의 블록을 생성했었지만, 이젠 'TIMESTAMP'의 2초 간격으로 블록이 생성되며, 'BLOCKNUMBER'를 통해서 그 간격을 확인할 수 있다.

System transactions

Bedrock은 시스템 트랜잭션이라는 새로운 개념이 도입되었다. 시스템 트랜잭션은 op-node에 의해서 생성되는 것으로 L1 정보를 기록하여 deposit과 L2 업데이트에 활용된다.

  • 모든 블록은 하나의 시스템 트랜잭션을 포함하며 이를 'L1 attrubutes desposited transaction'이라고 한다. 이는 매 block의 첫번째 트랜잭션으로 기록된다.
  • 몇몇 블록은 하나 혹은 하나 이상의 user-deposited transaction이 기록된다.
  • 모든 시스템 트랜잭션은 EIP-2718인 transaction type을 가진다.
  • 모든 시스템 트랜잭션은 서명되지 않는다.

https://optimistic.etherscan.io/tx/0x3110d5ca2b443832200c83c971945d389785a73469023e4324c9a4ae499e4981

위 트랜잭션을 보면 0xdead...01은 L1 Attributes depositor account 주소이며, Contract 주소인 0x42 ....15로 시스템 트랜잭션이 기록된것을 알 수 있다. 참고로 0x42....15 계정은 Opstack 기반으로 구성된 Layer2면 모두 동일한 주소의 predeployed contract다.

아래처럼 setL1BlockValues라는 메소드에 아래와 같은 L1의 특정 블록과 여러 정보를 기록한다.

Function: setL1BlockValues(uint64 _number, uint64 _timestamp, uint256 _basefee, bytes32 _hash, uint64 _sequenceNumber, bytes32 _batcherHash, uint256 _l1FeeOverhead, uint256 _l1FeeScalar)

MethodID: 0x015d8eb9
[0]:  00000000000000000000000000000000000000000000000000000000011169ec
[1]:  0000000000000000000000000000000000000000000000000000000064db1a8f
[2]:  00000000000000000000000000000000000000000000000000000003447c0359
[3]:  7489597ef9a050aefad0a831feb62a679fff7dd9f3e6ec98b6a17c9dbddb0a43
[4]:  0000000000000000000000000000000000000000000000000000000000000004
[5]:  0000000000000000000000006887246668a3b87f54deb3b94ba47a6f63f32985
[6]:  00000000000000000000000000000000000000000000000000000000000000bc
[7]:  00000000000000000000000000000000000000000000000000000000000a6fe0

여기서 0~7까지의 데이터는 위 number~l1FeeScalar 파라미터에 대응한다. 각 값은 32 바이트의 Hex 형태로 기록되어 있으며 그 값을 변환하면 아래와 같다.

  • number : 287643884
  • timestamp : 1688414863
  • basefee : 14024935289
  • hash : 0x7489597ef9a050aefad0a831feb62a679fff7dd9f3e6ec98b6a17c9dbddb0a43 
  • sequenceNumber : 4
  • batcherHash : 0x0000000000000000000000006887246668a3b87f54deb3b94ba47a6f63f32985 
  • l1FeeOverhead : 188
  • l1FeeScalar : 691968

파라미터에 대해서 간단히 설명하면,

number, timestamp, basefee, hash는 L1 블록 정보를 말한다.

sequencerNumber는 각 에포크에서 시작하는 L2 blockNumber다. L2 block은 L1 블록의 특정 블록이 생성되기 까지의 시간을 에포크로 둔다. 그래서 blockNumber가 100인 L1 블록에서 처음 생성된 L2 블록은 sequencerNumber가 1이된다.

batcherHash는 batcher의 커밋 버전이다.

l1FeeOverhead는 L2 block에서 L1 비용 계산에 적용할 트랜잭션 수수료의 초과 비용같은 개념이며,

l1FeeScalar는 L2 block에서 L2 비용 계산에 적용할 스케일링값으로, 기본 수수료에 곱해져 최종 수수료를 결정한다. (Scalar가 1이면 변화없는 기존값을 의미)

시스템 트랜잭션은 아래 L1BLock.sol 컨트랙트를 통해서 predeploy된다.

https://github.com/ethereum-optimism/optimism/blob/65ec61dde94ffa93342728d324fecf474d228e1f/packages/contracts-bedrock/contracts/L2/L1Block.sol

EIP-1559

EIP-1559는 베드락 업데이트 후에 적용되었다. 트랜잭션 제출을 위해서 가스비는 2가지로 나뉜다.

Base fee

한 블록에 속한 모든 트랜잭션이 동일한 값을 가진다. 블록이 target 블록 사이즈보다 더 많은 가스를 사용하면 Base fee는 올라가며 수요를 줄인다. 블록이 target 블록 사이즈보다 적은 가스를 사용하면 다시 줄어들어 수요를 올린다.

Priority fee

이 수수료는 유저가 지정하는 것으로 트랜잭션마다 값이 상이하다. Proposer는 더 많은 수익을 위해 Priority fee가 높은 거래를 먼저 선택한다.

Chain Reorganizations

베드락 노드는 항상 L1으로 부터 정보를 받아온다. 이는 만약 L1에서 reorg 이슈가 발생했을때, L2는 L1 상태에 맞추기 위해서 스스로 재구성해야한다는 것을 의미한다.

L1에 제출되지 않은 블록은 P2P 네트워크를 통해서 gossip되며, L1의 데이터가 P2P를 통해 gossip된 데이터와 일치하지 않으면 재구성될 수 있다.

베드락은 블록의 최종성 설명을 위해서 Beacon Chain과 같은 용어를 사용한다.

  • unsafe : 블록이 gossip을 통해 수신되었으나 아직 L1에 제출된 상태가 아니다. unsafe 블록은 L1이 reorg되거나 시퀀서에 의해서 재구성될 수 있다.
  • safe : 블록이 L1에 제출된 상태다. 그러나 L1이 reorg되면 재구성될 수 있다.
  • finalized : 블록이 최종적으로 기록된 상태다. 

Mempool

이전 버전에서는 하나의 트랜잭션 당 하나의 블록이 생성되어, FIFO 방식으로 트랜잭션이 처리되었다. 그러나 베드락 이후부터는 일정 간격으로 블록이 생성되기 때문에 멤풀이 필요해졌다.

멤풀을 통해서 처리되지 못한 트랜잭션은 pending 상태로 대기하게 된다. 여기서 MEV를 최소화하기 위해서 베드락의 멤풀은 프라이빗으로 처리된다. 트랜잭션을 제출하려면 op-geth가 필요하며 op-geth는 Sequencer로 트랜잭션을 전달한다. (이 구조도 바뀔 수 있다고 함) Seuqencer는 Base fee와 Priority fee를 위해서 멤풀의 트랜잭션을 처리한다.

반응형
Comments