ATEL
协议

A2B 子协议

AVIP Agent 对 Business 子协议 —— 链上承诺清单、策略门控执行,让 Agent 可以向没有 DID 的 Web2 商户付款。

AVIP · A2B 子协议

是什么

A2B 是 AVIP 的 Agent 对 Business 支付执行子协议。它规定了 AI Agent 如何代表用户或组织向 Web2 商户付款:资金由链上智能合约托管,整条流程的每一步都要对着签名 Intent 做策略校验。

A2B 里的对手方是一个传统 Web2 商户 —— 它有公开的 API 或 webhook,但没有 DID、没有链上身份、没有密码学签名。协议要做的,是约束 Agent 和 Platform,让 Web2 一方不被盲目信任,既拿不走用户的钱,也不会让用户失去追索权。

A2B vs A2A。 A2A 编排两个都签名的 Agent 之间的双向交换;A2B 构造的是单向清单 —— 只有 Agent 签名,商户的交付由 Platform 加目击数据来佐证。详细对比见 AVIP 总览。


提供什么

能力由什么交付
Agent 权限有边界签名 Intent 声明 maxAmount、deadline、allowedTools,可选 requiresConfirmAbove 阈值
策略门控执行Action Gateway 在每次工具调用到达商户前,逐一对着 Intent 校验
防篡改审计记录每次调用一条 ActionTrace 记录,哈希链 + Merkle 根
合约强制的资金流多格子链上清单,每格按序打勾才能放款
跑路自动退款任何人都能在截止时间后调 expireOrder,资金自动回到用户智能账户
密封交付商户交付物(礼品卡码、凭证、收据)用用户公钥加密,只锚定密文
链上可证CompletionProof 锚定审计根 + 裁决,供第三方核验

三幕流程

第一幕 · 声明Intent 签名 + 链上 order第二幕 · 执行Gateway 门控工具调用+ ActionTrace第三幕 · 结算合约清单 + 交付锚定
  • 第一幕 在链上登记 Agent 可以做什么(订单创建、资金预扣)。
  • 第二幕 把真正的工作过一遍策略门,每次工具调用产出一条 ActionTrace 记录。
  • 第三幕 把 Trace 汇成 Merkle 根,锚定 CompletionProof,清单打满才放款。

每一幕都产出链上证据。任一幕失败或超时,资金默认走退款路径 —— 用户永远不会失去托管权。


端到端工作流

上面的三幕流程是宏观形态。下面的端到端工作流展示 Action Gateway 如何对每次工具调用把关、合约清单如何逐槽推进,以及「交付或退款」的分支落在哪里:

拒绝放行是失败 / 超时Agent 签署 IntentmaxAmount · allowedTools · 截止时间 · userSA链上 createOrder状态 = CREATED用户智能账户存入 USDC状态 = FUNDEDAgent 通过 Action Gateway发起工具调用Gateway 策略校验工具在白名单? 在 scope? ≤ maxAmount? 已确认?写入 ActionTrace 拒绝记录(审计关键)链上提交发票商户地址 + 发票哈希状态 = INVOICE_COMMITTED按已提交发票执行支付状态 = PAID商户确认交付?confirmDelivery → DELIVERED用用户公钥密封交付物锚定 CompletionProofexpireOrder → EXPIRED退 USDC 回用户智能账户

只有当链下 Gateway 与链上合约同时同意时,资金才会向前推进;其余任何路径 —— 调用被拒、交付失败、或超过截止时间 —— 都会回到重试或由合约强制执行的退款。


步骤 1:Intent 与链上订单创建

A2B Intent 在通用 AVIP Intent 基础上扩展了支付执行相关的字段:

字段类型用途
intentIdstring唯一 id,intent_ 前缀
categorystring商户大类(如 gift_card)
maxAmountnumberAgent 可花的报价币种上限
deadlineUnixintUTC 秒数,过此自动过期
allowedToolsstring[]Agent 允许调用的工具白名单
requiresConfirmAbovenumber超过此阈值时,Agent 必须暂停等用户确认
scopestring[]商户 / SKU 过滤
userSAaddress用户智能账户(退款去向)
signaturestringAgent DID 的 Ed25519 签名

签名后,Platform 调 A2BOrderGateway.createOrder(intentHash, userAddr, maxAmount, deadline, data)。这会在链上登记订单,状态 = CREATED。后续任何一步偏离签名 Intent 都会被 Gateway 拒绝,或被合约拦下。

链上订单就是资金容器。没有合约清单推进,商户拿不到任何钱;而清单推进的前提是 Gateway 策略和合约自身不变式同时点头。


步骤 2:策略门控执行(Action Gateway)

Agent 所有工具调用都要走 Action Gateway —— 一个绑定到签名 Intent 的链下策略引擎。

每次调用,Gateway 都会校验:

  • 工具在 Intent 的 allowedTools 里。
  • 调用参数与 Intent 的 scope 和 maxAmount 一致。
  • 依赖的前置工具已经成功(比如 wallet.deposit 在 bitrefill.createInvoice 之前)。
  • 截止时间还没到。
  • 金额超过 requiresConfirmAbove 时,存在用户确认记录。

Gateway 给每次调用写一条 ActionTrace 记录,字段如下:

字段用途
intentId指回签名 Intent
sequence订单内单调递增计数
tool工具全名
args规范化后的参数
policyDecisionallow / deny / pending_user_confirm
ruleResults每条规则的 pass/fail 结果
previousHash上一条 ActionTrace 的哈希(形成链)
recordHash本条记录哈希

