【08】预言机机制

8-1 预言机概述

预言机(Oracle)的概念

预言机的含义

预言机在传统互联网中的含义

预言机英文为Oracle,最初源于古希腊宗教,意为“神谕、先知、预言”。

计算机科学之父艾伦▪图灵于1939年在博士论文里提出预言机的概念。

一部预言机可以解答两类问题:

一是决定性问题(Decision Problem,只需回答“是”或“否”的问题);

二是功能性问题(Function Problem,又被称为复杂性问题)。

预言机在区块链中的含义

区块链外信息写入区块链内的机制,一般被称为预言机。——摘自2018年11月6日中国人民银行发布的报告《区块链能做什么?不能做什么?》

预言机在区块链中的功能

预言机的功能就是将外界信息写入到区块链内,完成区块链与现实世界的数据互通。它允许确定的智能合约对不确定的外部世界作出反应,是智能合约与外部进行数据交互的唯一途径,也是区块链与现实世界进行数据交互的接口。

区块链中预言机的要求

区块链中为什么需要预言机

一切要从智能合约说起

以太坊将区块链带入到2.0时代,设计并实现了智能合约。

智能合约是一种特殊的计算机合同协议,使用信息化的方式传播、执行和验证,整个过程都通过计算机来实现。

为何需要预言机?

区块链是一个确定的、封闭的系统,每个节点需要获取精确一致的状态。

智能合约无法主动去获取链外的数据。

举个例子

假设小王和小李各自向智能合约里的地址发送1ETH作为赌注,并约定:

  1. 双方将赌注提前发送到智能合约地址,智能合约根据预言机提供的外界信息自动执行相应的程序;
  2. 如果小王押注的球队赢了,小王将从小李那里赢得1ETH,智能合约地址里的2ETH将自动发送给小王;
  3. 如果小李押注的球队赢了,小李将从小王那里赢得1ETH,智能合约地址里的2ETH将自动发送给小李;
  4. 小王和小李押注的球队打成了平局,智能合约地址里的ETH原路退回,两人均未有输赢。

预言机的分类

按照软硬件分类

软件预言机

通过API从第三方服务商或者网站获取数据,来作为智能合约的输入数据。最常用的如天气数据、航班数据、证券数据等等。

硬件预言机

直接从物理世界收集数据,并将其转换成数字价值,然后传入智能合约。这些设备包括条形码扫描器和传感器。

按照中心化与否分类
中心化预言机

由单一预言机为服务请求方提供数据。以Oraclize为代表。

去中心化预言机

由多个预言机共同提供数据获取服务。以Chainlink为代表。

按照数据流向分类
入站预言机(Inbound Oracles)

允许网络从外部数据源向智能合约发送信息

出站预言机(Outbound Oracles)

允许智能合约向外部数据源发送数据。

区块链预言机的执行

理想状态下预言机的工作流程

  1. 接受请求:预言机接收到用户合约发送的请求
  2. 获取数据:Oracle通过链外的API接口获取外部数据;
  3. 返回数据:Oracle一旦获得答案,再把数据返回给用户的智能合约使用。

可供预言机查询的数据源

互联网的URL链接

搜索引擎

其他区块链的数据

星际文件系统IPFS的数据

传感器的数据

预言机的应用

预言机作为区块链与现实世界进行数据交互的桥梁,应用场景非常多,可以说,所有需要与链外数据交互的区块链应用都需要借助预言机。

保险应用

预言机可以增强保险公司对客户真实情况的判断能力,并提高整个保险行业的信任水平。基于区块链的保险应用目前有Etherisc、HGS等。用户在平台上可购买航空延误险、农作物险等保险。

预测市场

预言机可以应用在预测市场中基于事件结果展开交易。事件可涵盖任何方面,包括想法、市场动态、政治事件等。应用预言机可以用去中心化的方式对事件结果取得共识,为预测市场提供奖励机制。

信贷平台

借贷平台允许匿名的用户用区块链上的加密资产抵押,来借贷出法币或者加密资产。这类应用需要使用预言机在贷款生成时提供价格数据,并且能监控加密抵押物的保证金比率,在保证金不足的时候发出警告并触发清算程序。

去中心化的稳定通证

