Solidity 0.8.0+ 中构造函数可见性修饰符的变化

279 阅读1分钟

Solidity 是一门用于编写智能合约的编程语言,它经常在以太坊及其他区块链平台上使用。在 Solidity 的版本 0.8.0 之前,构造函数没有可见性修饰符,但是从 Solidity 0.8.0 开始,构造函数的可见性修饰符被忽略,并且构造函数默认为 public。这一变化可以在你的 Solidity 合约中引发警告。

让我们看看以下示例合约代码:

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

contract HelloWord {
  string public _name;

  constructor(string memory name) public {
    _name = name;
  }

  function setName(string memory name) public {
    _name = name;
  }

  function getName() public view returns (string memory) {
    return _name;
  }
}

在这段代码中,构造函数被声明为 public,但是 Solidity 编译器在编译时会发出一个警告:

vbnetCopy code
Warning: Visibility for constructor is ignored. If you want the contract to be non-deployable, making it "abstract" is sufficient.
 --> project:/contracts/HelloWord.sol:7:1:

这个警告的意思是,构造函数的可见性修饰符被忽略了。在 Solidity 0.8.0+ 版本中,构造函数默认为 public,因此在构造函数声明中指定 public 可见性是多余的。

为了消除这个警告,我们只需简单地移除构造函数声明的可见性修饰符。修改后的代码如下:

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

contract HelloWord {
  string public _name;

  constructor(string memory name) {
    _name = name;
  }

  function setName(string memory name) public {
    _name = name;
  }

  function getName() public view returns (string memory) {
    return _name;
  }
}

现在,构造函数仍然是公开可见的,但不再产生警告。

这个改变是 Solidity 编译器版本升级所带来的一项改进,旨在简化和统一构造函数的可见性处理。对于那些习惯于旧版本的开发者来说,可能需要注意这一变化,以避免产生警告信息。

总结一下,在 Solidity 0.8.0+ 中,构造函数的可见性修饰符被忽略,构造函数默认为 public。因此,在声明构造函数时指定 public 可见性是多余的,可能会引发警告。为了消除警告去除public声明即可。