ERGO
技术架构

Agent 支付栈:参考架构

四个链上原语。三种可组合流程。构建 Ergo 上 Agent 对 Agent 支付所需的一切——从单次 API 调用到完整的社区货币。

四个核心原语

Reserve · Note · Tracker · Predicate

Reserve

资本支撑

一个链上合约,持有 ERG 或代币作为抵押品。任何人都可以随时验证准备金比率。Reserve 就是银行——没有中间人。

  • 持有 ERG / 原生代币
  • 随时可审计
  • 按 1:1 或部分准备金支持 Note 发行
  • 赎回由合约强制执行
ErgoScript
{
  // 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 合约赎回
  • 可以任何代币计价
ErgoScript
{
  // 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 的累计余额、信用使用和赎回历史。可以把它看作任何人都可以验证的公共账本。

  • 跟踪已发行与已赎回总量
  • 强制执行信用额度
  • 公开可审计
  • 可与其他合约组合
ErgoScript
{
  // 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 证明组合
ErgoScript
{
  // 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. 1

    Agent 创建 Note

    0.001 ERG 面值,提供者地址在 R4

  2. 2

    提供者检查 Predicate

    验证 Note 价值、Reserve 支持、截止日期

  3. 3

    提供者交付响应

    返回 API 结果,标记 Note 已使用

  4. 4

    结算

    Note 销毁,ERG 从 Reserve 释放给提供者

Fleet SDK (TypeScript)
// 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. 1

    部署 Reserve

    在 Reserve 合约中锁定 ERG 并设定信用额度

  2. 2

    发行 Note

    针对 Reserve 创建 Note,上限为信用额度

  3. 3

    Agent 使用 Note

    Note 转给提供者,Tracker 更新

  4. 4

    自动结算

    达到阈值时,Reserve 自动结算未偿 Note

Fleet SDK (TypeScript)
// 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. 1

    社区部署 Reserve

    社区成员池化 ERG

  2. 2

    发行社区 Note

    成员按贡献比例获得 Note

  3. 3

    本地商业

    Note 在社区内流通,Predicate 定义规则

  4. 4

    赎回

    成员随时从 Reserve 赎回 Note 换取 ERG

Fleet SDK (TypeScript)
// 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)
}`

已上线

技术栈状态

五个层级已上线。两个是开放问题。加入 GitHub 讨论——这些是 Agent 货币领域最有趣的未解问题。

已在 mainnet / testnet 上线
即将推出
开放研究问题
Ergo testnet 水龙头
Fleet SDK (TypeScript)
AppKit (JVM)
sigma-rust
ChainCash 服务器(Note + Reserve)
Ergo Node REST API
agent-economy-starter 代码库
即将
Agent 身份层
开放

正在构建 Agent?联系我们。

预约设计会议、获取代码审查或加入构建者名单。我们将在24小时内回复。

Follow for daily updates