稳定货币是一种和法币有稳定兑换率的加密货币,可以作为价值的储藏和交易的中间媒介。所有的稳定货币都需要预言机的帮助来获取外部世界稳定货币本身和锚定资产的兑换率等数据。

8-2 预言机经典应用

8-2-1 Oraclize

Oraclize基本概念及工作原理

回顾预言机

预言机为何诞生?

区块链无法主动获取现实世界的数据,既不能直接引入互联网数据,也不能自发调用外部网络API,而任何商业应用都不可避免地要与现实世界交互,特别是与互联网数据交互。由此,预言机诞生了。

市面上较为流行的预言机
  • Oraclize

为以太坊提供中心化数据传输预言机服务的项目

  • Chainlink

以太坊区块链上第一个被提出的去中心化预言机解决方案

  • Band Protocol

安全且可扩展的去中心化预言机(Oracle),以Layer2的形式为公链扩容。

  • DOS Network

提供去中心化的预言机服务的网络。它不但提供预言机功能,同时也为区块链提供无限的且可验证的计算力。

  • 蚂蚁链TEE预言机

基于TEE提供严谨可靠的外部数据访问能力,并对数据本身进行一个验证背书

Oraclize概述

Oraclize依托亚马逊AWS服务和TLSNotary证明技术,提供预言机的服务。目的是使智能合约可以访问其他区块链及链下网络中的数据。

特点

  • 中心化
  • 不需要信任它,它可以为所提供给智能合约的全部数据做真实性证明
  • 在比特币及以太坊上可用
Oraclize工作原理

举例:以太坊智能合约使用Oraclize从其他区块链和万维网中抓取数据

Oraclize数据源及数据输出格式

Oraclize数据源
  • URL

允许用户发送HTTP GET/POST请求,即从万维网中抓取数据

  • WolframAlpha

允许用户向WolframAlpha知识引擎提交查询

  • Blockchain

允许用户访问其他区块链的数据

  • IPFS

允许用户获取IPFS中存储的文件

  • computation

允许用户获取特定应用的链下结果

  • nested

是元数据源,不提供访问其他服务的权限。允许单个查询在任何可用数据源的基础上进行子查询

Oraclize数据输出格式

Oraclize数据输出格式多样化,包含:JSON、XML、HTML Parser、Binary Helper。

Oraclize可信第三方证明机制

检查验证Oraclize返回的数据是否真实,主要有三种机制:

  • TLSNontary Proof
  • Android Proof
  • Ledger Proof
TLSNontary Proof
TLSNontary Proof概述

TLSNontary Proof允许客户端向第三方提交证据,证明客户端与某服务器之间发生了HTTPS网络流量。

利用传输层安全协议(TLS)在服务器、被审核方(Oraclize)、审核方(Amazon云主机)之间分割TLS密钥(对称密钥和MAC密钥)

基本思想:被审计方向审计方证明某一个给定结果是由服务端在某个给定时间返回的。

TLSNontary Proof缺陷

Oraclize使用AWS虚拟机实例作为审计方,可以验证自实例化以来,它没有被篡改过,但是由于依然是中心化,过程依然需要依赖Amazon自身的可信(不会篡改虚拟机实例)。

Android Proof
Android Proof概述

Android Proof利用SafetyNet的软件(由Google开发)远程证明技术,主要验证:

运行环境是否安全

执行的代码是否与公开的一致

系统版本是否为最新版本

Ledger Proof
Ledger Proof概述

Ledger Proof利用代码证明和设备证明来验证任何第三方。

主要证明:

Oraclize的应用程序是否运行在了Ledger设备的TEE中

Oraclize服务定价模式

两个特性:

首次查询服务免费

从第二次起,需要支付服务请求费用(基础费用和证明费用)

8-2-2 蚂蚁链TEE预言机

TEE预言机的实现原理与特性

Oracle预言机概述

受限于区块链的共识模型,智能合约只能调用内部合约,无法直接与外部系统进行交互。区块链预言机(Oracle)是区块链与外部世界交互的一种实现机制。

蚂蚁链TEE预言机服务介绍

TEE(Trusted Execution Environment)是一个安全隔离的执行环境,提供隔离执行、可信应用的完整性、可信数据的机密性、安全存储等安全特征,使预言机服务数据服务安全可信。蚂蚁预言机服务是基于TEE可信执行环境技术实现的区块链预言机服务,该服务旨在为区块链智能合约提供可信访问外部数据源能力。

