banner
leaf

leaf

It is better to manage the army than to manage the people. And the enemy.

Solidity的基本语法进行讲解

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

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

image

image

2. 枚举

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

image

3. 结构体

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

image

4. 函数

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

image

其中,<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” 按钮进行保存,如图

image

image

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

image

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

image

接着单击 “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 智能合约

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

image

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

image

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

智能合约开发流程

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 常用命令

初始化 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 是实际需要下载的模板名字。下一节内容将详细介绍模板的使用。

Truffle 模板列表

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

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

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.