Smart Contracts
Введение
Smart Contracts Rocket Pool формируют основу протокола Rocket Pool. Они являются базовым уровнем инфраструктуры, на котором построены все остальные элементы сети, стек программного обеспечения Smart Node и все веб-интерфейсы или интерфейсы приложений.
Прямое взаимодействие с контрактами обычно не требуется и осуществляется через использование другого программного обеспечения. Этот раздел содержит подробное описание дизайна контрактов и информацию о том, как строить поверх Rocket Pool для разработчиков, желающих его расширить. Все примеры кода приведены как Solidity v0.7.6.
Дизайн контрактов
Контракты сети Rocket Pool построены с учетом обновляемости, используя архитектуру hub-and-spoke. Центральным узлом сети является контракт RocketStorage, который отвечает за хранение состояния всего протокола. Это реализовано через использование maps для хранения ключ-значение и методов getter и setter для чтения и записи значений для ключа.
Контракт RocketStorage также хранит адреса всех других сетевых контрактов (по имени) и ограничивает изменение данных только этими контрактами. Используя эту архитектуру, протокол может быть обновлен путем развертывания новых версий существующего контракта и обновления его адреса в хранилище. Это дает Rocket Pool гибкость, необходимую для исправления ошибок или реализации новых функций для улучшения протокола.
Взаимодействие с Rocket Pool
Чтобы начать взаимодействие с сетью Rocket Pool, сначала создайте экземпляр контракта RocketStorage, используя его интерфейс:
Приведенный выше конструктор должен быть вызван с адресом контракта RocketStorage в соответствующей сети.
Из-за архитектуры Rocket Pool адреса других контрактов не должны использоваться напрямую, а должны быть извлечены из блокчейна перед использованием. Обновления сети могли произойти с момента предыдущего взаимодействия, что привело к устаревшим адресам. RocketStorage никогда не может изменить адрес, поэтому безопасно хранить ссылку на него.
Другие экземпляры контрактов могут быть созданы с использованием соответствующего интерфейса, взятого из репозитория Rocket Pool, например:
Контракты Rocket Pool, как определено в RocketStorage, это:
rocketVault- Хранит ETH, удерживаемый сетевыми контрактами (внутренний, не обновляемый)rocketAuctionManager- Управляет аукционом RPL, изъятого из stake операторов нодrocketDepositPool- Принимает внесенный пользователями ETH и управляет назначением на minipoolsrocketSmoothingPool- Получает приоритетные комиссии и MEVrocketMinipoolBase- Содержит логику инициализации и обновления делегата для minipoolsrocketMinipoolBondReducer- Управляет окном сокращения залога и отменой доверенной нодыrocketMinipoolFactory- Управляет созданием контрактов minipoolrocketMinipoolDelegate- Служебный контракт minipool (внутренний)rocketMinipoolManager- Создает и управляет всеми minipools в сетиrocketMinipoolQueue- Организует minipools в очередь для назначения ETHrocketMinipoolStatus- Управляет обновлениями статуса minipool от нод watchtowerrocketMinipoolPenalty- Хранит штрафы, применяемые к операторам нод oDAOrocketNetworkBalances- Управляет обновлениями баланса сети от нод watchtowerrocketNetworkFees- Рассчитывает ставки комиссии нод на основе спроса на ноды в сетиrocketNetworkPrices- Управляет обновлениями цен RPL и эффективного stake от нод watchtowerrocketNetworkWithdrawal- Управляет обработкой выводов validator beacon chainrocketNetworkPenalties- Управляет штрафами minipoolrocketRewardsPool- Управляет распределением наград на каждый контракт наградrocketClaimDAO- Управляет получением наград для pDAOrocketNodeDeposit- Управляет депозитами нод для создания minipoolrocketMerkleDistributorMainnet- Управляет распределением наград RPL и ETHrocketNodeDistributorDelegate- Содержит логику для RocketNodeDistributorsrocketNodeDistributorFactory- Управляет созданием контрактов RocketNodeDistributorrocketNodeManager- Регистрирует и управляет всеми нодами в сетиrocketNodeStaking- Управляет staking и unstaking нодrocketDAOProposal- Содержит общую функциональность oDAO и pDAOrocketDAONodeTrusted- Управляет предложениями, связанными с oDAOrocketDAONodeTrustedProposals- Содержит функциональность предложений oDAO (внутренний)rocketDAONodeTrustedActions- Содержит функциональность действий oDAO (внутренний)rocketDAONodeTrustedUpgrade- Управляет функциональностью обновления контракта oDAO (внутренний)rocketDAONodeTrustedSettingsMembers- Управляет настройками, относящимися к доверенным членамrocketDAONodeTrustedSettingsProposals- Управляет настройками, относящимися к предложениямrocketDAONodeTrustedSettingsMinipool- Управляет настройками, относящимися к minipoolsrocketDAONodeTrustedSettingsRewards- Управляет настройками, относящимися к наградамrocketDAOProtocol- Управляет предложениями, связанными с pDAOrocketDAOProtocolProposals- Управляет функциональностью предложений pDAO (внутренний)rocketDAOProtocolActions- Управляет функциональностью действий pDAO (внутренний)rocketDAOProtocolSettingsInflation- Управляет настройками, связанными с инфляциейrocketDAOProtocolSettingsRewards- Управляет настройками, связанными с наградамиrocketDAOProtocolSettingsAuction- Управляет настройками, связанными с системой аукционовrocketDAOProtocolSettingsNode- Управляет настройками, связанными с операторами нодrocketDAOProtocolSettingsNetwork- Управляет настройками, связанными с сетьюrocketDAOProtocolSettingsDeposit- Управляет настройками, связанными с депозитамиrocketDAOProtocolSettingsMinipool- Управляет настройками, связанными с minipoolsrocketTokenRETH- Контракт токена rETH (не обновляемый)rocketTokenRPL- Контракт токена RPL (не обновляемый)rocketUpgradeOneDotOne- Управлял обновлением протокола Rocket Pool Redstone.rocketUpgradeOneDotTwo- Управлял обновлением протокола Rocket Pool AtlasaddressQueueStorage- Служебный контракт (внутренний)addressSetStorage- Служебный контракт (внутренний)
Устаревшие контракты Rocket Pool, которые были удалены из RocketStorage с момента первоначального развертывания:
rocketClaimNode- Управлял получением наград для операторов нодrocketClaimTrustedNode- Управлял получением наград для oDAO
Контракты, помеченные как "внутренние", не предоставляют методы, доступные для широкой публики, и поэтому обычно не полезны для расширения. Для получения информации о конкретных методах контрактов обратитесь к их интерфейсам в репозитории Rocket Pool.
Депозиты
Основная причина для расширения сети Rocket Pool - реализация пользовательской логики депозитов, которая направляет пользовательские депозиты в пул депозитов. Например, управляющий фондом может захотеть stake ETH своих пользователей в Rocket Pool через свои собственные смарт-контракты и абстрагировать использование Rocket Pool от своих пользователей.
Примечание: адрес контракта RocketDepositPool не должен быть жестко закодирован в ваших контрактах, а должен быть извлечен из RocketStorage динамически. См. Взаимодействие с Rocket Pool для более подробной информации.
Реализация
Ниже описан базовый пример контракта, который перенаправляет внесенный ETH в Rocket Pool и отправляет отчеканенный rETH обратно вызывающему: