前言继上一篇对x402协议的详细解析后,本篇将重点介绍与x402功能高度互补、且常被一同讨论的ERC标准——ERC-8004。x402作为一款可在Base、Solana、Ethereum等多链使用的跨链协议,核心解决的是“如何完成支付”的问题;而ERC-8004则与之
继上一篇对 x402 协议的详细解析后,本篇将重点介绍与 x402 功能高度互补、且常被一同讨论的 ERC 标准 ——ERC-8004。x402 作为一款可在 Base、Solana、Ethereum 等多链使用的跨链协议,核心解决的是 “如何完成支付” 的问题;而 ERC-8004 则与之形成互补,专注解决 “支付主体是谁” 以及 “为何可以信任该支付方” 的信任与身份验证问题。
一、核心定位
功能定位:以太坊上「AI 智能代理」的无信任协作标准,基于 ERC-721,让链上 AI 代理可被唯一标识、可信评估、安全协作
协作关系:在 AI 经济中,x402 负责处理高频微额的支付(如 API 结算),而 ERC-8004 负责验证对方的合法性,防止恶意机器人滥用资源
身份注册表:每个 AI 代理 = 唯一 ERC-721 NFT,固定身份、能力、地址,不可篡改、可转移。
声誉注册表:链上记录任务反馈(评分 / 评价),需代理签名授权防刷分,跨平台复用信誉。
验证注册表:提供通用验证接口,支持 zkML、TEE、抵押重执行等,证明代理执行结果真实。
代理注册:开发者铸造 ERC-721 NFT 作为 AI 代理身份,填写能力元数据并上链
代理发现:用户 / 其他代理通过链上注册表查询,基于身份元数据筛选匹配能力的代理
交互发起:双方协商任务与报酬(可配合 x402 微支付协议)
任务执行:代理完成链上 / 链下任务
结果验证(可选):
反馈提交:用户获取代理授权签名后,提交任务评分与评价至声誉注册表
声誉更新:系统聚合新反馈,形成代理最新可信度画像
循环复用:代理身份、声誉、验证记录跨平台永久有效,支撑后续无信任交互
打破平台壁垒,跨协议 / 跨应用互认
降低信任成本,无需中心化背书
去中心化 AI 服务市场:代理自主提供代码审计、数据分析、内容生成、DeFi 策略执行等服务,用户基于声誉自由选择
代理协作网络:多个 AI 代理自动分工完成复杂任务(如科研数据分析→模型训练→结果验证),通过验证注册表保障各环节可信
智能合约 + AI 融合:AI 代理作为合约 “执行者”,完成链下数据获取、复杂计算,通过 zkML/TEE 证明结果真实性后触发合约执行
DeFi 智能体:自动做市、风险对冲、借贷管理,验证注册表确保策略按预期执行,声誉系统反映历史业绩
微支付生态:配合 x402 协议,AI 代理自主购买算力、数据或雇佣其他代理,形成完整代理经济闭环
| 概述:x402 是 Web3 时代的“钱包”,那么 ERC-8004 就是“身份证”与“信用分” 维度 | x402 协议 | ERC-8004 标准 |
|---|---|---|
| 主要角色 | 支付通道(支付谁、付多少) | 身份层(谁在付、是否可信) |
| 技术实现 | HTTP 402 状态码 + [ERC-3009]() | 链上注册表 + 签名验证 |
| 打个比方 | 自动扣费的信用卡/POS机 | 实名认证的营业执照 |
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/utils/cryptography/EIP712.sol";
/**
@dev 实现 ERC-8004 标准:建立用户(User)与智能体(Agent)的授信关系 */ contract ERC8004Registry is EIP712 { using ECDSA for bytes32;
// 记录用户是否授权了该 Agent: User => Agent => IsAuthorized mapping(address => mapping(address => bool)) public isDelegated;
// EIP-712 TypeHash: 用于 Agent 证明其被授权执行特定任务 bytes32 private constant _DELEGATION_TYPEHASH = keccak256( "AuthorizeAgent(address user,address agent,uint256 nonce)" );
event AgentAuthorized(address indexed user, address indexed agent); event AgentRevoked(address indexed user, address indexed agent);
constructor() EIP712("ERC8004Registry", "1") {}
/**
/**
/**
@param signature Agent 使用其私钥对 AuthorizeAgent 结构体的签名 */ function isValidAgent( address user, address agent, uint256 nonce, bytes calldata signature ) public view returns (bool) { // 1. 检查链上委派记录 if (!isDelegated[user][agent]) return false;
// 2. 验证 Agent 签名,确保是 Agent 本人在操作 bytes32 structHash = keccak256(abi.encode(_DELEGATION_TYPEHASH, user, agent, nonce)); bytes32 hash = _hashTypedDataV4(structHash);
return hash.recover(signature) == agent; } }
### 测试脚本
**测试说明**:
1. **成功建立委派并通过 Agent 身份验证**
2. **撤销授权后验证应当失败**
import assert from "node:assert/strict"; import { describe, it, beforeEach } from "node:test"; import { network } from "hardhat"; import { getAddress } from 'viem';
describe("ERC-8004 Agent Delegation Test", function () { let registry: any; let publicClient: any; let user: any, agent: any; let chainId: number;
beforeEach(async function () {
const { viem } = await (network as any).connect();
publicClient = await viem.getPublicClient();
[user, agent] = await viem.getWalletClients();
// 部署合约 (Solidity 0.8.24)
registry = await viem.deployContract("ERC8004Registry", []);
chainId = await publicClient.getChainId();
});
it("应该成功建立委派并通过 Agent 身份验证", async function () {
const userAddr = getAddress(user.account.address);
const agentAddr = getAddress(agent.account.address);
const nonce = 8004n;
// 1. 用户执行链上授权
const txHash = await registry.write.authorizeAgent([agentAddr], { account: user.account });
await publicClient.waitForTransactionReceipt({ hash: txHash });
// 2. 构造 EIP-712 结构化数据 (符合 ERC-8004 规范)
const domain = {
name: 'ERC8004Registry',
version: '1',
chainId: chainId,
verifyingContract: registry.address,
};
const types = {
AuthorizeAgent: [
{ name: 'user', type: 'address' },
{ name: 'agent', type: 'address' },
{ name: 'nonce', type: 'uint256' },
],
};
const message = {
user: userAddr,
agent: agentAddr,
nonce: nonce,
};
// 3. Agent 签名证明身份 (Agent 掌握私钥)
const agentSignature = await agent.signTypedData({
domain,
types,
primaryType: 'AuthorizeAgent',
message,
});
// 4. 合约校验验证
const isValid = await registry.read.isValidAgent([
userAddr,
agentAddr,
nonce,
agentSignature
]);
assert.strictEqual(isValid, true, "ERC-8004 验证应返回 True");
console.log("✅ ERC-8004 身份委派验证成功");
});
it("撤销授权后验证应当失败", async function () {
const userAddr = getAddress(user.account.address);
const agentAddr = getAddress(agent.account.address);
// 撤销
await registry.write.revokeAgent([agentAddr], { account: user.account });
const isValid = await registry.read.isValidAgent([
userAddr,
agentAddr,
1n,
"0x" + "b".repeat(130) // 假签名
]);
assert.strictEqual(isValid, false, "撤销后应返回 False");
});
});
### 部署脚本
// scripts/deploy.js import { network, artifacts } from "hardhat"; async function main() { // 连接网络 const { viem } = await network.connect({ network: network.name });//指定网络进行链接
// 获取客户端 const [deployer] = await viem.getWalletClients(); const publicClient = await viem.getPublicClient();
const deployerAddress = deployer.account.address; console.log("部署者的地址:", deployerAddress); // 加载合约 const ERC8004RegistryArtifact = await artifacts.readArtifact("ERC8004Registry");
// 部署 const ERC8004RegistryHash = await deployer.deployContract({ abi: ERC8004RegistryArtifact.abi,//获取abi bytecode: ERC8004RegistryArtifact.bytecode,//硬编码 args: [], }); const ERC8004RegistryReceipt = await publicClient.waitForTransactionReceipt({ hash: ERC8004RegistryHash }); console.log("ERC8004Registry合约地址:", ERC8004RegistryReceipt.contractAddress); }
main().catch(console.error);
# 结语
至此,关于 ERC8004 标准的知识梳理与代码落地工作已全面完成。在理论层面,已系统梳理其核心定位、核心三件套、完整工作流、核心价值、应用场景,并对比了 x402 协议与 ERC-8004 标准的差异,同时分析了该标准的发展展望与面临的挑战;在代码层面,基于 openzeppelinV5+solidity0.8.24 + 技术栈,实现了从开发、测试到部署落地的全流程落地实践。 如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!