预言机详解系列之Chainlink(上)

Odaily星球日报發佈於 2025-04-15更新於 2025-04-15

文章摘要

在区块链领域中,预言机是一种能够为链上智能合约提供外部信息的系统。作为连接智能合约和区块链以外世界的中间件,预言机扮演着极其关键的基础设施角色,它的主要功能是为区块链中的智能合约提供数据。

在区块链领域中,预言机是一种能够为链上智能合约提供外部信息的系统。作为连接智能合约和区块链以外世界的中间件,预言机扮演着极其关键的基础设施角色,它的主要功能是为区块链中的智能合约提供数据。

例如,如果我们在以太坊网络上创建一个智能合约,而这个合约需要访问原油某天的交易量数据。然而智能合约本身无法获取这种链下的现实世界数据,因此需要通过预言机来实现。在这种情况下,智能合约会将所需日期的原油交易量写入事件日志,然后,链下会启动一个进程来监控并订阅这个事件日志,当监听到交易中的请求时,该进程会通过提交链上交易,调用合约的相关方法,把指定日期的原油交易量信息上传到智能合约中。

预言机详解系列之Chainlink(上)

数据源自 https://defillama.com/oracles

Chainlink

在区块链中,市场占有率最大的莫过于 Chainlink 预言机。Chainlink 是一个去中心化的预言机项目,它的作用就是以最安全的方式向区块链提供现实世界中产生的数据。Chainlink 在基本的预言机原理的实现方式之上,围绕 LINK token 通过经济激励建立了一个良性循环的生态系统。Chainlink 预言机需要通过 LINK token 的转账来实现触发。而 LINK 则是以太坊网络上的 ERC 677 合约。而基于 LINK ERC 677 token 完成的预言机功能,属于其中的请求 / 响应模式。

ERC 677 代币中的 transferAndCall

预言机详解系列之Chainlink(上)

预言机实质上是提供服务的一方,ChainLink 在设计预言机框架的时候首先想到的是预言机的用户如何向提供服务的预言机支付服务费用。但由于标准的同质化 Token 合约 ERC 20 无法满足支付后提供服务这样的一个需求,因此 ChainLink 自己提出了一个适用于预言机服务场景的标准——ERC 677 。

从上面的代码中可以看到,ERC 677 其实只是在标准 ERC 20 的基础上增加了一个 transferAndCall 方法。该方法将支付和服务请求合二为一,满足了预言机业务场景的需求。

预言机详解系列之Chainlink(上)

当用户进行 transferAndCall 进行转账时,除了 ERC 20 的转账以外,还会判断 to 地址是否为一个合约地址,如果是,则调用该 to 地址的 onTokenTransfer 方法。(这里 ERC 677 Receiver 里面只有一个方法:onTokenTransfer)

我们也可以去到 Etherscan 上查看 LINK 代币的合约源码:https://etherscan.io/address/0x514910771af9ca656af840dff83e8264ecf986ca#code

预言机详解系列之Chainlink(上)

可以看到 LINK Token 在实现的时候除了多对 _to 地址进行了校验以外,都是实实在在继承了 ERC 677 的 transferAndCall 方法。注意:在请求预言机服务之前,要先确定该预言机是否可信,因为预言机为消费者提供服务之前需要先付款。(人人都能提供预言机服务)

预言机详解系列之Chainlink(上)

预言机可信度划分

链上 oracle 请求

下面来看看 oracle 合约的 onTokenTransfer 方法是如何实现的:

预言机详解系列之Chainlink(上)

当预言机的消费者使用 transferAndCall 方法支付费用并请求预言机的服务,这里这个 to 地址就是被请求的预言机的地址了。预言机中的 onTokenTransfer 方法首先会校验转账是否为 LINK 代币(onlyLINK),其实就是判断 msg.sender 是否为 Link 代币合约的地址。然后会判断 _data 的长度有没有超过最大限度。最后会判断_data 中是不是以“oracleRequest”开头的 function selector。当然这里的 function selector 可以根据预言机所提供的服务进行定制,不一定非要是“oracleRequest”,具体看这个预言机对外暴露什么样的接口了。

