Шлюз оракула
Ценовые потоки Pyth и Switchboard за интерфейсом Chainlink AggregatorV3Interface.
Oracle Gateway предоставляет нативные для Solana ценовые фиды (Pyth, Switchboard V3) через интерфейс Chainlink AggregatorV3Interface, поэтому Ethereum-протоколы, переносящиеся в Rome, сохраняют существующий код интеграции с оракулом. Oracle Gateway V2 развернут на Hadrian, Martius и Rubicon, хотя реестр перечисляет адреса фидов только для Hadrian и Martius, а регистрацией управляет клиентский портал. Обслуживающий узел Rome обновляет кэшированные и book-фиды, но не каждый фид свеж в каждый момент — какие фиды отвечают сегодня описано ниже. Адаптеры, фабрика и модель keeper рассматриваются в rome-oracle-gateway репозитории.
Предварительный просмотр. Oracle Gateway не проходил аудит. На портале сказано то же самое: не используйте его в производственных потоках стоимости.
Проблема
Ethereum DeFi ожидает от Chainlink AggregatorV3Interface:
(, int256 price,,,) = priceFeed.latestRoundData();Поставщики оракулов Solana (Pyth, Switchboard) используют другие форматы данных. Без адаптации каждому перенесенному протоколу понадобился бы собственный код оракула.
Решение
Oracle Gateway V2 разворачивает легковесные контракты-адаптеры, которые:
Читают данные о цене напрямую из аккаунтов Pyth или Switchboard в Solana (кросс-state чтения, не CPI)
Разбирают данные on-chain
Нормализуют цены до 8 знаков после запятой
Предоставляют стандартный Chainlink
AggregatorV3Interface
import {IAggregatorV3Interface} from "@rome-protocol/rome-solidity/contracts/oracle/IAggregatorV3Interface.sol";
// Тот же интерфейс, что и Chainlink в Ethereum
(, int256 price,,,) = IAggregatorV3Interface(ADAPTER).latestRoundData();
// price = SOL/USD с 8 знаками после запятой (например, 15000000000 = $150.00)Используйте фид в три шага
Получите адрес адаптера из реестра — никогда не хардкодьте его:
Реестр устанавливается из GitHub (npm install github:rome-protocol/rome-registry#v0.2.0). Ключи фидов содержат суффикс, который указывает, какой тип адаптера стоит за ними; см. Ключи фидов в реестре прежде чем выбирать один.
Читайте его с интерфейсом, который ваш протокол уже использует —
IAggregatorV3Interface(solUsd).latestRoundData(). Устаревший или неинициализированный фид вызывает откат а не выдавать замороженную цену.Несколько фидов одновременно?
BatchReader.getLatestPrices(adapters[])(Hadrian, registry v0.2.0:0x2869f0a96572e7fb15036656e9a32fd17346499b) — иgetFeedHealth(adapters[])перед тем, как полагаться на них. Кэшированные адаптеры делают каждое обращение потребителя обычнымSLOAD, поэтому транзакции с несколькими фидами (займ с несколькими залогами, просмотр портфеля) остаются дешевыми.
cardo читает эти фиды на Hadrian. Поскольку поверхность интерфейса в точности AggregatorV3Interface, протоколы класса Compound и Aave могут использовать эти фиды без изменений в коде оракула — укажите в их конфигурации ценовых фидов адреса адаптеров.
Типы адаптеров
PythPullAdapter — читает аккаунты цен Pyth (цена, доверительный интервал, EMA, время публикации).
SwitchboardV3Adapter — читает аккаунты агрегатора Switchboard (цена, временная метка; без EMA).
адаптеры CachedPyth / CachedFeed — кэшированные варианты для эффективного по CU чтения.
BookFeedAdapter — интерфейс, совместимый только для чтения с Chainlink, поверх одной записи в
PriceBookконтракте. Книга хранит цены для всех зарегистрированных в ней фидов и обновляется пакетно (обновление не требует разрешений); адаптер каждого фида не хранит собственного кэша. Приостановленная запись немедленно завершает выполнение с ошибкойAdapterPaused, вместо того чтобы дожидаться устаревания.
Адаптеры развертываются как клоны минимального proxy по EIP-1167: OracleAdapterFactory клонирует адаптеры Pyth, Switchboard и кэшированные адаптеры, а каждый PriceBook клонирует свой собственный BookFeedAdapter при регистрации фида. Они предоставляют расширенный интерфейс вместе с AggregatorV3Interface (latestPriceData, maxStaleness, oracleType, и metadata() интерфейсом, используемым для проверок состояния).
Ключи фидов в реестре
getOracle(chainId).feeds имеет по несколько ключей на каждый актив. Суффикс в имени ключа указывает тип адаптера:
SOL/USD
Прямой Pyth (PythPullAdapter)
Разбирает аккаунт Pyth при каждом вызове.
SOL/USD-BOOK
BookFeedAdapter
Читает PriceBook запись, которую обновляет keeper.
SOL/USD-CACHED
Кэшированный (оборачивает другой фид)
Читает сохраненную цену, которую обновляет keeper.
SOL/USD-CACHEDPYTH
Кэшированный Pyth (CachedPythAdapter)
Читает сохраненную цену, которую обновляет keeper.
SOL/USD-SB
Switchboard (SwitchboardV3Adapter)
Разбирает аккаунт Switchboard при каждом вызове. Реестр помечает эти записи выведенные из эксплуатации.
Какой именно потреблять, зависит от сети. Сначала проверьте следующий раздел.
Какие фиды отвечают сегодня
Это результаты вызовов только для чтения latestRoundData() по фидам, перечисленным в registry v0.2.0, сделанные во время подготовки этой страницы. Актуальность фидов меняется от минуты к минуте в devnet, поэтому воспринимайте это как снимок и выполните тот же вызов на фиде, который планируете использовать.
Hadrian. Прямые фиды часто устаревшие: при повторных проверках большинство из них (BONK, BTC, ETH, JITOSOL, JTO, JUP, MSOL, USDC, USDT) каждый раз завершались ошибкой
StalePriceFeedиSOL/USDотвечал на одних вызовах и не отвечал на других. Фиды-BOOKоказались наиболее надежными и отвечали на каждом вызове для каждого актива, кроме JTO, чей-BOOKфид завершался ошибкой как устаревший. Каждый-CACHEDи-CACHEDPYTHфид завершался ошибкой сUninitializedPriceFeed(ничто их не обновляло), иSOL/USD-SBзавершался ошибкой сStalePriceFeed. На Hadrian отдавайте предпочтение-BOOKфиду и запускайтеlatestRoundData()на выбранном вами фиде, прежде чем полагаться на него.Martius. Прямые,
-CACHED,-CACHEDPYTHи-BOOKфиды отвечали для каждого актива, кроме JTO, чьи прямые и кэшированные фиды завершались ошибкой как устаревшие (для JTO на Martius нет-BOOKфида).SOL/USD-SBзавершался ошибкой сStalePriceFeed.Rubicon. Реестр не перечисляет фиды оракула для Rubicon, поэтому эта страница их не охватывает. Фабрика развернута там (см. Развернутые адреса) и ее первые адаптеры отвечают, но адреса фидов следует искать из фабрики (
adapterCount()иallAdapters(i)), а не в реестре.
Завершение с ошибкой здесь — ожидаемое поведение: устаревший или неинициализированный фид громко падает, а не возвращает старую цену. Обрабатывайте это в своем контракте.
Актуальность — keeper оракула
Адаптеры обеспечивают maxStaleness окно: если block.timestamp - publishTime > maxStaleness, чтения завершаются ошибкой. В основной сети Solana Pyth использует production keepers. В devnet Solana (где живут публичные сети) пушеры Pyth работают по принципу best-effort, поэтому Rome запускает собственный oracle-keeper сайдкар, чтобы поддерживать базовые аккаунты Pyth свежими и обновлять кэшированные и book-фиды. Keeper не покрывает каждый фид в каждой сети в каждый момент (см. какие фиды отвечают сегодня).
Проверяйте состояние фидов с помощью BatchReader.getFeedHealth (который читает metadata()каждого адаптера ), а не только latestRoundData
Клиентский портал
Регистрируйте фиды и настраивайте потребителей по сетям через портал Oracle Gateway. См. страницу портала чтобы понять, что он охватывает.
Развернутые адреса
Канонические адреса по каждой сети (фабрики, реализации адаптеров и активные фиды) находятся в реестре. Основные фабрики из live записей registry v0.2.0 (версия 5.0.0 на Hadrian и Martius; адреса Rubicon — это адреса на Contract Addresses странице); см. Чтение списка контрактов:
OracleAdapterFactory
0x52b008771fc95b4674a4f3533570b3d223f27f68
0x8c92fd70360df63246cd0c8247119c79234b26ae
0x6a1340dd86c3951b6f13d9001b3951d56a2fe581
BatchReader
0x2869f0a96572e7fb15036656e9a32fd17346499b
0xab10948dc8b5bdaea0b31266b663022e7492e9cd
0x580dc0ecb226530ee8a90b57e0f0cd2555fb4f0f
Ограничения
Нет исторических данных раунда —
getRoundData(roundId)завершение с ошибкой;latestRoundData()поддерживается толькоEMA Switchboard не поддерживается — данные EMA есть только у Pyth.
Устаревание по каждой сети —
maxStalenessнастраивается для каждого окружения при запуске: адаптеры direct (чтение Pyth) по умолчанию ~60 секунд; кэшированные адаптеры по умолчанию 3600 секунд (когда keeper их обновляет, он делает это гораздо чаще).Смещения парсера проверяются по текущим схемам Pyth/Switchboard; изменения схемы требуют повторной проверки.
Что дальше
портал Oracle Gateway — регистрируйте фиды, настраивайте потребителей
Contract Addresses — прекомпайлы и адреса по сетям
Последнее обновление
Это было полезно?