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

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

作者: 吉祥在成长 | 来源:发表于2018-08-21 22:00 被阅读55次

    待字闺中开发了一门区块链方面的课程:《深入浅出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 语法基础

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

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

    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原理与智能合约开发》笔记

          本文链接:https://www.haomeiwen.com/subject/ojypvftx.html