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)所示。

图(1) 私有变量,没有属性按钮

图(2) 公有变量,才有属性按钮

    注意,这个可见性指定的是父子合约之间的访问权限,不是矿工或者用户的访问权限。无论是私有变量,还是公有变量,它们都存在Storage里,可以通过读取变量所在的插槽位置,来读取它的值

以上是关于Solidity状态变量的可见性的主要内容,如果未能解决你的问题,请参考以下文章

区块链特辑——solidity语言基础

volatile变量

具有受保护可见性的变量的风险是啥

Java 并发编程:如何保证共享变量的可见性?

Java 并发编程:如何保证共享变量的可见性?

Android:通过更改片段更改菜单项的可见性