预言机与可信上链

# 预言机与可信上链

上链不等于真实:区块链让已确认的记录难以被单方篡改,但不能把假数据变成真数据。例如,冷链传感器能自动记录温度,但设备也可能故障或被篡改,所以自动采集和上链都不能替代源头校验。

# 预言机:把链外数据提供给智能合约

智能合约不能像普通后端一样直接调用外部 HTTP 接口,否则不同节点可能拿到不同结果。预言机(Oracle) (opens new window)负责获取外部数据,经过验证后供合约使用;它不是预测未来的工具,也不是自动判断真假的机器。

例如,借贷合约通过预言机获取 ETH 价格,计算抵押品价值,再判断是否允许清算。预言机提供数据,合约按规则处理业务;实际执行仍需要交易触发。

可靠性需要分层保证:多数据源、多独立节点交叉验证,降低单点造假风险;签名校验确认数据来自谁、是否被改动;业务合约检查更新时间和异常值,拒绝使用过期或明显异常的数据。这些措施能降低风险,但不能保证源头数据永远真实。

# Relayer:代为提交链上交易的服务

Relayer(中继服务)是负责接收任务、组织并提交链上交易的后台程序。它是一类服务角色,可以自己编写,也可以使用第三方提供的中继服务。实现时可以选择不同的编程语言、运行平台和签名方式,核心职责都是把待执行的操作组织成交易并提交到链上。

# 一次交易怎样送上链

例如定时结算:后台定时任务生成结算请求,Relayer 检查条件,组织并提交调用结算合约的交易。一次写链通常包含这些步骤:

  1. 接收任务:从接口、链上事件或任务队列中取得待处理请求,核验是否允许执行。
  2. 组织交易:确定目标链、合约和方法,填写参数、交易序号 nonce 和 Gas 费用等信息。
  3. 请求签名:使用本地密钥、硬件签名设备或 KMS 等签名服务,对交易签名。
  4. 广播并确认:通过区块链 RPC 节点提交已签名交易,保存交易哈希并查询回执,确认执行成功后才将任务标记为完成。

拿到交易哈希只表示交易已被提交,不保证执行成功。回执暂时查不到时,也不能直接认定失败并重新发一笔;应先核对原交易和链上业务状态。进一步说明见 交易生命周期。

# 谁签名、谁支付 Gas,谁决定权限

在普通以太坊交易中,交易发送账户负责签名并支付 Gas。Relayer 用自己的账户提交交易时,由该账户支付链上费用;私钥可以交给签名服务保管,但 ETH 余额仍属于对应的链上账户,签名服务不会自动替它充值或支付 Gas。

另一种场景是用户签署操作授权消息,由 Relayer 用自己的账户发送外层交易并先支付 Gas。这通常需要合约支持元交易,并核验用户授权。若 Relayer 只是转发用户已经签好的普通交易,发送账户仍是用户,Gas 也仍由用户账户支付,不能仅凭 “经过了 Relayer” 就认为费用被代付。

Relayer 不能绕过合约的权限检查。例如某个方法要求管理员权限,Relayer 的交易发送地址就必须具备这项权限;用户签署的授权消息也必须按合约规则验证,不能把任意后台请求当作授权。

# Relayer 与 RPC、KMS、预言机怎样分工

角色 负责什么
Relayer 决定何时处理任务,组织交易,调用签名与广播接口,跟踪结果和处理失败
区块链 RPC 提供查询链上状态、提交已签名交易等接口,不替应用决定是否应该执行某项业务操作
AWS KMS (opens new window) 签名服务的一种选择,保护签名密钥并检查调用权限,不判断业务操作是否符合规则
预言机 获取并提供可验证的外部数据;可信程度取决于数据来源、验证方式和参与节点

这些角色可以配合使用。Relayer 可以读取预言机提供的数据再触发交易,也可以先核验外部结果再提交,承担中心化预言机的部分职责;使用 KMS 则主要改善密钥保护,不会自动让业务数据真实或执行过程去中心化。

# 面试时怎样解释 Relayer

建议回答:Relayer 是代为提交链上交易的后台服务。它接收业务任务,检查条件,组织交易、请求签名,再通过 RPC 广播并确认结果。例如定时结算,后台到时间后提交任务,Relayer 检查是否满足结算条件,再调用合约。Gas 由发送交易的账户支付,合约仍会检查权限和业务规则;服务还要处理失败和重复请求,不能把交易提交成功等同于业务执行成功。

使用云端签名服务的实现示例见 使用 AWS KMS 签署以太坊交易 (opens new window)。

# 预言机与 Relayer:区别与可信度

合约不能主动查询外部接口,但链下程序可以查询后,通过交易把结果提交给合约。所以不一定要使用 Chainlink,自建后台服务也能完成这件事。

  • Relayer(中继服务)侧重代为提交交易。它可以先查询接口、核验条件,再调用合约,但是否核验以及怎样核验取决于具体实现。运行平台和签名服务提供基础设施,不会让合约获得访问外部接口的能力。
  • 预言机侧重为合约提供可验证的外部数据。它可以是中心化服务,也可以由多个独立节点组成网络。因此两者不是完全互斥的产品:核验并提交外部结果的 Relayer,也承担了中心化预言机的部分职责。

去中心化预言机的优势是减少对单一参与方的信任,不是自动保证数据真实。例如获取 BTC 价格,自建服务只读取一家交易所,需要信任该接口和自己的后台;采用多源、多节点聚合的预言机,则能降低单个来源出错或单个节点作恶的影响。代价是额外的服务费用、接入与验证成本,仍需检查数据时效。

但如果物流状态只来自一家公司的数据库,即使多个节点都读到 “已签收”,也不能证明货物真的送到了收件人手中。多节点能增强执行过程的可信度,不能把同一个数据源变成多个独立证据。

选型看信任边界:市场价格等需要独立外部依据的数据,优先评估可靠的预言机服务;业务本身接受由指定运营方确认的结果时,可以由受控 Relayer 提交。引入多节点执行网络,可以减少对单个执行服务的依赖,但数据源仍需要独立核验。

# 常见预言机与适用场景

预言机 主要特点 适合什么场景
Chainlink (opens new window) 既提供现成的数据服务,也支持由去中心化预言机网络执行自定义工作流 资产价格读取、链外 API 与链上合约联动
Pyth (opens new window) 聚合交易所、交易机构等提供的价格,侧重低延迟金融数据 永续合约等对价格更新速度敏感的应用
RedStone (opens new window) 模块化价格预言机,覆盖质押、再质押等资产 需要相关资产价格的借贷与 DeFi 应用
UMA (opens new window) 先提交结果,留出质疑期,有争议再裁决 预测市场、保险等事件结果确认,不是高频价格源

Chainlink 中这两项能力用途不同:

  • Data Feeds (opens new window):读取现成数据。多来源数据经预言机网络聚合后发布到链上,例如借贷合约读取 ETH/USD 价格来估值抵押品。
  • CRE(Chainlink Runtime Environment) (opens new window):编排完整流程。用 TypeScript 或 Go 编写由事件或定时任务等触发的工作流,调用链外 API、处理数据并读写合约;例如 “收到订单事件 → 查询物流状态 → 将结果写回链上” 。

Data Feeds 和 CRE 是不同能力,不是改名或替代关系;CRE 也能用于构建自定义数据源。选型时重点检查目标链与资产是否支持、更新频率是否满足业务、费用及异常处理机制;合约侧的安全检查见 预言机、滑点与 MEV 各自保护什么。

课程原文见 区块链基础:可信上链。

上次更新时间: 2026年10月10日 06:39:50