solidity的语法结构

一个简单的合约申明

合约申明
  pragma solidity ^0.4.21

语言的版本

  contract SimpleStorage{
  
}

类似于类的概念

注意: constant 是定义恒常数,不能改变成员变量。但是,这个版本中,只是警示用,实际程序可以修改的。returns(uint) 定义返回类型。
最新版本中,constant变为view,但是仍然可以改参数;pure是加强版的view,意思是函数中不能修改,也不能读取成员变量,例如:用于加密库之类。

合约的执行

个人简单的理解:
当部署在区块链中时,会申明出这个合约中的方法,然后大家就可以通过执行这些方法来进行相应的交易。
每一个函数执行都是有一定的费用的,简单理解为小费,单位gas,在以太坊的ether是最小的虚拟货币单位,会有价格波动,所以用gas表示函数执行所拥有的小费。比如说,一个函数固定执行一次会有2146gas,但是gas的price是随ether的价格变动而变动的。这样,每一个函数执行的费用就不会随着货币价值的变化而需要修改相应的数量了。

类型

  • uint/int ,目前不存在浮点数类型
  • address,类似于一个objecct类型,默认值为0x0(包含钱包地址,智能合约的地址等)。.balance地址上的金额,.transfer转钱
address方法

一些单位跟常用变量

  uint salary = 1 ether; //金额的最小单位wei,本质上就是等于整型的1

uint constant dur = 30 days ;// 时间单位,这里的constant是有效的,申明常变量,但是修饰函数,是没用的

uint lastPday = now;// 
统一单位
金额

时间

块的概念,相当于静态变量(全局变量)。在区块链中,就是挖到的交易块

消息

当执行某个函数时,包含调用用户信息等。
.sender 谁调用了这个函数
.gas 这个函数附带的gas消费

调用函数,给合约塞钱

充值函数
  1. 关键字 payable 只有添加这个关键字,才能在执行这个函数时,给这个合约充钱。
  2. this.balance 这里的this就是指代合约的地址,return this.balance 就是返回执行之后合约上的钱。
  3. 通过分析2,可以推测函数的执行,虽然是用户点击执行,但是真正执行环境是contract。

给一个地址转钱

申明金额
钱包地址

合约转钱

注意: 当执行函数时,是执行多少语句就要花费多少gas,如果说遍历很大的数据时,就很贵了。所以如果这个函数出现了异常或者没有按照理想的情况执行,这些gas是拿不回来的。执行revert()函数,能够终止当前函数,并不消耗gas。而throw异常的话,执行到throw前的gas就拿不回来了。

固定执行的用户

只能frank调用

变量作用域与js很像

会有变量提升

计算顺序,注意点

在solidity中,除法是做整除,没有小数点。so
当计算a(b-c)/d时,如果计算顺序是a((b-c)/d),会导致误差变大。

构造函数

在合约发布的时候,就执行。
这里的意思是,保存发布这个合约的人。


构造函数
合约名

注意: 构造函数与合约名要一致。

assert && require

assert函数用于确定运行中的代码满足某要求。
require函数用于要求输入的起始条件。

require
assert

数组

可固定,也可以动态数组。

uint[2] a;//固定长度

uint[] a;//动态长度,这时长度为0,所以无法用a[0]=1进行赋值
a.push(1);//用于增加元素,之后,就可以用a[0]进行获取

delete a[i];
a[i] = a[a.length-1];
a.length  -=1;//删除数组中的值,并且把最后一个数放到删除的位置上,长度减一

struct结构

这个就类似于C语言里面的,构造类型。

struct
Employee[] employees;//相当于一个新的类型
Employee(employee,salary,now);//这就新建了一个Employee类型对象了

可视度,函数默认为public

但是一个函数的输入或者输出是自己建的struct,那么函数可视度需要为private。

可视度

数据存储

数据存储

storage 是在区块链上,永久存在
memory 临时空间,当函数运行之后,就会释放
calldata 也是临时空间,类似memory

这里的存储类似于JS,对于一个对象来说,存储的是内存地址。


规则

注意点: 由于函数返回的是memory上的数据。

实例

这里的_findEmployee函数返回相应的状态变量的拷贝。因为函数返回是memory,而状态变量是storage。

这时当修改employee上的值时,存在storage上的状态变量是不会改变的。

为了减少gas的消耗,mapping

就是一个hash数据结构。
只有四种类型做key


mapping
实现规则

由于不能进行遍历,所以下面的语句报错。


错误

解决方法:将uint totalSalary变为状态变量,然后在每次增加或者移除一个employee时,便操作这个totalSalary的值。

命名参数

命名返回参数
得到的结果

对于输出也可以直接进行赋值


直接赋值

可视度

四种可视度

internal像protect。
external就是只能是外部用户或者其他合约来调用,而当前合约其他内部函数,是无法调用的。为了能够使用,可以用this.fn1();这样就相当于外部调用,代价会贵一点。


状态变量可视度

因为在区块链上所有的数据都是公开的。合约的成员变量都是肉眼可见的。

函数的可视度

继承

继承的小例子

子类有构造函数

父类具有构造函数

不同的父类构造函数形式

Parent is owned 继承

抽象合约

抽象合约

抽象合约不能部署在区块链上,继承抽象合约的合约需要重新定义其中的函数,类似于重写。

INTERFACE

interface

必须实现继承的interface上的函数,否则因为还有抽象函数在里面,合约不能发布。

多继承

简单的多继承
继承顺序
动态绑定1
动态绑定2
super.func1();//用于绑定上级继承的函数func1
实例
执行顺序的线性确定

如果多继承的执行函数出现环,就无法进行线性化。

modifier,使得代码工程化

address owner = 0xdfsdfdff;
modifier onlyOwner{
    require(msg.sender == owner)
     -;//相当于替代修饰的函数剩下的语句,也可以加参数
}

function removeEm(address employ) onlyowner{
     
}//这样修饰之后就相当于加了一个输入限制

加参数的modifier

modifier参数来自于当前函数的传入参数或者全局的状态变量。

不同的-;

这里的modifier中的a=1;执行在修饰的函数return之前。

SAFE math

在solidity中,运算是比较危险的。
因为这个数字大部分都跟钱有关系,所以要避免数据的溢出等异常。


提前检验一下

但是这样做的话,很麻烦。所以我们加入一些第三方库,来帮我们确保safe math。
例如:

  • zeppelin-solidity
import './SafeMath.sol';//进行导入第三方的library

如果要自己编写一个第三方库:


library申明

当引入第三方库后,就可以直接使用里面定义的方法了。但是这样也会很麻烦,相当于每次进行操作时,都会调用这个函数。
利用一个语法,using SafeMath for uint8; 这样每当调用SafeMath中的sub函数时,直接用a.sub(100)替代SafeMath.sub(a,100),因为a是uint8类型,可以直接穿透到参数里面。


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

推荐阅读更多精彩内容