메인 콘텐츠로 건너뛰기
OP Stack 상호운용성(interop)은 Lagoon 하드포크와 함께 활성화됩니다.

개요

이 튜토리얼에서는 OP Stack 생태계 내에서 크로스체인 통신을 구현하는 방법을 보여 줍니다. L2ToL2CrossDomainMessenger 컨트랙트를 사용하여 서로 다른 체인이 상호작용할 수 있게 해 주는 완전한 메시지 전달 시스템을 구축합니다.
필요한 사전 기술 지식
  • 중급 수준의 Solidity 프로그래밍
  • 기본적인 TypeScript 지식
  • 스마트 컨트랙트 개발에 대한 이해
  • 블록체인 개념에 대한 이해
학습 내용
  • 서로 다른 체인에 컨트랙트를 배포하는 방법
  • 크로스체인 메시지 전달을 구현하는 방법
  • 체인 간 발신자 검증을 처리하는 방법
  • 체인 간에 메시지를 수동으로 릴레이하는 방법
개발 환경
  • Unix 계열 운영 체제(Linux, macOS 또는 Windows용 WSL)
  • Node.js 버전 16 이상
  • 버전 관리를 위한 Git
필요한 도구이 튜토리얼에서는 다음과 같은 주요 도구를 사용합니다.
  • Foundry: 스마트 컨트랙트 개발용
  • Supersim: 로컬 블록체인 시뮬레이션용(선택 사항)
  • TypeScript: 오프체인 코드용(메시지를 수동으로 릴레이하는 경우)
  • Viem: 오프체인 앱에서 체인과 상호작용하는 용도

빌드할 내용

  • 인사말을 저장하고 업데이트하는 Greeter 컨트랙트
  • 인사말을 업데이트하기 위해 크로스체인 메시지를 보내는 GreetingSender 컨트랙트
  • 체인 간에 메시지를 릴레이하는 TypeScript 애플리케이션
이 튜토리얼은 크로스체인 메시징을 구현하기 위한 단계별 안내를 제공합니다. 개념적인 개요는 메시지 전달 설명을 참조하십시오.
이 튜토리얼에서는 L2ToL2CrossDomainMessenger 컨트랙트를 사용하여 상호운용 가능한 블록체인 간에 메시지를 전달하는 방법을 알아봅니다.

개발 환경 설정하기

1

Supersim 설치하기를 따라 다음을 설정합니다.

  • 스마트 컨트랙트 개발을 위한 Foundry(모든 경우에 필요)
  • 로컬 블록체인 시뮬레이션을 위한 Supersim(선택 사항)
2

설치를 확인합니다.

온체인 메시지 전달 구현하기 (Solidity)

구현은 세 가지 주요 구성 요소로 이루어집니다.
  1. Greeter 컨트랙트: Chain B에 배포되며, 메시지를 수신하고 저장합니다.
  2. GreetingSender 컨트랙트: Chain A에 배포되며, 크로스체인 메시지를 시작합니다.
1

테스트 네트워크 설정하기

  1. Supersim을 사용하는 경우 Supersim이 설치된 디렉터리로 이동하여 autorelay를 활성화한 상태로 시작합니다.
    devnet을 사용하는 경우 이 단계를 건너뛰십시오.
    Supersim은 세 개의 anvil 블록체인을 생성합니다.
  2. 별도의 셸에서 구성을 환경 변수에 저장합니다.
    Supersim에 대해 다음 파라미터를 설정합니다.
체인이 실행 중인지 확인하려면 $USER_ADDRESS의 잔액을 확인합니다.
2

컨트랙트 생성하기

  1. 새 Foundry 프로젝트를 생성합니다.
  2. src/Greeter.sol에 다음 파일을 넣습니다. 이 컨트랙트는 Hardhat의 Greeter 컨트랙트를 변형한 것입니다.
  3. Greeter 컨트랙트를 Chain B에 배포하고, 생성된 컨트랙트 주소를 GREETER_B_ADDRESS 환경 변수에 저장합니다.
    컨트랙트를 배포하는 명령은 다음과 같습니다.
    명령 출력에는 배포자 주소, 새 컨트랙트의 주소, 트랜잭션 해시가 표시됩니다.
    awk 명령은 Deployed to:가 포함된 줄을 찾아 해당 줄의 세 번째 단어, 즉 주소를 출력합니다.
    마지막으로, UNIX(Linux 및 macOS 포함)에서 명령줄에 백틱이 포함되어 있으면 셸은 백틱 사이의 코드를 실행하고 그 출력(이 경우 컨트랙트 주소)을 명령에 넣습니다. 따라서 다음과 같은 결과가 됩니다.
