# Web3.0学习树|4.Solidity基础 Ⅰ

By [链上巫师](https://paragraph.com/@looplove) · 2022-11-25

---

**这是Web3.0学习的第二章Solidity基础,文内如出现知识性和理解性错误还请各位斧正，原创文章，完全开源，若能得转载不胜荣幸，推特会分享Coding学习,生活日常和NBA等内容。**

### 目录

*   **Remix介绍**
    
*   **第一个智能合约**
    
*   **Solidity基础数据类型**
    

Solidity是一门面向合约的，为实现智能合约而创建的高级编程语言，在EVM虚拟机上运行，语法整体类似于JavaScript，是目前最流行的智能合约语言，也是入门区块链与Web3所必须掌握的语言。

Solidity智能合约的开发往往无法直接通过一个IDE或本地环境进行方便的调试，而是需要与一个链上节点进行交互。

![](https://storage.googleapis.com/papyrus_images/8cfecdaf790983768a1c236e61a6a1d541cec6d2b114d2f0c1491525db895259.png)

### Remix介绍

**Welcome to Remix.**

![](https://storage.googleapis.com/papyrus_images/612c99354293aa2aeaea1136edcc8a0a3af77f0c86e1b4a039c3c18a9885b2cf.png)

### 第一个智能合约

Solidity是一个更新频率很高的语言,和别的语言相比,它总会有新版本,我们需要告诉代码,要用哪个版本,我们通过"pragma solidity"加上要用的版本号,来约定版本号。记得在我们开发的时候,根据我们的需求加上注释。在代码中留下注释,这样在回顾的时候可以最快了解当时的想法。

    //这样写表示只使用0.8.7这个版本
    pragma solidity 0.8.7;//最新版0.8.17,0.8.7被认为是一个稳定的版本
    
    
    //这样写也可以使用比0.8.7更新的版本
    //<- This means that this section is a comment!
    pragma solidity ^0.8.7;//这样表示任何比0.8.7更新的版本都适用这段代码
    
    //这样写可以使用某个范围内的版本
    pragma solidity >=0.8.7 <0.9.0;//这样表示版本大于等于0.8.7,但是要小于0.9.0
    

在代码的最上方,我们可以加入SPDX-License-Identifier,尽管这个是可选的,但是没有的话,有些编译器会出现警告,这段代码会定义license(软件许可证)和代码分享规则。**添加一个SPDX许可证标识符。**

软件许可是创建和提供应用程序、基础源代码或相关产品的实体与其最终用户之间的合同。该许可证是一个文本文档，旨在保护软件开发人员的知识产权，并限制因使用该许可证而可能产生的针对他们的任何索赔。

软件许可证还为软件的分发和使用提供了具有法律约束力的定义。最终用户的权利，如安装、保证和责任，也经常在软件许可中明确说明，包括对开发者知识产权的保护。

    //SPDX-License-Identifier:MIT//MIT是限制最少的License之一,我们会在大多数的代码中使用MIT协议
    

接着输入”contract“,开始定义智能合约,这会告诉Solidity,接下来的会是智能合约。可以把它看作Java里面类似"class"的关键字。

    //SPDX-License-Identifier:MIT
    pragma solidity ^0.8.8;
    
    contract SimpleStorage {
        
    }
    

### Solidity基础数据类型

> bytes:byte\[\]的缩写，分为固定大小数组和可变数组，通过byte1 a = 0xb5;来定义
> 
> 变量通常是"0x"开头然后有一些随机的数字和字母
> 
> bytes32是最大的(32byte是bytes型变量被允许的分配的最多空间)。

> boolean:布尔类型有true和false两种类型，可以通过bool public boo = true;来定义，默认值为false。

> uint:定义无符号整数,表示这个数字只能是正数,uint比较特殊,我们可以决定给它分配的空间(其实就是有多少存储分配给了这个数字)
> 
> 可以指定uint8，uint16，uint256，默认为uint256，通过uint8 public u8 = 1;来定义，默认值为0。
> 
> bits(位)和bytes(字节)是衡量计算机数据的单位,它是最小的数据形式,它基本上就像一个开关,它可以是0或1。16位=2个字节
> 
> uint8,就是分配了8个bit;这个数字可以一直分配到uint256,如果你不知道被赋值的数字多大,默认就是uint256,最小设置uint8(因为8bit是一个byte,我们按照byte为单位步长来增加空间)
> 
> **通常把分配空间显式的写出来是一个好习惯。**

> int:整数类型，可以指定int8到int256，默认为int256，通过int public int = 0;来定义，默认值为0，还可以通过type(int).min和type(int).max来查看类型最小和最大值。

> address:地址类型，可以通过address public addr = 0xCA35b7d915458EF540aDe2F44E8fa733c;来定义，默认值为0x000000000000000000。
> 
> 表示地址,就像在MetaMask中看到的一样

> string:代表一个词,可以通过双引号表达它们,它可以是一个词,一个短语或者任何其他组合。
> 
> string其实是一种bytes,但是只能存储文本

> Enum是枚举类型，可以通过以下语法来定义
> 
>     enum Status {
>         UnKnown,
>         Start,
>         End,
>         Pause
>     }
>     
> 
> 并通过以下语法来进行更新与初始化
> 
>     //实例化枚举类型
>     Status public status;
>     
>     //更新枚举值
>     function pause() {
>         status = Status.Pause;
>     }
>     
>     //初始化枚举值
>     function reset() public{
>         delete status;
>     }
>     

    //SPDX-License-Identifier:MIT
    pragma solidity ^0.8.8;
    
    contract SimpleStorage {
        bool hasFavoriteNumber = true;
        uint256 favoriteNumber = 5;
        string favoriteNumberInText = "Five";
        int256 favoriteInt = -5;
        address myAddress = 0x3563c97491114E4F87389446E7f48d77c9220789;
        bytes32 favoriteBytes = "cat";//cat是一个string,但是可以自动转化为bytes
    }
    

**在Solidity中,如果我不给变量赋值,它会有一个默认值**,默认值是null的值,在Solidity中是0,所以声明一个uint256变量但不赋值,就相当于声明变量然后赋值为0,因为它初始化的时候就是0.

我们通过这些基础数据类型,定义不同的变量,变量是用来存储不同的数值的

---

*Originally published on [链上巫师](https://paragraph.com/@looplove/web3-0-4-solidity)*
