除了address(地址)这类特别的类型,Solidity的变量和数据类型与常见编程语言类似,具体介绍如下:


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

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

4.函数
Solidity中函数的定义语法如下:

其中,<parameter types>指函数的参数及类型。{internal|external}这两个关键字规定了函数的调用方式,internal指内部调用,能直接使用上下文环境中的数据;external实现合约的外部消息调用,默认是internal。[pure|constant|view|payable]这4个关键字用来说明函数属性,pure关键字来源于函数式编程,表明这个函数体是一个纯函数计算不能调用其他函数;constant关键字定义一个常量,但在Solidity的0.4.17版本后不再使用;view关键字表明这个函数是只读不能修改状态;如果一个函数需要进行货币操作,必须要带上payable关键字。[returns(<return types>)]用来指明函数的返回类型。
Solidity注释的语法和JavaScript中一样,使用“//”进行单行注释,使用“/*”和“*/”进行多行注释。
//这是单行注释
/*
这是
多行注释
*/
对于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即可使用,无须本地安装。
Remix的操作界面主要分为4部分。左侧是文件浏览区域,可以进行新建文件、打开本地文件、更新代码到GitHub和浏览所有打开文件等操作;中间上半部分是编辑代码的地方,代码语法高亮,并可以自动进行语法检查,黄色是警告和建议,红色是语法错误;下半部分是一个交互式的终端界面,用来查询交易详情,调试智能合约;右侧是功能面板,用来编译、运行和测试智能合约,整个界面如图5-21所示。
Remix的功能比较强大,本书不过多赘述,有兴趣的读者可访问Remix的官网https://remix.readthedocs.io/en/latest进行查阅。接下来我们直接上手,用Remix编译器开发一个智能合约。
打开Remix后,默认显示的是Solidity语言编写的一个投票的智能合约示例,代码比较多,此处不展开说明。这里新建一个Hello.sol的文件。单击左上角的“+”按钮,输入文件名为“Hello.sol”,单击“OK”按钮进行保存,如图


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

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

接着单击“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)

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

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

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

1)新建sol文件,编写智能合约的功能,这里实现里一个输出“Hello Blockchain”的功能。
2)使用编译器对代码进行编译。
3)若编码无错误,编译器将编译结果编译生成一个二进制文件。
4)将编译成功的智能合约部署到区块链系统中。
5)部署成功后会返回智能合约的地址和应用二进制接口(Application Binary Interface,ABI),用于和智能合约进行交互。
6)通过地址和ABI调用智能合约。
当掌握了Solidity的基本语法和智能合约的开发流程后,就可以进一步学习DApp的开发框架Truffle了。
Truffle是针对基于以太坊的Solidity语言的一套开发框架。Truffle本身基于JavaScript,Truffle的目标是让DApp的开发变得更简单,它具有以下功能。
●内置的智能合约编译、链接、部署和二进制文件的管理。
●支持智能合约的自动化测试。
●脚本化的、可扩展的部署与发布框架。
●管理部署的网络环境功能。
●使用EthPM或npm提供的包管理,使用ERC190标准。
●与合约直接通信的交互控制台(写完合约就可以在命令行里验证了)。
●智能合约的构建流程可根据需求进行自定义配置。
●在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项目的结构如



2.编译命令——truffle compile
执行truffle compile命令会编译智能合约文件,编译成功后会在当前目录的build文件夹下生成新的智能合约二进制文件,如图5-32所示。
3.部署命令——truffle deploy
部署智能合约之前需要修改配置文件,本章中使用的智能合约开发测试环境为Ganache,其客户端监听的端口为本地的7545端口,故需要修改truffle.js文件连接到本地的7545端口,如图


修改完成就可以进行智能合约部署了,在终端中输入命令“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是实际需要下载的模板名字。下一节内容将详细介绍模板的使用。

要使用这个drizzle模板,首先要安装Truffle和Ganache环境,前边已经安装完了,接下来直接执行truffle unbox drizzle命令下载这个模板即可。
至此,进行DApp开发的各项基础知识已经介绍完,准备工作也已完成,下面开始进行DApp的实际开发。

