进阶
代付交易 (PayingForTx)
让第三方支付交易手续费,加速用户引流
为什么需要代付交易?
PayingForTx(又称 Meta-Transaction)是一个非常强大且高效的解决方案,对于引入新用户至关重要。
通过使用 PayingForTx,你可以为用户承担交易手续费,让他们无需持有 AE 代币就能与你的 dApp 交互。
工作原理
-
用户签名内部交易
你希望为其支付费用的用户(如新用户)使用专门的内部交易签名对内部交易(如
ContractCallTx)进行签名。 -
收集签名交易
你收集用户签名的内部交易。
-
包装并广播
将内部交易包装进
PayingForTx,然后广播到网络。手续费由你支付。
用户签名 → 收集 → 包装 → 广播
支持的交易类型
PayingForTx 可以包装协议支持的任何类型的交易作为内部交易:
-
SpendTx -
ContractCallTx -
ContractCreateTx
-
NamePreclaimTx -
NameClaimTx -
NameUpdateTx
-
OracleRegisterTx -
OracleQueryTx - ... 更多
使用示例
官方提供了两个 Node.js 示例:
基本流程代码
import { AeSdk, Node, AccountMemory, Tag, buildTxAsync } from '@aeternity/aepp-sdk';
// 1. 用户方:签名内部交易
const userAccount = new AccountMemory(USER_SECRET_KEY);
const innerTx = await buildTxAsync({
tag: Tag.SpendTx,
senderId: userAccount.address,
recipientId: 'ak_recipient...',
amount: 100,
onNode: node,
});
// 用内部交易专用方式签名
const signedInnerTx = await userAccount.signTransaction(innerTx, {
networkId: 'ae_uat',
innerTx: true, // 关键!标记为内部交易签名
});
// 2. 付款方:包装并广播
const payerAccount = new AccountMemory(PAYER_SECRET_KEY);
const aeSdk = new AeSdk({
nodes: [{ name: 'testnet', instance: node }],
accounts: [payerAccount],
});
// 构建 PayingForTx
const payingForTx = await aeSdk.payForTransaction(signedInnerTx);
console.log('交易哈希:', payingForTx.hash);
应用场景
游戏开发者
快速引入新玩家,无需让他们先获取代币。
治理应用
让用户免费参与重要提案投票。
托管服务
为客户提供手续费代付增值服务。
推广活动
空投、首次体验等营销场景。
关键要点
- 用户签名时必须设置
innerTx: true使用内部交易专用签名 - 付款方账户需要有足够的 AE 支付手续费
- 内部交易的 nonce 必须正确
- PayingForTx 可以嵌套任意类型的交易