ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AI 与 Web3 结合的第一版:把合约边界先收紧

AI 与 Web3 结合的第一版:把合约边界先收紧

AI 与 Web3 结合的第一版:把合约边界先收紧

智能合约部署上链后,无法像传统后端一样随时修复。构建 AI 与 Web3 产品时,需要明确 AI 的权限边界,避免直接授予私钥操控权,也避免将其限制为只能回答问题的聊天界面。

第一版产品(MVP)需要先界定 AI 与 Web3 合约交互的工程边界。本文讨论核心链路拆解、链上状态异步隔离和防幻觉校验的实现方式。

架构选型与边界切割

AI 模型的核心特性是概率输出,而智能合约追求确定性执行。将概率性逻辑直接映射为链上交易,是生产事故的高发地带。

第一版系统绝不能给 AI 赋予直接调用sendTransaction的权限。正确的架构应当是将 AI 定位为“意图构建器(Intent Builder)”与“交易参数预检器”。AI 负责解析用户的自然语言需求,生成符合 ERC-20 / ERC-721 或 DeFi 协议标准的强类型 Payload,后续的模拟执行、用户签名与链上广播必须在确定性沙箱中完成。

这种分层设计让异常输出先经过链上模拟(eth_call)检查,再决定是否提交交易,从而降低非法或高风险 Payload 上链的概率。

flowchart TD UserPrompt["用户自然语言指令"] --> LLMIntent["LLM 意图解析器"] LLMIntent --> RawPayload["结构化交易 Payload"] RawPayload --> SimulationEngine{"节点模拟执行 (eth_call)"} SimulationEngine -- "模拟失败 / Gas过高" --> RejectAlert["拒绝交易并返错给AI"] SimulationEngine -- "模拟成功" --> UserWallet["用户客户端私钥签名"] UserWallet --> ChainBroadcast["区块链网络广播"]

关键链路一:AI 意图解析与强结构化校验

在第一版开发中,不要尝试自己解析复杂的非结构化文本,必须依赖 Pydantic 或 TypeScript Zod 强行约束 AI 的输出格式。

以下示例展示了基于 Python asyncio 与 Pydantic 构建的意图解析与交易预校验引擎。系统获取 LLM 返回的 JSON 后,优先进行严格的类型断言与数值范围校验,剔除包含恶意合约地址或异常 Gas 限制的指令。

import asyncio import json from typing import Dict, Any, Optional from pydantic import BaseModel, Field, field_validator from web3 import AsyncWeb3 from web3.providers import AsyncHTTPProvider class SwapIntentSchema(BaseModel): token_in: str = Field(..., description="输入代币合约地址") token_out: str = Field(..., description="输出代币合约地址") amount_in_wei: int = Field(..., description="输入金额(Wei)") max_slippage_bps: int = Field(..., description="最大滑点(基点 1-1000)") recipient: str = Field(..., description="接收方地址") @field_validator('token_in', 'token_out', 'recipient') def validate_eth_address(cls, v: str) -> str: if not v.startswith("0x") or len(v) != 42: raise ValueError("非法 Ethereum 地址格式") return AsyncWeb3.to_checksum_address(v) @field_validator('max_slippage_bps') def validate_slippage(cls, v: int) -> int: if v <= 0 or v > 1000: raise ValueError("滑点范围必须在 0.01% 至 10% 之间") return v class TransactionBuilderEngine: def __init__(self, rpc_url: str): self.w3 = AsyncWeb3(AsyncHTTPProvider(rpc_url)) async def parse_and_validate(self, llm_raw_output: str) -> Dict[str, Any]: try: parsed_data = json.loads(llm_raw_output) intent = SwapIntentSchema(**parsed_data) except Exception as e: return {"success": False, "stage": "SCHEMA_VALIDATION", "error": str(e)} # 模拟链上状态检查 is_contract = await self._is_smart_contract(intent.token_out) if not is_contract: return {"success": False, "stage": "CHAIN_PRECHECK", "error": "目标输出代币地址非合约账户"} return {"success": True, "validated_intent": intent.model_dump()} async def _is_smart_contract(self, address: str) -> bool: code = await self.w3.eth.get_code(AsyncWeb3.to_checksum_address(address)) return len(code) > 0 async def main(): rpc = "https://eth-mainnet.g.alchemy.com/v2/your-api-key" engine = TransactionBuilderEngine(rpc) mock_llm_output = """ { "token_in": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "token_out": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", "amount_in_wei": 1000000000000000000, "max_slippage_bps": 50, "recipient": "0x71C7656EC7ab88b098defB751B7401B5f6d8976F" } """ res = await engine.parse_and_validate(mock_llm_output) print("预检结果:", res) if __name__ == "__main__": asyncio.run(main())

