Skip to main content
ArcBlock Community

Delegate 交易不支持 TransferV3 的问题报告

shenxiuqiang
Support
bugdiscussionfeature

问题概述

在使用 ArcBlock OCap SDK 创建委托(Delegate)交易时,发现 fg:t:transfer_v3 类型的权限无法在委托交易中使用,只能使用 fg:t:transfer_v2。这限制了我们使用 TransferV3 交易的多输出功能来实现支付分成场景。

业务背景

在 GLofter Hub 网络中,我们实现了以下支付分成流程:

  1. Studio 向 Hub 申请加入网络:Studio 需要支付订阅费用
  2. 支付分成机制
  • 90% 支付给 Hub(平台方)
  • 10% 分成给应用开发者(factoryOwner)
  1. 使用 TransferV3 的多输出功能:在单笔交易中同时向多个接收方转账,实现自动分成

业务流程图

javascript
Studio (购买者)
    ↓ 支付订阅费用
TransferV3 交易(多输出)
    ├─ 90% → Hub (平台)
    └─ 10% → Factory Owner (开发者分成)

委托交易创建

在 studio/api/src/services/delegate.service.ts 中,我们尝试创建委托交易,授权 Hub 可以从 Studio 账户执行 TransferV3 交易:

javascript
const [hash, address] = await client.delegate({
  from: wallet,
  to: fromAddress(hubAppId),
  privileges: [
    {
      typeUrl: "fg:t:transfer_v3", // ❌ 不支持
    },
  ],
});

测试验证

测试 1: 使用 fg:t:transfer_v3 创建委托交易

代码

javascript
await client.delegate({
  from: userWallet,
  to: fromAddress(hubAppId),
  privileges: [
    {
      typeUrl: "fg:t:transfer_v3",
    },
  ],
});

结果:❌ 失败

错误信息:交易被拒绝或无法创建委托(Delegation type url is not allowed)

"GraphQLError: Delegation type url is not allowed"

测试 2: 使用 fg:t:transfer_v2 创建委托交易

代码

javascript
await client.delegate({
  from: userWallet,
  to: fromAddress(hubAppId),
  privileges: [
    {
      typeUrl: "fg:t:transfer_v2",
    },
  ],
});

结果:✅ 成功

问题影响

当前限制

  1. 无法使用 TransferV3 的多输出功能
  • TransferV2 只支持单输出,无法在一笔交易中同时向多个接收方转账
  • 需要使用两笔 TransferV2 交易来实现分成,增加了交易成本和复杂性
  1. 业务实现复杂性增加
  • 需要分别执行两笔转账交易
  • 需要处理部分成功、部分失败的异常情况
  • 增加了事务一致性的保证难度
  1. 用户体验影响
  • 用户需要确认多笔交易
  • 交易确认时间增加
  • 增加了失败的可能性

期望行为

我们希望能够在委托交易中使用 fg:t:transfer_v3 权限,以便:

  1. ✅ 授权 Hub 可以从 Studio 账户执行 TransferV3 交易
  2. ✅ 使用 TransferV3 的多输出功能实现支付分成
  3. ✅ 在单笔交易中完成支付和分成,保证原子性

建议解决方案

方案 1: 支持 TransferV3 委托权限(推荐)

在 ArcBlock 链上支持 fg:t:transfer_v3 作为委托权限类型,允许委托方授权被委托方执行 TransferV3 交易。

优点

  • 充分利用 TransferV3 的多输出功能
  • 单笔交易完成支付和分成,保证原子性
  • 降低交易成本和复杂度

实现要求

  • 链上协议支持 fg:t:transfer_v3 作为委托权限类型
  • SDK 支持在 client.delegate() 中使用 fg:t:transfer_v3

方案 2: 使用 TransferV2 + 额外交易(临时方案)

如果暂时无法支持 TransferV3 委托,可以:

  1. 使用 fg:t:transfer_v2 创建委托
  2. Hub 执行两笔 TransferV2 交易:
  • 第一笔:90% 转给 Hub
  • 第二笔:10% 转给 Factory Owner

缺点

  • 需要两笔交易,成本增加
  • 需要处理部分成功的情况
  • 用户体验下降

总结

当前 ArcBlock OCap SDK 的委托交易功能不支持 fg:t:transfer_v3 权限类型,这限制了我们在支付分成场景中使用 TransferV3 多输出功能的优势。我们期望能够在委托交易中支持 TransferV3,以便更好地实现业务需求。

希望 ArcBlock 团队能够考虑支持这个功能,或者提供替代方案的建议。

Reply