Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

서명된 인가로 정산하기

ERC-3009는 토큰 보유자가 메시지에 서명하여 전송을 인가할 수 있게 합니다. 그러면 누구든지 그 서명된 인가를 제출하여 온체인에서 전송을 실행할 수 있습니다. 송신자는 컨트랙트를 직접 호출할 필요가 전혀 없습니다.

이것은 Stable에서 x402 결제를 뒷받침하는 정산 메커니즘입니다.

어떤 문제를 해결하나요?

허용량(allowance) 문제

제3자 전송을 위한 전통적인 ERC-20 패턴은 approve + transferFrom입니다. 송신자는 먼저 approve를 호출하여 지출 허용량을 부여한 다음, 제3자가 transferFrom을 호출하여 자금을 옮깁니다. 여기에는 잘 알려진 문제들이 있습니다:

  • 두 개의 트랜잭션 필요: 송신자는 어떤 전송이 일어나기 전에 먼저 온체인 approve 트랜잭션을 보내야 합니다. 이는 가스 비용이 들고 지연이 추가됩니다.
  • 무한 허용량 위험: 반복적인 승인 트랜잭션을 피하기 위해 많은 애플리케이션이 무제한 지출 권한을 요청하며, 이는 심각한 보안 위험을 만듭니다.

ERC-3009는 다른 접근 방식을 취합니다. 허용량을 부여하는 대신, 송신자는 특정 전송에 대한 일회성 인가에 서명합니다. 별도의 승인 단계도, 남아있는 지출 권한도 없습니다.

순차 nonce 문제

ERC-2612(permit) 역시 서명된 인가를 가능하게 하지만, 순차 nonce를 사용합니다. 여러 permit는 순서 의존성을 가집니다: nonce 5가 소비되지 않으면, nonce 6은 절대 실행될 수 없습니다.

ERC-3009는 이를 고유 nonce로 해결합니다. 각 인가는 순차 카운터 대신 32바이트 값을 사용합니다. 여러 인가가 서로 의존하지 않고, 어떤 순서로든 독립적으로 생성되고 제출될 수 있습니다.

비교

속성ERC-20 (approve)ERC-2612 (permit)ERC-3009
온체인 단계2 (approve + transferFrom)1 (transferFrom)1 (transferWithAuthorization)
허용량 모델 사용필요 (온체인 tx)예 (permit을 통해 허용량 설정)불필요 (서명)
Nonce 모델순차순차고유
동시 인가아니오아니오

작동 방식

transferWithAuthorization

송신자는 전송 세부 정보를 담은 EIP-712 타입 데이터 메시지에 서명합니다. 그러면 누구든지 그 서명된 메시지로 토큰 컨트랙트의 transferWithAuthorization를 호출할 수 있습니다. 컨트랙트는 서명을 검증하고, 유효 기간을 확인하고, 전송을 실행하고, nonce를 사용됨으로 표시합니다.

서명된 인가에는 다음이 포함됩니다:

  • from: 송신자(서명자)의 주소
  • to: 수신자의 주소
  • value: 전송 금액
  • validAfter: 이 인가가 실행될 수 있는 가장 이른 시점 (Unix 타임스탬프)
  • validBefore: 이 인가가 실행될 수 있는 가장 늦은 시점 (Unix 타임스탬프)
  • nonce: 고유성을 보장하는 32바이트 값

시간 기간(validAfter/validBefore)은 송신자에게 전송이 언제 일어날 수 있는지에 대한 정밀한 제어권을 줍니다. 인가는 미래로 예약하거나, 마감 기한을 정하거나, 둘 다 할 수 있습니다. 제출 전에 기간이 만료되면 인가는 무효가 되고 자금은 송신자에게 남습니다.

receiveWithAuthorization

이 함수는 transferWithAuthorization와 동일하게 작동하지만, 한 가지 추가 검사가 있습니다: 호출자는 반드시 수신자여야 합니다. 이는 제3자가 대기 중인 인가를 관찰하고 먼저 제출하여 트랜잭션 순서를 조작하는 프런트러닝 공격을 방지합니다.

이는 수신자(가맹점 또는 서비스 제공자)가 정산을 개시하는 주체여야 하는 결제 시나리오에서 유용합니다.

cancelAuthorization

송신자는 사용되지 않은 인가가 실행되기 전에 이를 취소할 수 있습니다. 송신자가 EIP-712 취소 메시지에 서명하면, 컨트랙트는 전송을 실행하지 않고 nonce를 사용됨으로 표시합니다. 원래의 인가는 더 이상 제출될 수 없습니다.

내장된 안전 속성

  • 일회성 사용: 각 고유 nonce는 한 번만 사용할 수 있습니다. 동일한 서명된 인가를 다시 제출하면 되돌려집니다(revert).
  • 시간 제한: validAfter/validBefore 기간은 인가가 무기한 유효하게 남지 않도록 보장합니다.
  • 자기 완결성: 하나의 서명은 하나의 특정 수신자에게 하나의 특정 금액에 대한 하나의 특정 전송을 인가합니다. 남아있는 권한이 없습니다.
  • 비수탁(Non-custodial): 제출자는 송신자의 자금을 절대 보유하지 않습니다. 전송은 컨트랙트 내에서 송신자로부터 수신자에게 직접 이동합니다.

Stable에서의 ERC-3009

Stable의 USDT0는 ERC-3009를 기본적으로 구현합니다. 어떤 애플리케이션이든 추가 컨트랙트나 릴레이 인프라를 배포하지 않고도 transferWithAuthorization를 사용할 수 있습니다.

단일 자산 정산

이더리움에서는 ERC-3009를 사용하더라도 제출자가 transferWithAuthorization를 호출하는 가스를 지불하기 위해 ETH가 필요합니다. 전송 자체는 USDT이지만, 실행은 별도의 네이티브 자산에 의존합니다.

Stable에서는 USDT0가 결제 토큰이자 가스 토큰 역할을 동시에 합니다. 인가부터 온체인 정산까지 전체 결제 라이프사이클이 단일 스테이블코인 위에서 실행됩니다. 어떤 단계에서도 별도의 네이티브 자산이 필요하지 않습니다.

이 속성이 바로 Stable에서의 ERC-3009를 상위 수준 결제 프로토콜을 위한 강력한 기반으로 만드는 요소입니다. x402는 이를 직접 활용하여, 표준 HTTP 통신 내에서 ERC-3009를 온체인 정산 메커니즘으로 사용합니다.

핵심 요약

  • ERC-3009는 토큰 보유자가 메시지에 서명하여 전송을 인가할 수 있게 합니다. 누구든지 그 서명된 인가를 제출하여 전송을 실행할 수 있습니다.
  • 이는 ERC-20 허용량 모델을 일회성 사용, 자기 완결적 인가로 대체합니다. approve 단계도, 남아있는 권한도, 이중 지출 위험도 없습니다.
  • 고유 nonce는 여러 인가가 어떤 순서로든 동시에 생성되고 제출될 수 있게 합니다.
  • Stable의 USDT0는 ERC-3009를 기본적으로 지원하며, USDT0만으로 정산을 완료할 수 있기 때문에 x402를 위한 실용적인 기반을 제공합니다.
함께 보기: