name: 编排 description: AI代理如何规划、构建和部署一个完整的以太坊去中心化应用。Scaffold-ETH 2项目的三阶段构建系统。用于在以太坊上构建完整应用——从合约到前端再到生产部署到IPFS。
dApp编排
你可能做错的地方
SE2有特定的模式你必须遵循。 通用的“构建dApp”建议不适用。SE2自动生成deployedContracts.ts——不要编辑它。使用Scaffold钩子,而非原始wagmi。外部合约在构建前端前放入externalContracts.ts。
有三个阶段。切勿跳过或合并它们。 合约 → 前端 → 生产。每个阶段都有验证门。
三阶段构建系统
| 阶段 | 环境 | 发生了什么 |
|---|---|---|
| 阶段1 | 本地分叉 | 合约 + UI在本地主机上。快速迭代。 |
| 阶段2 | 实时网络 + 本地UI | 将合约部署到主网/L2。用真实状态测试。优化UI。 |
| 阶段3 | 生产 | 将前端部署到IPFS/Vercel。最终质量保证。 |
阶段1:脚手架(本地)
1.1 合约
npx create-eth@latest my-dapp
cd my-dapp && yarn install
yarn chain # 终端1:本地节点
yarn deploy # 终端2:部署合约
关键步骤:
- 在
packages/foundry/contracts/(或packages/hardhat/contracts/)中编写合约 - 编写部署脚本
- 将所有外部合约添加到
packages/nextjs/contracts/externalContracts.ts——在阶段1.2之前 - 编写测试(≥90%覆盖率)
- 移动前端前进行安全审计
验证: yarn deploy成功。deployedContracts.ts自动生成。测试通过。
1.2 前端
yarn chain # 终端1
yarn deploy --watch # 终端2:变更时自动重新部署
yarn start # 终端3:Next.js在localhost:3000
使用SCAFFOLD钩子,而非原始WAGMI:
// 读取
const { data } = useScaffoldReadContract({
contractName: "YourContract",
functionName: "balanceOf",
args: [address],
watch: true,
});
// 写入
const { writeContractAsync, isMining } = useScaffoldWriteContract("YourContract");
await writeContractAsync({
functionName: "swap",
args: [tokenIn, tokenOut, amount],
onBlockConfirmation: (receipt) => console.log("完成!", receipt),
});
// 事件
const { data: events } = useScaffoldEventHistory({
contractName: "YourContract",
eventName: "SwapExecuted",
fromBlock: 0n,
watch: true,
});
三按钮流程(强制)
任何代币交互显示一个按钮:
- 切换网络(如果链错误)
- 批准代币(如果授权不足)
- 执行动作(仅在1和2满足后)
切勿同时显示批准和执行按钮。
UX规则
- 人类可读金额:
formatEther()/formatUnits()用于显示,parseEther()/parseUnits()用于合约 - 所有异步操作都有加载状态:
isLoading、isMining在所有异步操作上 - 在待处理交易期间禁用按钮(区块链需5-12秒)
- 切勿使用无限批准——批准精确金额或3-5倍
- 有帮助的错误: 将“资金不足”、“用户拒绝”、“执行回滚”解析为通俗语言
验证: 完整用户旅程在本地主机上使用真实钱包工作。所有边缘情况处理。
🚨 切勿将秘密提交到Git
在接触阶段2前,阅读此部分。 AI代理是GitHub上泄露凭证的头号来源。机器人实时抓取仓库并在几秒内利用泄露的秘密。
这意味着所有秘密——不只是钱包私钥:
- 钱包私钥——几秒内资金被抽干
- API密钥——Alchemy、Infura、Etherscan、WalletConnect项目ID
- 嵌入密钥的RPC URL——例如
https://base-mainnet.g.alchemy.com/v2/YOUR_KEY - OAuth令牌、密码、Bearer令牌
⚠️ 常见SE2陷阱:scaffold.config.ts
scaffold.config.ts中的rpcOverrides和alchemyApiKey会提交到Git。切勿将API密钥直接粘贴到此文件。使用环境变量:
// ❌ 错误——密钥提交到公开仓库
rpcOverrides: {
[chains.base.id]: "https://base-mainnet.g.alchemy.com/v2/8GVG8WjDs-LEAKED",
},
// ✅ 正确——密钥保持在.env.local中
rpcOverrides: {
[chains.base.id]: process.env.NEXT_PUBLIC_BASE_RPC || "https://mainnet.base.org",
},
在每次git add或git commit前:
# 检查泄露的秘密
git diff --cached --name-only | grep -iE '\.env|key|secret|private'
grep -rn "0x[a-fA-F0-9]\{64\}" packages/ --include="*.ts" --include="*.js" --include="*.sol"
# 检查配置文件中的硬编码API密钥
grep -rn "g.alchemy.com/v2/[A-Za-z0-9]" packages/ --include="*.ts" --include="*.js"
grep -rn "infura.io/v3/[A-Za-z0-9]" packages/ --include="*.ts" --include="*.js"
# 如果任何匹配,停止。将秘密移动到.env并添加.env到.gitignore。
你的.gitignore必须包括:
.env
.env.*
*.key
broadcast/
cache/
node_modules/
SE2默认处理部署者密钥——yarn generate创建带有部署者密钥的.env,.gitignore排除它。不要覆盖此模式。不要将密钥复制到脚本、配置文件或部署日志中。这包括RPC密钥、API密钥和任何凭证——不只是钱包密钥。
查看wallets/SKILL.md以获取完整密钥安全指南、如果已经泄露密钥该做什么,以及部署的安全模式。
阶段2:实时合约 + 本地UI
- 更新
scaffold.config.ts:targetNetworks: [mainnet](或你的L2) - 资助部署者:
yarn generate→yarn account→ 发送真实ETH - 部署:
yarn deploy --network mainnet - 验证:
yarn verify --network mainnet - 用真实钱包测试,小额($1-10)
- 优化UI——移除SE2品牌,自定义样式
设计规则: 无LLM马虎。无通用紫色渐变。让它独特。
验证: 合约在区块浏览器上验证。完整旅程与真实合约工作。
阶段3:生产部署
部署前检查清单
onlyLocalBurnerWallet: true在scaffold.config.ts中(关键——防止生产环境中的燃烧器钱包)- 更新元数据(标题、描述、OG图像1200x630px)
- 将所有测试值恢复为生产值
部署
IPFS(去中心化):
yarn ipfs
# → https://YOUR_CID.ipfs.cf-ipfs.com
Vercel(快速):
cd packages/nextjs && vercel
生产质量保证
- [ ] 应用在公共URL加载
- [ ] 钱包连接,网络切换工作
- [ ] 读取 + 写入合约操作工作
- [ ] 无控制台错误
- [ ] 燃烧器钱包未显示
- [ ] OG图像在链接预览中工作
- [ ] 移动响应式
- [ ] 用MetaMask、Rainbow、WalletConnect测试
阶段过渡规则
阶段3错误 → 回到阶段2(用本地UI + 生产合约修复) 阶段2合约错误 → 回到阶段1(本地修复,编写回归测试,重新部署) 切勿在生产环境中hack修复错误。
关键SE2目录
packages/
├── foundry/contracts/ # Solidity合约
├── foundry/script/ # 部署脚本
├── foundry/test/ # 测试
└── nextjs/
├── app/ # 页面
├── components/ # React组件
├── contracts/
│ ├── deployedContracts.ts # 自动生成(不要编辑)
│ └── externalContracts.ts # 你的外部合约(编辑此文件)
├── hooks/scaffold-eth/ # 使用这些钩子
└── scaffold.config.ts # 主配置
AI代理商业:端到端流程(ERC-8004 + x402)
这是2026年以太坊的杀手级用例:自主代理发现、信任、支付和评级彼此——无人类介入循环。
完整周期
┌─────────────────────────────────────────────────────────────┐
│ 1. 发现 代理查询ERC-8004 IdentityRegistry │
│ → 找到带有“天气”服务标签的代理 │
│ │
│ 2. 信任 代理检查ReputationRegistry │
│ → 按在线时间>99%、质量>85过滤 │
│ → 挑选评分最高的天气代理 │
│ │
│ 3. 调用 代理发送HTTP GET到天气端点 │
│ → 接收402 Payment Required │
│ → PAYMENT-REQUIRED header: $0.10 USDC on Base │
│ │
│ 4. 支付 代理签署EIP-3009 transferWithAuthorization │
│ → 用PAYMENT-SIGNATURE重试请求 │
│ → 服务器通过facilitator验证 │
│ → 支付在Base上结算(约$0.001 gas) │
│ │
│ 5. 接收 服务器返回200 OK + 天气数据 │
│ → PAYMENT-RESPONSE header带交易哈希 │
│ │
│ 6. 评分 代理发布反馈到ReputationRegistry │
│ → 值=95,标签=“质量”,端点=“...” │
│ → 为下次调用者建立链上信誉 │
└─────────────────────────────────────────────────────────────┘
具体实现(TypeScript代理)
import { x402Fetch } from '@x402/fetch';
import { createWallet } from '@x402/evm';
import { ethers } from 'ethers';
const wallet = createWallet(process.env.AGENT_PRIVATE_KEY);
const provider = new ethers.JsonRpcProvider('https://base-mainnet.g.alchemy.com/v2/YOUR_KEY');
const IDENTITY_REGISTRY = '0x8004A169FB4a3325136EB29fA0ceB6D2e539a432';
const REPUTATION_REGISTRY = '0x8004BAa17C55a88189AE136b182e5fdA19dE9b63';
// 1. 发现:找到提供天气服务的代理
const registry = new ethers.Contract(IDENTITY_REGISTRY, registryAbi, provider);
// 查询事件或使用The Graph子图进行索引代理发现
// 2. 信任:检查信誉
const reputation = new ethers.Contract(REPUTATION_REGISTRY, reputationAbi, provider);
const [count, value, decimals] = await reputation.getSummary(
agentId, trustedClients, "quality", "30days"
);
// 仅在值/10^小数位数 > 85时继续
// 3-5. 支付 + 接收:x402Fetch处理整个402流程
const response = await x402Fetch(agentEndpoint, {
wallet,
preferredNetwork: 'eip155:8453'
});
const weatherData = await response.json();
// 6. 评分:发布链上反馈
const reputationWriter = new ethers.Contract(REPUTATION_REGISTRY, reputationAbi, signer);
await reputationWriter.giveFeedback(
agentId, 95, 0, "quality", "weather", agentEndpoint, "", ethers.ZeroHash
);
这是代理经济。 无API密钥、无订阅、无发票、无信任假设。只有加密身份、链上信誉和HTTP原生支付。
构建此堆栈的关键项目
- ERC-8004 — 代理身份 + 信誉(EF、MetaMask、Google、Coinbase)
- x402 — HTTP支付协议(Coinbase)
- A2A — 代理间通信(Google)
- MCP — 模型上下文协议(Anthropic)
- The Graph — 索引代理注册以快速发现
- EigenLayer — 代理工作的加密经济验证
资源
- SE2文档: https://docs.scaffoldeth.io/
- UI组件: https://ui.scaffoldeth.io/
- SpeedRunEthereum: https://speedrunethereum.com/
- ETH技术树: https://www.ethtechtree.com