다음 명령을 실행하여 컨트랙트가 작동하는지 확인합니다. 첫 번째와 세 번째 명령은 현재 인사말을 조회하고, 두 번째 명령은 인사말을 업데이트합니다.
  1. 프로젝트에 Optimism Solidity 라이브러리를 설치합니다.
  2. src/GreetingSender.sol을 생성합니다.
    이 함수는 setGreeting에 대한 호출을 인코딩하여 다른 체인의 컨트랙트로 보냅니다. abi.encodeCall(Greeter.setGreeting, (greeting))은 함수 selector와 파라미터를 인코딩하여 calldata를 구성합니다. 인코딩된 메시지는 messenger.sendMessage로 전달되며, 이 함수는 메시지를 지정된 체인(greeterChainId)의 대상 컨트랙트(greeterAddress)로 전달합니다.이를 통해 (메시지를 릴레이할 실행 메시지가 있는 한) 제공된 greeting 값으로 setGreeting이 원격으로 실행됩니다.
  3. GreetingSender를 chain A에 배포합니다.
3

메시지 보내기

chain A에서 chain B로 인사말을 보냅니다.
sleep 호출이 필요한 이유는 트랜잭션이 chain A에 포함되기까지 최대 2초가 걸릴 수 있고, 그 후 릴레이 트랜잭션이 chain B에 포함되기까지 다시 최대 2초가 걸릴 수 있기 때문입니다.

발신자 정보

다음 명령을 실행하여 이벤트를 확인하고 누가 setGreeting을 호출했는지 확인합니다.
발신자 정보는 두 번째 이벤트 topic에 저장됩니다. 그러나 크로스체인 메시지의 경우 이 값은 로컬 L2ToL2CrossDomainMessenger 컨트랙트 주소(4200000000000000000000000000000000000023)에 해당하므로, 원래 발신자를 식별하는 데는 효과적이지 않습니다. 이 섹션에서는 크로스 도메인 메시지를 수신할 때 발신자의 신원(주소 및 체인 ID)과 함께 별도의 이벤트를 발생시키도록 Greeter.sol을 변경합니다.
1

Greeter 컨트랙트 수정하기

  1. src/Greeter.sol을 다음 코드로 수정합니다.
    이 정의는 작성 시점에 npmjs 패키지에 포함되어 있지 않으므로 여기에 직접 추가합니다.
    L2ToL2CrossDomainMessenger로부터 메시지를 받았다면 L2ToL2CrossDomainMessenger.crossDomainMessageContext를 호출합니다.
  2. 컨트랙트를 다시 배포합니다. GreetingSender에서 Greeter의 주소는 변경할 수 없으므로(immutable) 두 컨트랙트를 모두 다시 배포해야 합니다.
2

크로스체인 발신자 정보를 확인할 수 있는지 검증하기

  1. GreetingSender를 통해 인사말을 설정합니다.
  2. 로그 항목을 읽습니다.
    두 번째 topic(첫 번째 indexed 로그 파라미터)이 $GREETER_A_ADDRESS와 같은지 확인합니다. 세 번째 topic은 supersim chain A의 체인 ID인 0x385=901 또는 devnet alpha 0의 체인 ID인 0x190a85c0=420120000 중 하나입니다.

다음 단계

  • 상호운용성에 관한 일반적인 질문에 대한 답변은 OP Stack Interop 설명을 검토하십시오.
  • 내부적으로 어떤 일이 일어나는지 이해하려면 메시지 전달 설명을 읽어 보십시오.
  • OP Stack 생태계 내에서 여러 블록체인을 사용하는 혁신적인 앱을 작성해 보십시오.