Hardhat-deploy: 代理合约需要某种验证

创建于 2021-06-24  ·  2评论  ·  资料来源: wighawag/hardhat-deploy

目前,如果您尝试使用具有无效结构的实现来部署代理合约,它仍然会成功。
例如,此合约将很好地部署:

contract Foo {
  uint public b;
  uint public c = 5;

  constructor(a uint) { 
    b = a; 
  }
}

但是当从代理部署时,这个合约是无效的。 因为任何中继到此实现的代理都不会设置cb变量。 我认为如果用户尝试部署这个或至少是某种警告,它应该在这里抛出一个错误。

最有用的评论

同样相关的是升级代理 - 存储冲突会导致重大错误。 显然,验证这一点比较困难,因为升级可能会在未来发生在遥远的地方。

旧实现:

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 有一个类似的检查,但它内置在他们的部署功能中,因此在安全帽部署中没有用,尽管他们的验证码可能大部分可以重用(?)

所有2条评论

同样相关的是升级代理 - 存储冲突会导致重大错误。 显然,验证这一点比较困难,因为升级可能会在未来发生在遥远的地方。

旧实现:

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 :

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

lepidotteri picture lepidotteri  ·  5评论

smartcontracts picture smartcontracts  ·  20评论

jaypaik picture jaypaik  ·  13评论

lcswillems picture lcswillems  ·  14评论

tennox picture tennox  ·  4评论