
YFII は新しい分散型 DeFi マイニング プールであり、コミュニティ パートナーの招待により、Ambi Lab は 2020 年 7 月 27 日から 8 月 2 日まで YFII スマート コントラクトのセキュリティ調査を実施しました。
分析対象は以下の契約です。
YFII Pool 1: 0xb81D3cB2708530ea990a287142b82D058725C092
YFII Pool 2: 0xAFfcD3D45cEF58B1DfA773463824c6F6bB0Dc13a
YFII Token: 0xa1d0E215a23d7030842FC67cE582a6aFa3CCaB83
BPT Token: 0x16cAC1403377978644e78769Daa49d8f6B6CF565
副題
YFIIとYFIとは何ですか
副題
現在、YFII 契約コードは Yearn Finance から直接フォークされており、YFII トークンの定期的な半減配布をサポートするために小さな変更が加えられています。
現在、YFII 契約コードは Yearn Finance から直接フォークされており、YFII トークンの定期的な半減配布をサポートするために小さな変更が加えられています。
YFII に係る契約と YFI 契約との対応関係とアドレスは次の表のとおりです。
YFI/YFII トークンはプロジェクト ガバナンス トークン コントラクトであり、この 2 つの実装は一貫しています。具体的には、ミントとシンプルなガバナンス機能を備えた標準の ERC-20 トークンです。
BPTトークンはバランサープールトークン契約であり、マーケットメーカーの流動性証明トークンであり、実際には自動マーケットメーカー契約バランサーによって提供されます。BFactoryエントリコントラクトが作成されるため、2 つの実装は完全に一貫しています。契約コードは以前に Trail of Bits と Consensys Diligence によって開発されました。監査済み。
Pool1 と Pool2 は、ガバナンス トークンの配布に使用される流動性マイニング コントラクトです。Pool1 と Pool2 のコードは同じ方法で実装されており、両方とも YearnRewards コントラクトと呼ばれ、YFI に対する YFII の変更はこのコントラクトに含まれています。
副題
YFII および YFI コア契約の簡単な分析
YFII および YFI 流動性マイニングのコア契約コード YearnRewards は、実際には Synthetix プロジェクトから派生しています。Unipool監査監査。
YearnRewards に基づく流動性マイニングのプロセス全体は、次のステップに分割できます。
RewardDistribution 権限を持つアドレスは、事前に YearnRewards コントラクトの NoticeRewardAmount() 関数を呼び出して報酬額を設定し、対応する量の YFI トークンを YFI ミンターから YearnRewards コントラクトに転送する必要があります。
マイナーは、 YearnRewards 契約 (自動マーケットメーカー DEX または融資契約の場合がある) で指定されたターゲット DeFi 契約に流動性を提供し (通常はステーブルコインを預ける)、対応する流動性証明トークン (通常はプール トークンとも呼ばれる) を取得します。トークンは資産を交換し、利息や手数料収入を得るために使用できます。
マイナーは、stake() 関数を呼び出して、取得したプール トークンを YearnRewards コントラクトに預け入れます。コントラクトは、ステーク期間と、プールの合計サイズにおけるマイナーの入金資金のサイズに基づいて、マイナーの報酬を自動的に計算します。
マイナーは、いつでも受け取るべき報酬 (YFI トークン) と以前に預け入れたプール トークンを引き出すことができます。
副題
いくつかの発見
前述したように、YFI と比較した YFII の変更点は、全体的なコードの変更は比較的小さいです。
2 つの新しいデコレータ関数が追加され、stake()、drawr()、および getReward() の 3 つの主要関数関数が制約されます。
新しいコード行が、notifyRewardAmount() 関数に追加されます。この関数は、通知中に現在の YearnRewards コントラクトに指定された数のトークンをミント (増加) する YFI トークン コントラクトを直接制御し、それらを配布の報酬として使用するために使用されます。したがって、Pool1 および Pool2 コントラクトは、YFII トークン コントラクトの作成者である必要があります。
これにより、YFII と YFI では、トークン配布の詳細のロジックが若干異なります。 YFI の各期間の報酬の分配には、金額の設定とトークンへの転送を担当する特定のアドレスが必要です。 YFII は、最初の期間の開始前に NoticeRewardAmount() オペレーションを実行することに加えて、ユーザーが呼び出すと定期的に出力を自動的に半分にします。
さらに、コミュニティ開発者の Madao 氏と gaojin 氏とコードの詳細について議論する過程で、Madao 氏は、トークン生成の自動半減の実行は checkhalf() 関数の実行に依存しているが、実際にはユーザーとユーザー間の対話に依存していると述べました。前のサイクルの終了時点では、半減期の時刻と予想される時刻との間には一定の時間差があり、実際の半減期の時刻は、契約の半減期よりも遅くなる可能性が高くなります。予定の時間。
特に、契約で報酬を計算する際には、2 週間間の余分な時間差が考慮されるため、各ユーザーの計算された報酬値が期待値よりわずかに大きくなり、一定の誤差が生じます。さらに、エラーが存在する限り、理論的にはプールから最後に報酬を引き出した人が正常に引き出しできない可能性があることがわかりました。これは、契約が半分になると同時に、Mint YFII Token がプール契約に移管されるためです。以前のエラーの存在により、契約上のユーザーの帳簿収入は、Mint が発行した実際のトークンの量よりも高くなっています。誤差の計算方法は、各期間の終了時刻と次の半減期の実際の時刻との時間差Deltaに半減期後のrewardRateを乗じたものです。
副題
YFII管理者権限の取り扱い
YFI のようなトークンにはすべて minting (Mint) インターフェイスがあり、mint 権限を持つアドレスは追加のトークンを発行できます。 YFI トークンのガバナンス管理者もおり、Minter を追加および削除する権限があります。理想的には、これらの特別な権限を持つアドレスは、マルチシグ コントラクトまたはその他の特殊なコントラクトである必要があります。
さらに、 YearnRewards コントラクトには、rewardDistribution 権限アドレスがあり、notifyRewardAmount() 関数を呼び出して報酬額を設定するために使用されます。 YearnRewards コントラクトには、rewardDistribution アドレスの設定に使用される所有者権限アドレスもあります。
現在、YFII プロジェクトの慣例では、YFII トークン ガバナンスの管理者と、Pool1 と Pool2 の awardDistribution をアドレス 0 に設定します。レコードを破棄する管理者権限は、次の場所にあります。https://burn.yfii.finance/。検査の結果、管理者権限の破壊は事実です。現時点では、Pool1 と Pool2 の 2 つの契約アドレスのみが YFII トークンのミント パーミッションを持っています。これは、定期的な半減を達成するために必要なパーミッションであり、将来的に悪用することはできません。
特に言及する価値があるのは、元の YFI トークン コードの実装では、特権関数 addMinter() にイベントが追加されていなかったため、一般のユーザーがコントラクトのミンター数を確認することが不可能であったことです。これにより、さまざまな YFI プロジェクトがバックドアに隠れやすくなることに注意してください。
検査後、YFII トークン契約には合計が含まれています。addMinter() レコードは 2 つだけ要約する
要約する
YFI は全体として非常に有意義な DeFi イノベーション実験であり、 Yearn Finance を通じて、分散型ガバナンス トークンの配布が見られ、DeFi コミュニティのマイニングとガバナンスの熱意が完全に刺激されました。
安全上のアドバイス
安全上のアドバイス
流動性マイニングと DeFi 製品の人気に伴い、さまざまな新しい DeFi スマート コントラクトが市場に登場しており、その組み合わせのリスクは劇的に増加しています。 Ambi Labsはユーザーに、DeFiプロジェクトを操作する際には安全第一に注意し、ドメイン名と契約アドレスを認識し、資金に関連するすべての操作を慎重に確認し、出所不明のスマートコントラクトと操作しないように努めるよう注意を促している。さらに、DeFi製品自体やスマートコントラクトのセキュリティにもっと注意を払い、価値ベースとリスク源を分析し、APRを盲目的に信じず、損失に耐えられる金額のみを投資する必要があります。
特別な注意として、この記事で提供されている手がかりを使用して、参加している YFI のようなプロジェクトの管理者権限を確認することを忘れないでください。