这段代码揭示了第一版必须要做的防线:任何由模型推荐的地址,必须检查其get_code确保合约真实存在;所有金额与滑点限制必须在 Python/TypeScript 层做硬性截断,绝不透传原始概率数据。

关键链路二:链上模拟执行与状态沙箱

即便校验通过,也不代表交易可以安全提交。网络拥堵、流动性不足或者抢跑攻击(MEV)都可能导致实际交易失败。因此,第二道防线是使用 RPC 节点的eth_calleth_estimateGas进行干跑(Dry-run)。

干跑的意义在于完全抹平 AI 生成非确定性代码带来的潜在风险。在第一版中,可以将模拟执行结果作为结构化数据反馈给前级 AI,使其具备“自我纠错”的能力。例如,当模拟执行提示TRANSFER_FAILED时,AI 可以在捕获回溯信息后,重新调整兑换路径或减少交易数额。

链上模拟不仅能捕获简单的逻辑错误,还能精准计算出交易所需的真实 Gas 消耗。许多包含 AI 功能的 DApp 经常因为 Gas 限制预估过低导致交易在链上 Revert,既白白浪费了用户的手续费,又造成了极差的用户体验。通过沙箱模拟,我们可以强制在估算出的 Gas 上限上增加 15% 的缓冲余量,确保交易成功率。

关键代码取舍:MVP 阶段舍弃什么

在确定第一版功能范围时,团队容易产生过度设计的倾向。下表梳理了第一版开发中应当保留与临时舍弃的技术点:

功能模块第一版(MVP)必须保留第一版(MVP)坚决舍弃取舍理由
私钥管理客户端 WalletConnect / Metamask 签名后端托管私钥代扣 Gas / 门限签名 (MPC)托管私钥大幅增加合规与被盗风险
交易解析静态 ABI 硬编码与 Schema 匹配全网动态 ABI 智能解析与泛化 Agent泛化 ABI 解析在边界条件易崩溃
错误自愈单次失败后提示用户手动重试无人值守多轮自动重试与链上抢跑自动重试可能引发重复扣款或连续亏损
状态同步WebSocket 订阅特定 Hash 状态实时全节点日志索引与自建 Graph自建索引节点运维成本极高

舍弃复杂性并不意味着降低安全标准。相反,剥离了自动化托管与复杂的全网 ABI 动态匹配后,开发精力可以集中在交易的安全性校验和界面交互的流畅度上。

生产部署的真实教训

在实际上线过程中,经常会遇到 RPC 节点限频(Rate Limit)与 LLM 响应延迟叠加导致的体验停滞。当用户发起一条需要 AI 辅助分析的智能合约操作指令时,如果后端直接进行同步阻塞等待,HTTP 请求极易超时。

解决这一问题的工程手段是采用异步 Task ID + Event Stream 机制。前端提交意图生成请求后,后端立即返回一个 Job ID,同时启动后台协程完成“LLM解析 -> Schema校验 -> eth_call模拟”。前端通过 Server-Sent Events (SSE) 实时接收任务进度。这种异步流水线架构能够有效屏蔽底层 RPC 节点的网络抖动,为第二版的扩展奠定稳固的基石。

返回列表