ERC-5164 크로스체인 실행 표준 (Cross-Chain Execution)

Last Call · 기타 · 2022-06-14 작성

한 체인 위의 컨트랙트가 다른 EVM 체인의 컨트랙트에 메시지를 보내 코드를 실행하게 하는 공통 인터페이스를 정의합니다. 발신 쪽 디스패처와 수신 쪽 익스큐터 두 부품으로 구성됩니다.

왜 필요한가

이더리움 생태계의 많은 프로토콜은 여러 EVM 체인에 걸쳐 상태 변경을 조율해야 합니다. 체인 사이를 잇는 다리 역할의 서비스인 브리지(bridge)가 이미 있어서 한 체인의 컨트랙트가 다른 체인에서 코드를 실행할 수는 있지만 브리지마다 호출 방식(API)이 달라서 연동 코드를 브리지별로 따로 만들어야 합니다. 브리지마다 보안 수준, 속도, 제어 방식도 제각각입니다. 그래서 한 번 짠 크로스체인 코드를 다른 브리지에서 다시 쓰기 어렵습니다. 이 표준은 단순한 공통 규격을 정해 코드 재사용을 늘리고 여러 프로젝트가 같은 브리지 구현을 함께 쓸 수 있게 하려는 제안입니다.

구현해야 하는 것

심층 설명

두 부품 구조: MessageDispatcher와 MessageExecutor

표준은 두 인터페이스를 정의하고 구현체는 둘 다 구현해야 합니다. MessageDispatcher는 메시지를 보내는 원본 체인에 있고 전송 계층(transport layer)을 거쳐 하나 이상의 MessageExecutor 컨트랙트로 메시지를 중계합니다. MessageExecutor는 목적지 체인에 있으면서 발송된 메시지를 실행합니다. 디스패처와 익스큐터를 어떻게 짝지을지는 각 브리지가 정합니다. 사용자는 익스큐터 주소를 몰라도 dispatchMessage만 호출하면 메시지를 보낼 수 있습니다.

messageId 생성 규칙

메시지 또는 메시지 묶음마다 고유한 messageId를 반드시 생성해야 하며 이 식별자는 체인과 디스패처를 통틀어 고유해야 합니다(MUST). 원문은 chainId, dispatcherAddress, messageNonce 세 값의 튜플을 해시하는 방법을 제시하는데, 여기서 messageNonce는 메시지마다 1씩 늘어나는 정수입니다.

dispatchMessage의 의무 사항

디스패처는 메시지 발송 시 MessageDispatched 이벤트를 반드시 발생시켜야 하고(MUST) 지원하지 않는 toChainId가 들어오면 반드시 되돌려야 합니다(MUST). 메시지를 toChainId 위의 MessageExecutor로 반드시 전달해야 하고 메시지마다 고유한 messageId를 쓰며 발신자가 추적할 수 있도록 messageId를 반드시 반환해야 합니다. 수수료를 요구할 수 있으므로(MAY) 함수는 payable로 선언되어 있습니다. 일부 브리지는 네이티브 통화로 지불을 요구할 수 있기 때문입니다.

익스큐터의 실행 규칙: 중복 금지, 순서 비보장

익스큐터는 하나의 messageId를 두 번 이상 성공적으로 실행해서는 안 됩니다(MUST NOT). 이미 실행된 messageId가 다시 들어오면 반드시 되돌리고 MessageIdAlreadyExecuted 오류를 내보내는 것이 권장됩니다(SHOULD). 반면 실행 순서는 보장하지 않습니다. 메시지가 전송 계층을 비순차적으로 통과할 수 있기 때문에 messageId들이 어떤 순서로든 실행될 수 있습니다. 또 익스큐터는 모든 메시지 데이터를 브리지 전송 계층으로 검증하는 것이 권장됩니다(SHOULD).

실패 처리와 재시도

메시지 실행이 실패하면 익스큐터는 트랜잭션을 반드시 되돌려야 합니다(MUST). 그래야 나중에 같은 메시지를 다시 시도할 수 있습니다. 이때 MessageFailure(messageId, errorData) 커스텀 오류를 내보내는 것이 권장됩니다(SHOULD). 실행이 완료되면 MessageIdExecuted 이벤트를 반드시 발생시켜야 하며 클라이언트는 이 이벤트에 기록된 데이터로 메시지를 추적할 수 있습니다.

calldata 뒤에 붙는 발신자 정보

익스큐터는 메시지를 실행할 때 호출 데이터 뒤에 ABI 패킹된 (messageId, fromChainId, from)을 반드시 덧붙여야 합니다(MUST). 원문 코드로는 to.call(abi.encodePacked(data, messageId, fromChainId, from)) 형태입니다. 메시지를 받는 컨트랙트는 이 덧붙은 데이터를 읽어 어느 체인의 어느 주소가 보낸 메시지인지 검증할 수 있습니다.

제안 상태: Last Call

이 제안은 현재 Last Call 상태이며 마감일은 2023년 11월 15일로 표시되어 있습니다. 최종 확정(Final) 전 마지막 검토 단계이므로 세부 내용이 바뀔 가능성이 남아 있습니다.

쓸 때 주의할 점

ERC 원문 · ← ERCs