エージェント決済スタック:リファレンスアーキテクチャ
4つのオンチェーンプリミティブ。3つの組み合わせ可能なフロー。単一のAPI呼び出しから完全なコミュニティ通貨まで、Ergo上でエージェント間決済を構築するために必要なすべて。
4つのプリミティブ
Reserve · Note · Tracker · Predicate
Reserve
資本の裏付け
ERGまたはトークンを担保として保持するオンチェーンコントラクト。誰でもいつでもリザーブ比率を検証できます。Reserveは銀行であり、仲介者は不要です。
- ERG / ネイティブトークンを保持
- いつでも監査可能
- Note発行を1:1または部分的に裏付け
- コントラクトによって償還を強制
{
// 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は転送、分割、償還が可能です。承認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にわたる累積残高、信用使用量、償還履歴を追跡します。誰でも検証可能な公開台帳と考えてください。
- 発行済み vs 償還済みの合計を追跡
- 信用限度額を強制
- 公開監査可能
- 他のコントラクトと組み合わせ可能
{
// 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
プログラマブル信頼ルール
エージェントが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)
}サンプルフロー
3つの組み合わせ可能なフロー
フローA:エージェントがAPI呼び出しを購入
1回の呼び出し。1つの証明。永続アカウント不要。
- 1
エージェントが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:エージェントが信用で支払い
Reserveをデプロイ。Noteを発行。Trackerが監視。
- 1
Reserveをデプロイ
信用限度額付きでERGをReserveコントラクトにロック
- 2
Noteを発行
信用限度額までReserveに対してNoteを作成
- 3
エージェントが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
ローカルマーケットプレイス、コンピュート協同組合、エージェントネットワーク。
- 1
コミュニティがReserveをデプロイ
コミュニティメンバーがERGをプール
- 2
コミュニティNoteを発行
メンバーは貢献に比例してNoteを受け取り
- 3
ローカル商取引
コミュニティ内でNoteが受け入れられ、Predicateがルールを定義
- 4
償還
メンバーはいつでもReserveからERGとNoteを交換可能
// 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)
}`SDK & ツール