当这些 modifier 都判断通过后,再检查当前的函数调用者和转账金额是否跟 _data 中的相同。这一些列的安全检查都通过后,才通过一个 delegatecall 来 call 当前这个 oracle 合约。当然,因为已经检查过 _data 中的 function selector 了,所以其实是 call 的 oracleRequest 方法。

预言机详解系列之Chainlink(上)

首先,将 oracle 请求者和他发送过来的 nonce 拼接然后进行哈希,作为本次请求的 requestId,并通过查检查 commitments 映射看是否是唯一的 id。检查没问题的话,就设置一个过期时间,并将 requestId 添加到 commitments 中去,并将 _payment、_callbackAddress、_callbackFunctionId 和 expiration 进行拼接作为 value。最重要的是,发出一个 OracleRequest 事件,该事件中包含了请求数据 _data,是一种 Concise Binary Object Representation(CBOR) 数据。该编码格式轻量简洁,可以简单理解为二进制形式 JSON 格式。这个数据可以是各种各样的形式,看链下节点是如何设计的了。

例如:一个 Chainlink: ETH/USD Aggregator,有一笔交易包含了 OracleRequest 事件:

预言机详解系列之Chainlink(上)

OracleRequest 事件示例

该事件可以看出,是 0xF79D6aFBb6dA890132F9D7c355e3015f15F3406F 这个 ETH/USD 价格聚合器向 oracle:0x7e94a8a23687d8c7058ba5625db2ce358bcbd244 发出的价格数据请求。如果 oracle 返回请求数据的话,可以从这里面知道返回的合约地址:0xF79D6aFBb6dA890132F9D7c355e3015f15F3406F,需要调用的方法 ID: 6 A 9705 B 4 ,以及过期时间: 1618185924 。

链下节点回应

3.1 链下调用 fulfillOracleRequest

预言机详解系列之Chainlink(上)

首先进行检查:

  • onlyAuthorizedNode:函数调用者 (msg.sender) 必须是合约的 owner 或在授权的列表内;

  • isValidRequest:依旧去 commitments 映射中检查是否存在该 requestId;

  • 将 payment、callbackAddress、_callbackFunctionId 和 expiration 进行拼接,检查是否是该 requestId 在 commitments 映射中对应的值。

如果这些检查都通过了的话,那么将这次的请求的花费累加到 withdrawableTokens 中,记录可以取款的数额。之后将该 _requestId 从 commitments 映射中删除。最后计算一下剩余的 gas 量,看是否大于 MINIMUM_CONSUMER_GAS_LIMIT,即回调发出请求的合约的回调函数执行最小需要的 gas 量。

如果上述检查都通过了,那么可以用 call 的形式正式调用请求者合约的回调函数。

