現時点では、無効な構造を持つ実装でプロキシコントラクトをデプロイしようとしても、成功します。
たとえば、この契約は正常に展開されます。
contract Foo {
uint public b;
uint public c = 5;
constructor(a uint) {
b = a;
}
}
ただし、プロキシからデプロイした場合、このコントラクトは無効です。 この実装にリレーするプロキシには、 c
またはb
変数が設定されていないためです。 ユーザーがこれまたは少なくとも何らかの警告を展開しようとすると、ここでエラーがスローされるはずだと思います。
また、プロキシのアップグレードにも関連しています-ストレージの衝突は重要なエラーを引き起こします。 明らかに、アップグレードは将来遠い時点で発生する可能性があるため、これを確認するのは困難です。
古い実装:
contract Foo {
uint public b = 5;
};
新しい実装:
// Incorrect
contract Bar {
uint public c; // Collision here! - value is actually set to 5 not 0
}
// Correct
contract Bar {
uint public b; // value is 5 as expected
uint public c; // value is 0
}
新しいコントラクトが古いコントラクトストレージと競合せず、有効なプロキシアップグレードであることを確認する機能があると便利です。
// Checks if "Foo" can be upgraded to "Bar"
const isValid = deployments.isValidProxyUpgrade("Foo", "Bar");
OpenZeppelinにも同様のチェックがありますが、デプロイ機能に組み込まれているため、ここではhardhat-deployでは役に立ちませんが、検証コードはおそらくほとんど再利用できます(?)
絶対に欲しかった:)、これもここで言及されました: https :
最も参考になるコメント
また、プロキシのアップグレードにも関連しています-ストレージの衝突は重要なエラーを引き起こします。 明らかに、アップグレードは将来遠い時点で発生する可能性があるため、これを確認するのは困難です。
古い実装:
新しい実装:
新しいコントラクトが古いコントラクトストレージと競合せず、有効なプロキシアップグレードであることを確認する機能があると便利です。
OpenZeppelinにも同様のチェックがありますが、デプロイ機能に組み込まれているため、ここではhardhat-deployでは役に立ちませんが、検証コードはおそらくほとんど再利用できます(?)