蚂蚁链TEE预言机服务也称为蚂蚁链外部数据源服务,该服务会在智能合约平台部署有关外部数据源服务合约,用户合约通过调用该服务合约发送外部数据源请求,链下的TEE外部数据源服务对接该服务合约,监听用户的请求,然后去对应的外部数据源取数据,最后将结果返回给用户合约。

蚂蚁链TEE预言机服务特性
  • 数据安全可信

区块链预言机底层使用TEE技术实现,TEE是一个安全隔离的执行环境,提供隔离执行、可信应用的完整性、可信数据的机密性、安全存储等安全特征,使预言机服务数据服务安全可信。

  • 支持HTTPS协议

通过HTTPS协议,区块链预言机会与目标数据源建立端到端的安全通行通道,并且可以完成对数据源的证书校验以确定身份,从而安全、可靠地获取来自指定外部数据源的数据。

  • 支持JSON API

JSON是一种轻量级的数据交换格式,广泛地被采用为API的数据交换格式。区块链预言机内置JSON解析器,如果请求的URL响应格式是JSON格式,可以在请求命令中设置jsonpath命令,使区块链预言机根据jsonpath读取部分JSON数据,只返回这部分数据上链。

  • 支持访问要权限认证的API

一些API需要认证授权访问,例如使用OAuth 2.0协议实现的API,需要在请求中携带服务端认证鉴权需要的参数,但这些参数属于私密信息不可泄露。这种情况下,利用TEE技术提供的机密性,与区块链预言机的TEE环境建立端到端的加密信封,使得请求只在TEE硬件可信执行环境里面解密,从而不会泄露请求机密。

  • 高可用预言机集群

区块链预言机服务使用集群架构实现,为合约提供高可用的数据访问服务。

蚂蚁链外部数据源服务原理

外部数据源服务使用TEE技术实现,对于每笔外部数据请求都将在可信硬件环境中执行

  1. 可信硬件环境会验证外部数据源的TLS通讯证书以确认数据源的身份,通过TLS协议确保拿到的数据没有被第三方篡改
  2. 可信硬件环境得到数据后,会使用硬件私钥对数据进行签名,并返回给智能合约
  3. 智能合约将自动验证可信硬件的签名,确保数据是可信硬件执行结果,没有被第三方篡改,从而安全可靠地获取来自指定外部数据源的数据

TEE预言机合约开发流程

通过外部数据源服务,让智能合约获取指定外部数据源数据的开发流程主要分为7步:

  1. 获得预言机合约ID
  2. 获得合约API定义
  3. 用户合约引入合约API定义
  4. 用户合约实现回调接口,用于异步接收请求结果
  5. 用户请求需要使用CURL命令构建外部数据源请求
    1. CURL命令描述了预言机合约访问目的互联网资源的URI,例如:curl https://address[:port][/path][?args]{options]
  6. 用户合约向预言机合约发送查询请求
  7. 用户合约的回调函数被预言机合约调用
蚂蚁链外部数据源服务合约接口

OracleInterface.sol中定义了用户合约与预言机合约的通信接口

  1. curlRequestDefault是业务合约向预言机合约发送请求的接口
  2. 业务合约提供oracleCallbackCurlResponse来接收预言机合约的请求结果回调
外部数据源服务合约接口使用流程

外部数据源服务合约接口OracleInterface.sol是用户合约和预言机合约相互通信的桥梁

用户智能合约调用预言机合约的curlRequestDefault接口发起查询请求,预言机合约同步返回查询结果,即请求单据号(request_id)

预言机合约获取到查询结果数据后,异步回调用户合约的oracleCallbackCurlResponse回调接口

外部数据源服务合约开发案例

用户合约调用预言机外部数据源服务合约实现与外部系统进行交互

