链上 AI 预言机设计:可信数据喂入 + 推理结果上链的工程方案
链上 AI 预言机设计可信数据喂入 推理结果上链的工程方案一、智能合约不能直接调用 ChatGPT智能合约运行在区块链的确定性环境中无法发起 HTTP 请求也无法调用 OpenAI 的 API。这就产生了一个矛盾DeFi 协议需要 AI 来做风险评估NFT 市场需要 AI 来验证内容原创性但智能合约本身没有 AI 能力。预言机Oracle就是桥梁——将链外数据传送给链上合约。而 AI 预言机更进一步不仅传递数据还传递模型的推理结果。但这里有一个信任问题你怎么证明链外的 AI 推理没有被篡改二、AI 预言机架构数据喂入 推理验证flowchart TB subgraph OffChain[链下Off-Chain] Data[外部数据源\n行情、新闻、链上数据] -- Preprocess[数据预处理\n清洗 标准化] Preprocess -- Model[AI 模型推理\n风险评分、内容审核等] Model -- Proof[生成推理证明\nZK-SNARK / TEE 签名] end subgraph Oracle[预言机网络] Proof -- Node1[预言机节点 1\nAI 推理] Proof -- Node2[预言机节点 2\nAI 推理] Proof -- Node3[预言机节点 3\nAI 推理] Node1 -- Agg[结果聚合\n多数一致 中位数] Node2 -- Agg Node3 -- Agg Agg -- Sign[多方签名\n门限签名TSS] end subgraph OnChain[链上On-Chain] Sign -- Contract[智能合约] Contract -- Verify[验证签名 检查结果一致性] Verify -- Execute[执行业务逻辑\n清算、定价、版税] end subgraph Trust[信任机制] Trust1[经济激励: 节点质押 罚没] Trust2[TEE: 可信执行环境Intel SGX] Trust3[ZK: 零知识证明推理过程可验证] end三、Python 实现 AI 预言机节点预言机节点核心逻辑import hashlib import json import time from typing import List, Optional, Dict, Any from dataclasses import dataclass, field from enum import Enum from web3 import Web3 from eth_account import Account from eth_account.messages import encode_defunct class OracleNodeStatus(Enum): ACTIVE active SLASHED slashed # 被罚没 INACTIVE inactive dataclass class AIInferenceResult: AI 推理结果——需要上链的结构 request_id: str # 请求唯一 ID model_name: str # 模型名称如 risk_scorer_v2 model_version: str # 模型版本哈希 input_hash: str # 输入数据的哈希用于验证输入一致性 result: Dict[str, Any] # 推理结果 confidence: float # 模型置信度 [0, 1] timestamp: int # Unix 时间戳 node_address: str # 预言机节点地址 tss_signature: Optional[str] None # 门限签名聚合后添加 dataclass class OracleNode: AI 预言机节点 private_key: str contract_address: str contract_abi: list web3_provider: str stake_amount: int # 质押金额Wei status: OracleNodeStatus OracleNodeStatus.INACTIVE _web3: Optional[Web3] field(defaultNone, reprFalse) def __post_init__(self): self._web3 Web3(Web3.HTTPProvider(self.web3_provider)) self.account Account.from_key(self.private_key) def stake(self) - str: 质押——成为活跃的预言机节点 try: contract self._web3.eth.contract( addressWeb3.to_checksum_address(self.contract_address), abiself.contract_abi, ) tx contract.functions.stake().build_transaction({ from: self.account.address, value: self.stake_amount, nonce: self._web3.eth.get_transaction_count(self.account.address), gas: 300000, gasPrice: self._web3.eth.gas_price, }) signed self.account.sign_transaction(tx) tx_hash self._web3.eth.send_raw_transaction(signed.raw_transaction) receipt self._web3.eth.wait_for_transaction_receipt(tx_hash) if receipt.status 1: self.status OracleNodeStatus.ACTIVE return tx_hash.hex() raise Exception(质押交易失败) except Exception as e: print(f质押失败: {e}) raise def process_inference_request( self, request_id: str, input_data: bytes, model_func, # AI 推理函数 ) - AIInferenceResult: 处理推理请求 1. 计算输入哈希 2. 执行 AI 推理 3. 生成签名 # 计算输入哈希确保所有节点使用相同输入 input_hash hashlib.sha3_256(input_data).hexdigest() # 执行 AI 推理 try: result, confidence model_func(input_data) except Exception as e: print(f推理失败: {e}) return AIInferenceResult( request_idrequest_id, model_nameerror, model_version, input_hashinput_hash, result{error: str(e)}, confidence0.0, timestampint(time.time()), node_addressself.account.address, ) # 构造推理结果 inference AIInferenceResult( request_idrequest_id, model_namegetattr(model_func, __name__, unknown), model_versionhashlib.md5( str(model_func.__code__).encode() ).hexdigest()[:8], input_hashinput_hash, resultresult, confidenceconfidence, timestampint(time.time()), node_addressself.account.address, ) return inference def sign_result(self, inference: AIInferenceResult) - str: 对推理结果签名 ——用于链上验证该结果来自可信节点 # 构造签名消息 message json.dumps({ request_id: inference.request_id, input_hash: inference.input_hash, result_hash: hashlib.sha3_256( json.dumps(inference.result, sort_keysTrue).encode() ).hexdigest(), confidence: inference.confidence, timestamp: inference.timestamp, }, sort_keysTrue) # 以太坊格式签名 encoded encode_defunct(textmessage) signed self.account.sign_message(encoded) return signed.signature.hex()聚合器多节点结果共识from collections import Counter from statistics import median class OracleAggregator: 预言机聚合器——从多个节点收集结果并达成共识 def __init__(self, min_confirmations: int 3, tolerance: float 0.1): min_confirmations: 至少需要多少个节点返回结果 tolerance: 结果之间的允许偏差用于判断一致 self.min_confirmations min_confirmations self.tolerance tolerance # 待处理的推理请求 self._pending: Dict[str, List[AIInferenceResult]] {} def collect_result(self, inference: AIInferenceResult) - Optional[AIInferenceResult]: 收集单个节点的推理结果 如果收集到足够多的结果返回聚合后的最终结果 rid inference.request_id if rid not in self._pending: self._pending[rid] [] self._pending[rid].append(inference) # 检查是否收集满 if len(self._pending[rid]) self.min_confirmations: return self._aggregate(self._pending.pop(rid)) return None def _aggregate(self, results: List[AIInferenceResult]) - AIInferenceResult: 聚合多个节点的推理结果 # 策略一多数一致适合分类任务 # 策略二取中位数适合回归任务 # 策略三加权平均按质押量加权 # 检查输入哈希是否一致 input_hashes Counter(r.input_hash for r in results) if len(input_hashes) 1: print(f[WARN] 输入数据不一致! 哈希分布: {input_hashes}) # 取多数哈希 majority_hash input_hashes.most_common(1)[0][0] results [r for r in results if r.input_hash majority_hash] # 取置信度中位数稳健统计 confidences [r.confidence for r in results if r.confidence 0] median_confidence median(confidences) if confidences else 0.0 # 聚合结果取出现最多的结果项 result_items [ json.dumps(r.result, sort_keysTrue) for r in results ] majority_result_str Counter(result_items).most_common(1)[0][0] aggregated_result json.loads(majority_result_str) return AIInferenceResult( request_idresults[0].request_id, model_nameresults[0].model_name, model_versionresults[0].model_version, input_hashresults[0].input_hash, resultaggregated_result, confidencemedian_confidence, timestampint(time.time()), node_addressaggregated, ) def submit_to_chain( self, web3: Web3, contract_address: str, abi: list, inference: AIInferenceResult, private_key: str, ) - Optional[str]: 将聚合后的结果提交到链上合约 try: account Account.from_key(private_key) contract web3.eth.contract( addressWeb3.to_checksum_address(contract_address), abiabi, ) # 调用合约方法提交结果 tx contract.functions.submitInferenceResult( inference.request_id, json.dumps(inference.result), int(inference.confidence * 10000), # 存为整数 inference.timestamp, ).build_transaction({ from: account.address, nonce: web3.eth.get_transaction_count(account.address), gas: 500000, gasPrice: web3.eth.gas_price, }) signed account.sign_transaction(tx) tx_hash web3.eth.send_raw_transaction(signed.raw_transaction) receipt web3.eth.wait_for_transaction_receipt(tx_hash) if receipt.status 1: return tx_hash.hex() return None except Exception as e: print(f上链提交失败: {e}) return None四、边界分析与 Trade-offs去中心化程度 vs 延迟更多预言机节点 → 更高的去中心化程度 → 更长的聚合等待时间3-5 个节点是性价比拐点推理可验证性链上无法重放 AI 推理因此无法通过计算验证结果正确性替代方案TEEIntel SGX证明推理运行在可信环境或 ZK-ML 证明推理过程的正确性当前实践中经济激励质押 罚没比技术证明更实用数据新鲜度链上需要的是某个时间点的推理结果而不是实时流预言机节点应附带数据的时间戳链上合约检查新鲜度窗口Gas 成本控制每条推理结果上链需要消耗 Gas建议仅上链哈希 关键字段完整结果存在 IPFS 上合约仅验证签名和哈希不存储大量数据五、总结AI 预言机设计的核心是解决链下 AI 推理结果如何在链上被信任多节点冗余——至少 3 个节点独立推理聚合后上链质押 罚没——节点行为不当则损失质押金签名验证——链上合约验证节点签名拒绝未签名结果输入哈希——确保所有节点使用相同的输入数据记住不要试图在链上做 AI 推理也不要在链下放弃信任机制。预言机的价值在于两者之间的平衡设计。

