Agent 支付栈:参考架构
四个链上原语。三种可组合流程。构建 Ergo 上 Agent 对 Agent 支付所需的一切——从单次 API 调用到完整的社区货币。
四个核心原语
Reserve · Note · Tracker · Predicate
Reserve
资本支撑
一个链上合约,持有 ERG 或代币作为抵押品。任何人都可以随时验证准备金比率。Reserve 就是银行——没有中间人。
- 持有 ERG / 原生代币
- 随时可审计
- 按 1:1 或部分准备金支持 Note 发行
- 赎回由合约强制执行
{
// Reserve contract: allow withdrawal only
// if redemption note is burned
val noteBox = INPUTS(1)
val burnCheck = noteBox.tokens.size == 0
sigmaProp(burnCheck && SELF.R4[Long].get > 0)
}Note
可编程 IOU
代表对 Reserve 索赔权的持有人代币。Note 可以转让、拆分和赎回。Acceptance Predicate 定义谁可以接收或赎回 Note。
- 持有人票据——不需要身份
- 点对点可转让
- 可从 Reserve 合约赎回
- 可以任何代币计价
{
// Note: transferable by holder,
// redeemable against reserve
val holder = SELF.R4[GroupElement].get
val isHolder = proveDlog(holder)
val isRedemption = INPUTS.exists { box =>
box.tokens.exists(_._1 == reserveId)
}
isHolder || isRedemption
}Tracker
链上记账
跟踪从 Reserve 发行的所有 Note 的累计余额、信用使用和赎回历史。可以把它看作任何人都可以验证的公共账本。
- 跟踪已发行与已赎回总量
- 强制执行信用额度
- 公开可审计
- 可与其他合约组合
{
// Tracker: ensure running total
// doesn't exceed credit limit
val limit = SELF.R4[Long].get
val used = SELF.R5[Long].get
val newUsed = used + INPUTS(0).value
sigmaProp(newUsed <= limit)
}Acceptance Predicate
可编程信任规则
Agent 接受 Note 作为支付的条件。条件可以包括任务哈希验证、截止日期检查、凭证证明或任何链上数据。
- 任意接受条件
- 任务哈希验证
- 截止日期强制执行
- 可与 Sigma 证明组合
{
// Accept note only if:
// 1. Task hash matches R4
// 2. Deadline not passed
val taskHash = SELF.R4[Coll[Byte]].get
val deadline = SELF.R5[Int].get
val inputHash = INPUTS(0).R4[Coll[Byte]].get
val onTime = HEIGHT <= deadline
sigmaProp(taskHash == inputHash && onTime)
}示例流程
三种可组合流程
流程 A:Agent 购买 API 调用
一次调用。一个证明。无需持久账户。
- 1
Agent 创建 Note
0.001 ERG 面值,提供者地址在 R4
- 2
提供者检查 Predicate
验证 Note 价值、Reserve 支持、截止日期
- 3
提供者交付响应
返回 API 结果,标记 Note 已使用
- 4
结算
Note 销毁,ERG 从 Reserve 释放给提供者
// Fleet SDK: create a note for API payment
import { TransactionBuilder, OutputBuilder, SAFE_MIN_BOX_VALUE } from "@fleet-sdk/core"
const noteBox = new OutputBuilder(
1_000_000n, // 0.001 ERG
NOTE_CONTRACT_ADDRESS
)
.setAdditionalRegisters({
R4: SGroupElement(providerPubKey), // recipient
R5: SLong(BigInt(HEIGHT + 100)), // deadline
R6: SColl(SByte, taskHashBytes), // task identifier
})
const tx = new TransactionBuilder(currentHeight)
.from(inputs)
.to(noteBox)
.sendChangeTo(agentAddress)
.payMinFee()
.build()流程 B:Agent 信用支付
部署 Reserve。发行 Note。Tracker 监控。
- 1
部署 Reserve
在 Reserve 合约中锁定 ERG 并设定信用额度
- 2
发行 Note
针对 Reserve 创建 Note,上限为信用额度
- 3
Agent 使用 Note
Note 转给提供者,Tracker 更新
- 4
自动结算
达到阈值时,Reserve 自动结算未偿 Note
// Deploy a reserve with 10 ERG, 100 ERG credit limit
const reserveBox = new OutputBuilder(
10_000_000_000n, // 10 ERG collateral
RESERVE_CONTRACT_ADDRESS
)
.setAdditionalRegisters({
R4: SLong(100_000_000_000n), // 100 ERG credit limit
R5: SLong(0n), // issued so far
R6: SGroupElement(ownerKey), // reserve controller
})
// Issue a note against the reserve
const noteBox = new OutputBuilder(
1_000_000_000n, // 1 ERG face value
NOTE_CONTRACT_ADDRESS
)
.setAdditionalRegisters({
R4: SGroupElement(agentKey), // holder
R5: SColl(SByte, reserveId), // backing reserve
})流程 C:社区 Reserve + Tracker
本地市场、计算合作社、Agent 网络。
- 1
社区部署 Reserve
社区成员池化 ERG
- 2
发行社区 Note
成员按贡献比例获得 Note
- 3
本地商业
Note 在社区内流通,Predicate 定义规则
- 4
赎回
成员随时从 Reserve 赎回 Note 换取 ERG
// Community reserve: multiple funders
const communityReserve = new OutputBuilder(
TOTAL_POOLED_ERG,
MULTISIG_RESERVE_CONTRACT
)
.setAdditionalRegisters({
R4: SColl(SGroupElement, memberKeys), // governance
R5: SInt(3), // 3-of-5 threshold
R6: SColl(SByte, communityTokenId), // community token
})
// Acceptance predicate: only members of community
const memberPredicate = `{
val isMember = CONTEXT.dataInputs(0)
.R4[Coll[GroupElement]].get
.exists(pk => proveDlog(pk))
sigmaProp(isMember)
}`