# Solidity的基本语法进行讲解

By [leaf](https://paragraph.com/@leaf-6) · 2022-12-04

---

1.变量声明和常见数据类型
=============

除了address（地址）这类特别的类型，Solidity的变量和数据类型与常见编程语言类似，具体介绍如下：

![](https://storage.googleapis.com/papyrus_images/0e67a1b5a00adaaba2f7b97c64ef3a749aa759169d732268b2917a7973d05c6e.png)

![](https://storage.googleapis.com/papyrus_images/51029d3276f6ca7331feea89e209002d8b8263b6455abef275eb124e640bd39e.png)

2.枚举

Solidity需要定义一组常量时可以通过定义枚举来实现，定义枚举使用enum关键字，示例代码如下，该示例代码定义了一个颜色的枚举，枚举中有红、黄、绿三种颜色，三种颜色的值依次为0、1、2。

![](https://storage.googleapis.com/papyrus_images/24ac14bf2818709e4f4ab13c2b746041497ce942e72d29a61d3702baa1e6e61c.png)

3.结构体

结构体使用Stouct关键字定义，下面的示列定义了一个名为Player的结构体，这个结构体包含了地址（addr）和数量（amount）两个属性，其中地址是address类型，数量是整型，具体代码如下

![](https://storage.googleapis.com/papyrus_images/3ef2b6c14f1157c712f7fde5a6c8aa7a578491dc21aa3f9c86a13ad784671d5b.png)

4.函数

Solidity中函数的定义语法如下：

![](https://storage.googleapis.com/papyrus_images/7996f5a8d21e36b63ead2b924b3dd05daf4f25a261dc37489e7a906f08b305fd.png)

其中，＜parameter types＞指函数的参数及类型。{internal|external}这两个关键字规定了函数的调用方式，internal指内部调用，能直接使用上下文环境中的数据；external实现合约的外部消息调用，默认是internal。\[pure|constant|view|payable\]这4个关键字用来说明函数属性，pure关键字来源于函数式编程，表明这个函数体是一个纯函数计算不能调用其他函数；constant关键字定义一个常量，但在Solidity的0.4.17版本后不再使用；view关键字表明这个函数是只读不能修改状态；如果一个函数需要进行货币操作，必须要带上payable关键字。\[returns（＜return types＞）\]用来指明函数的返回类型。

5.注释
====

Solidity注释的语法和JavaScript中一样，使用“//”进行单行注释，使用“/\*”和“\*/”进行多行注释。

`//这是单行注释`

`/*`

`这是`

`多行注释`

`*/`

6.文件结构
======

对于Solidity语言，除了要了解以上基本语法外，还需要了解Solidity的文件结构。Solidity文件一般以.sol作为文件后缀。在sol文件中，第1行是版本声明，不同的版本支持的功能不同，所以文件需要指定版本号，语法如下：

pragma solidity ^0.4.0；

上面这行语句表明这个sol文件需要在0.4.0之后的版本上运行，其中的“^”符号表示不支持0.5.0及之后的版本。

以上是Solidity语法的简单介绍，详细内容可参看Solidity的官方教程，在此不再赘述。

: Solidity语言的官方教程地址是http：//solidity.readthedocs.io/en/develop/types.html。

智能合约的开发
=======

了解了Solidity的基本语法后就可以开始进行智能合约的开发了。使用Solidity开发智能合约需要安装一个编译器。对于刚开始学习Solidity语言的读者朋友来说，这里推荐使用在线的IDE编辑器——Remix。在浏览器中输入http：//remix.ethereum.org即可使用，无须本地安装。

### 1.编译器Remix的使用

Remix的操作界面主要分为4部分。左侧是文件浏览区域，可以进行新建文件、打开本地文件、更新代码到GitHub和浏览所有打开文件等操作；中间上半部分是编辑代码的地方，代码语法高亮，并可以自动进行语法检查，黄色是警告和建议，红色是语法错误；下半部分是一个交互式的终端界面，用来查询交易详情，调试智能合约；右侧是功能面板，用来编译、运行和测试智能合约，整个界面如图5-21所示。

Remix的功能比较强大，本书不过多赘述，有兴趣的读者可访问Remix的官网https：//remix.readthedocs.io/en/latest进行查阅。接下来我们直接上手，用Remix编译器开发一个智能合约。

打开Remix后，默认显示的是Solidity语言编写的一个投票的智能合约示例，代码比较多，此处不展开说明。这里新建一个Hello.sol的文件。单击左上角的“+”按钮，输入文件名为“Hello.sol”，单击“OK”按钮进行保存，如图

![](https://storage.googleapis.com/papyrus_images/6459ab59fa20fcdfd3332b469a38dd6739fc9369eb49d2ff16f0b556dae7ea16.png)

![](https://storage.googleapis.com/papyrus_images/5103a3b1cb0e3a5e8fb598a3e8fb60453ba09c141bebef865c79cb97fced1d3f.png)

在新生成的文件第1行先声明编译器版本为0.4.0之后的版本，然后定义一个名为“helloBlockchain”的智能合约，这个合约中只包含一个函数renderHello，其功能就是返回“Hello Blockchain”字符串，如图

![](https://storage.googleapis.com/papyrus_images/2d5dce1a407ec33d11af2d10a915562b00b157ca9d77da7fc4ec14c611189d04.png)

代码编写完成后，在右侧功能面板选择版本号0.4.25+的编译器进行编译，如图所示。编译成功后会打印“Hello Blockchain”这个智能合约的名字。

![](https://storage.googleapis.com/papyrus_images/1b7b1f59b986e95d95526b40b225ae559232ee6f73878c30782b427d4356b39e.png)

接着单击“Run”标签，选择运行环境为本地测试环境，选择“helloBlockchain”智能合约后再单击“Deploy”按钮部署这个智能合约，如图5-25所示。

Remix有3种运行模式，如下所述。

●JavaScript VM：这种模式是在浏览器中模拟一个区块链，合约在这个模拟的沙盒中执行，刷新页面就会使所有数据清空，不会做任何持久化，没有注入Web3对象。

●Injected Provider：连接到包含注入Web3对象的源上，在Mist浏览器或安装MetaMask的浏览器上会自动切换到此模式下。

●Web3 Provider：连接到远程结点，需要填写源的url地址和端口，例如geth、ganache等客户端，包含Web3对象

这里选择Injected Provider模式（图中的Provider为Web3对象，即Injected Web3）

![部署helloBlockchain智能合约](https://storage.googleapis.com/papyrus_images/5e5bdb43edca1154a1487ffe98b40a386d6c04ee81a70f3551615d3280d8cf35.png)

部署helloBlockchain智能合约

部署智能合约是将智能合约写入到以太坊，在以太坊上进行写入操作都需要消耗以太币，所以在这一步操作会消耗以太币。在弹出的窗口中单击“Confirm”按钮确认支付，如图

![](https://storage.googleapis.com/papyrus_images/9fae3b7bada08f9a606e858cfffb89782325dd33da4b62ea41b726c8ee3a9d7d.png)

到这里智能合约就部署到本地的测试环境了。智能合约部署成功后，在Remix主界面的右下角可以看到部署成功的智能合约和可以使用的函数renderHello，单击renderHello即是调用并执行该函数，可以看到输出结果为字符串“Hello Blockchain”，如图

![](https://storage.googleapis.com/papyrus_images/37409ec67258ca358d4a946e9e8648717dbbbde1b4c2c6b67c67c902e45c4513.png)

最后，总结一下智能合约的开发过程，整个流程如图

![智能合约开发流程](https://storage.googleapis.com/papyrus_images/8daef179cc0191788e89b02df5f8f2eb77e0fc2c50300ff96b9ee868647833a7.png)

智能合约开发流程

1）新建sol文件，编写智能合约的功能，这里实现里一个输出“Hello Blockchain”的功能。

2）使用编译器对代码进行编译。

3）若编码无错误，编译器将编译结果编译生成一个二进制文件。

4）将编译成功的智能合约部署到区块链系统中。

5）部署成功后会返回智能合约的地址和应用二进制接口（Application Binary Interface，ABI），用于和智能合约进行交互。

6）通过地址和ABI调用智能合约。

Truffle框架
=========

当掌握了Solidity的基本语法和智能合约的开发流程后，就可以进一步学习DApp的开发框架Truffle了。

Truffle是针对基于以太坊的Solidity语言的一套开发框架。Truffle本身基于JavaScript，Truffle的目标是让DApp的开发变得更简单，它具有以下功能。

●内置的智能合约编译、链接、部署和二进制文件的管理。

●支持智能合约的自动化测试。

●脚本化的、可扩展的部署与发布框架。

●管理部署的网络环境功能。

●使用EthPM或npm提供的包管理，使用ERC190标准。

●与合约直接通信的交互控制台（写完合约就可以在命令行里验证了）。

●智能合约的构建流程可根据需求进行自定义配置。

●在Truffle环境里支持执行外部的脚本

Truffle的安装和常用命令
===============

Truffle可以通过包管理工具npm进行安装，安装命令如下：

$ npm install -g truffle

安装完成后输入truffle命Truffle可以通过包管理工具npm进行安装，安装命令如下：

$ npm install -g truffle

安装完成后输入truffle命令即可看到它的使用方法，如图5-29所示。以下是几个主要的Truffle命令的用法介绍。

1.初始化Truffle项目——truffle init

要初始化Truffle项目只需要输入truffle init就可以初始化一个空的项目，新建一个文件夹叫first-DApp，进入文件夹后执行truffle init，如图所示。

Truffle会自动生成一个空的项目工程。新生成的Truffle项目中包含几个文件夹和配置文件，其中contracts文件夹用来存放智能合约；migrations文件夹用来实现部署智能合约的功能；test文件夹用来存放合约的测试文件；truffle.js是默认配置文件；truffle-config.js是Windows下的默认配置文件，以防止文件名与truffle命令冲突，一个Truffle项目的结构如

![Truffle常用命令](https://storage.googleapis.com/papyrus_images/6525882f504fb4fb36f1dc9a74ab3bfde852cd504ae7a7e345d22660e45c2968.png)

Truffle常用命令

![初始化Truffle项目](https://storage.googleapis.com/papyrus_images/1deb8f9a2ed78dfe5e8716f95f1b2e79da9b3a19f9a1791d61a58a6e7fa36775.png)

初始化Truffle项目

![Truffle项目结构](https://storage.googleapis.com/papyrus_images/9b4ea12e3764e1741a9ea31a65d716e7d36f531d3b915974e9815eadfb0cf63b.png)

Truffle项目结构

2.编译命令——truffle compile

执行truffle compile命令会编译智能合约文件，编译成功后会在当前目录的build文件夹下生成新的智能合约二进制文件，如图5-32所示。

3.部署命令——truffle deploy

部署智能合约之前需要修改配置文件，本章中使用的智能合约开发测试环境为Ganache，其客户端监听的端口为本地的7545端口，故需要修改truffle.js文件连接到本地的7545端口，如图

![编译智能合约文件](https://storage.googleapis.com/papyrus_images/bf1bb25cff8c62c2305f3b5330e84ddd2cb1bf0443386460bd498d5d34d9e4b1.png)

编译智能合约文件

![更新配置文件](https://storage.googleapis.com/papyrus_images/5b364defc6e7cf8f410a5871705b6bf248165b1ff5b8f799699989a3a2066675.png)

更新配置文件

修改完成就可以进行智能合约部署了，在终端中输入命令“truffle deploy”即可完成。

4.测试命令——truffle test

执行truffle test命令会运行test文件夹下的所有测试用例，该命令将会自动识别以.js、.es、.es6、.jsx和.sol为扩展名的文件，其他扩展名的文件将被忽略。

5.终端命令——truffle console

执行truffle console命令可以打开一个交互式终端界面，方便地进行智能合约的调用和调试。

6.下载模板命令——truffle unbox\[box-name\]

安装完成后输入truffle命令即可看到它的使用方法，如图5-29所示。以下是几个主要的Truffle命令的用法介绍。

1.初始化Truffle项目——truffle init

要初始化Truffle项目只需要输入truffle init就可以初始化一个空的项目，新建一个文件夹叫first-DApp，进入文件夹后执行truffle init，如图5-30所示。

Truffle会自动生成一个空的项目工程。新生成的Truffle项目中包含几个文件夹和配置文件，其中contracts文件夹用来存放智能合约；migrations文件夹用来实现部署智能合约的功能；test文件夹用来存放合约的测试文件；truffle.js是默认配置文件；truffle-config.js是Windows下的默认配置文件，以防止文件名与truffle命令冲突，一个Truffle项目的结构如图

Truffle还有一个很实用的命令就是truffle unbox\[box-name\]，这个命令用来下载模板，box-name是实际需要下载的模板名字。下一节内容将详细介绍模板的使用。

![Truffle模板列表](https://storage.googleapis.com/papyrus_images/a19fa7cf79b4b231a5719e121e2fc045f23abf7937eab86b7112f1c28d7ed2ad.png)

Truffle模板列表

要使用这个drizzle模板，首先要安装Truffle和Ganache环境，前边已经安装完了，接下来直接执行truffle unbox drizzle命令下载这个模板即可。

至此，进行DApp开发的各项基础知识已经介绍完，准备工作也已完成，下面开始进行DApp的实际开发。

---

*Originally published on [leaf](https://paragraph.com/@leaf-6/solidity)*
