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 语法基础

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

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 简介和语法基础,并提供了一个智能合约的例子。
两个例子中还有一些没弄明白的地方。。。


不足之处,请批评指正。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容