这是代理模式上下文中的抽象契约:
abstract contract Initializable {
bool private _initialized;
bool private _initializing;
modifier initializer() {
require(_initializing || !_initialized, "Initializable: contract is already initialized");
bool isTopLevelCall = !_initializing;
if (isTopLevelCall) {
_initializing = true;
_initialized = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
}
}
}
contract UpgradebleTest1 is Initializable {
uint public x;
function initialize(uint _x) public initializer {
x = _x;
}
}我不明白_initializing和isTopLevelCall的必要性。仅仅使用_initialized进行控制还不够吗?
谢谢,
发布于 2021-12-02 10:21:20
_initializing和isTopLevelCall组合允许使用initializer修饰符进行链接调用:
contract UpgradebleTest1 is Initializable {
uint public x;
function initialize(uint _x) public initializer {
internalInit(_x);
}
function internalInit(uint _x) internal initializer {
x = _x;
}
}如果没有_initializing和isTopLevelCall检查,initializer修饰符将传递第一个调用(initialize()),但在第二个调用(internalInit())上失败。
modifier initializer() {
require(!_initialized, "Initializable: contract is already initialized");
_initialized = true;
}发布于 2021-12-02 11:07:40
abstract contract Initializable {
bool private _initialized;
modifier initializer() {
require(!_initialized, "Initializable: co...");
_;
_initialized = true;
}
}
contract UpgradebleTestParent is Initializable {
uint public x;
function initialize(uint _x) internal initializer {
x = _x;
}
}
contract UpgradebleTestMain is UpgradebleTestParent {
function init(uint _x) public initializer {
initialize(_x);
}
}如果如上,它将执行相同的逻辑,但是_initialized = true;将不必要地执行两次,对吗?然而,它似乎比前一个更便宜的一个变量和相关的附加指令?难到不是么?
https://stackoverflow.com/questions/70189923
复制相似问题