什麼是 paymaster?
作者 Alchemy
Paymaster 是一個智慧合約,為別人的 user operation 支付 gas。ERC-4337 引入它,是為了讓應用程式可以用鏈的原生代幣贊助費用,或讓使用者用 USDC 這類 ERC-20 代幣支付這些費用,而提交該操作的 bundler 仍然以原生代幣獲得償還。
工作就是這些。新使用者持有 USDC,沒有 ETH。兌換、鑄造,或第一次部署帳戶都不會開始,因為網路不接受發送者付不起的交易。Paymaster 就是按應用程式設定的規則承擔這筆費用的合約。
它不是錢包,也不是 bundler。發送者通常是 smart account。Bundler 是把 user operation 打包進一筆交易的鏈下服務。EntryPoint 是鏈上合約,檢查各方、執行呼叫,並償還 bundler。Paymaster 是同意為這筆償還出錢的一方。
什麼是 paymaster?
Paymaster 是一個 ERC-4337 合約,在 EntryPoint 上存有原生 gas 代幣的押金。當一筆 user operation 指定這個 paymaster 時,EntryPoint 從 paymaster 的押金裡扣費,而不是從發送者那裡扣。
User operation 把 paymaster 位址放在 paymasterAndData(較舊的 EntryPoint)裡,或放在分開的 paymaster 和 paymasterData 欄位裡(EntryPoint v0.7 及以後)。這些資料是 paymaster 識別自己已經核准的贊助的方式。在 Alchemy 的 paymaster 上,這段資料是 32 位元組打包的時間範圍,後面跟著 65 位元組的簽章。
沒有 paymaster 時,smart account 在做任何事之前必須持有 ETH,或該鏈用作 gas 的代幣。有了它,應用程式可以代付,使用者也可以用已經持有的代幣支付。
什麼時候應該使用 paymaster?
當執行操作的人不該必須持有該鏈的 gas 代幣時,使用 paymaster。
有兩個長期成立的理由。
贊助。應用程式來付。新使用者完成引導,活動承擔最初的操作,或者產品像金融科技隱藏卡組織費用那樣隱藏 gas。結算費用的,是 EntryPoint 上 paymaster 的押金。
ERC-20 支付。使用者用一種代幣支付,通常是穩定幣,paymaster 仍然用原生代幣向 bundler 結算。這種代幣不會變成該鏈的 gas 代幣。Paymaster 給出報價,收取代幣,並用自己的原生代幣押金向網路付款。
兩者可以同時運行:為一部分使用者贊助,讓另一部分使用者用 USDC 支付。由策略決定用哪一種。
Paymaster 如何運作?
Paymaster 自己從不提交交易。提交的是 bundler。EntryPoint 是呼叫 paymaster、再把錢還給 bundler 的合約。
一筆被贊助的 user operation 按這個順序進行:
- 發送者簽署一筆指定了 paymaster 的 user operation。
- Bundler 把一個 bundle 提交到
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 的押金向 bundler 付款。如果這筆操作沒有 paymaster,就由發送者自己的押金向 bundler 付款。

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 為應用程式贊助 gas 的模式。應用程式的後端,或 gas 策略服務,決定這個發送者、這次呼叫和這個成本被允許。合約信任的是簽章。Alchemy 的 Onchain Paymaster 策略按這個方式工作。策略核准 user operation,alchemy_requestGasAndPaymasterAndData 返回 paymaster 位址、已簽章的資料和 gas 估算。推薦的 Gas Sponsorship 策略不是這樣。它在 bundler 上贊助,不返回 paymaster 欄位。
驗證型 paymaster 也可以放在金融卡或法幣扣款後面。鏈下服務先確認付款。鏈上合約只看到一個簽章,表示費用已被覆蓋。
ERC-20 paymaster
ERC-20 paymaster 有時也叫 token paymaster 或 deposit paymaster,向使用者收取 ERC-20 代幣。EntryPoint 仍然從 paymaster 的押金裡,用原生代幣向 bundler 付款。postOp,或在某些設計裡的驗證步驟,收取代幣,以便補回押金。
匯率必須在使用者簽章之前固定。Alchemy 在贊助被簽章的那一刻鎖定 Token Prices By Address API 的報價,而不是在操作被打包上鏈時鎖定。簽章和被納入之間價格變動,會改變使用者已經同意的費用。
轉移代幣有兩種方式:
- 執行之後。這是起步應使用的模式。User operation 可以包含代幣授權,因此不需要單獨的授權交易。如果代幣轉帳失敗,整筆操作 revert,但贊助方仍然要對已使用的 gas 負責。先做模擬。模擬不是保證。
- 執行之前。轉帳發生在
validatePaymasterUserOp內部。Paymaster 必須已經有 allowance,來自更早的approve或 permit 簽章。缺少 allowance 時,操作會被拒絕。這會消耗更多 gas,並增加使用者能看見的一步。
兩種模式裡,付給 bundler 的都是 paymaster 的原生代幣押金。從使用者處收取 USDC,並不能去掉這筆押金。
錢包如何請求 paymaster 資料?
錢包不該各自發明一套私有的贊助 API。ERC-7677 是 paymaster 網路服務標準。應用程式傳入一個 paymaster 服務 URL。錢包在這個 URL 上呼叫兩個 JSON-RPC 方法:
pm_getPaymasterStubData返回佔位的 paymaster 欄位,讓錢包在使用者簽章之前估算 gas。pm_getPaymasterData返回將提交給 bundler 的已簽章 user operation 的最終欄位。
服務必須識別 EntryPoint 版本。v0.6 期望 paymasterAndData。v0.7 及以後期望 paymaster 和 paymasterData。
Alchemy 為 Onchain Paymaster 策略實作了這些 pm_ 方法。alchemy_requestGasAndPaymasterAndData 同時返回 paymaster 欄位和 gas 估算。alchemy_requestPaymasterAndData 是舊方法,正在被棄用。Bundler Sponsored Operations 不使用這些方法,也不返回 paymaster 欄位。
EIP-7702 取代了 paymaster 嗎?
沒有。EIP-7702 讓外部擁有帳戶在一筆交易期間,或直到帳戶更改這次委託之前,委託給智慧合約程式碼。帳戶可以批次呼叫並使用 smart account 的能力,而不必先部署一個單獨的合約錢包。仍然得有人支付 gas。
當這條路徑使用鏈上 paymaster 時,付款方仍然是那個 paymaster,提交方仍然是 bundler。部署在 0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108 的 EntryPoint v0.8 增加了原生的 EIP-7702 檢查:user operation 雜湊包含委託位址,EntryPoint 檢查委託是否相符。已發布的 Gas Manager 請求範例指向 0x0000000071727De22E5E9d8BAf0edAc6f37da032 的 EntryPoint v0.7。傳入你的帳戶所針對的 EntryPoint。Bundler 和 EntryPoint 仍然必須理解這次授權。
EIP-7702 讓現有的 EOA 也能使用贊助。它沒有從 ERC-4337 去掉 paymaster。Alchemy 推薦的 Gas Sponsorship 策略仍然可以覆蓋已委託的 EOA,這條路徑不把 paymaster 放進 user operation。那是 bundler 策略,不是對 EntryPoint 的改動。
如何限制被贊助的 gas?
沒有限制的贊助策略會覆蓋任何向它提出的請求。策略是放在 bundler 前面,或放在 paymaster 合約前面的允許和拒絕名單。
在 Gas Manager 上,一條贊助策略可以設定:
- 全域最大支出,以 USD 計
- 每個發送者的最大支出,以及每筆 user operation 的最大支出
- 被贊助操作的最大次數,全域和按發送者
- 發送者 allowlist 和發送者 blocklist
- 開始時間和結束時間
- 贊助到期時間,以毫秒計,也就是一次已簽章核准保持有效的時長
後兩項在鏈上 paymaster 上不同。開始和結束時間約束策略。到期時間約束一次 paymaster 簽章。Bundler Sponsored Operations 要求設定每筆 user operation 的最大支出,bundler 會重試到這個金額。這條路徑沒有 paymaster 簽章,所以到期時間從 bundler 接受 user operation 時開始。
對於不是支出上限的規則,掛上 webhook。Gas Manager 呼叫你的 URL,並用回應允許或拒絕操作。approveOnFailure 選擇這次呼叫出錯或逾時時怎麼做:如果你更想保持可用就核准,如果你更想嚴格就拒絕。預設是拒絕。
在控制台建立策略,或用 Gas Manager Admin API 建立。ERC-20 規則也是同一形狀,包括接受哪些代幣,以及是否在執行之後收款。
Alchemy 如何贊助 gas?
Gas Manager 持有策略。它並不總是鏈上 paymaster。
推薦的策略類型是 Gas Sponsorship,由 Bundler Sponsored Operations 支撐。BSO 在 bundler 透過 eth_sendUserOperation 收到已簽章的 user operation 時檢查該策略。User operation 不攜帶 paymaster 欄位,也沒有 paymaster 合約可呼叫。Bundler 承擔 gas,並重試提交,直到策略的每筆 user operation 最大支出。Rundler 是我們運行的開源 bundler。
Onchain Paymaster 策略是 EVM 上的另一種選擇。那是驗證型 paymaster。你在使用者簽章之前請求 paymaster 欄位,user operation 攜帶 paymaster 簽章,EntryPoint 從 paymaster 押金償還 bundler。
Wallet APIs 位於兩者之上,給那些不該手工組裝 user operation 的應用程式使用。把 BSO 策略 ID 傳給 smart wallet client,或傳給單次呼叫。SDK 按該策略贊助這次呼叫。在 EIP-7702 流程裡,wallet_prepareCalls 返回的是供使用者簽章的授權,不是 user operation,所以下面的 gas 欄位置零不適用於那裡。發送者是 smart account,或委託到 smart account 程式碼的 EOA。wallet_prepareCalls 和 wallet_sendCalls 仍然附上批次處理,以及 EIP-7702 委託。
用策略贊助 gas,而不是要求每個使用者都持有原生代幣。從 Gas Manager 開始,透過 Bundler 提交。當應用程式應當發送 smart account 呼叫、而不自己構造 user operation 時,使用 Wallet APIs。
如何發送 Bundler Sponsored Operation?
建立類型為 Bundler Sponsored Operations 的 Gas Manager 策略,並設定 Max Spend Per UO。這個上限是必需的。Bundler 會重試到這個金額。
低層整合用 eth_sendUserOperation 發送已簽章的 user operation。把策略 ID 放進 x-alchemy-policy-id 標頭,並把 maxFeePerGas、maxPriorityFeePerGas 和 preVerificationGas 設為 0。Bundler 把這些 0 當作填充 gas 並贊助該操作的訊號。不要為這條策略呼叫 alchemy_requestGasAndPaymasterAndData。BSO 的 user operation 沒有 paymaster 位址,也沒有 paymaster 簽章。
資格在 bundler 收到操作時決定。如果策略上限已經達到,發送會失敗。Bundler 接受之後,操作仍須在贊助到期之前進入 bundle。如果沒有,bundler 會捨棄它。
什麼時候使用鏈上 paymaster?
當 user operation 必須指定 paymaster 合約時,使用 Onchain Paymaster 策略。這包括 ERC-20 gas 支付:使用者用代幣付款,paymaster 仍然用原生代幣向 bundler 結算。用 alchemy_requestGasAndPaymasterAndData 或 ERC-7677 的 pm_ 方法請求欄位,然後透過 Bundler 提交。策略在使用者簽章之前檢查。Paymaster 簽章會到期,所以操作必須在這個視窗內發送。
贊助 gas 要花多少錢?
Gas Manager 已公布的費用,來自 Gas Manager FAQ:
- 每個方案的測試網贊助都免費。
- 免費方案不包含主網贊助。
- 按量付費在所覆蓋的主網 gas 之上加收 8%。在你購買 gas 額度或另行安排上限之前,沒有固定的主網額度。
- Enterprise 的費用和上限是客製的。
你覆蓋的 gas 會計入月度帳單。Gas 額度是一次性的 USD 購買,計入該帳單,並在用完之前結轉。用量提醒會在贊助上限的 50%、75%、90% 和 100% 發給帳單管理員。因為贊助按批核准,繁忙的策略可能在短時間內略微超出上限。
ERC-20 的 gas 支付計入同一上限。在鏈上 paymaster 上,鏈上結算的仍然是原生代幣押金。Bundler Sponsored Operations 不使用這筆押金。文件把 BSO gas 定價為鏈上結算成本,加上 bundler 重試和更快打包的服務費。
哪些網路支援 gas 贊助?
網路清單會隨著鏈的增加而變化。Gas Manager 和 Bundler 的支援以功能支援表為準。Bundler Sponsored Operations 運行在 Alchemy 提供 gas 贊助的每條鏈上,MegaETH 除外。ERC-20 gas 代幣按策略啟用。控制台清單不是上限:當 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。
Bundler 如何限制惡意 paymaster?
Paymaster 的儲存被使用它的同一個 bundle 裡的每筆操作共享。一次惡意的 validatePaymasterUserOp 可以讓該 bundle 中後面的操作失敗。這是針對 bundler 的拒絕服務,不是針對單個使用者。
ERC-4337 用聲譽評分和限流,以及一筆質押來應對。這筆質押不會被罰沒,也可以取出。它的存在是為了讓攻擊者不能為每次嘗試都廉價部署一個新的 paymaster。Bundler 也可以封鎖持續使其他操作失效的 paymaster。規則在 ERC-4337 的聲譽一節。
常見問題
ERC-4337 中的 paymaster 是什麼?
Paymaster 是為 user operation 支付 gas 的智慧合約。它把鏈的原生代幣存入 EntryPoint,在 validatePaymasterUserOp 中核准操作,並從這筆押金償還 bundler。它可以直接贊助費用,也可以向使用者收取 ERC-20 代幣,同時仍然用原生代幣向 bundler 結算。
Paymaster 和 bundler 有什麼區別?
Bundler 提交 user operation,並先向鏈付款。鏈上 paymaster 決定是否承擔這筆成本,並透過 EntryPoint 向 bundler 退款。Bundler Sponsored Operation 跳過 paymaster 合約。Bundler 在收到已簽章操作時檢查 Gas Manager 策略,並自己承擔 gas。應用程式需要的是策略,以及一個願意接受該操作的 bundler。只有鏈上路徑才需要 paymaster 合約,包括 ERC-20 gas 支付。
使用者可以用 USDC 支付 gas 嗎?
可以。ERC-20 paymaster 給出代幣價格,從 smart account 收取 USDC(或另一種已啟用的代幣),並用原生 gas 代幣向 bundler 付款。優先選擇執行後收款,這樣授權可以放進同一筆 user operation。如果這次轉帳失敗,操作會 revert,贊助方仍然欠這筆 gas。
EIP-7702 取代了 paymaster 嗎?
沒有。EIP-7702 讓 EOA 委託給合約程式碼。當 user operation 指定鏈上 paymaster 時,那個 paymaster 仍然為 bundler 提供資金,EntryPoint v0.8 會檢查委託。Alchemy 推薦的 Gas Sponsorship 策略可以覆蓋這個已委託的 EOA,而不在 user operation 上放置 paymaster。
Alchemy 贊助 gas 收多少錢?
測試網免費。主網贊助不在免費方案裡。按量付費是所覆蓋主網 gas 的 8%,前提是你加上額度或上限。Enterprise 定價是客製的。在為上線做預算之前,先在 Gas Manager FAQ 確認目前表格。
如何開始贊助 gas?
應用程式贊助 gas 時,建立一條 Gas Sponsorship 策略。它使用 Bundler Sponsored Operations。低層呼叫方把策略 ID 放進 x-alchemy-policy-id 標頭,並把 maxFeePerGas、maxPriorityFeePerGas 和 preVerificationGas 設為 0。Wallet APIs 呼叫方傳入同一個策略 ID,不組裝 paymaster 欄位。只有當 user operation 必須指定 paymaster 時,包括 ERC-20 gas,才使用 Onchain Paymaster 策略,以及 alchemy_requestGasAndPaymasterAndData 或 ERC-7677 的 pm_ 方法。先打開 BSO 指南、策略類型和策略規則。
相關總覽

打造區塊鏈魔法
Alchemy 結合最強大的 Web3 開發者產品與工具,並提供資源、社群與卓越的支援。


