Smart Contracts
はじめに
Rocket Pool Smart Contractsは、Rocket Poolプロトコルの基盤を形成します。これらは、ネットワークの他のすべての要素、Smart Nodeソフトウェアスタック、およびすべてのwebまたはアプリケーションインターフェースが構築される基盤となるインフラストラクチャ層です。
コントラクトとの直接的な対話は通常は必要なく、他のソフトウェアの使用を通じて容易になります。このセクションでは、コントラクトの設計の詳細な説明と、Rocket Poolを拡張したい開発者向けにRocket Poolの上に構築する方法に関する情報を提供します。すべてのコード例はSolidity v0.7.6として提供されています。
Contract Design
Rocket Poolネットワークコントラクトは、ハブアンドスポークアーキテクチャを使用してアップグレード可能性を念頭に置いて構築されています。ネットワークの中央ハブはRocketStorageコントラクトで、プロトコル全体の状態を保存する責任があります。これは、キーバリューストレージのマップの使用と、キーの値を読み書きするためのgetterメソッドとsetterメソッドによって実装されています。
RocketStorageコントラクトは、他のすべてのネットワークコントラクトのアドレス(名前でキー化)も保存し、それらのコントラクトのみにデータ変更を制限します。このアーキテクチャを使用すると、既存のコントラクトの新しいバージョンをデプロイし、ストレージ内のアドレスを更新することでプロトコルをアップグレードできます。これにより、Rocket Poolはバグを修正したり、プロトコルを改善するための新機能を実装したりするために必要な柔軟性が得られます。
Interacting With Rocket Pool
Rocket Poolネットワークとの対話を開始するには、まずinterfaceを使用してRocketStorageコントラクトのインスタンスを作成します。
上記のコンストラクタは、適切なネットワーク上のRocketStorageコントラクトのアドレスで呼び出す必要があります。
Rocket Poolのアーキテクチャのため、他のコントラクトのアドレスは直接使用するのではなく、使用前にブロックチェーンから取得する必要があります。以前の対話以降にネットワークのアップグレードが発生し、アドレスが古くなっている可能性があります。RocketStorageはアドレスを変更することはできないため、参照を保存しても安全です。
他のコントラクトインスタンスは、Rocket Poolリポジトリから取得した適切なインターフェースを使用して作成できます。例:
RocketStorageで定義されているRocket Poolコントラクトは以下の通りです。
rocketVault- ネットワークコントラクトが保持するETHを保存します(内部、アップグレード不可)rocketAuctionManager- node operatorのstakeからslashされたRPLのオークションを処理しますrocketDepositPool- ユーザーが預けたETHを受け入れ、minipoolへの割り当てを処理しますrocketSmoothingPool- priority feeとMEVを受け取りますrocketMinipoolBase- minipoolの初期化とdelegate upgradeロジックを含みますrocketMinipoolBondReducer- bondの削減ウィンドウとtrusted nodeのキャンセルを処理しますrocketMinipoolFactory- minipoolコントラクトの作成を処理しますrocketMinipoolDelegate- Minipoolユーティリティコントラクト(内部)rocketMinipoolManager- ネットワーク内のすべてのminipoolを作成および管理しますrocketMinipoolQueue- minipoolをETH割り当てのキューに整理しますrocketMinipoolStatus- watchtower nodeからのminipoolステータスの更新を処理しますrocketMinipoolPenalty- oDAOによってnode operatorに適用されたペナルティを保存しますrocketNetworkBalances- watchtower nodeからのネットワークバランスの更新を処理しますrocketNetworkFees- ネットワークnode需要に基づいてnodeの手数料率を計算しますrocketNetworkPrices- watchtower nodeからのRPL価格と有効なstakeの更新を処理しますrocketNetworkWithdrawal- beacon chain validatorのwithdrawalの処理を処理しますrocketNetworkPenalties- minipoolペナルティを処理しますrocketRewardsPool- 各報酬コントラクトへの報酬の配分を処理しますrocketClaimDAO- pDAOの報酬の請求を処理しますrocketNodeDeposit- minipool作成のためのnodeデポジットを処理しますrocketMerkleDistributorMainnet- RPLとETH報酬の配分を処理しますrocketNodeDistributorDelegate- RocketNodeDistributorsのロジックを含みますrocketNodeDistributorFactory- RocketNodeDistributorコントラクトの作成を処理しますrocketNodeManager- ネットワーク内のすべてのnodeを登録および管理しますrocketNodeStaking- nodeのstakingとunstakingを処理しますrocketDAOProposal- oDAOとpDAOの共通機能を含みますrocketDAONodeTrusted- oDAO関連の提案を処理しますrocketDAONodeTrustedProposals- oDAO提案機能を含みます(内部)rocketDAONodeTrustedActions- oDAOアクション機能を含みます(内部)rocketDAONodeTrustedUpgrade- oDAOコントラクトのアップグレード機能を処理します(内部)rocketDAONodeTrustedSettingsMembers- trusted memberに関する設定を処理しますrocketDAONodeTrustedSettingsProposals- 提案に関する設定を処理しますrocketDAONodeTrustedSettingsMinipool- minipoolに関する設定を処理しますrocketDAONodeTrustedSettingsRewards- 報酬に関する設定を処理しますrocketDAOProtocol- pDAO関連の提案を処理しますrocketDAOProtocolProposals- pDAO提案機能を処理します(内部)rocketDAOProtocolActions- pDAOアクション機能を処理します(内部)rocketDAOProtocolSettingsInflation- インフレーションに関する設定を処理しますrocketDAOProtocolSettingsRewards- 報酬に関する設定を処理しますrocketDAOProtocolSettingsAuction- オークションシステムに関する設定を処理しますrocketDAOProtocolSettingsNode- node operatorに関する設定を処理しますrocketDAOProtocolSettingsNetwork- ネットワークに関する設定を処理しますrocketDAOProtocolSettingsDeposit- デポジットに関する設定を処理しますrocketDAOProtocolSettingsMinipool- minipoolに関する設定を処理しますrocketTokenRETH- rETHトークンコントラクト(アップグレード不可)rocketTokenRPL- RPLトークンコントラクト(アップグレード不可)rocketUpgradeOneDotOne- Rocket Pool protocol Redstoneアップグレードを処理しましたrocketUpgradeOneDotTwo- Rocket Pool protocol Atlasアップグレードを処理しましたaddressQueueStorage- ユーティリティコントラクト(内部)addressSetStorage- ユーティリティコントラクト(内部)
初期デプロイ以降にRocketStorageから削除されたレガシーRocket Poolコントラクトは以下の通りです。
rocketClaimNode- node operatorの報酬の請求を処理しましたrocketClaimTrustedNode- oDAOの報酬の請求を処理しました
「内部」とマークされたコントラクトは、一般公開されているメソッドを提供しないため、拡張には通常役に立ちません。特定のコントラクトメソッドの情報については、Rocket Poolリポジトリのインターフェースを参照してください。
Deposits
Rocket Poolネットワークを拡張する主な理由は、deposit poolにユーザーのデポジットを導くカスタムデポジットロジックを実装することです。たとえば、ファンドマネージャーは、独自のスマートコントラクトを介してユーザーのETHをRocket Poolにステークし、Rocket Poolの使用自体をユーザーから抽象化したい場合があります。
注:RocketDepositPoolコントラクトアドレスは、コントラクトにハードコードするのではなく、RocketStorageから動的に取得する必要があります。詳細については、Interacting With Rocket Poolを参照してください。
Implementation
以下は、預けられたETHをRocket Poolに転送し、鋳造されたrETHを呼び出し元に戻す基本的なサンプルコントラクトについて説明しています。