Delegate 交易不支持 TransferV3 的问题报告
问题概述
在使用 ArcBlock OCap SDK 创建委托(Delegate)交易时,发现 fg:t:transfer_v3 类型的权限无法在委托交易中使用,只能使用 fg:t:transfer_v2。这限制了我们使用 TransferV3 交易的多输出功能来实现支付分成场景。
业务背景
在 GLofter Hub 网络中,我们实现了以下支付分成流程:
- Studio 向 Hub 申请加入网络:Studio 需要支付订阅费用
- 支付分成机制:
- 90% 支付给 Hub(平台方)
- 10% 分成给应用开发者(factoryOwner)
- 使用 TransferV3 的多输出功能:在单笔交易中同时向多个接收方转账,实现自动分成
业务流程图
Studio (购买者)
↓ 支付订阅费用
TransferV3 交易(多输出)
├─ 90% → Hub (平台)
└─ 10% → Factory Owner (开发者分成)
委托交易创建
在 studio/api/src/services/delegate.service.ts 中,我们尝试创建委托交易,授权 Hub 可以从 Studio 账户执行 TransferV3 交易:
const [hash, address] = await client.delegate({
from: wallet,
to: fromAddress(hubAppId),
privileges: [
{
typeUrl: "fg:t:transfer_v3", // ❌ 不支持
},
],
});
测试验证
测试 1: 使用 fg:t:transfer_v3 创建委托交易
代码:
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 创建委托交易
代码:
await client.delegate({
from: userWallet,
to: fromAddress(hubAppId),
privileges: [
{
typeUrl: "fg:t:transfer_v2",
},
],
});
结果:✅ 成功
问题影响
当前限制
- 无法使用 TransferV3 的多输出功能:
- TransferV2 只支持单输出,无法在一笔交易中同时向多个接收方转账
- 需要使用两笔 TransferV2 交易来实现分成,增加了交易成本和复杂性
- 业务实现复杂性增加:
- 需要分别执行两笔转账交易
- 需要处理部分成功、部分失败的异常情况
- 增加了事务一致性的保证难度
- 用户体验影响:
- 用户需要确认多笔交易
- 交易确认时间增加
- 增加了失败的可能性
期望行为
我们希望能够在委托交易中使用 fg:t:transfer_v3 权限,以便:
- ✅ 授权 Hub 可以从 Studio 账户执行 TransferV3 交易
- ✅ 使用 TransferV3 的多输出功能实现支付分成
- ✅ 在单笔交易中完成支付和分成,保证原子性
建议解决方案
方案 1: 支持 TransferV3 委托权限(推荐)
在 ArcBlock 链上支持 fg:t:transfer_v3 作为委托权限类型,允许委托方授权被委托方执行 TransferV3 交易。
优点:
- 充分利用 TransferV3 的多输出功能
- 单笔交易完成支付和分成,保证原子性
- 降低交易成本和复杂度
实现要求:
- 链上协议支持
fg:t:transfer_v3作为委托权限类型 - SDK 支持在
client.delegate()中使用fg:t:transfer_v3
方案 2: 使用 TransferV2 + 额外交易(临时方案)
如果暂时无法支持 TransferV3 委托,可以:
- 使用
fg:t:transfer_v2创建委托 - Hub 执行两笔 TransferV2 交易:
- 第一笔:90% 转给 Hub
- 第二笔:10% 转给 Factory Owner
缺点:
- 需要两笔交易,成本增加
- 需要处理部分成功的情况
- 用户体验下降
总结
当前 ArcBlock OCap SDK 的委托交易功能不支持 fg:t:transfer_v3 权限类型,这限制了我们在支付分成场景中使用 TransferV3 多输出功能的优势。我们期望能够在委托交易中支持 TransferV3,以便更好地实现业务需求。
希望 ArcBlock 团队能够考虑支持这个功能,或者提供替代方案的建议。