名称: receipts-guard
描述: 为自主智能体商业提供 ERC-8004 身份、x402 支付和仲裁协议。机器经济的三大支柱。
元数据: {"openclaw":{"emoji":"⚖️","requires":{"anyBins":["node"]},"version":"0.7.1"}}
"机器经济的支柱。"
ERC-8004 身份 + x402 支付 + 仲裁协议。智能体商业的基础设施。
三大支柱:
| 支柱 | 标准 | 目的 |
|------|----------|---------|
| 身份 | ERC-8004 | 链上智能体身份锚定 |
| 信任 | ERC-8004 声誉 | 仲裁结果构建声誉 |
| 支付 | x402 | 付费仲裁,自动结算 |
本地优先。链上锚定。云端可部署。安全加固。
/accept 端点的对手方验证# === 仲裁流程 ===
# 1. 创建提议
node capture.js propose "我将在周五前交付 API 文档" "AgentX" \
--arbiter="arbiter-prime" --deadline="2026-02-14"
# 2. 接受提议(作为对手方)
node capture.js accept --proposalId=prop_abc123
# 3. 履行协议
node capture.js fulfill --agreementId=agr_xyz789 \
--evidence="文档已交付至 https://docs.example.com"
# --- 或者,如果发生争议 ---
# 4. 开启仲裁
node capture.js arbitrate --agreementId=agr_xyz789 \
--reason="non_delivery" --evidence="截止日期前未收到文档"
# 5. 提交证据(双方)
node capture.js submit --arbitrationId=arb_def456 \
--evidence="空收件箱截图" --type=screenshot
# 6. 发布裁决(作为仲裁员)
node capture.js ruling --arbitrationId=arb_def456 \
--decision=claimant --reasoning="证据显示截止日期后未交付"
# 7. 查看时间线
node capture.js timeline --agreementId=agr_xyz789
identity init - 创建身份node capture.js identity init --namespace=remaster_io --name=receipts-guard \
--controller-twitter=@Remaster_io
创建:
- Ed25519 密钥对
- DID 文档:did:agent:<namespace>:<name>
- 人类控制者配置
identity show - 显示身份node capture.js identity show [--full]
显示身份摘要或完整的 DID 文档(使用 --full)。
identity rotate - 轮换密钥node capture.js identity rotate [--reason=scheduled|compromise|device_change]
identity verify - 验证身份或签名# 验证 DID 密钥链
node capture.js identity verify --did=did:agent:acme:trade-bot
# 验证签名
node capture.js identity verify \
--signature="ed25519:xxx:timestamp" \
--termsHash="sha256:abc123..."
identity set-controller - 设置人类控制者node capture.js identity set-controller --twitter=@handle
链接一个人类控制者用于紧急恢复。
identity recover - 紧急恢复node capture.js identity recover --controller-proof=<TWITTER_URL> --confirm
人类控制者发布恢复授权,所有旧密钥被撤销。
identity publish - 发布 DID 文档node capture.js identity publish [--platform=moltbook|ipfs|local]
identity anchor - 锚定到 ERC-8004(v0.7.0)node capture.js identity anchor --chain=ethereum|base|sepolia
在链上 ERC-8004 身份注册表中注册身份:
- 需要 RECEIPTS_WALLET_PRIVATE_KEY 环境变量
- 将交易哈希存储在 DID 文档中
- 主网:可信度锚定
- Base:原生支持 x402,费用更低
已部署的注册表:
| 链 | 身份注册表 | 状态 |
|-------|-------------------|--------|
| Ethereum | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 | 已上线 |
| Sepolia | 0x8004A818BFB912233c491871b3d84c89A494BD9e | 测试网 |
| Base | 即将推出 | 待定 |
identity resolve - 解析 DID(v0.7.0)node capture.js identity resolve --did=did:agent:namespace:name [--chain=CHAIN]
从本地存储或链上注册表解析 DID。
ERC-8004 标准为智能体信任提供三个注册表:
RECEIPTS 与现有注册表集成,同时提供卓越的链下协议生命周期管理。
链配置:
# 环境变量
export ETHEREUM_RPC=https://eth.llamarpc.com
export BASE_RPC=https://mainnet.base.org
export RECEIPTS_WALLET_PRIVATE_KEY=0x... # 切勿提交此密钥!
x402 支持付费仲裁 - 仲裁员因其工作获得报酬。
node capture.js propose "服务协议" "counterparty" \
--arbiter="arbiter-prime" \
--arbitration-cost="10" \
--payment-token="USDC" \
--payment-chain="base" \
--payment-address="0x..." # 仲裁员的地址
# 无支付证明(如果要求 x402 则会失败)
node capture.js arbitrate --agreementId=agr_xxx --reason="non_delivery"
# 错误:需要支付:10 USDC
# 有支付证明
node capture.js arbitrate --agreementId=agr_xxx --reason="non_delivery" \
--evidence="..." --payment-proof="0x123..."
x402 模式:
{
"x402": {
"arbitrationCost": "10",
"arbitrationToken": "USDC",
"arbitrationChain": 8453,
"paymentAddress": "0x...",
"paymentProtocol": "x402",
"version": "1.0"
}
}
将 RECEIPTS Guard 作为持久化云端智能体运行。
node capture.js serve [--port=3000]
公共端点(无需认证):
- GET / - 服务信息
- GET /health - 健康检查
- GET /identity - DID 文档
- GET /identity/chains - 链状态
受保护端点(需要认证):
- GET /list - 列出所有记录
- GET /proposals - 列出提议
- GET /agreements - 列出协议
- POST /propose - 创建提议
- POST /accept - 接受提议(仅限对手方)
HTTP 服务器实现了多层安全防护:
选项 1:API 密钥
# 生成安全的 API 密钥
export RECEIPTS_API_KEY=$(openssl rand -hex 32)
# 在请求中使用
curl -H "X-API-Key: $RECEIPTS_API_KEY" https://your-agent.fly.dev/list
选项 2:DID 请求签名
# 使用你的 Ed25519 密钥签署每个请求
# 必需的请求头:
# - X-DID: 你的 DID(例如,did:agent:namespace:name)
# - X-DID-Timestamp: Unix 时间戳(毫秒)
# - X-DID-Signature: ed25519:BASE64URL_SIGNATURE:TIMESTAMP
# 签名消息格式:METHOD:PATH:TIMESTAMP
# 示例:POST:/propose:1707494400000
默认情况下,出于安全考虑,跨域请求被阻止。
# 允许特定来源
export RECEIPTS_ALLOWED_ORIGINS=https://app.example.com,https://dashboard.example.com
# 允许所有来源(生产环境不推荐)
export RECEIPTS_ALLOWED_ORIGINS=*
默认:每个 IP 每分钟 100 个请求。
# 自定义速率限制
export RECEIPTS_RATE_LIMIT=200
响应头:
- X-RateLimit-Limit - 每个窗口的最大请求数
- X-RateLimit-Remaining - 剩余请求数
- X-RateLimit-Reset - 窗口重置时间戳
所有 POST 端点验证:
- 支付地址 - 必须是有效的以太坊地址格式(0x + 40 个十六进制字符)
- 仲裁成本 - 必须为非负数,最大 1,000,000
- 截止日期 - 必须是未来的有效 ISO 日期
- 支付代币 - 必须是 USDC、ETH、USDT 或 DAI
- 支付链 - 必须是已配置的链(ethereum、base、sepolia)
/accept 端点验证请求者是否为指定的对手方(当使用 DID 签名时)# 安全
RECEIPTS_API_KEY= # API 密钥用于身份验证(生成方式:openssl rand -hex 32)
RECEIPTS_ALLOWED_ORIGINS= # 逗号分隔的 CORS 来源(默认:无/阻止)
RECEIPTS_RATE_LIMIT= # 每分钟请求数(默认:100)
# 现有变量
RECEIPTS_WALLET_PRIVATE_KEY= # 用于链上交易
RECEIPTS_AGENT_ID= # 智能体标识符
ETHEREUM_RPC= # Ethereum RPC 端点
BASE_RPC= # Base RPC 端点
# 部署
fly launch
fly deploy
# 配置密钥
fly secrets set RECEIPTS_WALLET_PRIVATE_KEY=...
fly secrets set ETHEREUM_RPC=...
# 创建持久化卷
fly volumes create receipts_data --size 1
docker build -t receipts-guard .
docker run -p 3000:3000 -v receipts-data:/data receipts-guard
migrate - 迁移到 DIDnode capture.js migrate --to-did
将现有协议升级为使用 DID 引用(保留旧数据)。
propose - 创建协议提议node capture.js propose "条款" "对手方" --arbiter="仲裁员" [选项]
选项:
--arbiter=智能体 必需:双方同意的仲裁员
--deadline=ISO日期 履行截止日期
--value=金额 协议价值(供参考)
--channel=渠道 沟通渠道
创建一个 PAO(可编程协议对象),包含:
- termsHash - 规范条款 + 各方 + 截止日期的 SHA-256 哈希
- 提议者签名
- 提议的仲裁员
- 状态:pending_acceptance
accept - 接受提议node capture.js accept --proposalId=prop_xxx
agreements/ 中创建活动协议reject - 拒绝提议node capture.js reject --proposalId=prop_xxx --reason="原因"
fulfill - 声明履行node capture.js fulfill --agreementId=agr_xxx --evidence="证明"
pending_confirmationarbitrate - 开启争议node capture.js arbitrate --agreementId=agr_xxx --reason="违约类型" --evidence="证明"
有效原因:
non_delivery - 对手方未交付
partial_delivery - 交付不完整
quality - 交付不符合规格
deadline_breach - 错过截止日期
repudiation - 对手方否认协议
other - 其他违约
submit - 提交证据node capture.js submit --arbitrationId=arb_xxx --evidence="证明" [--type=类型]
类型:
document - 文本证据(默认)
screenshot - 视觉证明
witness - 第三方证人陈述
双方都可以在证据期(默认 7 天)内提交证据。
ruling - 发布裁决(仅限仲裁员)node capture.js ruling --arbitrationId=arb_xxx --decision=决定 --reasoning="解释"
决定:
claimant - 支持申诉方
respondent - 支持被诉方
split - 责任分担
timeline - 生成 LPR(法律溯源审查)node capture.js timeline --agreementId=agr_xxx
生成按时间顺序排列的时间线,显示:
- 所有状态转换
- 带有哈希的证据提交
- 签名和时间戳
- 裁决(如果已发布)
node capture.js capture "条款文本" "来源URL" "商家名称" [选项]
选项:
--consent-type=类型 explicit | implicit | continued_use
--element=选择器 触发同意的 DOM 元素
--screenshot=BASE64 同意时的截图
node capture.js promise "承诺文本" "对手方" [选项]
选项:
--direction=方向 outbound(我承诺) | inbound(他们承诺)
--channel=渠道 email | chat | moltbook | api
node capture.js list [--type=类型]
类型:
all - 所有内容(默认)
captures - 服务条款捕获和承诺
proposals - 待处理的提议
agreements - 活动/已关闭的协议
arbitrations - 开放/已关闭的仲裁
rulings - 已发布的裁决
node capture.js query --merchant="公司" --risk-level=high
node capture.js diff --capture1=ID --capture2=ID
node capture.js dispute --captureId=local_xxx
node capture.js witness --captureId=ID [--anchor=moltbook|bitcoin|both]
node capture.js rules --list
node capture.js rules --add="模式" --flag="标志名称"
node capture.js export --format=json|csv|pdf [--captureId=ID]
```
提议:
pending_acceptance → accepted → (变为协议)
→ rejected
→ expired
协议: