进阶

代付交易 (PayingForTx)

让第三方支付交易手续费,加速用户引流

为什么需要代付交易?

PayingForTx(又称 Meta-Transaction)是一个非常强大且高效的解决方案,对于引入新用户至关重要

通过使用 PayingForTx,你可以为用户承担交易手续费,让他们无需持有 AE 代币就能与你的 dApp 交互。

工作原理
  1. 用户签名内部交易

    你希望为其支付费用的用户(如新用户)使用专门的内部交易签名对内部交易(如 ContractCallTx)进行签名。

  2. 收集签名交易

    你收集用户签名的内部交易。

  3. 包装并广播

    将内部交易包装进 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 可以嵌套任意类型的交易