回应 request 应该尽量迅速,因此这里推荐使用 ZAN 的节点服务(https://zan.top/home/node-service?chInfo=ch_WZ)来提高响应速度。可以在节点服务控制台找到获取对应的 RPC 链接以提高链下发送交易的速度。

预言机详解系列之Chainlink(上)

3.2 回调函数

之前我们从 oracleRequest 中知道了回调函数的 id 是 6 A 9705 B 4 ,查询得到该方法为「 chainlinkCallback(bytes 32, int 256 」

预言机详解系列之Chainlink(上)

预言机详解系列之Chainlink(上)

validateChainlinkCallback 是一个可以自定义的函数,这里有一个 modifier:

预言机详解系列之Chainlink(上)

在 pendingRequests 里面检查该 _requestId 对应请求的 oracle 是否匹配。并发出事件 ChainlinkFulfilled:

预言机详解系列之Chainlink(上)

如果校验都通过了的话,那么就可以对 responds 做进一步的处理了,这里是对 answers 映射进行更新。那么如果是价格预言机的话,则是将回应的价格数据赋给 currentPrice 做相应的价格更新:

预言机详解系列之Chainlink(上)

以上是通用预言机服务的完整流程。

我们以 Chainlink 提供的「 TestnetConsumer 」合约中的一个「 requestEthereumPrice 」方法为例来简单讲一下价格预言机请求响应的流程。这个函数定义如下:

预言机详解系列之Chainlink(上)

它所实现的功能就是从指定的 API(cryptocompare) 获取 ETH/USD 的交易价格。函数传入的参数是指定的 oracle 地址和 jobId。将一些列的请求参数组好后,调用「 sendChainlinkRequestTo 」方法将请求发出。「 sendChainlinkRequestTo 」是定义在 Chainlink 提供的库中的一个接口方法,定义如下:

预言机详解系列之Chainlink(上)

Oracle 合约在收到转账之后,会触发「 onTokenTransfer 」方法,该方法会检查转账的有效性,并通过发出「 OracleRequest 」事件记录更为详细的数据信息。

这个日志会在 oracle 合约的日志中找到。链下的节点会订阅该主题的日志,在获取到记录的日志信息之后,节点会解析出请求的具体信息,通过网络的 API 调用,获取到请求的结果。之后通过提交事务的方式,调用 Oracle 合约中的「 fulfillOracleRequest 」方法,将数据提交到链上。

这个方法会在进行一系列的检验之后,会将结果通过之前记录的回调地址与回调函数,返回给消费者合约。

那我作为开发者我只想要用已有的币对价格,而不需要自己指定这些 url 可不可以呢?

答案是可以。第一种使用方式,官方给的示例代码是这样的:

预言机详解系列之Chainlink(上)

首先,每个交易对都有一个单独的 Price Feed,也叫 Aggregator,其实就是一个个 AggregatorProxy,像下面这样:

预言机详解系列之Chainlink(上)

具体这个 interface 实现比较简单,可以参考 AAVE/ETH 这个 pair:https://etherscan.io/address/0x6Df09E975c830ECae5bd4eD9d90f3A95a4f88012#code

总共有 5 个查询方法:

  • decimals():返回的价格数据的精度位数,一般为 8 或 18 

  • description():一般为交易对名称,比如 ETH / USD

  • version():主要用来标识 Proxy 所指向的 Aggregator 类型

  • getRoundData(_roundId):根据 round ID 获取当时的价格数据

  • latestRoundData():获取最新的价格数据

大部分应用场景下,合约可能只需要读取最新价格,即调用最后一个方法,其返回参数中,answer 就是最新价格。

另外,大部分应用读取 token 的价格都是统一以 USD 为计价单位的,若如此,你会发现,以 USD 为计价单位的 Pair,精度位数都是统一为 8 位的,所以一般情况下也无需根据不同 token 处理不同精度的问题。

本文由 ZAN Team(X 账号 @zan_team) 的 XiG(X 账号 @SHXiGi)撰写。

熱門幣種推薦

你可能也喜歡

扎克伯格,把AI牛市吓了一跳

扎克伯格领导的Meta公司近日宣布,将内部“过剩”的AI算力资源对外出售。这一看似普通的商业决策,却在7月2日引发了AI基础设施板块的剧烈震荡,英伟达、台积电、AMD等硬件巨头股价集体下跌,相关板块一夜损失万亿市值,而Meta自身股价则反向上涨。 市场反应如此强烈,核心在于此举动摇了过去两年AI牛市的核心定价逻辑——“算力永远不够”。整个AI产业的估值循环建立在GPU(图形处理器)极度稀缺的假设之上,从GPU到HBM(高带宽内存)、光模块等环节都因此获得高估值。Meta的举动首次公开传递了“算力可能过剩”的信号。 Meta此举有三层深层动机:一是提高巨额资本开支下算力资源的利用率,在研发间歇期将闲置算力变现;二是战略路径选择,其开源模型Llama不直接盈利,真正的目标是仿效亚马逊AWS,通过提供算力服务构建生态并盈利;三是重新定义AI基础设施,向市场提供“GPU + 训练框架 + 开源模型 + 云服务”的一体化解决方案,而不仅仅是硬件。 资本市场担心的并非Meta多卖几张显卡,而是其背后预示的商业模式变革。如果算力可以便捷地租赁共享,新入局的AI公司可能不再需要大量自购GPU,这将从根本上改变过去基于“每家厂商都必须囤货”的线性增长需求模型,转向基于实际调用量的动态调整。这类似于当年AWS将企业购买服务器的资本支出模式转变为云服务的运营支出模式。 受冲击最大的是CoreWeave这类纯算力租赁公司,它们建立在巨头算力自用、市场缺卡的真空期。面对Meta提供的“算力+软件+模型”的全栈服务,其纯硬件租赁模式的竞争力将面临严峻挑战。 市场暴跌后次日出现反弹,原因是市场经过重新评估后认识到:尽管长期方向可能从“绝对短缺”转向“结构性过剩”,但短期内大模型训练和推理需求依然旺盛,Meta能释放的闲置算力相对于全球总需求仍有限。然而,方向已然改变,这意味着AI产业的驱动逻辑正从“短缺驱动”转向“效率驱动”。未来的竞争将不再是比谁买的卡多,而是比谁能更高效、更低成本地利用已有算力。 扎克伯格的这一动作,像一声发令枪,标志着AI产业单纯依靠囤积算力硬件就能估值暴涨的红利期即将结束,一个比拼运营效率、资产回报率的新时代正在开启。

marsbit10 分鐘前

扎克伯格,把AI牛市吓了一跳

marsbit10 分鐘前

以太坊交易者们,在鲸鱼转移2600万美元后,请密切关注此事,因为…

自跌破1,510美元后,以太坊(ETH)一直在窄幅区间内交易,过去一周徘徊在1,600美元附近。截至发稿,ETH报1,622美元,24小时上涨2.8%。这种平淡的价格走势使得部分投资者减少持仓,另一些则在等待更明确的趋势。 近期,一位在5月下旬至6月期间累计购入约91,945 ETH(当时价值约1.599亿美元)的巨鲸“Satofashi”将16,842 ETH(约2,687万美元)转移至交易所。其平均购入成本约为1,749美元,若此刻出售将面临约266万美元的亏损。不过,其大部分ETH持仓未动,此举可能意在重新配置资产(如用作抵押或轮动资金),而非全面清仓。 与此同时,链上数据显示交易所净流入量连续两日为正,表明有更多ETH转入交易所,这可能带来潜在的抛压。 从技术指标看,尽管市场整体疲软,ETH仍坚守在1,600美元水平。MACD指标虽处于零轴下方,但已形成看涨交叉并升至-64,同时BvB指标也连续两日转为正值。这些迹象表明下行动能正在减弱,市场势头有所改善,但尚不能确认为看涨反转。 综合来看,若改善势头延续,ETH可能向上测试1,777美元;然而,若大额持币者持续向交易所充值,可能增加卖压,导致价格再次考验1,500美元支撑位。当前ETH正处于关键抉择点。

ambcrypto22 分鐘前

以太坊交易者们,在鲸鱼转移2600万美元后,请密切关注此事,因为…

ambcrypto22 分鐘前

交易

現貨

熱門文章

如何購買LINK

歡迎來到HTX.com!在這裡,購買ChainLink (LINK)變得簡單而便捷。跟隨我們的逐步指南,放心開始您的加密貨幣之旅。第一步:創建您的HTX帳戶使用您的 Email、手機號碼在HTX註冊一個免費帳戶。體驗無憂的註冊過程並解鎖所有平台功能。立即註冊第二步:前往買幣頁面,選擇您的支付方式信用卡/金融卡購買:使用您的Visa或Mastercard即時購買ChainLink (LINK)。餘額購買:使用您HTX帳戶餘額中的資金進行無縫交易。第三方購買:探索諸如Google Pay或Apple Pay等流行支付方式以增加便利性。C2C購買:在HTX平台上直接與其他用戶交易。HTX 場外交易 (OTC) 購買:為大量交易者提供個性化服務和競爭性匯率。第三步:存儲您的ChainLink (LINK)購買ChainLink (LINK)後,將其存儲在您的HTX帳戶中。您也可以透過區塊鏈轉帳將其發送到其他地址或者用於交易其他加密貨幣。第四步:交易ChainLink (LINK)在HTX的現貨市場輕鬆交易ChainLink (LINK)。前往您的帳戶,選擇交易對,執行交易,並即時監控。HTX為初學者和經驗豐富的交易者提供了友好的用戶體驗。

1.0k 人學過發佈於 2024.12.13更新於 2026.06.02

如何購買LINK

相關討論

歡迎來到 HTX 社群。在這裡,您可以了解最新的平台發展動態並獲得專業的市場意見。 以下是用戶對 LINK (LINK)幣價的意見。

活动图片