Paymaster란?
작성자 Alchemy
Paymaster는 다른 사람의 user operation에 대한 가스를 내는 스마트 컨트랙트다. ERC-4337은 앱이 체인의 네이티브 토큰으로 수수료를 후원하거나, 사용자가 USDC 같은 ERC-20 토큰으로 그 수수료를 낼 수 있게 하려고 이것을 도입했다. 오퍼레이션을 제출한 번들러는 여전히 네이티브 토큰으로 상환받는다.
일이 전부 그것이다. 새 사용자는 USDC는 있고 ETH는 없다. 스왑도, 민트도, 첫 계정 배포도 시작되지 않는다. 네트워크는 전송자가 낼 수 없는 트랜잭션을 받지 않기 때문이다. Paymaster는 앱이 정한 규칙 아래에서 그 수수료를 내는 컨트랙트다.
지갑이 아니고, 번들러도 아니다. 전송자는 보통 스마트 계정이다. 번들러는 user operation을 하나의 트랜잭션으로 묶는 오프체인 서비스다. EntryPoint는 모두를 검사하고, 호출을 실행하고, 번들러에게 갚는 온체인 컨트랙트다. Paymaster는 그 상환에 자금을 대기로 한 쪽이다.
Paymaster란?
Paymaster는 EntryPoint에 네이티브 가스 토큰 예치를 둔 ERC-4337 컨트랙트다. User operation이 그 paymaster를 지목하면, EntryPoint는 전송자가 아니라 paymaster의 예치에서 수수료를 가져간다.
User operation은 paymaster 주소를 paymasterAndData(이전 EntryPoint)에 싣거나, 분리된 paymaster와 paymasterData(EntryPoint v0.7 이후)에 싣는다. 그 데이터는 paymaster가 이미 승인한 후원을 알아보는 방법이다. Alchemy paymaster에서 그 데이터는 32바이트로 묶인 시간 범위 뒤에 65바이트 서명이 온다.
Paymaster가 없으면 스마트 계정은 무엇을 하기 전에 ETH, 또는 그 체인이 가스로 쓰는 토큰을 가지고 있어야 한다. 있으면 앱이 내거나, 사용자가 이미 가진 토큰으로 낼 수 있다.
Paymaster는 언제 써야 하는가?
행동을 하는 사람이 체인의 가스 토큰을 들고 있지 않아도 될 때 paymaster를 쓴다.
오래 가는 이유는 두 가지다.
후원. 앱이 낸다. 새 사용자가 온보딩을 끝내거나, 캠페인이 첫 행동을 커버하거나, 제품이 카드 네트워크 수수료를 숨기는 핀테크처럼 가스를 숨긴다. 수수료를 정산하는 것은 EntryPoint에 있는 paymaster의 예치다.
ERC-20 결제. 사용자는 토큰, 흔히 스테이블코인으로 내고, paymaster는 여전히 번들러에게 네이티브 토큰으로 정산한다. 그 토큰이 체인의 가스 토큰이 되지는 않는다. Paymaster는 가격을 제시하고, 토큰을 가져가고, 자기 네이티브 토큰 예치로 네트워크에 낸다.
둘은 동시에 돌 수 있다. 일부 사용자는 후원하고, 다른 사용자는 USDC로 내게 한다. 어느 쪽인지는 정책이 정한다.
Paymaster는 어떻게 동작하는가?
Paymaster는 트랜잭션을 직접 제출하지 않는다. 번들러가 한다. EntryPoint가 paymaster를 호출한 다음 번들러에게 갚는다.
후원된 user operation의 순서는 이렇다.
- 전송자가 paymaster를 지목한 user operation에 서명한다.
- 번들러가 번들을
EntryPoint.handleOps에 제출한다. - EntryPoint는 paymaster의 예치가 그 오퍼레이션의 최악 비용을 커버하는지 확인한다. 예치가 너무 낮으면 오퍼레이션은
AA31 paymaster deposit too low로 실패한다. - EntryPoint는 전송자의
validateUserOp를 호출한다. Paymaster가 내기 때문에, 이 오퍼레이션을 위해 계정에 자금을 예치하라고 요구하지 않는다. - EntryPoint는 paymaster의
validatePaymasterUserOp를 호출한다. Paymaster가 거부하면 오퍼레이션은 실행되지 않는다. - EntryPoint가 전송자의 호출을 실행한다.
- 검증이 비어 있지 않은 context를 반환하면, EntryPoint는
postOp를 호출해 paymaster가 정산하게 한다. 예를 들어 ERC-20 토큰을 가져온다. - EntryPoint는 paymaster의 예치에서 번들러에게 낸다. Paymaster가 없었다면 전송자 자신의 예치가 번들러에게 낸다.

