Rayls에서 전송이 실패하면 내 토큰은 돌아올까?
크로스체인 전송에서 목적지 거래가 실패하면 출발지에서 처리된 토큰은 어떻게 될까?
$RLS 토큰을 다른 체인으로 옮길 때 출발지에서는 자산이 잠기거나 소각될 수 있다. 그런데 목적지에서 처리가 실패하면 자산 상태를 복구하는 절차가 필요하다.
Rayls의 공식 문서는 이 상황에 대응하는 복구 메커니즘을 설명한다. 하지만 공개 코드를 함께 살펴보면 추가로 확인해야 할 부분이 드러난다.
Public Chain 전송과 관련된 기존 계약 코드에도 폐기 표시가 있기 때문이다.
그렇다면 Rayls의 토큰 복구 기능은 현재 어떻게 구현돼 있을까?
공식 문서와 공개 코드를 비교해 봤다.
1. 공식 문서가 설명하는 토큰 복구 방식
Rayls의 공식 문서는 Sovereign과 Public Chain 사이의 전송 방식과 실패 처리 절차를 설명한다.
공식 문서:
https://docs.rayls.com/docs/connecting-rayls-sovereign-to-the-public-chain
이 경로는 Private Network Hub를 거치는 기관 간 전송 경로와 구분된다. Public Chain 경로는 별도의 계약 구성과 Public Relayer를 사용하며, RN 계열 계약을 통해 메시지를 처리한다.
전송 방향에 따라 자산 처리 방식도 달라진다.
Sovereign → Public Chain
• 출발지에서 토큰을 잠근다.
• 목적지에서 대응하는 토큰을 발행한다.
• 목적지 거래가 실패하면 복구 데이터를 이용해 출발지의 토큰을 해제하는 절차를 진행한다.
Public Chain → Sovereign
• 공개 체인에서 토큰을 소각한다.
• 목적지에서 기존에 잠겨 있던 토큰을 해제한다.
• 목적지 거래가 실패하면 공개 체인에서 토큰을 다시 발행하는 복구 절차를 진행한다.
공식 문서에 따르면 Public Relayer는 전송 과정에서 복구 데이터를 준비하고 저장한다. 이후 목적지 거래의 영수증 상태를 확인해 실행 실패가 확인되면, 저장된 복구 데이터를 사용해 출발지에서 복구 절차를 진행한다.
따라서 Rayls의 공식 문서에는 Public Chain 전송 실패에 대응하는 구체적인 복구 설계가 명시돼 있다.
하지만 문서에 설계가 설명돼 있다는 사실만으로 현재 메인넷에서 사용되는 구현과 실제 복구 성공 여부까지 확인할 수 있는 것은 아니다.
2. 공개 코드에서 발견한 폐기 표시
다음으로 Rayls Sovereign Contracts 저장소의 `RaylsErc20Handler.sol`을 살펴봤다.
코드:
https://github.com/raylsnetwork/rayls-sovereign-contracts/blob/main/src/rayls-protocol-sdk/tokens/RaylsErc20Handler.sol
이 파일에는 Public Chain 전송과 관련된 함수가 구현돼 있다.
• `teleportToPublicChain()` — Public Chain으로 토큰을 보내는 전송 경로
• `receiveTeleportFromPublicChain()` — Public Chain에서 온 전송을 처리하고 잠긴 토큰을 해제하는 경로
• `revertTeleportToPublicChain()` — 목적지에서 전송 처리가 완료되지 않았을 때 잠긴 토큰을 복구하는 경로
특히 `revertTeleportToPublicChain()`의 주석은 목적지에서 토큰 수령을 완료할 수 없는 경우 잠긴 토큰을 복구한다고 설명한다. 함수 내부에서도 잠긴 잔액을 해제하고 토큰을 원래 보낸 주소로 돌려주는 로직을 확인할 수 있다.
그런데 이 함수에는 다음과 같은 폐기 관련 주석이 붙어 있다.
`@custom:deprecated Decommissioning Teleport (vanilla, atomic).`
같은 파일의 다른 Teleport 관련 함수에도 유사한 표시가 존재한다.
즉, 폐기 표시가 기존 Private Network의 Teleport 코드에만 있는 것은 아니다. 공개된 기존 `RaylsErc20Handler`의 Public Chain 관련 함수에서도 확인된다.
이 부분은 현재 공식 문서와 함께 살펴볼 필요가 있다. 공식 문서는 Public Chain 경로의 복구 절차를 설명하지만, 공개된 기존 계약 코드에는 해당 전송과 복구를 처리하는 함수에 폐기 표시가 있기 때문이다.
그렇다고 곧바로 현재 Public Chain 복구 기능이 폐기됐다고 결론 내릴 수는 없다. 주석이 붙은 코드의 버전과 현재 운영 환경에서 사용되는 구현이 일치하는지 확인해야 하기 때문이다.
여기서 중요한 질문은 폐기 표시의 존재 자체가 아니라, 그 표시가 현재 운영 중인 Public Chain 전송 경로에 어떻게 적용되는가다.
3. 문서와 코드의 차이만으로 운영 상태를 판단할 수 있을까?
현재 확인한 자료는 세 가지로 나눌 수 있다.
① 공식 문서
Public Chain 전송 실패 시 복구 데이터를 이용해 토큰 상태를 복구하는 절차를 설명한다.
② 공개 계약 코드
기존 `RaylsErc20Handler.sol`에 전송 및 복구 로직이 구현돼 있다. 다만 관련 함수에는 폐기 표시도 존재한다.
③ 실제 운영 환경
공개된 코드와 현재 메인넷에 배포된 계약의 관계는 아직 입증하지 못했다.
이 자료만으로 복구 기능이 중단됐다고 판단하는 것은 성급하다. 폐기 주석만으로 현재 메인넷에서 어떤 계약과 버전이 사용되는지 알 수 없기 때문이다.
반대로 공식 문서에 복구 절차가 설명돼 있다는 이유만으로 현재 운영 환경에서 모든 실패가 성공적으로 복구된다고 보장할 수도 없다.
실제 운영 상태를 판단하려면 다음 항목을 연결해서 확인해야 한다.
• 현재 메인넷에서 사용되는 계약 주소
• 해당 주소에 배포된 계약의 구현 버전
• 실제 운영 중인 Public Relayer의 버전과 처리 경로
• 목적지 실행 실패와 출발지 복구 거래를 연결하는 실제 기록
이번 조사에서는 공식 문서의 복구 설계와 공개 코드의 관련 함수 및 폐기 표시를 확인했다. 그러나 운영 계약 주소와 구현 버전을 연결하고, 실제 실패 거래가 복구 완료까지 이어졌다는 메인넷 거래 사례를 입증하지는 못했다.
따라서 현재 근거로는 복구 기능이 정상 운영 중이라고 확정할 수도, 폐기됐다고 확정할 수도 없다.
결론: 복구 설계는 문서에 명시돼 있지만, 운영 상태는 추가 검증이 필요하다.
이번 조사에서 확인한 사실은 두 가지다.
첫째, Rayls의 공식 문서는 Public Chain 전송 실패에 대응하는 복구 절차를 설명한다.
둘째, 공개된 기존 `RaylsErc20Handler.sol`에는 관련 복구 로직이 구현돼 있지만, Public Chain 전송 및 복구와 관련된 함수에도 폐기 표시가 있다.
이 두 사실을 함께 살펴보면 현재 운영 상태를 판단하기 위해 무엇을 추가로 확인해야 하는지 분명해진다. 공개된 코드의 주석만으로 기능의 현재 상태를 단정하지 말고, 실제 배포 계약과 구현 버전, 복구 거래까지 연결해서 확인해야 한다.
현재 자료로 내릴 수 있는 결론은 Rayls의 공식 문서에 복구 설계가 명시돼 있고, 공개 코드에 관련 구현과 폐기 표시가 함께 존재한다는 것이다. 현재 메인넷에서 해당 기능이 어떤 버전으로 운영되는지, 실제 실패 거래에서 복구가 완료됐는지는 아직 입증하지 못했다.
토큰 전송의 안전성을 평가할 때는 복구 기능이 문서에 있다는 사실만으로 판단해서는 안 된다. 해당 기능이 현재 어떤 코드와 배포 환경에서 실행되는지까지 확인해야 한다.
참고 자료
• Rayls 공식 문서 — Connecting Rayls Sovereign to the Public Chain
https://docs.rayls.com/docs/connecting-rayls-sovereign-to-the-public-chain
• Rayls 공식 문서 — RaylsErc20Handler
https://docs.rayls.com/docs/raylserc20handler
• Rayls Sovereign Contracts — RaylsErc20Handler.sol
https://github.com/raylsnetwork/rayls-sovereign-contracts/blob/main/src/rayls-protocol-sdk/tokens/RaylsErc20Handler.sol
• Rayls Sovereign Relayer
https://github.com/raylsnetwork/rayls-sovereign-relayer
#RLS #Rayls