相关新闻

Go 垃圾回收调优:GOMEMLIMIT 和 GOGC 的配合策略

Go 垃圾回收调优:GOMEMLIMIT 和 GOGC 的配合策略

Go 垃圾回收调优:GOMEMLIMIT 和 GOGC 的配合策略 一、Pod 频繁 OOMKilled 的根因 生产环境中一个 Go 服务在运行 2 小时后被 Kubernetes OOMKilled。查看监控发现内存占用呈现锯齿形——每 5-10 分钟涨到 2GB 然后下降到 500MB,最终某次 GC 来不及回收就…

2026/9/24 22:04:16 阅读更多 →
WINLOGON 初始化与作用分析

WINLOGON 初始化与作用分析

WINLOGON 初始化与作用分析 概述 WINLOGON.EXE 是 ReactOS 的用户登录进程,由 SMSS 在启动 CSRSS 之后创建。它负责创建窗口站 WinSta0 和三个桌面(Default/Winlogon/Screen-Saver)、加载 GINA DLL 处理用户身份验证、启动 Shell(…

2026/9/23 23:55:24 阅读更多 →
MySQL 间隙锁死锁问题处理

MySQL 间隙锁死锁问题处理

MySQL 间隙锁死锁问题的原理、场景与完整解决方案 间隙锁死锁是 InnoDB 引擎在可重复读(RR)隔离级别下的高频死锁场景,它的成因和普通行锁死锁不同,核心根源是「间隙锁之间兼容,但间隙锁与插入意向锁互斥」的特性&…

2026/9/24 22:47:22 阅读更多 →

最新新闻

Nasiko A2A Registry 设计解析:把“Agent 发现“本身做成一个 A2A Agent

Nasiko A2A Registry 设计解析:把“Agent 发现“本身做成一个 A2A Agent

【免费下载链接】nasiko Developer Control Plane for your AI Agents 项目地址: https://gitcode.com/gh_mirrors/na/nasiko 点击查看 免费下载 在 Nasiko(Developer Control Plane for your AI Agents)中,Agent 之间的通信、发…

2026/9/25 22:57:20 阅读更多 →
LDA主题词提取实战:从原理到Python实现与调参

LDA主题词提取实战:从原理到Python实现与调参

简介:面向自然语言处理与文本挖掘场景的LDA主题建模与关键词提取资源包,基于潜在狄利克雷分配模型,适合需要学习主题模型原理或快速搭建文本分析工具的开发者和研究者,可用于从文档集合中自动发现隐藏主题并提取代表性词语。压缩包…

2026/9/25 22:57:20 阅读更多 →
从ProX到UltraX:LLM预训练数据精炼方法演进史与UltraX-0.6B精炼模型完整详解

从ProX到UltraX:LLM预训练数据精炼方法演进史与UltraX-0.6B精炼模型完整详解

从ProX到UltraX:LLM预训练数据精炼方法演进史与UltraX-0.6B精炼模型完整详解 【免费下载链接】UltraX-Preview 项目地址: https://ai.gitcode.com/OpenBMB/UltraX-Preview OpenBMB 开源社区发布的 UltraX-Preview 数据集是 LLM 预训练数据精炼的最新成果&am…

2026/9/25 22:57:20 阅读更多 →
S型曲线Demo:手把手理解扩散模型DDPM原理与实现

S型曲线Demo:手把手理解扩散模型DDPM原理与实现

简介:面向机器学习初学者的扩散模型微型demo,通过生成S型曲线演示扩散模型从随机噪声逐步还原数据分布的核心过程,特别适合刚接触生成模型、想绕过复杂公式直接看代码逻辑的读者。压缩包共8个文件,大小约9.74MB,主程序…

2026/9/25 22:57:20 阅读更多 →
Robomongo 内嵌 esprima 2.7.3:ECMAScript 解析器在 MongoDB Shell 脚本解析中的集成与应用

Robomongo 内嵌 esprima 2.7.3:ECMAScript 解析器在 MongoDB Shell 脚本解析中的集成与应用

数据库客户端桌面应用 【免费下载链接】robomongo Native cross-platform MongoDB management tool 项目地址: https://gitcode.com/gh_mirrors/ro/robomongo 点击查看 免费下载 Robomongo(即 Robo 3T)是一款原生的跨平台 MongoDB 管理工具&…

2026/9/25 22:57:20 阅读更多 →
rsuite Calendar 自定义单元格样式:深入解析 cellClassName 的用法与实现原理

rsuite Calendar 自定义单元格样式:深入解析 cellClassName 的用法与实现原理

前端UI组件 【免费下载链接】rsuite 🧱 A suite of React components . 项目地址: https://gitcode.com/gh_mirrors/rs/rsuite 点击查看 免费下载 导读 本文围绕 rsuite 的 Calendar(日历)组件,重点讲解如何通过 ce…

2026/9/25 22:56:19 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/25 19:27:14 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/25 20:29:09 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/25 19:27:26 阅读更多 →