这些记录组成哈希链,以 Merkle 根收尾。篡改任一条都会让后面每个哈希失效、打破链上的 auditRoot。

Gateway 拒绝的调用也会持久化。deny 记录对审计至关重要 —— 它们证明系统是在拒绝越界尝试,而不是悄悄略过。


步骤 3:合约清单与结算

链上订单按一条固定的格子序列往前走。每个格子对应一次状态变更,而状态变更只在 Gateway 批准了对应工具调用时才可能发生。

CREATEDIntent 已签名FUNDED用户 SA 把 USDC存入合约INVOICE_COMMITTED商户支付地址+ 发票哈希已提交PAID支付执行DELIVERED商户交付确认

每次转换都是对 A2BOrderGateway 的一次独立链上交易。合约会拒绝不按清单顺序的转换(比如还没 INVOICE_COMMITTED 就想到 PAID)。

资金触到商户之前,合约必须看到一条金额 ≤ 存款的已提交发票,并且支付交易本身是从那条发票的字段构造出来的。 意思就是 Platform、Agent、商户三方都不能独立构造出一个不同的收款地址或金额。

其他终态:

格子何时进入
DELIVERED商户交付确认,审计根已锚定
FAILED商户报失败,资金路径重新打开走退款
EXPIRED截止时间过了没完成,expireOrder 被调用

步骤 4:完成证明与密封交付

商户确认交付时,有两件事在同一步里发生:

  1. 构造并锚定 CompletionProof,里面包含:

    • intentHash —— 签名 Intent 的哈希
    • auditRoot —— 所有 ActionTrace 记录的 Merkle 根
    • deliveryHash —— 商户侧交付确认的哈希
    • verdict —— DELIVERED / FAILED / EXPIRED
    • anchorTx —— Proof 写入 AnchorRegistry 的交易
  2. 商户交付物(如礼品卡码)用信封加密密封:

    • 一个新的对称密钥加密交付物
    • 对称密钥再用用户的长期公钥加密
    • 产生的 redemption_ciphertext 被保存;明文永远不存
    • 只有用户私钥能拆开信封

链上记录只存密文的哈希。密文本体在链下(Platform 数据库、IPFS 或用户设备)。这种设计让敏感的商户交付物保持私密,同时"确实交付了"这件事可核验。


超时自助退款:expireOrder

如果 deadlineUnix 过了订单还没关,任何人都能调 A2BOrderGateway.expireOrder(intentHash)。合约会:

  • 校验 block.timestamp > deadline
  • 把订单状态推到 EXPIRED
  • 把存入的 USDC 转回用户智能账户

退款不需要 Platform、Agent 或商户参与。只要世界上还有一个以太坊兼容节点,用户就能找回自己的钱。这就是协议层面的"抗跑路"。

部分失败也是一样:Agent 存完款就消失了,截止时间就是安全阀。


每笔交易的链上数据

一笔完整执行的 A2B 订单会产出多条链上记录:

记录类型锚定键数据
createOrderintentHashIntent 声明哈希 + 用户 SA + max + deadline
depositOrderintentHash存入 USDC 金额
commitInvoiceintentHash商户支付地址 + 金额 + 选择哈希 + 发票哈希
executePaymentintentHash审计根(所有 ActionTrace 的 Merkle 根)
confirmDeliveryintentHash交付哈希 + 成功标志
CompletionProofkeccak256("proof:a2b:" + intentHash)完整 CompletionProof JSON

一笔典型已交付订单会在 A2B 部署的 EVM 主网上产生若干次链上状态转换,外加一次 CompletionProof 锚定。

每个锚定下的富化数据

链上每条记录只存 32 字节哈希,而哈希背后的数据通过 ATEL 验证 API 发布:

  • GET /verify/v1/tx/{txHash} —— 按交易哈希查任意已锚定数据
  • GET /verify/v1/anchor?key={anchorKey} —— 按锚定键查

API 从返回数据重算哈希,确认是否和链上锚定对得上。第三方只要有一个交易哈希就能端到端审计整笔订单。

零信任审计命令

SDK 暴露三条命令,把审计逻辑在本地复现:

atel bitrefill verify-intent <intentId>
# Verifies the Intent's Ed25519 signature and checks that the on-chain
# Order exists with matching intentHash, userAddr, maxAmount, deadline.

atel bitrefill audit <intentId>
# Fetches all ActionTrace records, recomputes the Merkle root locally,
# compares against the on-chain auditRoot.

atel bitrefill proof <intentId>
# Fetches the CompletionProof anchor transaction, decodes the JSON,
# compares against the Platform-side verdict.

三条命令都是只读,跑在公开端点和区块链上。它们故意不需要 Platform 认证 —— 用户只要有 intent id 就能跑。


与 A2A 的关系

A2B 和 A2A 共享同一套密码学底座:

  • 都用 DID + Ed25519 签名做 Agent 身份。
  • 都用 AnchorRegistry 模式做链上承诺。
  • 都产出第三方可核验的 CompletionProof 结构。
  • 都支持 expireOrder 风格的超时兜底。

A2B 和 A2A 的差异:

方面A2AA2B
对手方签名 Agent(有 DID)Web2 商户(无 DID)
执行模型里程碑验证(多步 Agent 交付)合约清单原子操作
放款方式双边托管(EscrowManagerV2)链上 5 格清单(A2BOrderGateway)
争议处理仲裁流程基于截止时间的 expireOrder 退款
信任反馈双边信任分调整单向:用户拿审计证明,商户拿交付证明

两个子协议产出的证据,下游消费者(合规 API、跨平台审计流水线、第三方验证者)可以统一处理。


给集成方

On this page