메인 콘텐츠로 건너뛰기
OP Stack 학습하기 — 14단계 중 11단계. 입금(디파짓)과 출금이 어떻게 동작하는지 읽어 보았습니다. 이 프로젝트에서는 Viem을 사용하여 코드로 양방향 흐름을 처음부터 끝까지 진행합니다. 완료한 후에는 결함 증명(fault proof) 설명으로 계속 진행하십시오.
이 튜토리얼에서는 Viem을 사용하여 크로스 도메인 트랜잭션을 처리하는 방법을 설명합니다.
  • 입금 트랜잭션(deposited transaction): 입금(deposit)이라고도 하며, L1에서 시작되어 L2에서 실행되는 트랜잭션입니다. L1에서 임의의 L2 트랜잭션을 제출하는 데 사용할 수 있습니다.
  • 출금(withdrawal): L2에서 시작되어 L1에서 실행되는 트랜잭션으로 최종 확정되는 크로스 도메인 트랜잭션입니다. OptimismPortal을 통해 L2에서 L1으로 임의의 메시지를 보내는 데 사용할 수 있습니다.
입금 트랜잭션과 출금 모두 ETH와 데이터를 전송할 수 있습니다.

지원되는 네트워크

Viem은 모든 OP Stack 네트워크를 지원합니다. OP Stack 네트워크는 기본적으로 Viem에 포함되어 있습니다. 기본적으로 포함되지 않은 네트워크를 사용하려면 Viem의 체인 구성에 추가할 수 있습니다.

의존성

데모 프로젝트 생성

이 튜토리얼에서는 Viem 라이브러리를 사용합니다. Viem는 Node.js 라이브러리이므로, 이를 사용하려면 Node.js 프로젝트를 생성해야 합니다.
1

프로젝트 폴더 만들기

2

프로젝트 초기화

3

의존성 설치

Sepolia에서 ETH 받기

이 튜토리얼에서는 Sepolia에서 OP Sepolia로 ETH를 브리징하는 방법을 설명합니다. 따라 하려면 Sepolia에서 약간의 ETH가 필요합니다.

환경에 개인 키 추가

트랜잭션에 서명하려면 개인 키가 필요합니다. export 명령으로 개인 키를 환경 변수로 설정하십시오. 이 개인 키가 Sepolia에서 ETH를 보유한 주소에 해당하는지 확인하십시오.
이 튜토리얼을 위해 새 지갑을 만들고 싶으신가요? cast가 설치되어 있다면 터미널에서 cast wallet new를 실행하여 새 지갑을 만들고 개인 키를 얻을 수 있습니다.

Node REPL 시작

Node REPL을 사용하여 Viem와 상호작용합니다. Node REPL을 시작하려면 터미널에서 다음 명령을 실행하십시오.
그러면 JavaScript 코드를 실행할 수 있는 Node REPL 프롬프트가 열립니다.

의존성 가져오기

Node REPL 세션에 몇 가지 의존성을 가져와야 합니다.
1

Viem 및 기타 패키지 가져오기

2

개인 키 불러오기 및 계정 설정

3

Sepolia 네트워크에서 데이터를 읽기 위한 L1 public client 생성

4

Sepolia에서 트랜잭션을 전송하기 위한 L1 wallet client 생성

5

OP Sepolia와 상호작용하기 위한 L2 public client 생성

6

OP Sepolia에서 L2 wallet client 생성

Sepolia에서 ETH 받기

L2로 브리징할 수 있는 L1의 ETH가 필요합니다. 이 faucet에서 Sepolia ETH를 받을 수 있습니다.

ETH 입금하기

이제 L1에 ETH가 있으므로, ETH 브리징에 설명된 방법 외에도 아래 예제에 나온 방식으로 ETH를 입금할 수 있습니다. 컨트랙트 계정을 사용하는 경우 주소 별칭(Address Aliasing)에 주의해야 합니다.
1

L1에서 지갑 잔액 확인

나중에 입금이 정상적으로 처리되었는지 확인할 수 있도록 L1에 보유한 ETH 수량을 확인합니다.
viem의 formatEther 메서드를 사용하여 잔액을 ether 단위로 변환했습니다.
2

입금 트랜잭션 생성

buildDepositTransaction을 사용하여 L2에서의 입금 트랜잭션 매개변수를 구성합니다.선택적 매개변수 mint와 value의 의미를 반드시 이해하십시오. 원한다면 다른 사람의 주소를 to 값으로 사용할 수도 있습니다.
3

입금 트랜잭션 전송

L1에서 입금 트랜잭션을 전송하고 L1 트랜잭션 해시를 로그로 출력합니다.
4

L1 트랜잭션 대기

L1 트랜잭션이 처리될 때까지 기다린 후 영수증을 로그로 출력합니다.
5

L2 트랜잭션 해시 추출

