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)
구현은 세 가지 주요 구성 요소로 이루어집니다.- Greeter 컨트랙트:
Chain B에 배포되며, 메시지를 수신하고 저장합니다. - GreetingSender 컨트랙트:
Chain A에 배포되며, 크로스체인 메시지를 시작합니다.
1
2
컨트랙트 생성하기
-
새 Foundry 프로젝트를 생성합니다.
-
src/Greeter.sol에 다음 파일을 넣습니다. 이 컨트랙트는 Hardhat의 Greeter 컨트랙트를 변형한 것입니다. -
Greeter컨트랙트를 Chain B에 배포하고, 생성된 컨트랙트 주소를GREETER_B_ADDRESS환경 변수에 저장합니다.설명
컨트랙트를 배포하는 명령은 다음과 같습니다.명령 출력에는 배포자 주소, 새 컨트랙트의 주소, 트랜잭션 해시가 표시됩니다.awk명령은Deployed to:가 포함된 줄을 찾아 해당 줄의 세 번째 단어, 즉 주소를 출력합니다.마지막으로, UNIX(Linux 및 macOS 포함)에서 명령줄에 백틱이 포함되어 있으면 셸은 백틱 사이의 코드를 실행하고 그 출력(이 경우 컨트랙트 주소)을 명령에 넣습니다. 따라서 다음과 같은 결과가 됩니다.
동작 확인
동작 확인
다음 명령을 실행하여 컨트랙트가 작동하는지 확인합니다.
첫 번째와 세 번째 명령은 현재 인사말을 조회하고, 두 번째 명령은 인사말을 업데이트합니다.
-
프로젝트에 Optimism Solidity 라이브러리를 설치합니다.
-
src/GreetingSender.sol을 생성합니다.설명
이 함수는setGreeting에 대한 호출을 인코딩하여 다른 체인의 컨트랙트로 보냅니다.abi.encodeCall(Greeter.setGreeting, (greeting))은 함수 selector와 파라미터를 인코딩하여 calldata를 구성합니다. 인코딩된 메시지는messenger.sendMessage로 전달되며, 이 함수는 메시지를 지정된 체인(greeterChainId)의 대상 컨트랙트(greeterAddress)로 전달합니다.이를 통해 (메시지를 릴레이할 실행 메시지가 있는 한) 제공된greeting값으로setGreeting이 원격으로 실행됩니다. -
GreetingSender를 chain A에 배포합니다.
3
메시지 보내기
chain A에서 chain B로 인사말을 보냅니다.
sleep 호출이 필요한 이유는 트랜잭션이 chain A에 포함되기까지 최대 2초가 걸릴 수 있고, 그 후 릴레이 트랜잭션이 chain B에 포함되기까지 다시 최대 2초가 걸릴 수 있기 때문입니다.발신자 정보
다음 명령을 실행하여 이벤트를 확인하고 누가setGreeting을 호출했는지 확인합니다.
L2ToL2CrossDomainMessenger 컨트랙트 주소(4200000000000000000000000000000000000023)에 해당하므로, 원래 발신자를 식별하는 데는 효과적이지 않습니다.
이 섹션에서는 크로스 도메인 메시지를 수신할 때 발신자의 신원(주소 및 체인 ID)과 함께 별도의 이벤트를 발생시키도록 Greeter.sol을 변경합니다.
1
Greeter 컨트랙트 수정하기
-
src/Greeter.sol을 다음 코드로 수정합니다.설명
이 정의는 작성 시점에 npmjs 패키지에 포함되어 있지 않으므로 여기에 직접 추가합니다.L2ToL2CrossDomainMessenger로부터 메시지를 받았다면L2ToL2CrossDomainMessenger.crossDomainMessageContext를 호출합니다. -
컨트랙트를 다시 배포합니다.
GreetingSender에서Greeter의 주소는 변경할 수 없으므로(immutable) 두 컨트랙트를 모두 다시 배포해야 합니다.
2
크로스체인 발신자 정보를 확인할 수 있는지 검증하기
-
GreetingSender를 통해 인사말을 설정합니다. -
로그 항목을 읽습니다.
두 번째 topic(첫 번째 indexed 로그 파라미터)이
$GREETER_A_ADDRESS와 같은지 확인합니다. 세 번째 topic은 supersim chain A의 체인 ID인0x385=901또는 devnet alpha 0의 체인 ID인0x190a85c0=420120000중 하나입니다.
다음 단계
- 상호운용성에 관한 일반적인 질문에 대한 답변은 OP Stack Interop 설명을 검토하십시오.
- 내부적으로 어떤 일이 일어나는지 이해하려면 메시지 전달 설명을 읽어 보십시오.
- OP Stack 생태계 내에서 여러 블록체인을 사용하는 혁신적인 앱을 작성해 보십시오.