待字闺中开发了一门区块链方面的课程:《深入浅出ETH原理与智能合约开发》,马良老师讲授。此文集记录我的学习笔记。
课程共8节课。其中,前四课讲ETH原理,后四课讲智能合约。
第五课分为三部分:
- Dapp用例
- 合约结构
- Solidity语法
这篇文章是第五课第三部分的学习笔记:Solidity语法 。
这节课主要讲解了以太坊编程语言 Solidity 简介和语法基础。
1、Solidity 简介
1.1 Solidity 历史
- 2014 年由 Gavin,Woods 首先发布设计;
- 面向合约的语言,图灵完备,紧密与以太坊底层结构耦合;
- 设计比较灵活,吸收了javascript / python等多种语言的特点编译型语言;
- 它还有一些缺陷,被指责是2016 DAO Hack的根本原因,这是有争议的一个地方;
- 适用平台不止Ethereum,还有Tendermint,Zeppelin,Counterparty;
- 其它实验性质的语言有vyper,ewasm,serpent,mutan。Solidity是主流,值得研究。
1.2 Solidity 技术特性
- 静态类型
- 编译型语言,即先编译好,再在以太坊虚拟机上运行字节码。
- 支持继承 / 多继承
- 支持函数重载
- 支持多种函数修饰符(包括自定义)
- 支持抽象接口(INTERFACE)
- 缺省不支持字符串操作以及slice操作
- 不支持定点数 / 不支持操作符重载
1、Solidity 语法基础
这节课只从整体上介绍一下基础的语法,具体细节需要在实践中探索。
2.1 数据类型
整型
uint8, uint16, uint24, ……, uint256分别用于存储无符号的8位,16位,24位,……,256位整数。 int8, int16, int24, ……, int256分别用于存储8位,16位,24位,……,256位整数。 uint 和 int 分别uint256 和 int256 的别名。布尔型(Boolean)
其值可以是 true或者false。枚举类型(enum)
支持有理数和整数的表达,如科学计数法,可以做为常数。
字符串常数,如一个地址。
支持定长数组。
第三、四节课中讲到过,storage存在于前缀树中,memory存在于虚拟机本地的实例中。memory中的数组只能支持定长类型,而storage中的数组可以是定长的,也可以是变长的。
2.2 引用类型与映射
- 数组
Dynamic Array,动态数据,声明时并不会特定地标明这个数据有多长,一般还附有一个属性,就是长度。通过改变长度,来改变整个动态数组的大小。
在动态数组之上,有一个衍生的类型是字节数组(Bytes),它也是一个可变长的数组,是以原始字节存储的内容。
在动态数组基础之上,还有另外一个数据类型,字符串(String),将字符以UTF-8格式编码后存储在字节数组上,它的长度信息在这里不可用。
其中,Bytes包括bytes1,bytes2,bytes3,……,bytes32。byte是bytes1的别名。bytes32,32个字节,正好是256位,以太坊虚拟机中一个栈的长度。
- 结构体Structure
类似于C语言中的结构体
- 映射 Mapping
(key, value) 键值对,可以嵌套,value的值也可以是一个映射。
- 以太坊特有的全局变量或操作(如图)
time :时间
block :块相关的内容
msg :消息相关的内容
tx :交易相关的内容
contract :合约相关的内容
address :地址相关,如balance, transfer, send, call
Exception Handler :异常处理。require(检查外部), assert(检查内部),检查出失败则回滚;revert(直接回滚)。
2.3 表达式/控制结构
Solidity 的控制语句和其它编程语言类似,如if / else, while / do / for, break / continue, return 等。但是,它没有switch, goto 。可以return 多个返回值。合约可以多继承。这部分在实践中掌握。
2.4 函数
函数是一大块重要的内容。这里介绍两部分内容,访问控制标识符和各类修饰符。
访问控制标识符有四种,分别是public, private, external, internal,具体作用如上图。
各类修饰符有pure, view, payable, indexed,还可以用modifier自定义修饰符。后面通过实例介绍。
3、智能合约例子
最后通过Remix自带的一个例子,可以复习巩固前面的内容。
这个例子在《区块链原理、设计与应用》(杨保华、陈昌 编著)中也有。
电子版:例子
(注,课程中老师讲的例子较早一些,链接中的例子有所更新。)
在旧例子中,可在Remix中进行的实践有:
- 创建投票;
- 赋予投票权;
- 委托投票权;
- 进行投票;
- 查询获胜提案。
(截图略)
总结一下,这节课主要讲解了以太坊编程语言 Solidity 简介和语法基础,并提供了一个智能合约的例子。
两个例子中还有一些没弄明白的地方。。。
不足之处,请批评指正。