Создание пользовательских оракульных контрактов
Научитесь проектировать и реализовывать собственный шаблон оракула в Solidity, включая сценарии запросов и ответов, доверенных обновляющих компонентов и проверки актуальности данных в блокчейне.
«Создание пользовательских оракульных контрактов» — бесплатный урок Blockchain Smart Contracts with Solidity на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Blockchain Smart Contracts with Solidity, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Blockchain Smart Contracts with Solidity содержит 4 уроков всего.
Части этого урока еще не переведены и отображаются на английском.
Beyond Third-Party Oracles
Chainlink and similar networks cover common feeds, but sometimes you need data nobody else provides, like a proprietary API result. In those cases you build a custom oracle: an off-chain updater plus an on-chain contract that stores and serves the data.
The Two-Party Design
A custom oracle has two sides:
- Off-chain updater: a server that reads the external source and sends transactions.
- On-chain contract: stores the latest value and exposes a read function for other contracts.
A Minimal Storage Oracle
The simplest oracle just lets a trusted address write a value that anyone can read.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract SimpleOracle {
address public updater;
uint256 public value;
uint256 public lastUpdated;
constructor() {
updater = msg.sender;
}
function setValue(uint256 newValue) external {
require(msg.sender == updater, 'not updater');
value = newValue;
lastUpdated = block.timestamp;
}
}Guarding the Updater
The single point of trust is the updater address. Protect it with access control and allow it to be rotated safely if a key is compromised.
function transferUpdater(address newUpdater) external {
require(msg.sender == updater, 'not updater');
require(newUpdater != address(0), 'zero address');
updater = newUpdater;
}Checking Data Freshness
Stale data is dangerous. Consumers should reject values older than a threshold using the stored lastUpdated timestamp.
uint256 public constant MAX_AGE = 1 hours;
function getFreshValue() external view returns (uint256) {
require(block.timestamp - lastUpdated <= MAX_AGE, 'stale data');
return value;
}Request-Response Pattern
For on-demand data, a consumer emits a request event. The off-chain updater watches for it and replies with the answer in a callback.
event DataRequested(uint256 indexed requestId, string query);
uint256 private nextId;
function requestData(string calldata query) external returns (uint256) {
uint256 id = nextId++;
emit DataRequested(id, query);
return id;
}Fulfilling a Request
The updater calls back with the result for a given request id. Store it keyed by id so the consumer can read it later.
mapping(uint256 => uint256) public answers;
mapping(uint256 => bool) public fulfilled;
function fulfill(uint256 requestId, uint256 result) external {
require(msg.sender == updater, 'not updater');
answers[requestId] = result;
fulfilled[requestId] = true;
}Reducing Single-Source Risk
One updater is one point of failure. To harden the oracle you can require multiple updaters to agree (an aggregation or median of submissions) before a value is accepted.
mapping(address => bool) public isUpdater;
mapping(address => uint256) public submitted;
address[] public updaters;
function submit(uint256 v) external {
require(isUpdater[msg.sender], 'not updater');
submitted[msg.sender] = v;
}Computing a Median
A median resists a single malicious updater better than an average. Collect submissions, sort them off-chain or with a small on-chain helper, and take the middle value.
function median(uint256[] memory data) internal pure returns (uint256) {
// assume data already sorted
uint256 n = data.length;
if (n % 2 == 1) return data[n / 2];
return (data[n / 2 - 1] + data[n / 2]) / 2;
}Trust Tradeoffs
Custom oracles trade decentralization for flexibility. Document clearly who runs the updater, what data is sourced, and how consumers should react to staleness. For high-value DeFi, prefer established decentralized oracle networks.
Consumer Integration
A consumer contract simply imports the oracle interface and reads from it, applying its own freshness checks.
interface IOracle {
function getFreshValue() external view returns (uint256);
}
contract Consumer {
IOracle public oracle;
constructor(address o) { oracle = IOracle(o); }
function price() external view returns (uint256) {
return oracle.getFreshValue();
}
}Quick Check
Test your grasp of custom oracle design.
Recap
You built a custom oracle with an off-chain updater and an on-chain store. Key ideas:
- Trusted updater with rotatable access control
- Freshness checks via
lastUpdated - Request-response flow with events and callbacks
- Multiple updaters and medians to reduce single-source risk
Use custom oracles for niche data, but prefer decentralized networks for high-stakes feeds.
Часто задаваемые вопросы
Урок «Создание пользовательских оракульных контрактов» бесплатный?
Да — полный текст урока «Создание пользовательских оракульных контрактов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Blockchain Smart Contracts with Solidity, подпишись на CoddyKit PRO. Курс Blockchain Smart Contracts with Solidity содержит 4 уроков всего.
Чему я научусь в уроке «Создание пользовательских оракульных контрактов»?
Научитесь проектировать и реализовывать собственный шаблон оракула в Solidity, включая сценарии запросов и ответов, доверенных обновляющих компонентов и проверки актуальности данных в блокчейне. Ты практикуешь Blockchain Smart Contracts with Solidity с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Blockchain Smart Contracts with Solidity?
Предыдущий опыт не требуется. Blockchain Smart Contracts with Solidity на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Создание пользовательских оракульных контрактов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Blockchain Smart Contracts with Solidity?
Да. Каждый урок Blockchain Smart Contracts with Solidity включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Объяснение проблемы оракула
- Интеграция оракулов Chainlink
- Получение данных вне блокчейна
- Создание пользовательских оракульных контрактов