오프체인 데이터 조회 처리
Chainlink를 통해 외부 API에 데이터를 요청하고 수신하는 패턴을 구현하며 데이터 무결성을 보장합니다.
오프체인 데이터 조회 처리은(는) CoddyKit의 무료 Blockchain Smart Contracts with Solidity 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Blockchain Smart Contracts with Solidity 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Blockchain Smart Contracts with Solidity 강의에는 총 4개의 강의가 포함되어 있습니다.
이 강의의 일부는 아직 번역되지 않았으며 영어로 표시됩니다.
Bridging On-chain & Off-chain
Smart contracts live on the blockchain, isolated from the outside world. But what if your contract needs real-time data, like a cryptocurrency price or a weather report?
This is where oracles come in. In this lesson, we'll learn how to implement patterns for requesting and receiving external data from APIs using Chainlink, ensuring the data is secure and reliable.
The Oracle Request-Response Model
Chainlink acts as a bridge, allowing your smart contract to securely interact with off-chain (external) data sources. It works using a request-response cycle:
- Your smart contract sends a request to a Chainlink oracle network.
- A Chainlink node fetches the data from the specified API.
- The Chainlink node then sends a response back to your contract by calling a specific 'callback' function.
Your Contract: A Chainlink Client
To interact with Chainlink, your Solidity contract needs to inherit from the ChainlinkClient contract provided by Chainlink.
This base contract gives you access to essential functions for building and sending data requests, as well as security features for receiving responses.
Initiating a Data Request
To ask for data, you'll use functions like buildChainlinkRequest and sendChainlinkRequestTo.
buildChainlinkRequest: Prepares the request, specifying details like the Chainlink job ID, your contract's address, and the callback function the oracle should call.sendChainlinkRequestTo: Sends the prepared request to the Chainlink oracle, along with the LINK token fee.
Code: Requesting Live Price Data
Here's a simplified contract showing how to initiate a Chainlink request for external data, like a cryptocurrency price. This contract would be deployed to a test network.
The requestEthPrice function builds the request, specifies the API to call, and sends it to the oracle.
/*
This is a simplified example for explanation.
For a real deployment, replace placeholders like
oracle address, LINK address, jobId, and fee
with values for your chosen Chainlink network.
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "@chainlink/contracts/src/v0.8/ChainlinkClient.sol";
contract PriceConsumer is ChainlinkClient {
bytes32 public lastRequestId; // Stores the ID of our last request
uint256 public currentPrice; // Where we'll store the fetched price
address private immutable i_oracle; // Chainlink oracle address
bytes32 private immutable i_jobId; // Specific job ID for the data source
uint256 private immutable i_fee; // Amount of LINK to pay for the request
constructor(address _oracle, address _link, bytes32 _jobId, uint256 _fee) {
setChainlinkToken(_link); // Set the LINK token address
i_oracle = _oracle;
i_jobId = _jobId;
i_fee = _fee;
}
// Function to request a price from a Chainlink oracle
function requestEthPrice() public returns (bytes32) {
// 1. Build the Chainlink request
Chainlink.Request memory request = buildChainlinkRequest(
i_jobId, // The job ID for the oracle
address(this), // Our contract's address
this.fulfillEthPrice.selector // The function the oracle will call back
);
// 2. Add parameters for the Chainlink node (e.g., API URL, path to data)
request.add("get", "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD");
request.add("path", "USD"); // Extract the USD value from the JSON response
request.addInt("times", 100000000); // Multiply by 10^8 for fixed-point math
// 3. Send the request to the oracle
lastRequestId = sendChainlinkRequestTo(i_oracle, request, i_fee);
return lastRequestId;
}
// The fulfillEthPrice function will be defined later!
}Tracking Requests with IDs
When you call sendChainlinkRequestTo, it returns a unique identifier: a bytes32 value called the requestId.
- This ID acts like a tracking number for your data request.
- It's essential because multiple requests might be pending, and the
requestIdensures that when the data comes back, your contract knows which request it belongs to.
Always store this requestId in a state variable!
Fulfilling the Data Request
Once the Chainlink node successfully fetches the data, it calls the callback function you specified (e.g., fulfillEthPrice) in your contract.
This function's purpose is to:
- Receive the
requestId(to match it with the original request). - Receive the actual data fetched by the oracle (e.g.,
uint256 _price). - Process and store the data within your contract's state.
Code: Implementing the Callback
Let's complete our PriceConsumer contract by adding the fulfillEthPrice function. This is the function that the Chainlink oracle will call back to with the fetched price.
The recordChainlinkFulfillment modifier and the requestId check are crucial for security and data integrity.
/*
This is a simplified example for explanation.
For a real deployment, replace placeholders like
oracle address, LINK address, jobId, and fee
with values for your chosen Chainlink network.
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "@chainlink/contracts/src/v0.8/ChainlinkClient.sol";
contract PriceConsumer is ChainlinkClient {
bytes32 public lastRequestId; // Stores the ID of our last request
uint256 public currentPrice; // Where we'll store the fetched price
address private immutable i_oracle; // Chainlink oracle address
bytes32 private immutable i_jobId; // Specific job ID for the data source
uint256 private immutable i_fee; // Amount of LINK to pay for the request
constructor(address _oracle, address _link, bytes32 _jobId, uint256 _fee) {
setChainlinkToken(_link); // Set the LINK token address
i_oracle = _oracle;
i_jobId = _jobId;
i_fee = _fee;
}
// Function to request a price from a Chainlink oracle
function requestEthPrice() public returns (bytes32) {
Chainlink.Request memory request = buildChainlinkRequest(
i_jobId,
address(this),
this.fulfillEthPrice.selector // Callback function
);
request.add("get", "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD");
request.add("path", "USD");
request.addInt("times", 100000000); // Multiply by 10^8
lastRequestId = sendChainlinkRequestTo(i_oracle, request, i_fee);
return lastRequestId;
}
// This is the callback function called by the Chainlink oracle
function fulfillEthPrice(bytes32 _requestId, uint256 _price)
public
recordChainlinkFulfillment(_requestId) // Security modifier
{
// Crucial: Check if the requestId matches our last sent request
require(lastRequestId == _requestId, "Request ID mismatch!");
currentPrice = _price; // Store the fetched price
}
}Enhancing Data Integrity
Ensuring the integrity of off-chain data is paramount. Chainlink employs several mechanisms, and you should use them:
recordChainlinkFulfillment(_requestId): This modifier (fromChainlinkClient) verifies that the caller is the authorized Chainlink oracle for that specificrequestId.requestIdMatching: Always include arequire(lastRequestId == _requestId, ...)check in your callback. This prevents accidental or malicious fulfillment of an old or unrelated request.- Error Handling: Consider what happens if the oracle fails or returns invalid data. Implement checks and revert if necessary.
Quick Check: Oracle Flow
You've learned about requesting and receiving data from Chainlink oracles.
Consider the following steps involved in a Chainlink request-response cycle:
Recap: Off-chain Data Retrieval
In this lesson, we explored how to enable your smart contracts to interact with external data using Chainlink oracles.
- We learned about the request-response model, where your contract requests data and an oracle node delivers it.
- You saw how to use the
ChainlinkClientbase contract to build and send requests. - We implemented a callback function (e.g.,
fulfillEthPrice) to receive the data. - Finally, we discussed the importance of
requestIdmatching and therecordChainlinkFulfillmentmodifier for data integrity and security.
You can now build contracts that react to real-world events!
자주 묻는 질문
“오프체인 데이터 조회 처리” 강의는 무료인가요?
네 — “오프체인 데이터 조회 처리” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Blockchain Smart Contracts with Solidity 강의 전체를 잠금 해제할 수 있습니다. Blockchain Smart Contracts with Solidity 강의에는 총 4개의 강의가 포함되어 있습니다.
“오프체인 데이터 조회 처리”에서 뭘 배우나요?
Chainlink를 통해 외부 API에 데이터를 요청하고 수신하는 패턴을 구현하며 데이터 무결성을 보장합니다. 브라우저에서 직접 실행하는 실습 코드로 Blockchain Smart Contracts with Solidity을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Blockchain Smart Contracts with Solidity을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Blockchain Smart Contracts with Solidity은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“오프체인 데이터 조회 처리” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Blockchain Smart Contracts with Solidity 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Blockchain Smart Contracts with Solidity 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 오라클 문제 이해하기
- Chainlink 오라클 통합
- 오프체인 데이터 조회 처리
- 사용자 지정 오라클 컨트랙트 구축