Paymaster는 어떤 함수를 구현해야 하는가?
Paymaster 인터페이스에는 함수가 두 개 있다.
validatePaymasterUserOp는 검증 중에 돈다. User operation, 그 해시, 최대 비용을 받는다. Context 바이트 배열과 검증 결과를 반환한다. 비어 있지 않은 context는 실행 뒤에 postOp가 돌아야 한다는 신호다. 빈 context는 정산할 것이 남지 않았다는 뜻이다.
postOp는 호출 뒤에, 그리고 그 context가 비어 있지 않았을 때만 돈다. ERC-20 paymaster가 전송자로부터 토큰을 옮기는 곳이다. 호출이 revert되어도 돌아서, paymaster가 실패에 반응할 수 있다. Mode 인자가 어느 경우인지 알려 준다.
두 함수 모두 EntryPoint가 아닌 호출자를 거부해야 한다. 어디서든 호출을 받는 paymaster는 승인한 적 없는 오퍼레이션을 후원하도록 속을 수 있다.
Paymaster에는 어떤 종류가 있는가?
ERC-4337은 공식 제품을 두 개 정의하지 않는다. 인터페이스를 하나 정의한다. 팀은 누가 낼지 정하는 주체와, 사용자에게 무엇을 청구하는지로 paymaster를 나눈다.
검증형 paymaster
검증형 paymaster는 오프체인 서비스에 오퍼레이션 승인을 요청한 다음, 그 승인을 온체인에서 확인한다. 보통의 확인은 user operation에 대한 서명이며, 나중에 재사용할 수 없도록 시간 창에 묶는 경우가 많다.
이것이 앱을 위해 가스를 후원하는 온체인 paymaster의 패턴이다. 앱 백엔드, 또는 가스 정책 서비스가 이 전송자, 이 호출, 이 비용을 허용한다고 정한다. 컨트랙트가 신뢰하는 것은 서명이다. Alchemy의 Onchain Paymaster 정책은 이렇게 동작한다. 정책이 user operation을 승인하고, alchemy_requestGasAndPaymasterAndData가 paymaster 주소, 서명된 데이터, 가스 추정을 반환한다. 권장하는 Gas Sponsorship 정책은 다르다. 번들러에서 후원하고, paymaster 필드를 반환하지 않는다.
검증형 paymaster는 카드나 법정화폐 결제 뒤에 둘 수도 있다. 오프체인 서비스가 먼저 결제를 확인한다. 온체인 컨트랙트가 보는 것은 수수료가 커버되었다는 서명뿐이다.
ERC-20 paymaster
ERC-20 paymaster는 토큰 paymaster 또는 예치 paymaster라고도 불리며, 사용자에게 ERC-20 토큰으로 청구한다. EntryPoint는 여전히 paymaster의 예치에서 네이티브 토큰으로 번들러에게 낸다. postOp, 또는 어떤 설계에서는 검증 단계가 예치를 다시 채울 수 있도록 토큰을 걷는다.
환율은 사용자가 서명하기 전에 고정되어야 한다. Alchemy는 오퍼레이션이 채굴될 때가 아니라, 후원에 서명하는 순간에 Token Prices By Address API의 견적을 잠근다. 서명과 포함 사이에 가격이 움직이면, 사용자가 이미 동의한 수수료가 바뀐다.
토큰을 옮기는 방법은 두 가지다.
- 실행 후. 시작하기에 맞는 모드다. User operation에 토큰 승인을 넣을 수 있어서, 별도의 승인 트랜잭션이 없다. 토큰 전송이 실패하면 오퍼레이션 전체가 revert되지만, 사용된 가스의 책임은 후원자에게 남는다. 먼저 시뮬레이션한다. 시뮬레이션은 보장이 아니다.
- 실행 전. 전송은
validatePaymasterUserOp안에서 일어난다. Paymaster는 이전approve나 permit 서명으로 받은 allowance를 이미 가지고 있어야 한다. Allowance가 없으면 오퍼레이션은 거부된다. 가스가 더 들고, 사용자가 보는 단계가 하나 늘어난다.
두 모드 모두 번들러에게 지급되는 돈은 paymaster의 네이티브 토큰 예치다. 사용자에게서 USDC를 가져가도 그 예치의 필요는 없어지지 않는다.
지갑은 paymaster 데이터를 어떻게 요청하는가?
지갑이 후원용 사설 API를 각자 만들 필요는 없다. ERC-7677은 paymaster 웹 서비스 표준이다. 앱이 paymaster 서비스 URL을 넘긴다. 지갑은 그 URL에서 JSON-RPC 메서드 두 개를 호출한다.
pm_getPaymasterStubData는 사용자가 서명하기 전에 지갑이 가스를 추정할 수 있도록 더미 paymaster 필드를 반환한다.pm_getPaymasterData는 번들러에 제출할 서명된 user operation의 최종 필드를 반환한다.
서비스는 EntryPoint 버전을 알아내야 한다. v0.6은 paymasterAndData를 기대한다. v0.7 이후는 paymaster와 paymasterData를 기대한다.
Alchemy는 Onchain Paymaster 정책을 위해 그 pm_ 메서드를 구현한다. alchemy_requestGasAndPaymasterAndData는 paymaster 필드와 가스 추정을 함께 반환한다. alchemy_requestPaymasterAndData는 이전 메서드이며 지원이 종료되는 중이다. Bundler Sponsored Operations는 이 메서드를 쓰지 않고, paymaster 필드도 반환하지 않는다.
EIP-7702가 paymaster를 대체했는가?
아니다. EIP-7702는 외부 소유 계정이 한 트랜잭션 동안, 또는 그 위임을 바꿀 때까지 스마트 컨트랙트 코드에 위임하게 한다. 별도의 컨트랙트 지갑을 먼저 배포하지 않고도 계정은 호출을 묶고 스마트 계정 기능을 쓸 수 있다. 가스를 낼 누군가는 여전히 필요하다.
그 흐름이 온체인 paymaster를 쓰면, 내는 쪽은 여전히 그 paymaster이고 제출하는 쪽은 여전히 번들러다. 0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108에 배포된 EntryPoint v0.8은 EIP-7702 검사를 네이티브로 더한다. User operation 해시에 위임 주소가 들어가고, EntryPoint는 위임이 일치하는지 확인한다. 공개된 Gas Manager 요청 예제가 가리키는 것은 0x0000000071727De22E5E9d8BAf0edAc6f37da032의 EntryPoint v0.7이다. 계정이 전제로 하는 EntryPoint를 넘긴다. 번들러와 EntryPoint는 그 인가를 이해해야 한다.
EIP-7702는 기존 EOA에도 후원을 쓸 수 있게 했다. ERC-4337에서 paymaster를 없애지는 않았다. Alchemy의 권장 정책인 Gas Sponsorship은 위임된 EOA도 커버할 수 있고, 그 경로에서는 user operation에 paymaster를 싣지 않는다. 그것은 번들러 정책이지, EntryPoint의 변경이 아니다.
후원 가스는 어떻게 제한하는가?
제한이 없는 후원 정책은 요청받은 것을 무엇이든 커버한다. 정책은 번들러 앞, 또는 paymaster 컨트랙트 앞에 두는 허용과 거부 목록이다.
Gas Manager에서 후원 정책은 다음을 설정할 수 있다.
- 전체 최대 지출, USD
- 전송자당 최대 지출, 그리고 user operation당 최대 지출
- 후원하는 오퍼레이션의 최대 건수, 전체와 전송자당
- 전송자 allowlist와 전송자 blocklist
- 시작 시각과 종료 시각
- 후원 만료, 밀리초. 서명된 승인이 유효한 시간이다
마지막 둘은 온체인 paymaster에서 다르다. 시작과 종료는 정책을 묶는다. 만료는 paymaster 서명 하나를 묶는다. Bundler Sponsored Operations는 user operation당 최대 지출을 필수로 한다. 번들러는 그 금액까지 재시도한다. 이 경로에는 paymaster 서명이 없으므로, 만료는 번들러가 user operation을 수락한 때 시작한다.
지출 한도가 아닌 규칙에는 webhook을 붙인다. Gas Manager가 URL을 호출하고, 응답으로 오퍼레이션을 허용하거나 거부한다. approveOnFailure는 그 호출이 오류를 내거나 시간이 초과되면 어떻게 할지를 고른다. 계속 살아 있고 싶으면 승인, 엄격하게 가고 싶으면 거부다. 기본값은 거부다.
정책은 대시보드에서 만들거나 Gas Manager Admin API로 만든다. ERC-20 규칙도 같은 형태이며, 어떤 토큰을 받고 회수가 실행 뒤에 일어나는지를 포함한다.
Alchemy는 가스를 어떻게 후원하는가?
Gas Manager는 정책을 가진다. 언제나 온체인 paymaster인 것은 아니다.
권장 정책 유형은 Gas Sponsorship이고, Bundler Sponsored Operations가 그것을 뒷받침한다. BSO는 번들러가 eth_sendUserOperation으로 서명된 user operation을 받을 때 그 정책을 검사한다. User operation은 paymaster 필드를 담지 않고, 호출할 paymaster 컨트랙트도 없다. Bundler가 가스를 부담하고, 정책의 user operation당 최대 지출까지 제출을 재시도한다. Rundler는 우리가 운영하는 오픈 소스 번들러다.
Onchain Paymaster 정책은 EVM에서의 다른 선택이다. 이것은 검증형 paymaster다. 사용자가 서명하기 전에 paymaster 필드를 요청하고, user operation은 paymaster 서명을 담으며, EntryPoint는 paymaster 예치에서 번들러에게 갚는다.
Wallet APIs는 user operation을 손으로 조립하지 않아야 하는 앱을 위해 둘 위에 있다. BSO 정책 ID를 스마트 월렛 클라이언트에 넘기거나, 호출 한 번에 넘긴다. SDK는 그 호출을 정책 아래에서 후원한다. EIP-7702 흐름에서 wallet_prepareCalls가 반환하는 것은 사용자가 서명할 인가이지, user operation이 아니다. 그래서 아래의 가스 필드 제로화는 거기 적용되지 않는다. 전송자는 스마트 계정이거나, 스마트 계정 코드에 위임한 EOA다. wallet_prepareCalls와 wallet_sendCalls는 여전히 배칭과 EIP-7702 위임을 붙인다.
모든 사용자에게 네이티브 토큰을 요구하는 대신 정책으로 가스를 후원한다. Gas Manager로 시작하고, Bundler로 제출하고, 앱이 user operation을 직접 만들지 않고 스마트 계정 호출을 보내야 하면 Wallet APIs를 쓴다.
Bundler Sponsored Operation은 어떻게 보내는가?
유형을 Bundler Sponsored Operations로 한 Gas Manager 정책을 만들고, Max Spend Per UO를 설정한다. 그 상한은 필수다. 번들러는 그 금액까지 재시도한다.
저수준 통합은 서명된 user operation을 eth_sendUserOperation으로 보낸다. 정책 ID를 x-alchemy-policy-id 헤더에 넣고, maxFeePerGas, maxPriorityFeePerGas, preVerificationGas를 0으로 둔다. 번들러는 그 0을, 가스를 채우고 오퍼레이션을 후원하라는 신호로 다룬다. 이 정책에는 alchemy_requestGasAndPaymasterAndData를 호출하지 않는다. BSO user operation에는 paymaster 주소도 paymaster 서명도 없다.
자격은 번들러가 오퍼레이션을 받을 때 정해진다. 정책 한도에 이미 도달했으면 전송은 실패한다. 번들러가 수락한 뒤에도, 오퍼레이션은 후원 만료 전에 번들에 들어가야 한다. 들어가지 않으면 번들러가 그것을 버린다.
온체인 paymaster는 언제 쓰는가?
User operation이 paymaster 컨트랙트를 지목해야 할 때 Onchain Paymaster 정책을 쓴다. ERC-20 가스 결제도 여기에 포함된다. 사용자는 토큰으로 내고, paymaster는 여전히 번들러에게 네이티브 토큰으로 정산한다. alchemy_requestGasAndPaymasterAndData 또는 ERC-7677 pm_ 메서드로 필드를 요청한 다음 Bundler로 제출한다. 정책은 사용자가 서명하기 전에 검사된다. Paymaster 서명은 만료되므로, 오퍼레이션은 그 창 안에서 보내야 한다.
후원 가스는 얼마인가?
Gas Manager FAQ에 공개된 Gas Manager 수수료는 이렇다.
- 테스트넷 후원은 모든 플랜에서 무료다.
- 무료 플랜에는 메인넷 후원이 없다.
- Pay as you go는 커버한 메인넷 가스에 8%를 더한다. 가스 크레딧을 사거나 한도를 정하기 전까지 상시 메인넷 허용량은 없다.
- Enterprise 수수료와 한도는 별도다.
커버한 가스는 월 청구서에 더해진다. 가스 크레딧은 한 번의 USD 구매이며, 그 청구서에 적용되고 쓰일 때까지 이월된다. 사용량 알림은 후원 한도의 50%, 75%, 90%, 100%에서 청구 관리자에게 간다. 후원은 배치로 승인되므로, 바쁜 정책은 한도를 아주 잠깐 조금 넘길 수 있다.
ERC-20 가스 결제도 같은 한도에 포함된다. 온체인 paymaster에서는 온체인 정산이 여전히 네이티브 토큰 예치다. Bundler Sponsored Operations는 그 예치를 쓰지 않는다. 문서는 BSO 가스를, 온체인 정산 비용에 번들러의 재시도와 더 빠른 포함을 위한 서비스 수수료를 더한 값으로 가격을 매긴다.
어느 네트워크가 가스 후원을 지원하는가?
네트워크 목록은 체인이 추가될 때마다 바뀐다. Gas Manager와 Bundler 지원은 기능 지원 표를 따른다. Bundler Sponsored Operations는 Alchemy가 가스 후원을 제공하는 모든 체인에서 동작하고, MegaETH는 빠진다. ERC-20 가스 토큰은 정책마다 켠다. 대시보드 목록이 상한은 아니다. Token Prices By Address API에 가격이 있거나, 소수 자릿수가 같은 참조 토큰을 지정하면 Admin API로 커스텀 토큰을 추가할 수 있다.
배포 주소는 EntryPoint 버전과 새 네트워크에 따라 움직인다. 복사한 목록 대신, 사용 중인 네트워크의 Gas Manager 문서에 있는 주소를 쓴다.
Solana에 paymaster가 있는가?
ERC-4337의 것은 없다. Solana에는 EntryPoint도 user operation도 없다. Gas Manager는 그래도 Solana 수수료를 후원한다. alchemy_requestFeePayer가 트랜잭션에 대한 fee payer 서명과 수수료 및 rent 추정을 반환한다. 제품이 하는 일은 같고, 앱이 네트워크 수수료를 낸다. 메커니즘은 paymaster가 아니다. Solana 트랜잭션을 validatePaymasterUserOp에 향하게 하지 마라.
번들러는 악의적인 paymaster를 어떻게 제한하는가?
Paymaster의 스토리지는 그것을 쓰는 번들 안의 모든 오퍼레이션이 공유한다. 적대적인 validatePaymasterUserOp 하나가 그 번들의 이후 오퍼레이션을 실패하게 만들 수 있다. 이것은 한 사용자에 대한 것이 아니라 번들러에 대한 서비스 거부다.
ERC-4337은 평판 점수와 스로틀링, 그리고 스테이크로 답한다. 스테이크는 슬래시되지 않고, 인출할 수 있다. 공격자가 시도마다 새 paymaster를 싸게 배포하지 못하게 하려고 있다. 다른 오퍼레이션을 계속 무효화하는 paymaster를 번들러가 차단할 수도 있다. 규칙은 ERC-4337의 평판 절에 있다.
자주 묻는 질문
ERC-4337에서 paymaster란?
Paymaster는 user operation의 가스를 내는 스마트 컨트랙트다. 체인의 네이티브 토큰을 EntryPoint에 예치하고, validatePaymasterUserOp에서 오퍼레이션을 승인하고, 그 예치에서 번들러에게 갚는다. 수수료를 그대로 후원하거나, 사용자에게서 ERC-20 토큰을 걷고도 번들러에게는 네이티브 토큰으로 정산할 수 있다.
Paymaster와 번들러의 차이는?
번들러는 user operation을 제출하고 체인에 먼저 낸다. 온체인 paymaster는 그 비용을 커버할지 정하고, EntryPoint를 통해 번들러에게 환급한다. Bundler Sponsored Operation은 paymaster 컨트랙트를 건너뛴다. 번들러는 서명된 오퍼레이션을 받을 때 Gas Manager 정책을 검사하고, 스스로 가스를 부담한다. 앱에 필요한 것은 정책과, 그 오퍼레이션을 받을 번들러다. Paymaster 컨트랙트가 필요한 것은 온체인 경로뿐이며, ERC-20 가스 결제도 포함된다.
사용자가 USDC로 가스를 낼 수 있는가?
낼 수 있다. ERC-20 paymaster는 토큰 가격을 제시하고, 스마트 계정에서 USDC(또는 켠 다른 토큰)를 가져온 뒤 네이티브 가스 토큰으로 번들러에게 낸다. 승인을 같은 user operation에 넣을 수 있도록 실행 후 회수를 택한다. 그 전송이 실패하면 오퍼레이션은 revert되고, 후원자는 그래도 가스를 빚진다.
EIP-7702가 paymaster를 대체했는가?
아니다. EIP-7702는 EOA가 컨트랙트 코드에 위임하게 한다. User operation이 온체인 paymaster를 지목하면 그 paymaster가 여전히 번들러에 자금을 댄다. EntryPoint v0.8은 위임을 검사한다. Alchemy의 권장 정책인 Gas Sponsorship은 그 위임된 EOA를 user operation 위의 paymaster 없이 커버할 수 있다.
Alchemy는 가스 후원에 얼마를 청구하는가?
테스트넷은 무료다. 메인넷 후원은 무료 플랜에 없다. Pay as you go는 크레딧이나 한도를 더한 뒤, 커버한 메인넷 가스의 8%다. Enterprise 가격은 별도다. 출시 예산을 잡기 전에 Gas Manager FAQ의 현재 표를 확인한다.
가스 후원은 어떻게 시작하는가?
앱이 가스를 후원하려면 Gas Sponsorship 정책을 만든다. 그것은 Bundler Sponsored Operations를 쓴다. 저수준 호출자는 정책 ID를 x-alchemy-policy-id 헤더로 보내고, maxFeePerGas, maxPriorityFeePerGas, preVerificationGas를 0으로 둔다. Wallet APIs 호출자는 같은 정책 ID를 넘기고 paymaster 필드는 만들지 않는다. User operation이 paymaster를 지목해야 할 때만, ERC-20 가스를 포함해, Onchain Paymaster 정책과 alchemy_requestGasAndPaymasterAndData 또는 ERC-7677 pm_ 메서드를 쓴다. 먼저 열 문서는 BSO 가이드, 정책 유형, 정책 규칙이다.
관련 개요

블록체인 매직을 만드세요
Alchemy는 가장 강력한 Web3 개발자 제품 및 도구를 리소스, 커뮤니티, 그리고 전설적인 지원과 결합합니다.


