서명된 승인으로 결제
ERC-3009는 토큰 보유자가 메시지에 서명하여 전송을 승인할 수 있도록 합니다. 그러면 누구나 서명된 승인을 제출하여 온체인에서 전송을 실행할 수 있습니다. 발신자는 컨트랙트를 직접 호출할 필요가 없습니다.
이것은 Stable의 x402 결제 뒤에 있는 결제 메커니즘입니다.
어떤 문제를 해결하나요?
허용 문제
제3자 전송을 위한 전통적인 ERC-20 패턴은 approve + transferFrom 입니다. 발신자는 먼저 approve를 호출하여 지출 허용량을 부여한 다음, 제3자가 transferFrom을 호출하여 자금을 이동합니다. 여기에는 잘 알려진 문제가 있습니다.
- 두 번의 트랜잭션 필요: 발신자는 전송이 발생하기 전에 온체인
approve트랜잭션을 보내야 합니다. 이는 가스 비용을 발생시키고 지연을 추가합니다. - 무한 허용 위험: 반복되는 승인 트랜잭션을 피하기 위해 많은 애플리케이션은 무제한 지출 권한을 요청하여 상당한 보안 위험을 초래합니다.
ERC-3009는 다른 접근 방식을 취합니다. allowance를 부여하는 대신, 발신자는 특정 전송에 대한 일회성 승인에 서명합니다. 별도의 승인 단계도 없고, 남아 있는 지출 권한도 없습니다.
순차 논스 문제
ERC-2612 (permit)도 서명된 승인을 가능하게 하지만, 순차 논스를 사용합니다. 여러 permit은 순서 종속성을 가집니다. 논스 5가 사용되지 않으면 논스 6은 절대 실행될 수 없습니다.
ERC-3009는 고유 논스로 이 문제를 해결합니다. 각 승인은 순차 카운터 대신 32바이트 값을 사용합니다. 여러 승인은 서로 의존하지 않고 어떤 순서로든 독립적으로 생성되고 제출될 수 있습니다.
비교
| 속성 | ERC-20 (approve) | ERC-2612 (permit) | ERC-3009 |
|---|---|---|---|
| 온체인 단계 | 2 (approve + transferFrom) | 1 (transferFrom) | 1 (transferWithAuthorization) |
| 허용 모델 사용 | 필요 (온체인 트랜잭션) | 예 (permit을 통해 허용량 설정) | 필요 없음 (서명) |
| 논스 모델 | 순차 | 순차 | 고유 |
| 동시 승인 | 아니오 | 아니오 | 예 |
작동 방식
transferWithAuthorization
발신자는 전송 세부 정보가 포함된 EIP-712 유형 데이터 메시지에 서명합니다. 그러면 누구나 해당 서명된 메시지로 토큰 컨트랙트에서 transferWithAuthorization을 호출할 수 있습니다. 컨트랙트는 서명을 확인하고, 유효 기간을 확인하고, 전송을 실행하고, 논스를 사용된 것으로 표시합니다.
서명된 승인에는 다음이 포함됩니다.
from: 발신자(서명자)의 주소to: 수신자의 주소value: 전송 금액validAfter: 이 승인이 실행될 수 있는 가장 빠른 시간 (Unix 타임스탬프)validBefore: 이 승인이 실행될 수 있는 가장 늦은 시간 (Unix 타임스탬프)nonce: 고유성을 보장하는 32바이트 값
시간 창 (validAfter/validBefore)을 통해 발신자는 전송이 언제 발생할 수 있는지 정확하게 제어할 수 있습니다. 승인을 미래로 예약하거나, 기한을 정하거나, 둘 다 할 수 있습니다. 제출 전에 창이 만료되면 승인이 무효화되고 자금은 발신자에게 남습니다.
receiveWithAuthorization
이 함수는 transferWithAuthorization과 동일하게 작동하며, 한 가지 추가 확인 사항이 있습니다. 호출자는 수신자여야 합니다. 이는 제3자가 보류 중인 승인을 관찰하고 트랜잭션 순서를 조작하기 위해 먼저 제출하는 선행 공격을 방지합니다.
이것은 수신자(판매자 또는 서비스 제공업체)가 결제 시작을 담당해야 하는 결제 시나리오에서 유용합니다.
cancelAuthorization
발신자는 사용되지 않은 승인이 실행되기 전에 취소할 수 있습니다. 발신자는 EIP-712 취소 메시지에 서명하고, 컨트랙트는 전송을 실행하지 않고 논스를 사용된 것으로 표시합니다. 원래 승인은 더 이상 제출될 수 없습니다.
내장된 안전 속성
- 일회성 사용: 각 고유 논스는 한 번만 사용할 수 있습니다. 동일한 서명된 승인을 다시 제출하면 되돌려집니다.
- 시간 제한:
validAfter/validBefore창은 승인이 무기한 유효하지 않도록 보장합니다. - 자립적: 하나의 서명은 하나의 특정 수신자에게 하나의 특정 금액의 하나의 특정 전송을 승인합니다. 남아 있는 권한은 없습니다.
- 비수탁형: 제출자는 발신자의 자금을 절대 보유하지 않습니다. 전송은 컨트랙트 내에서 발신자에서 수신자로 직접 이동합니다.
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단계, 남아 있는 권한, 이중 지불 위험이 없습니다. - 고유 논스를 통해 여러 승인을 어떤 순서로든 동시에 생성하고 제출할 수 있습니다.
- Stable의 USDT0은 ERC-3009를 기본적으로 지원하며, USDT0만으로 결제가 완료될 수 있으므로 x402의 실용적인 기반을 제공합니다.

