Solidity 存储变量

本文介绍了Solidity中的存储变量,并通过代码示例详细解释了存储变量的声明、使用以及不同修饰符(如pureviewpublicinternal)的区别。文章还强调了存储变量的持久性和其对区块链状态的影响。

到目前为止,我们所有的函数都只是返回纯粹依赖于函数参数的值。它们不依赖于除立即输入之外的任何内容。这就是为什么它们被称为函数。它们不知道区块链的状态或过去发生的任何事情。

如果我们要跟踪某些内容,比如某人欠了多少钱,或者他们在游戏中有多少分数,这将会非常成问题。

现在我们介绍存储变量

这些变量看起来像其他语言中的“类变量”,但行为并不像它们。你可以将它们视为行为类似于微型数据库的变量

让我们看一个例子


contract ExampleContract {

    uint256 internal x;

    function setX(
        uint256 newValue
    )
        public {
            x = newValue;
    }

    function getX()
        public
        view
        returns (uint256) {
            return x;
    }
}

我们有很多东西要解释!

在函数外声明的变量是存储变量。它们在交易结束后仍然保留其值。

注意getX()有修饰符view,而不是pure。这是因为它会查看区块链的状态,即存储在变量x中的内容。如果你在这个例子中将view改为pure,代码将无法编译。你也可以将view视为只读。还要注意getX的返回值与x的类型相同,都是uint256

其次,请注意setX没有viewpure修饰符。这是因为它是一个状态改变函数。改变存储变量或对区块链进行其他持久性更改的函数不能有viewpure修饰符,因为它们不是只读的,因此不能被标记为view,当然也不能标记为pure

为了强调这一点,请注意以下代码是无效的


contract ExampleContract {

    uint256 internal x;

    function setX(
        uint256 newValue
    )
        public {
            x = newValue;
    }

    // error: this function cannot be pure
    function getX()
        public
        pure
        returns (uint256) {
            return x;
    }
}

请注意,变量x本身有修饰符internal。这意味着其他智能合约无法看到这个值。

变量是internal的并不意味着它是隐藏的。它仍然存储在区块链上,任何人都可以通过解析区块链来获取该值!

这才是事情变得令人困惑的地方。

以下代码也是有效的,但它被认为是不好的做法


contract ExampleContract {

    uint256 x;

    function setX(
        uint256 newValue
    )
        public {
            x = newValue;
    }

    function getX()
        public
        view
        returns (uint256) {
            return x;
    }
}

在这种情况下,我们去掉了xinternal修饰符,它仍然可以编译。这被认为是不好的做法,因为你没有明确表达X的可见性意图。

以下代码也是有效的


contract ExampleContract {

    uint256 public x;

    function setX(
        uint256 newValue
    )
        public {
            x = newValue;
    }

    function getX()
        public
        view
        returns (uint256) {
            return x;
    }
}

当变量被声明为public时,意味着其他智能合约可以读取该值但不能修改它。

这很令人困惑,因为public函数可以修改变量,但public变量不能被修改,除非有一个函数来改变它们的值。

总结

  • 存储变量在函数外声明

  • 没有viewpure修饰符的public函数可以改变存储变量

  • 纯函数不能访问存储变量

    • *

练习题目

PublicVariable

BasicStorage

PublicFunction

PureVsView

更多学习资源

请查看 Web3 区块链培训营,了解更多关于智能合约开发和代币标准的信息。

  • 原文链接: rareskills.io/learn-soli...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
RareSkills
RareSkills
https://www.rareskills.io/