Layer 2는 어떻게 빠른 출금을 실현할까요? “조건부 거래”에 대해 알아보세요
이 글은 이더리움 애호가에 게시되었으며, 저자: Starkware, 번역: 아젠입니다.
이 글은 StarkEX가 빠른 인출(Fast Withdrawal)(Layer-2에서 임의의 Layer-1 주소로 한 블록 시간 내에 인출하는 것)을 지원하기 위해 제안한 솔루션을 설명하는 것을 목적으로 합니다. 이 솔루션의 장점은 속도가 L2 운영자가 유효성 증명을 생성하는 속도와 완전히 독립적이라는 점입니다.
빠른 인출 모듈은 이더리움 메인넷의 StarkEx에서 운영되고 있으며(2020년 10월 StarkEx 2.0 출시 이후), DeversiFi 거래소와 dYdX 거래소에 힘을 실어주고 있습니다.
아래에서 설명할 솔루션은 빠른 인출 외에도 매우 많은 사용 사례가 있습니다. 먼저 요구 사항이 무엇인지 알아보겠습니다.
요구 사항
블록체인은 두 당사자 간의 신뢰 없는 상호작용을 가능하게 합니다. Alice는 특정 조건이 충족될 때만 실행될 수 있는 거래를 게시하고 싶어합니다; Bob은 조건이 충족될 때 Alice의 거래를 직접 실행하고 싶어하며, 다시 Alice의 허가를 받을 필요가 없습니다. 우리는 이러한 상호작용 모델을 지원하는 구성 요소를 "조건부 거래(Conditional Transaction, CT)"라고 부릅니다.
L1에서 CT를 구현하는 것은 특별한 아이디어가 필요하지 않습니다. 스마트 계약이 시간과 거래 실행의 결합을 보장할 수 있기 때문입니다. 그러나 L2에서 구현해야 한다면 도전이 될 수 있습니다. 예를 들어, StarkEx에서 거래 발신자가 서명한 후 거래를 운영자에게 전달하는데, 운영자는 이 거래를 실행할 책임이 있습니다. 그러나 필요한 조건이 충족되기 전에 운영자가 이 거래를 실행하지 못하도록 하는 방법은 무엇일까요?
이 글에서는 L1 이벤트에 의존하는 L2에서의 CT 구현에만 집중합니다(기록: L2 | L1). 즉, 이러한 CT는 운영자가 특정 체인 상 이벤트가 발생한 후에만 서명된 거래를 실행할 수 있도록 보장해야 합니다. 더 나아가, 우리는 다른 L2 이벤트(기록: L21 | L22)에 의존하는 CT를 추가하여 StarkEx 인스턴스 간 및 StarkNet 내의 상호운용성을 지원할 것입니다.
이제 체인 상 이벤트의 개념을 형식화하고, StarkEx에서 CT가 이를 어떻게 활용하는지 살펴보겠습니다.
조건부 거래 개요
체인 상 이벤트 등록
CT는 체인 상 이벤트를 추적하기 위해 Fact Registry 계약을 사용합니다. 실제로, Fact Registry 계약에 등록된 이벤트만이 CT를 "잠금 해제"할 수 있습니다. 예를 들어, Alice가 이더리움 체인에서 Bob에게 1 ETH를 직접 전송했다면(즉, Fact Registry 계약을 통해서가 아니라면), CT는 실행 전제 조건을 충족할 수 없습니다.
위 사례에서 Fact Registry 계약은 transfer()
라는 함수를 필요로 하며, Alice는 Bob의 주소를 수신자로 전달합니다. transfer()
함수는 두 가지 작업을 수행합니다: (1) 전송할 ETH를 수신자에게 전송하고; (2) 이 전송에 대한 기록을 저장합니다. 예를 들어, 이 전송과 관련된 매개변수(발신자, 수신자, 금액)의 해시 값을 계약의 저장 항목에 저장합니다. Fact Registry 계약은 또한 해시 값을 매개변수로 받아들이고, 입력된 해시 값이 계약에 기록된 해시 값과 같으면 True
를 반환하는 isValid()
함수를 가지고 있습니다. 이렇게 계약 내의 해시 값은 어떤 사건이 발생했음을 증명하는 사실로 간주될 수 있습니다. Fact Registry 계약에 새로운 사실을 도입하는 이 과정을 일반적으로 "사실 등록"이라고 부릅니다.
서명된 CT에 포함된 체인 상 이벤트의 지문은 두 개의 필드(실제로는 이 두 매개변수의 해시 값)로 구성됩니다: (1) Fact Registry 계약의 주소; (2) 위 계약에서 기록해야 할 사실.
StarkEx 조건부 거래
StarkEx는 Layer-2의 거래를 일괄적으로 패키징하고, 체인에 전송된 STARK 증명을 사용하여 이러한 거래를 정산합니다. 만약 특정 배치에 CT가 포함되어 있다면, StarkEx는 관련 사실이 등록되었음을 보장하여 해당 배치의 거래를 정산할 수 있도록 합니다; 그렇지 않으면 전체 거래 배치는 롤백됩니다.
조건부 거래의 사례
이 섹션에서는 몇 가지 응용 사례를 제시하고 CT가 이러한 사례에서 어떻게 사용될 수 있는지 설명합니다.
상세 사례 ------ 빠른 인출
어떤 L2 솔루션에서든 L2에서 L1으로 자금을 인출하는 가장 기본적인 방법은 L2의 상태 업데이트를 최종화하는 것입니다(이 업데이트에는 인출 거래가 포함됩니다). 유효성 증명 기반 시스템(예: StarkEx)에서는 L2의 상태 업데이트를 최종화하기 위해 체인에 해당 업데이트에 대한 유효성 증명을 제출해야 하며, 일반적으로 10분이 소요됩니다. 이는 사용자가 이러한 방법으로 인출할 경우 최소 10분을 기다려야 함을 의미합니다.
빠른 인출의 목적은 이러한(인출이 L2 상태 업데이트에 대한) 의존성을 분리하여 사용자가 "블록 시간" 내에 신뢰 없이 자금을 인출할 수 있도록 하는 것입니다. 즉, 일반 이더리움 계약을 사용하는 것처럼 말입니다.
그렇다면 이 과정은 어떻게 이루어질까요? Alice가 L2에서 L1으로 1 ETH를 인출하고 싶다면, Alice는 L2에서 유동성 제공자(LP)에게 1 ETH를 전송하는 CT에 서명할 수 있으며, 조건은 LP가 L1에서 Alice에게 1 ETH(수수료를 제외한 금액)를 전송하는 것입니다. Alice의 CT는 그녀가 L1에서 전송을 받은 후에만 실행될 수 있으므로, 그녀는 상대방 위험에 직면하지 않습니다.
CT를 지원하는 간단한 Fact Registry 계약을 살펴보겠습니다:
이 계약에는 두 가지 기능을 가진 payabe 함수 transfer()
가 있습니다:
- 특정 수량의 ETH를 특정 주소로 전송
- keccack(amount, address, nonce) 등록
Alice가 발행한 CT는 keccack(1 ETH, Alice, nonce)가 Fact Registry에 등록된 후에만 실행될 수 있습니다. 그리고 이 사실은 Alice에게 1 ETH 전송이 발생한 후에만 성공적으로 등록될 수 있습니다. Alice는 신뢰 없이 1 ETH를 인출할 수 있으며, 전체 과정은 그녀의 서명과 LP가 이더리움 체인에서 시작한 거래만 필요합니다.
더 많은 응용 사례
유사한 프로세스는 다음과 같은 유형의 이벤트를 포착할 수 있으며, 따라서 L2의 CT는 더 많은 용도로 사용될 수 있습니다. 예를 들어:
ETH 가격이 1010 DAI로 떨어지면(체인에 등록된 알려진 정보 입력 서비스를 통해), Alice는 L2에서 1 ETH를 판매하고 L1에서 1000 DAI를 교환하고 싶어합니다.
Alice는 L2에서 Bob에게 10 ETH를 주고 싶어하며, 단 Bob이 Alice의 이름으로 Alice가 지정한 dApp(예: Aave 또는 Compound)에 9.5 ETH를 예치하기만 하면 됩니다.
Alice는 DeversiFi의 L2에서 Bob에게 10 ETH를 주고 싶어하며, 단 Bob이 dYdX의 L2에서 Alice의 계좌에 9.5 ETH를 예치하기만 하면 됩니다.
요약
CT의 첫 번째 용도는 빠른 인출이지만, StarkEx 운영자는 이 구성 요소를 사용하여 다양한 L2-L1 상호작용을 구현할 수 있습니다.