Web1+2入门 - Solidity 简介

261 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 2 天,点击查看活动详情

Solidity 是啥?

  • Solidity 是一种面向对象的高级语言,用于实现智能合约。它是运行在ETH 虚拟机(EVM)上的
  • 它是静态类型的,支持继承、库和复杂的用户定义类型等特性。

helloworld

pragma solidity ^{version};

contract HelloWorld {

}

变量和类型

Solidity 中有 3 种类型的变量

  • 本地的

    • 在函数内部声明并且不存储在链上
  • 状态

    • 在维护智能合约状态的函数之外声明
    • 存储在链上
  • 全局的

    • 提供有关区块链的信息。它们在运行时由以太坊虚拟机注入。
    • 包括交易发送者、区块时间戳、区块哈希等。
    • 全局变量示例

变量的范围是由它们的声明位置定义的,而不是它们的值。将局部变量的值设置为全局变量不会使其成为全局变量,因为它仍然只能在其范围内访问。

再看一个更详细的例子:

contract Variables {
    /*
        uint 代表无符号整数,意思是非负整数 有不同的大小可供选择,例如:
        - uint8   范围 0 to 2 ** 8 - 1
        - uint256 范围 0 to 2 ** 256 - 1
        `public` 表示变量可以在内部访问
        通过合约,也可以被外部世界读取
    */
    uint8 public u8 = 10;
    uint public u256 = 600;
    uint public u = 1230; // uint 是 uint256 的别名

    /*
      int 类型允许使用负数。例如
      int256 范围 -2 ** 255 to 2 ** 255 - 1
    */
    int public i = -123; 

    // 公钥地址
    address public addr = 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;

    bool public defaultBoo1 = false;

    // 未初始化的变量会给一个初始值
    bool public defaultBoo2; // false
    uint public defaultUint; // 0
    int public defaultInt; // 0
    address public defaultAddr; // 0x0000000000000000000000000000000000000000

    function doSomething() public {
        // 本地变量
        uint ui = 456;

        
        // 全局变量
        uint timestamp = block.timestamp; // 区块的时间戳
        address sender = msg.sender; // 这个地址的调用方,调用函数
    }
}

循环和 If/Else 案例

pragma solidity ^{version};

contract Conditions {
    uint public num;

    /*
        一个公共函数,接受一个 uint 并设置状态变量 num。
        它可以从合约内部调用,也可以从外部调用。
    */
    function set(uint _num) public {
        num = _num;
    }

    /*
        该函数不会改变任何变量的状态。
        solidity 中的 view 函数不需要 gas。
    */
    function get() public view returns (uint) {
        return num;
    }

    function foo(uint x) public returns (uint) {
        if (x < 10) {
            return 0;
        } else if (x < 20) {
            return 1;
        } else {
            return 2;
        }
    }

    function loop() public {
        // for loop
        for (uint i = 0; i < 10; i++) {
            if (i == 3) {
                // Skip to next iteration with continue
                continue;
            }
            if (i == 5) {
                // Exit loop with break
                break;
            }
        }
    }
}

数组、字符串

pragma solidity ^{version};

contract Array {

    // 全局字符串
    string public greet = "Hello World!";
    // 定义数组的几个方式, 这里初始化的数据会放到链上
    uint[] public arr;
    uint[] public arr2 = [1, 2, 3];
    // 固定大小的数组,数组的所有值都会被初始化为 0
    uint[10] public myFixedSizeArr;
    
    function get(uint i) public view returns (uint) {
        return arr[i];
    }

    /*
     memory - 这个字段只在内存中存储
    */
    function getArr(uint[] memory _arr) public view returns (uint[] memory) {
        return _arr;
    }

     /*
        这里仅在函数执行时才需要字符串也是加上了 memory 关键字
    */
    function foo() public returns (string memory) {
        return "C";
    }

    function doStuff(uint i) public {
        arr.push(i);
        arr.pop();
        uint length = arr.length;
        uint index = 1;
        delete arr2[index];
        uint[] memory a = new uint[](5);
        string memory hi = "hi";
    }

 }

回顾

本章主要介绍了一些 Solidity 基本语法和概念,帮助我们更好的了解怎么使用这个语言去实现一些简单的合约逻辑