메인 콘텐츠로 건너뛰기
OP Stack 상호운용성(interop)은 Lagoon 하드포크와 함께 활성화됩니다.
interop devnet에서는 메시지가 자동으로 릴레이됩니다.

개요

올바른 트랜잭션을 전송하여 트랜잭션을 직접 릴레이하는 방법을 알아봅니다.
필요한 사전 기술 지식
  • 블록체인 개념에 대한 이해
  • Foundry, 특히 cast에 대한 이해
학습 내용
  • autorelay가 작동하지 않을 때 cast를 사용하여 트랜잭션을 릴레이하는 방법
  • JavaScript를 사용하여 트랜잭션을 릴레이하는 방법
개발 환경 요구 사항
  • Unix 계열 운영 체제(Linux, macOS 또는 Windows용 WSL)
  • Node.js 버전 16 이상
  • 버전 관리를 위한 Git
  • 구성되어 실행 중인 Supersim 환경
  • 설치된 Foundry 도구(forge, cast, anvil)

빌드할 내용

  • JavaScript 라이브러리를 사용하여 메시지를 릴레이하는 프로그램
  • cast를 사용하여 메시지를 릴레이하는 셸 스크립트

설정

다음 단계는 cast를 사용하든 JavaScript API를 사용하든 관계없이 튜토리얼을 실행하는 데 필요합니다.
1

Supersim 실행하기

이 실습은 Supersim에서 수행해야 합니다. devnet에서는 autorelay를 비활성화할 수 없으므로 devnet을 사용할 수 없습니다.
  1. Supersim 설치하기를 따릅니다.
  2. --interop.relay 없이 Supersim을 실행합니다.
2

메시지 릴레이를 위한 상태 생성하기

이 단계의 결과는 autorelay를 켜지 않은 상태에서 메시지 전달 튜토리얼을 실행했을 때의 결과와 유사합니다.다음 스크립트를 실행합니다.
이 스크립트는 chain B에 Greeter.sol을, chain A에 GreetingSender.sol을 설치합니다. 이 스마트 컨트랙트를 사용하면 chain A에서 chain B로 릴레이되어야 하는 메시지를 보낼 수 있습니다.그런 다음 스크립트는 chain A에서 chain B로 메시지를 수동으로 릴레이하기 위한 ./manual-relay/sendAndRelay.sh를 생성합니다. 해당 스크립트는 아래에서 설명합니다.마지막으로, 이 스크립트는 계속 진행하기 전에 메인 셸에서 실행해야 하는 몇 가지 파라미터 설정 줄을 출력합니다. 새로 시작한 Supersim에서는 다음과 같아야 합니다.

API를 사용한 수동 릴레이

1

설정

Node 프로젝트를 사용합니다.
  1. 새 Node 프로젝트를 초기화합니다.
  1. 환경 변수를 export합니다.
2

수동 릴레이 앱

다음 내용으로 manual-relay.mjs 파일을 생성합니다.
JavaScript 프로그램을 실행합니다.
3

디버깅

특정 트랜잭션에 의해 어떤 메시지가 릴레이되었는지 확인하려면 다음을 사용합니다.

Manual relay using cast

manual-relay/sendAndRelay.sh에서 cast를 사용하여 수동으로 릴레이하는 예제를 확인할 수 있습니다. 이 과정은 다소 복잡하므로, 설정 단계에서 사용자 환경에 맞춘 스크립트를 생성합니다. 스크립트를 실행합니다.
자세한 설명은 다음과 같습니다.
  1. 구성 파라미터
    이것은 구성입니다. 사용자 주소의 nonce가 두 체인에서 동일하므로 greeter 주소도 동일합니다.
  2. 릴레이가 필요한 메시지 보내기
    chain A에서 chain B로 메시지를 보냅니다. $$는 프로세스 ID이므로, 스크립트를 다시 실행하면 정보가 바뀌는 것을 확인할 수 있습니다.
  3. 릴레이할 로그 항목 찾기
    L2ToL2CrossDomainMessenger는 다른 블록체인으로 메시지를 보낼 때마다 SentMessage 이벤트를 발생시킵니다. 로그에서 최신 SendMessage 이벤트만 추출합니다.
  4. 로그 항목을 가공하여 정보 얻기
    로그 topic을 하나의 16진수 문자열로 통합합니다.
    로그 항목에서 추가 필드를 읽습니다.
    전체 로그 항목을 통합합니다.
  5. 실행 메시지(executing message)를 위한 액세스 리스트 생성하기
크로스체인 메시징을 보호하고 잠재적인 서비스 거부(denial-of-service) 공격을 방지하기 위해, 릴레이 트랜잭션에는 메시지 데이터에서 파생된 체크섬을 포함하는 올바른 형식의 액세스 리스트가 필요합니다. 이를 통해 sequencer는 트랜잭션에서 어떤 실행 메시지를 예상해야 하는지 알 수 있으므로, 전송된 적 없는 메시지에 의존하여 유효하지 않은 트랜잭션을 쉽게 제외할 수 있습니다. (CrossL2Inbox에서) 액세스 리스트를 계산하는 알고리즘은 다소 복잡하지만, 이에 대해 걱정할 필요는 없습니다. Supersim은 포트 8420에서 이를 계산해 주는 RPC 호출을 제공합니다. 위 코드는 autorelay가 작동하지 않는 다른 interop 클러스터를 사용하는 경우에도 올바른 액세스 리스트를 계산합니다. 이는 이 코드가 외부 상태와 관계없이 일관된 결과를 생성하는 순수 함수(pure function)를 구현하기 때문입니다. 반면 admin_getAccessListByMsgHash RPC 호출은 순수 함수가 아니며, 시스템 상태에 의존하므로 이러한 상황에서는 유연성이 떨어집니다.
  1. 수동 릴레이가 필요함을 확인하기
    현재 인사말을 표시합니다. 메시지가 아직 릴레이되지 않았으므로 여전히 이전 인사말입니다.
  2. 실제로 메시지 릴레이하기
    L2ToL2CrossDomainMessenger에서 relayMessage를 호출하여 메시지를 릴레이합니다.
  3. 릴레이 결과 확인하기
    다시 현재 인사말을 표시합니다. 이제 새 인사말이 표시됩니다.

다음 단계

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