<think>嗯,用户想了解HOOK函数的定义、用法和实现。首先,我需要整理一下不同来源的信息。引用1提到了Vue中的Hook函数,用来管理状态,比如计数器。引用2分类了各种hook类型,比如pre-hook和post-hook。引用3讲的是libc中的内存分配hook,比如__malloc_hook,用户可以通过这些弱符号来替换自己的实现。引用4讨论了PyTorch的hook,用于在forward或backward时插入处理逻辑。 首先,定义部分需要综合不同场景下的HOOK概念。HOOK函数本质是拦截和处理特定事件,可以在不修改原代码的情况下扩展功能。比如在Vue中是状态管理,在PyTorch中是获取中间层输出,在libc中是监控内存分配。 然后,用法部分要分不同框架或环境。Vue的组合式API使用useCounter这样的函数,返回响应式状态和方法。PyTorch的register_forward_hook用于特征可视化,而libc的hook需要替换弱符号函数指针,比如__malloc_hook。 实现方面,不同平台机制不同。JavaScript/Vue利用闭包和响应式系统,C语言通过弱符号和函数指针,PyTorch则提供注册hook的API。需要强调HOOK的核心是回调函数和事件触发。 用户可能想知道HOOK的应用场景,比如调试、性能分析、扩展功能。还要注意不同实现中的注意事项,比如PyTorch的backward hook不能原地修改梯度,libc的hook需要谨慎处理避免循环调用。 生成的问题可能需要涵盖具体实现步骤、不同框架的例子、优缺点比较以及常见问题。确保回答覆盖定义、使用和实现,并结合例子说明,帮助用户全面理解HOOK函数在不同上下文中的应用。</think>### HOOK函数详解 --- #### **一、定义** HOOK函数是程序设计中用于**拦截/监听特定事件**的技术手段,通过**回调函数机制**在系统流程中插入自定义逻辑,分为两种实现形式: 1. **框架层**:通过API注册回调函数(如PyTorch/Vue) 2. **系统层**:修改函数指针或符号表(如C标准库内存管理)[^3][^4] 数学表达示例: 设原函数为$f(x)$,HOOK函数为$h(x)$,则拦截过程可表示为: $$ f_{hooked}(x) = h(f(x)) $$ --- #### **二、核心使用场景** | 类型 | 应用场景 | 技术特性 | |-------------|-----------------------------------|----------------------------------| | 前端框架 | Vue3组合式API状态管理[^1] | 响应式数据封装 | | 深度学习 | PyTorch特征可视化[^4] | 梯度/激活值捕获 | | 系统编程 | 内存分配监控(malloc/free) | 弱符号函数指针覆盖 | | 事件处理 | 网络请求拦截 | 请求/响应过滤 | --- #### **三、实现方式对比** **1. Vue组合式函数(高阶HOOK)** ```javascript // useCounter.js import { reactive, toRefs } from 'vue'; export function useCounter(initial = 0) { const state = reactive({ count: initial }); const methods = { increment: () => state.count++, decrement: () => state.count-- }; return { ...toRefs(state), ...methods }; } ``` *实现原理*:通过闭包封装响应式对象,返回可组合的方法集[^1] --- **2. C语言内存HOOK(系统级)** ```c // 覆盖malloc的HOOK实现 void *(*orig_malloc)(size_t) = NULL; void my_malloc_hook(size_t size) { printf("Allocating %zu bytes\n", size); return orig_malloc(size); } __malloc_hook = my_malloc_hook; // 修改全局函数指针[^3] ``` *注意事项*:需保存原始函数指针防止循环调用 --- **3. PyTorch特征捕获HOOK** ```python # 注册前向传播HOOK def forward_hook(module, input, output): print(f"Layer {module.__class__.__name__} output shape: {output.shape}") model.conv1.register_forward_hook(forward_hook) # [^4] ``` *数学表达*: 设卷积层计算为$y = W \ast x + b$,HOOK将捕获输出张量$y$ --- #### **四、关键技术要点** 1. **生命周期管理** Vue HOOK自动处理依赖清理,而PyTorch需手动移除HOOK: ```python handle.remove() # 显式释放HOOK ``` 2. **执行时序控制** - Pre-hook:在目标函数执行前触发[^2] $$ f_{pre}(x) \rightarrow h(x) \rightarrow f(x) $$ - Post-hook:在目标函数执行后触发[^4] $$ f(x) \rightarrow h(f(x)) $$ 3. **安全边界条件** 系统级HOOK需确保: $$ \forall x \in D, \|h(f(x)) - f(x)\| < \epsilon $$ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FrancyZhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值