ETH 브릿징하기

이더리움에서 GIWA로, GIWA에서 이더리움으로 ETH를 브릿징해요.

요구사항

아래 항목들이 설치되어 있어야해요.

개발 환경 세팅

이 튜토리얼에서는 viem을 사용해요. Viem은 Node.js 라이브러리이기 때문에 Node.js 프로젝트로 생성합니다.

1

프로젝트 폴더 생성

mkdir giwa-bridging-eth
cd giwa-bridging-eth
2

프로젝트 초기화

pnpm init
3

Dependencies 설치

pnpm add -D tsx @types/node
pnpm add viem@^2.38.0

지갑 준비

ETH 브릿징을 위해 지갑이 필요해요.

1

세폴리아 ETH 준비

Deposit (Ethereum -> GIWA) 을 위해 이더리움 세폴리아 네트워크에서 ETH가 필요해요. 해당 faucet에서 세폴리아 ETH를 받을 수 있습니다.

아직 지갑이 없나요? cast 커맨드로 지갑을 생성하세요.

2

Private Key 환경변수 세팅

이 튜토리얼에서는 여러 번의 트랜잭션 서명이 필요해요. 이를 위해 지갑 private key 환경변수를 세팅해야합니다.

export TEST_PRIVATE_KEY=0x...

Chain Client 설정

ETH 브릿징을 위해 chain client를 설정합니다.

Deposit ETH (이더리움 -> GIWA)

이제 이더리움에서 GIWA로 ETH를 브릿징 해볼까요?

아래 코드를 실행하면 이더리움에 있던 여러분의 ETH가 실제로는 OptimismPortal 컨트랙트로 전송되고, 전송한 수량만큼 여러분의 GIWA 지갑으로 전송되는 것을 확인할 수 있어요. 이러한 방식을 Lock-and-Mint 라고 해요.

1

구성

  1. 레이어 1에서 deposit 트랜잭션 전송

  2. 이에 대응되는 레이어 2 deposit 트랜잭션이 sequencer에 의해 생성

  3. Deposit 완료

2

코드 작성하기

3

실행하기

왜 레이어 1 deposit 트랜잭션을 전송하고, 레이어 2 지갑 잔고에 반영되기까지 수 분이 소요되나요?

여러분이 레이어 1 deposit 트랜잭션을 전송하면, 레이어 2 sequencer가 이를 확인하고 레이어 2 deposit 트랜잭션을 생성해요. 이 과정에서 레이어 1 체인이 reorg가 발생할 수 있기 때문에 시스템 안정성을 위해 레이어 2 sequencer는 레이어 1 deposit 트랜잭션이 발생하고 대략 N 블록 이후에 이를 처리하는 형태입니다.

Withdraw ETH (GIWA -> 이더리움)

이더리움에서 GIWA로 ETH가 잘 전송되었나요? 이제 반대로 GIWA에서 이더리움으로 ETH를 브릿징해요.

아래 코드를 실행하면 GIWA에 있던 여러분의 ETH가 실제로는 L2ToL1MessagePasser 컨트랙트로 전송되고, 전송한 수량만큼 여러분의 이더리움 지갑으로 전송되는 것을 확인할 수 있어요. 이때는 Deposit에 의해 OptimismPortal 컨트랙트에 Lock되어있던 ETH가 다시 Unlock되는 형태에요. 이러한 방식을 Burn-and-Unlock 이라고 합니다.

L2ToL1MessagePasser 컨트랙트로 전송된 ETH는 사실상 소각(burn)되었다고 볼 수 있어요. Balance를 조회하면 남아있지만 언제든 해당 컨트랙트의 burn() 함수를 호출하면 모든 balance가 소각되는 구조에요.

1

구성

  1. 레이어 2에서 withdrawal 개시 트랜잭션 전송

  2. 레이어 1에서 withdrawal 증명 트랜잭션 전송

  3. 레이어 1에서 withdrawal 완료 트랜잭션 전송

  4. Withdrawal 완료

2

코드 작성하기

3

실행하기

더 알아보기

viem 문서를 통해 더 많은 가이드를 읽어보세요.

Last updated