L1 영수증에서 대응하는 L2 트랜잭션 해시를 추출하여 로그로 출력합니다. 이 해시는 L2에서의 입금 트랜잭션을 나타냅니다.
6

L2 트랜잭션 처리 대기

L2 트랜잭션이 처리되고 확인될 때까지 기다린 후, 완료를 검증하기 위해 L2 영수증을 로그로 출력합니다.

ETH 출금하기

방금 L1에서 L2로 ETH를 브리징했습니다. 잘하셨습니다! 이제 과정을 반대로 반복하여 L2에서 L1으로 ETH를 브리징합니다. ETH 브리징에 설명된 방법 외에도 아래 예제에 나온 방식으로 ETH를 출금할 수 있습니다.
1

출금 트랜잭션 생성

buildInitiateWithdrawal을 사용하여 출금 매개변수를 생성합니다. 출금 금액을 wei로 변환하고 L1에서의 수신자를 지정합니다.
2

출금 실행

L2에서 출금 트랜잭션을 전송합니다. 이 트랜잭션은 L2에서 출금 과정을 시작하며, 출금을 추적하기 위한 트랜잭션 해시를 로그로 출력합니다.
3

L2 트랜잭션 확인

트랜잭션이 포함된 L2 Output이 제안(propose)될 때까지 (최대) 1시간 기다린 후, 블록 번호 등 중요한 세부 정보가 담긴 영수증을 로그로 출력합니다.
4

출금 증명 대기

다음으로, L2에서 출금이 발생했음을 L1의 bridge에 증명해야 합니다. 이를 위해 먼저 출금을 증명할 준비가 될 때까지 기다려야 합니다.
L2에서 출금을 증명하기 위한 매개변수를 구성합니다.
5

L1에서 출금 증명

출금을 증명할 준비가 되면 L1 트랜잭션을 전송하여 L2에서 출금이 발생했음을 증명합니다.
6

출금 최종 확정 대기

출금 트랜잭션을 최종 확정하려면 먼저 최종 확정 기간을 기다려야 합니다. 이는 결함 증명 기간이 지난 후에만 가능합니다. OP Mainnet에서는 7일이 걸립니다.
현재 OP Sepolia에서 결함 증명을 테스트하고 있으므로, 출금 소요 시간은 Mainnet 소요 시간과 동일합니다.
7

출금 최종 확정

8

출금이 최종 확정될 때까지 대기

waitToProve 및 waitToFinalize 액션을 실행하기 전에 getWithdrawalStatus로 확인하는 것을 권장합니다.

L1에서 임의의 L2 트랜잭션 제출하기

EOA는 L2에서 실행되어야 하는 모든 트랜잭션을 L1에서 제출할 수 있습니다. 이를 통해 Sequencer가 중단된 경우에도 사용자가 L2의 컨트랙트와 상호작용할 수 있습니다. 호출자가 L1의 컨트랙트인 경우 주소 별칭(Address Aliasing)에 주의해야 합니다. OP Mainnet으로 ERC-20 토큰 브리징하기 튜토리얼을 막 완료했다면, L2에서 실행될 ERC-20 전송 트랜잭션을 L1에서 시작해 볼 수 있습니다. encodeFunctionData와 erc20Abi는 Viem에서 가져올 수 있습니다.

OptimismPortal을 사용하여 L2에서 L1으로 임의의 메시지 보내기

L2ToL1MessagePasser 컨트랙트의 initiateWithdrawal 함수는 _target 주소와 _data 바이트를 인자로 받습니다. 이 값들은 챌린지 기간이 지난 후 finalizeWithdrawalTransaction이 실행될 때 L1의 CALL opcode로 전달됩니다. 즉, 설계상 OptimismPortal 컨트랙트를 사용하여 L1에서 임의의 트랜잭션을 보낼 수 있으며, 이때 OptimismPortal이 msg.sender 역할을 합니다.

중요 고려 사항

  • 이 튜토리얼의 목적은 입금 트랜잭션과 출금을 소개하는 것입니다. 먼저 standard bridge와 messenger가 사용 사례의 요구 사항을 충족하는지 검토해야 합니다.
  • 입금 트랜잭션을 다룰 때는 주소 별칭(Address Aliasing)의 영향을 고려하십시오.
  • 출금을 다룰 때는 OptimismPortal이 L1에서 임의의 메시지를 보낼 수 있다는 점을 고려하십시오.
  • 챌린지 기간: 7일간의 출금 챌린지 기간은 보안에 매우 중요합니다.
  • Gas 비용: 출금에는 L2와 L1 양쪽의 트랜잭션이 포함되며, 각각 gas 수수료가 발생합니다.
  • 개인 키 관리: 실제 애플리케이션에서는 안전한 키 관리 방식을 사용하십시오.
  • RPC 엔드포인트 보안: API 키(또는 모든 RPC 엔드포인트)를 안전하게 보관하십시오.