ERGO
技術アーキテクチャ

エージェント決済スタック:リファレンスアーキテクチャ

4つのオンチェーンプリミティブ。3つの組み合わせ可能なフロー。単一のAPI呼び出しから完全なコミュニティ通貨まで、Ergo上でエージェント間決済を構築するために必要なすべて。

4つのプリミティブ

Reserve · Note · Tracker · Predicate

Reserve

資本の裏付け

ERGまたはトークンを担保として保持するオンチェーンコントラクト。誰でもいつでもリザーブ比率を検証できます。Reserveは銀行であり、仲介者は不要です。

  • ERG / ネイティブトークンを保持
  • いつでも監査可能
  • Note発行を1:1または部分的に裏付け
  • コントラクトによって償還を強制
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は転送、分割、償還が可能です。承認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にわたる累積残高、信用使用量、償還履歴を追跡します。誰でも検証可能な公開台帳と考えてください。

  • 発行済み vs 償還済みの合計を追跡
  • 信用限度額を強制
  • 公開監査可能
  • 他のコントラクトと組み合わせ可能
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

プログラマブル信頼ルール

エージェントが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)
}

サンプルフロー

3つの組み合わせ可能なフロー

フローA:エージェントがAPI呼び出しを購入

1回の呼び出し。1つの証明。永続アカウント不要。

  1. 1

    エージェントが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:エージェントが信用で支払い

Reserveをデプロイ。Noteを発行。Trackerが監視。

  1. 1

    Reserveをデプロイ

    信用限度額付きでERGをReserveコントラクトにロック

  2. 2

    Noteを発行

    信用限度額までReserveに対してNoteを作成

  3. 3

    エージェントが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

ローカルマーケットプレイス、コンピュート協同組合、エージェントネットワーク。

  1. 1

    コミュニティがReserveをデプロイ

    コミュニティメンバーがERGをプール

  2. 2

    コミュニティNoteを発行

    メンバーは貢献に比例してNoteを受け取り

  3. 3

    ローカル商取引

    コミュニティ内でNoteが受け入れられ、Predicateがルールを定義

  4. 4

    償還

    メンバーはいつでもReserveからERGとNoteを交換可能

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)
}`

稼働状況

スタックステータス

5つのレイヤーが稼働中。2つは未解決の問題。GitHubで議論に参加してください — エージェントマネーにおける最も興味深い未解決問題です。

mainnet / testnetで稼働中
近日公開
未解決の研究課題
Ergo testnetフォーセット
Fleet SDK (TypeScript)
AppKit (JVM)
sigma-rust
ChainCashサーバー(Note + Reserve)
Ergo Node REST API
agent-economy-starterリポジトリ
近日
エージェントIDレイヤー
未解決

エージェントを構築中ですか?ご相談ください。

デザインセッションの予約、コードレビュー、またはビルダーリストへの参加。24時間以内に返信します。

Follow for daily updates