You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ethereum新手寻求Chainlink Outbound Oracle的Solidity示例代码指导

Outbound Oracle 指的是由智能合约主动发起请求,触发 Chainlink 节点执行链下任务(如调用外部 API、完成特定计算)并将结果返回链上的模式,和被动接收数据的 Inbound(如价格喂价)形成区别。

以下是一个简单的示例,实现合约发起请求获取外部API返回的指定数据:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

// 导入Chainlink核心合约
import "@chainlink/contracts/src/v0.8/ChainlinkClient.sol";

contract OutboundOracleExample is ChainlinkClient {
    // 存储链下任务返回的结果
    uint256 public apiResult;
    // Chainlink节点地址(需替换为实际可用节点)
    address private immutable oracle;
    // Job ID(需匹配节点上的对应任务)
    bytes32 private immutable jobId;
    // 单次请求支付的LINK数量
    uint256 private immutable fee;

    constructor() {
        // 设置LINK代币地址(以Sepolia测试网为例)
        setChainlinkToken(0x779877A7B0D9E8603169DdbD7836e478b4624789);
        oracle = 0xYourChainlinkNodeAddress; // 替换为实际节点地址
        jobId = "0xYourJobId"; // 替换为对应任务的Job ID
        fee = 0.1 * 10 ** 18; // 0.1 LINK
    }

    // 发起Chainlink链下任务请求
    function requestExternalData() public {
        // 构建请求,指定回调地址和回调函数
        Chainlink.Request memory req = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
        
        // 向请求中添加API参数(示例为调用返回数字的公开API)
        req.add("get", "https://api.example.com/data/value");
        req.add("path", "data.value"); // 指定API返回JSON中的数据路径

        // 发送请求并支付LINK费用
        sendChainlinkRequestTo(oracle, req, fee);
    }

    // 回调函数,接收Chainlink节点返回的结果
    function fulfill(bytes32 _requestId, uint256 _result) public recordChainlinkFulfillment(_requestId) {
        apiResult = _result;
    }

    // 提取合约中剩余的LINK(仅合约调用者可执行,可选)
    function withdrawLink() public {
        LinkTokenInterface linkToken = LinkTokenInterface(chainlinkTokenAddress());
        require(linkToken.transfer(msg.sender, linkToken.balanceOf(address(this))), "Transfer failed");
    }
}

核心逻辑说明

  • ChainlinkClient:封装了发起请求、验证回调的基础逻辑,简化开发流程。
  • buildChainlinkRequest:组装请求参数,绑定任务ID、回调地址与回调函数。
  • sendChainlinkRequestTo:将请求发送至指定Chainlink节点,并完成LINK费用转账。
  • recordChainlinkFulfillment:修饰回调函数,确保仅发起请求的Chainlink节点能调用,防止恶意篡改结果。

实操注意事项

  1. 合约需提前存入足够的LINK代币,用于支付链下任务的请求费用。
  2. 需替换代码中的oracle地址和jobId为实际可用的Chainlink节点信息,节点的Job需支持你要执行的链下操作(如API调用)。
  3. 测试阶段建议使用Sepolia等测试网,避免主网资金损失。

内容的提问来源于stack exchange,提问作者learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 12:45:50