目前,如果您尝试使用具有无效结构的实现来部署代理合约,它仍然会成功。
例如,此合约将很好地部署:
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 有一个类似的检查,但它内置在他们的部署功能中,因此在安全帽部署中没有用,尽管他们的验证码可能大部分可以重用(?)
绝对想要:),这里也提到了这一点: https :
最有用的评论
同样相关的是升级代理 - 存储冲突会导致重大错误。 显然,验证这一点比较困难,因为升级可能会在未来发生在遥远的地方。
旧实现:
新实现:
有一个功能来检查新合约是否与旧合约存储不冲突并且是有效的代理升级,这将很有用。
OpenZeppelin 有一个类似的检查,但它内置在他们的部署功能中,因此在安全帽部署中没有用,尽管他们的验证码可能大部分可以重用(?)