第1讲 从Hello Web3开始
1.1 Solidity简述
Solidity是以太坊虚拟机(EVM) 智能合约的语言。同时,笔者认为Solidity是熟练操作区块链相关项目必备的技能:区块链项目大部分是开源的,用户如果能读懂代码,就可以规避很多质量较差的项目。
Solidity具有如下两个特点:
(1)面向智能合约:Solidity提供了丰富的智能合约功能,包括状态变量(用于存储合约状态)、函数(用于定义合约的行为),事件(用于与外部应用程序通信)和修饰器(用于修改函数的行为)等,这些功能使得开发人员能够编写强大的智能合约。
(2)静态类型:Solidity是静态类型语言,每个变量的类型都需要在编译器确定,这有助于在编程阶段发现错误。
1.2 开发工具:remix
本教程中,笔者使用remix来运行Solidity合约。remix是以太坊官方推荐的智能合约开发IDE(集成开发环境),适合新手,可以在浏览器中快速开发和部署合约,而不需要在本地安装任何程序。remix的网址如下:
https://remix.ethereum.org
图1.1显示了remix开发环境的一部分面板。进入remix,我们可以看到最左边的菜单有一系列按钮,其中主要有“文件”(文件浏览器界面,在此添加和编写Solidity合约程序)、“编译”(将合约编译成可运行的格式)、“部署”(部署到区块链上)等按钮。
图1.1 remix面板
在文件浏览器界面点击“新建文件”(Create New File)按钮,就可以创建一个空白的Solidity合约文件。
1.3 第一个Solidity程序
很简单,只有1行注释+ 4行代码:
1 // SPDX-License-Identifier: MIT
2 pragma solidity ^0.8.4?
3 contract HelloWeb3{
4 string public _string = "Hello Web3!"?
5 }
我们拆开分析,学习Solidity代码源文件的结构:
(1)第1行是注释,其中标明这个代码所用的软件许可证(license),这里用的是MIT许可证,也是Solidity合约默认使用的开源许可证。如果不写许可,编译时会警告(warning),但程序可以运行。Solidity的注释由“//”开头,后面跟注释的内容(不会被程序运行)。
1 // SPDX-License-Identifier: MIT
第1讲从Hello Web3开始3
(2)第2行声明源文件所用的Solidity版本,因为不同版本语法有差别。这行代码的意思是源文件将不允许小于0.8.4版本或大于等于0.9.0的编译器编译(第二个条件由“^”提供)。Solidity语句以分号“?”结尾。
2 pragma solidity ^0.8.4?
(3)第3~5行是合约部分,第3行创建合约(contract),并声明合约的名字为HelloWeb3。第4 行是合约的内容,我们声明了一个string(字符串)类型的变量“_string”,并给它赋值“Hello Web3!”。
3 contract HelloWeb3{
4 string public _string = "Hello Web3!"?
5 }
在后面的内容中,我们将会详细介绍Solidity中的变量。
1.4 编译并部署代码
在remix 开发环境下,点击图1.1所示界面左侧的“编译”按钮,或者按Ctrl+S 就可以编译代码,非常方便。
编译好之后,点击“部署”按钮进入部署界面,如图1.2所示。
图1.2 Solidity合约的部署设置界面
在默认情况下,remix会用JavaScript虚拟机来模拟以太坊区块链,运行智能合约,相当于在浏览器里直接运行一条测试链。另外,remix会分配若干个测试账户用于测试合约的运行,每个账户里面有额度为100 ETH的测试代币,供用户自由使用以测试合约代码(不会进入实际的交易流程)。点击图1.2所示界面中的“Deploy”(黄色按钮),就可以部署刚才写好的合约了。
部署成功后,在部署界面的下方会看到名为HelloWeb3 的合约,如图1.3所示。点击“_string”,就能看到我们代码中写的“Hello Web3!”了。
图1.3 部署成功后查看Solidity合约的运行结果
1.5 总结
作为全书的开篇,这一讲中我们简单介绍了Solidity和remix工具,并完成了第一个Solidity 程序——Hello Web3。下面我们将继续Solidity旅程!
第2讲 值类型
Solidity语言中的变量类型主要包括以下三种:
(1)值类型(value type):包括布尔型和整型等。这类变量在赋值的时候直接传递数值。
(2)引用类型(reference type):包括数组和结构体。这类变量占用的存储空间较大,在赋值的时候直接传递变量的地址(类似C语言中的指针)。
(3)映射类型(mapping type):Solidity 中存储键值对的数据结构,可以理解为哈希表。
这一讲我们将介绍值类型。
2.1 布尔型
布尔型是二元变量,取值为true 或false。
1 //布尔值
2 bool public _bool = true?
布尔值的运算符包括如下几种:
(1)!(逻辑非)。
(2)&&(逻辑与,“and”)。
(3)||(逻辑或,“or”)。
(4)==(等于)。
(5)!=(不等于)。
例如,接着上一段代码,借助_bool变量定义一个新的布尔型变量_bool1,并进行运算:
1 //布尔运算
2 bool public _bool1 = !_bool? //取非
3 bool public _bool2 = _bool && _bool1? //与
4 bool public _bool3 = _bool || _bool1? //或
5 bool public _bool4 = _bool == _bool1? //相等
6 bool public _bool5 = _bool != _bool1? //不相等
以上代码中,变量_bool的取值是true。_bool1是_bool进行逻辑非运算的结果,为false。_bool && _bool1的运算结果为false。_bool || _bool1的运算结果为true。_bool == _bool1的运算结果为false。_bool != _bool1的运算结果为false。
读者可在部署合约后检验这些变量的结果,如图2.1所示。
图2.1 Solidity中的布尔变量及其运算
注意:&&和||两个运算符的机制和其他许多语言中的类似,遵循所谓“短路规则”。
温馨提示:请使用泸西县图书馆的读者帐号和密码进行登录