Solidity状态变量的可见性
Posted sanqima
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Solidity状态变量的可见性相关的知识,希望对你有一定的参考价值。
Solidity的状态变量,有private、public这2种,其中private表示私有,在本合约里可见;public表示公有,在本合约、以及它的子合约都可见。
如果一个状态变量,既没有被private修饰、也没有被public修饰,则它默认是私有的。
uint _value; <==> uint private _value; //这2者等价。
比如,EventValue.sol合约与 EthValue.sol合约
//EventValue.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
contract EventValue {
event ValueChanged(address indexed author,uint oldValue,uint newValue);
uint _value; //没有修饰符,默认为私有,不能继承
constructor(uint value) public {
uint tmp = _value;
_value = value;
emit ValueChanged(msg.sender, tmp, value);
}
function getValue() view public returns (uint) {
return _value;
}
function setValue(uint value) public {
uint tmp = _value;
_value = value;
emit ValueChanged(msg.sender, tmp, value);
}
}
//EthValue.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
contract EventValue {
event ValueChanged(address indexed author,uint oldValue,uint newValue);
uint public _value; //修饰符为public,表示公钥,可以继承
constructor(uint value) public {
uint tmp = _value;
_value = value;
emit ValueChanged(msg.sender, tmp, value);
}
function getValue() view public returns (uint) {
return _value;
}
function setValue(uint value) public {
uint tmp = _value;
_value = value;
emit ValueChanged(msg.sender, tmp, value);
}
}
在EventValue.sol中,_value是私有变量,是不可见的,它没有属性按钮,如图(1)所示;但在EthValue.sol中,_value是公有变量,是可见的,所以它有属性按钮,如图(2)所示。
![](https://image.cha138.com/20211112/ad1bf5a045654791acc5e15a8beee810.jpg)
![](https://image.cha138.com/20211112/f678d472724e43a58da08f83da46a56b.jpg)
注意,这个可见性指定的是父子合约之间的访问权限,不是矿工或者用户的访问权限。无论是私有变量,还是公有变量,它们都存在Storage里,可以通过读取变量所在的插槽位置,来读取它的值
以上是关于Solidity状态变量的可见性的主要内容,如果未能解决你的问题,请参考以下文章