03-Solidity8.0变量

Posted yyjava

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了03-Solidity8.0变量相关的知识,希望对你有一定的参考价值。

Solidity8.0

03-Solidity8.0变量


文章目录


前言

变量

Solidity 中有 3 种类型的变量

局部变量

在函数内部声明
不存储在区块链上

状态变量

在函数外声明
存储在区块链上

全局变量(提供有关区块链的信息)

常量

常量是不能修改的变量。
它们的值是硬编码的,使用常量可以节省 gas 成本。

不可变变量

不可变变量就像常量。不可变变量的值可以在构造函数中设置,但之后不能修改。

读取和写入状态变量

要写入或更新状态变量,您需要发送交易。
另一方面,您可以免费读取状态变量,无需任何交易费用


一、Solidity变量

1.变量

代码如下(示例):

// SPDX-License-Identifier: MIT
pragma solidity ^0.8;

contract Look 
	int8 public i8 = -1;
    int public i256 = 456;
    int public i = -123;
    int public minInt = type(int).min;
    int public maxInt = type(int).max;
    
    uint public count;
    bool public isOpen;
    address public addr;//0x0000000000000000000000000000000000000000 42bit
    bytes32 public name;//0x0000000000000000000000000000000000000000000000000000000000000000 66bit
    bytes2 public symbol;
    
    bytes16 public usd = "qweqweqweqwe";
    string sign = "qweqweqweqwe";
	string public text = "Hello";
	
    function doSomething() public 
        uint i = 456;

        uint timestamp = block.timestamp; 
        address sender = msg.sender; 
    
    address public constant MY_ADDRESS = 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;

    uint public immutable MY_UINT;
    constructor(uint _myUint) 
        MY_UINT = _myUint;
    
    
    uint public num;
    function set(uint _num) public 
        num = _num;
    
    function get() public view returns (uint) 
        return num;
    


总结

日拱一卒。

Solidity 访问私有变量

【中文标题】Solidity 访问私有变量【英文标题】:Solidity accessing private variable 【发布时间】:2018-11-02 17:28:33 【问题描述】:

目前,我正在练习 Solidity。但是,我对访问合约中的私有变量有点困惑。

例如这里;

address private a;
address private b;
mapping (bytes32 => uint) public people;
mapping (bytes32 => mapping(address => uint)) public listOfEmp;
bytes32[] public list;
bytes32 private z;

我可以通过

访问“a”
web3.eth.getStorageAt("0x501...", 0)

如何在此处访问“z”?来自不同的合同。

谢谢

【问题讨论】:

【参考方案1】:

我不相信你可以。私有变量只能在定义它的合同中使用。 见这里:http://solidity.readthedocs.io/en/v0.4.21/contracts.html

【讨论】:

你说的是内部变量。私有变量也可以在继承的合约中使用。【参考方案2】:

即使是私人的,您也可以访问您的合同。

试试这个:

web3.eth.getStorageAt("0x501...", 5)

如果您想访问地图或数组,请查看此文档以了解状态变量的布局:https://solidity.readthedocs.io/en/v0.4.24/miscellaneous.html

顺便说一句,您应该始终使用 getProof 来验证值。

【讨论】:

【参考方案3】:

将以太坊视为在您的机器上或远程运行的进程。使用web3.eth.getStorageAt 从进程内存中读取数据。以同样的方式,您可以读取计算机上每个程序的数据。

另一方面,Java、C++ 或 Solidity 等高级编程语言经常定义变量和函数(私有、受保护等)的访问规则。但是这些规则只在程序执行的上下文中成立。对于 Solidity,上下文是事务的执行。

这意味着私有字段仅对试图读取它的其他合约是私有的。但可以被外部(和相当低级的)API 读取,例如web3.eth.getStorageAt

【讨论】:

以上是关于03-Solidity8.0变量的主要内容,如果未能解决你的问题,请参考以下文章

全局变量 静态变量 局部变量 啥时候创建 啥时候撤销

成员变量、实例变量和属性变量的区别

Java 局部变量实例变量类变量(静态变量)区别

成员变量实例变量局部变量类变量(静态变量)详解

java 自变量 局部变量

变量:类变量,实例变量