什麼是元交易(ERC-2771)?
所有 Ethereum 交易都會使用 gas,每筆交易的發送方都必須持有足夠的 Ether 來支付所消耗的 gas。這使得新使用者必須先購買 Ether(這本身就不容易)才能開始使用 dapp,是使用者入門過程中的一大障礙。
所謂的「Meta transactions」讓代替使用者支付 gas 費用成為可能。
不過,許多此類方案正轉向 Account Abstraction(ERC-4337)基礎設施,因為它是更有前景、更成熟的 gas 抽象化方式,還提供更多功能。
什麼是 meta transactions?
Meta Transactions 的概念很簡單:由第三方(稱為 Relayer)代替使用者發送交易,並支付 gas 費用。
使用者簽署訊息(最好是符合 EIP-712 規範),訊息中包含要執行的交易資訊。
已簽署的訊息會傳給 Relayer,由 Relayer 負責驗證自己是否會獲得報酬(這一步可能是選擇性的,稍後會說明)、確認是否有足夠資金支付 gas 費用、簽署一筆原生交易,並提交執行。
我們以 OpenZepplin 的 Relayer 為例來理解 Meta Transactions:

meta transaction 請求長什麼樣子?
以下是一個範例 Meta Transaction 訊息……

上面的訊息用來鑄造一個 NFT,並由地址 0x7099797... 簽署。
訊息簽署完成後,客戶端(或使用者)就可以建立一個 Meta Transaction 請求(如下所示)。這會以 POST 請求的形式送到 Autotask,這是一個 webhook,被呼叫時會在內部使用 Relayer 的私鑰簽署原生交易。

