016:Solidity语法|《ETH原理与智能合约开发》笔记

待字闺中开发了一门区块链方面的课程:《深入浅出ETH原理与智能合约开发》,马良老师讲授。此文集记录我的学习笔记。

课程共8节课。其中,前四课讲ETH原理,后四课讲智能合约。
第五课分为三部分:

  1. Dapp用例
  2. 合约结构
  3. 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 语法基础

这节课只从整体上介绍一下基础的语法,具体细节需要在实践中探索。

016:Solidity语法|《ETH原理与智能合约开发》笔记_第1张图片
Solidity 语法(1)

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(直接回滚)。

016:Solidity语法|《ETH原理与智能合约开发》笔记_第2张图片
Solidity 语法(2)

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中进行的实践有:

  1. 创建投票;
  2. 赋予投票权;
  3. 委托投票权;
  4. 进行投票;
  5. 查询获胜提案。

(截图略)


总结一下,这节课主要讲解了以太坊编程语言 Solidity 简介和语法基础,并提供了一个智能合约的例子。
两个例子中还有一些没弄明白的地方。。。


不足之处,请批评指正。

你可能感兴趣的:(016:Solidity语法|《ETH原理与智能合约开发》笔记)