Solidity基础[part1]

Solidity 基础[part1]

Remix IDE

image-20250617173639681

函数

无返回体函数示例:

// SPDX-License-Identifier: MIT
pragma solidity 0.8.19; // chose our solidity version 

contract SimpleStorage {
    uint256 public myFavoriteNumber; // 初始值就是0 而且是internal 也就是内部不可见的

    function store(uint256 favoriteNumber) public {
        myFavoriteNumber = favoriteNumber;
    }

}

有返回体示例:

function recive() public view returns (uint256) {
       return myFavoriteNumber;
   }

数组

// 数组
uint256[] public myFavoriteNumbers;


Person public newPerson = Person(1, 'jack');

Person public myPerson;


function setPerson(string memory name, uint256 person_number) public {
    myPersonArray.push(Person(person_number,name));
}

结构

// 结构
    struct Person {
        uint256 personNumber;
        string name;
    }

数组加结构

// 数组加结构
 Person[] public myPersonArray;

可见性

函数和变量有四种可见性修饰符:

  • public:可从合约内部和外部合约访问
  • private:仅限当前合约内部访问。不会隐藏值,仅限制其访问权限。
  • external:仅适用于外部的合约访问。⚠️
  • internal: 当前合约和派生的合约可以访问。

如果没有指定,默认是internal

view 、pure

函数操作权限修饰符

1. view 关键字

  • 功能:使用view关键字修饰的函数,承诺不会对区块链的状态进行修改。

  • 可执行操作

    • 能够读取区块链上的数据(也就是状态变量)。
    • 可以访问 msg.sender、block.number 等全局变量。
    • 支持调用其他同样被标记为view或者pure的函数。
  • 不可执行操作:禁止对状态变量进行写入操作。

  • 示例

contract ViewExample {
    uint public balance;

    // 此函数仅读取状态变量,不会对其进行修改
    function getBalance() public view returns (uint) {
        return balance;
    }
}

2. pure 关键字

  • 功能:被pure关键字修饰的函数,既不会读取也不会修改区块链的状态。

  • 可执行操作

    • 可以使用函数内部定义的局部变量。
    • 能够操作传入函数的参数。
    • 支持进行数学运算。
    • 可以调用其他pure函数。
  • 不可执行操作

    • 禁止访问状态变量。
    • 不允许调用非viewpure的函数。
  • 示例

contract PureExample {
    // 该函数不依赖任何状态变量,仅对输入参数进行计算
    function add(uint a, uint b) public pure returns (uint) {
        return a + b;
    }
}

3. 关键区别

特性 view 函数 pure 函数
能否读取状态变量 可以 不可以
能否修改状态变量 不可以 不可以
是否消耗 Gas(外部调用时) 不消耗 不消耗
是否消耗 Gas(内部调用时) 消耗 消耗

⚠️ 一般调用这两个关键字都不会消耗gas费, 但是如果是内部调用,例如下面这个例子, store里面调用recive就会导致gas费产生。

function store(uint256 favoriteNumber) public {// 存储
       myFavoriteNumber = favoriteNumber;
       recive(favoriteNumber);
   }

 function recive() public view returns (uint256) {
     return myFavoriteNumber;
 }

完整代码:

// SPDX-License-Identifier: MIT
pragma solidity 0.8.19; // stating our version 

contract SimpleStorage {
    uint256 public myFavoriteNumber; // 初始值就是0 而且是internal 也就是内部不可见的



    // 数组
    uint256[] public myFavoriteNumbers;

    // 结构
    struct Person {
        uint256 personNumber;
        string name;
    }

    Person public newPerson = Person(1, 'jack');

    Person public myPerson;

    Person[] public myPersonArray;

    function setPerson(string memory name, uint256 person_number) public {
        myPerson = Person(person_number, name);
        myPersonArray.push(myPerson);
    }

    function store(uint256 favoriteNumber) public {// 存储
        myFavoriteNumber = favoriteNumber;
    }

    // view 可读不可写 pure 不可读不可写
    function recive() public view returns (uint256) {
        return myFavoriteNumber;
    }



}