什麼是 meta transaction relayer?
Relayer 是一個 Ethereum 帳戶,內含用來替使用者支付 gas 費用的資金。該帳戶的私鑰儲存在服務供應商伺服器上的安全金庫中。
開發者可以將資金轉入 Relayer,用來支付使用者的交易費用。
開發者可以視需要建立任意數量的 Relayer,每個 Relayer 都需要各自注入 ETH。
OZ Relay 支援暫停 Relayer、只接受白名單地址的請求,以及設定 gas 價格上限。若有需要,還可以在 Autotask 中加入更多條件邏輯。
要注意的是,使用者定義的交易現在存放在 Relayer 原生交易的 data 欄位中。Meta Transaction 本質上就是包在另一筆交易裡的交易!
meta transactions 中的 MinimalForwarder 是什麼?
到目前為止,還沒有進行過任何鏈上驗證,這正是 MinimalForwarder 派上用場的地方。
MinimalForwarder 是一個鏈上智能合約,用來驗證使用者簽署的訊息,確保其有效性並防止重放攻擊。
struct ForwardRequest {
address from;
address to;
uint256 value;
uint256 gas;
uint256 nonce;
bytes data;
}
function verify(ForwardRequest calldata req, bytes calldata signature) public view returns (bool) {
address signer = _hashTypedDataV4(
keccak256(
abi.encode(
_TYPEHASH,
req.from,
req.to,
req.value,
req.gas,
req.nonce,
keccak256(req.data)
)
)
).recover(signature);
return _nonces[req.from] == req.nonce && signer == req.from;
}驗證成功後,MinimalForwarder 會以適當的 calldata 呼叫請求的合約來執行該交易
function execute(ForwardRequest calldata req, bytes calldata signature)
public
payable
returns (bool, bytes memory)
{
require(verify(req, signature), "MinimalForwarder: signature does not match request");
_nonces[req.from] = req.nonce + 1;
(bool success, bytes memory returndata) = req.to.call{gas: req.gas, value: req.value}(abi.encodePacked(req.data, req.from));
// Validate that the relayer has sent enough gas for the call.
// See
if (gasleft() <= req.gas / 63) {
// We explicitly trigger invalid opcode to consume all gas and bubble-up the effects, since
// neither revert or assert consume all gas since Solidity 0.8.0
//
/// @solidity memory-safe-assembly
assembly {
invalid()
}
}
return (success, returndata);
}Meta Transactions 的缺點也在這裡浮現:被 MinimalForwarder 呼叫的合約,必須允許 MinimalForwarder 代替使用者呼叫該合約。
什麼是 ERC-2771?
最後,當呼叫抵達目標合約時,該合約需要能夠識別出巢狀在 Relayer 交易裡的原始使用者(msg.sender)與 calldata(msg.data)。為了將這個流程標準化,ERC2771 因此被提出。
OpenZepplin 提供了一個名為 ERC2771Context 的工具合約,讓智能合約開發者能輕鬆地從 MinimalForwarder 送出的資料中,取出真正的 msg.sender 與 msg.data。
contract YourContract is ERC2771Context {
constructor(MinimalForwarder forwarder, string memory uri_)
ERC2771Context(address(forwarder))
{}
// Depending on whether the call is made by the `MinimalForwarder` or not the `msg.sender` and `msg.data` will be inferred accordingly
}因為每個智能合約都必須知道如何讀取 Meta Transactions,為已部署的合約實作這項功能相當困難,也可能因此引入 bug!
儘管市面上還有許多其他的 Meta Transaction 基礎設施服務,但它們全都要求目標合約繼承基於 EIP-712 或 EIP-2771 的合約,才能推導出 msg.sender 與 msg.data。
雖然這個標準很好,但它無法回溯適用於既有合約。這正是為什麼 ERC-4337 被創造出來,並正在取代大多數現有的 ERC-2771 解決方案。
常見問題
什麼是 meta transactions?
Meta transactions 讓稱為 Relayer 的第三方能代替使用者發送交易並支付 gas 費用,消除了使用者在與 應用程式 互動前必須持有 Ether 的門檻。
meta transactions 是如何運作的?
使用者簽署包含交易資訊的訊息,這些訊息會傳給 Relayer,由 Relayer 驗證請求、支付 gas 費用、簽署原生交易,並提交至區塊鏈執行。
什麼是 ERC-2771?
ERC-2771 是一項標準,讓智能合約能在透過可信任的 forwarder 接收 meta transactions 時,識別出原始使用者與 calldata,確保正確萃取 msg.sender 與 msg.data。
meta transactions 中的 MinimalForwarder 是什麼?
MinimalForwarder 是一個鏈上智能合約,會先驗證使用者簽署訊息的真實性並防止重放攻擊,再透過呼叫目標合約來執行該交易。
什麼是 ERC2771Context?
ERC2771Context 是 OpenZeppelin 提供的工具合約,讓智能合約開發者能輕鬆地從 MinimalForwarder 送出的 meta transactions 中,取出真正的 msg.sender 與 msg.data。
ERC-2771 meta transactions 有哪些限制?
ERC-2771 要求目標合約必須明確繼承基於 EIP-712 或 EIP-2771 的合約才能支援該標準,這使得為已部署的合約實作這項功能十分困難,也可能因此引入 bug。
ERC-2771 與 ERC-4337 相比如何?
雖然 ERC-2771 能透過 relayer 與 forwarder 實現免 gas 交易,但 ERC-4337(Account Abstraction)正在取代大多數 ERC-2771 解決方案,因為它能回溯適用,且不需要修改既有合約。
relayer 在 meta transactions 中扮演什麼角色?
Relayer 是一個 Ethereum 帳戶,負責替使用者支付 gas 費用,其私鑰安全地儲存在服務供應商的伺服器上,並可設定白名單、gas 價格上限、條件邏輯等功能。
相關總覽
錢包2026年9月2日
代理錢包:AI 代理的工作階段與權限模型
AI 代理如何在不持有私鑰的情況下,取得範圍受限、可撤銷的錢包存取權限:工作階段、委派簽署與即時撤銷。
錢包2026年7月29日
別再把私鑰貼進 Cursor:如何為你的 coding agent 建立錢包
為你的 coding agent 建立錢包,但不用把私鑰交給它。了解 Alchemy CLI agent wallets 如何透過限定範圍的 session,讓 agent 在 .env 中沒有私鑰的情況下完成交易。
錢包2026年6月24日
什麼是加密貨幣 Bundler?
加密貨幣 Bundler 會將多筆交易或操作合併為一次鏈上提交,涵蓋批次處理、MEV、rollups、代幣發行與帳戶抽象化等場景。

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