代码改变世界

01.基础篇 - 值数据类型

2019-12-02 14:14  StevenZhao  阅读(278)  评论(0编辑  收藏  举报

三.solidity基础语法学习

solidity语言没有main()函数,只要部署在区块链上就会不停的运行.

3.1值数据类型

1.状态变量

成员变量也称状态变量

定义在合约之内,但是在函数之外的变量,称为状态变量.这些变量会上传到区块链上保存下来.

2.整型

int(有符号整型,有正有负) uint(⽆无符号整型,⽆无负数) 以8位为区间,支持int8,int16,int24 至 int256,uint同理。

int默认为int256,uint默认为uint256

3.函数类型

函数本身也是一个特殊的变量,它可以当作变量赋值,当作函数参数传递,当作返回值.

函数声明: 关键字 函数名(参数类型)函数类型 返回值类型{}

 

 

 

 

4.重要的关键字

5.访问的可见性

- public ,private

修饰为public的状态变量量会默认生成一个同名的public函数 状态变量量默认是internal的(先理理解为private即可)

-payable

  1. 任何函数,只要修饰为payable,那么就可以在调用这个方法的时候,对value字段赋值,然后将 价值value的钱转给合约。

  2. 若这个函数没有指定payable,但是对value赋值了了,那么本次调用会报错。

//任何函数,只要指定了了payable关键字,这个合约就可以接受转账,调用时,也可以转 0 wei ​ function giveMoney() public payable { ​ }

注意,所有在合约内的东西外部的观察者来说都是可见,将某些东西标记为 private 仅仅阻止了 其它合约来进行访问和修改,但并不不能阻止其它人看到相关的信息。

-匿名函数

一个合约可以有且只有一个匿匿名函数,此函数不能有参数,也不能有任何返回值,当我们企图去执行 一个合约上没有的函数时,那么合约就会执行这个匿名函数。

当合约在只收到以太币的时候,也会调用这个匿名函数,而且一般情况下会消耗很少的gas,所以当你 接收到以太币后,想要执行一些操作的话,你尽可以把你想要的操作写到这个匿名函数里,因为这样 做成本非常便宜。

//如果想向合约转账,在合约中添加如下函数即可 function() payable { ​ //函数体什么都不填 }

 

-构造函数constructor

关键字 contructor

构造函数只能有一个,不能被重载;

构造函数在函数运行的时候首先执行,主要做一些 初始化的作用;

 

-地址

以太坊地址的长度,大小 20个字节 ,20 * 8 = 160位 ,所以可以用一个 uint160 编码。地址是所 有合约的基础,所有的合约都会继承地址对象,通过合约的地址串,调用合约内的函数。

-运算符

 

-操作

注:call(),delegatecall()以及callcode()都是底层的消息传递调用,最好在不到万不得已的情况不要使用,因为他们会破坏solidity的类型安全;

-余额(balance)

返回指定地址的余额;

 

-合约地址(this)

如果只想返回当前合约账户的余额,可以使用this指针,this表示合约自身的地址。

 

-转账(send,transfer)

send 和 transfer函数提供了由合约向其他地址转账的功能;

 

-枚举类型()enum

枚举类型是在Solidity中的一种用户自定义类型; 枚举可以显示的转换与整数进行转换,但不能进行隐式转换。显示的转换会在运行时检查数值范 围,如果不不匹配,将会引起异常。 枚举类型应至少有一名成员,枚举元素默认为uint8,当元素数量足够多时,会自动变为 uint16,第一个元素默认为0,使用超出范围的数值时会报错。

-字节数组

定长的字节数组

solidity内置了一些数组的数据类型:(和go语言做一下对比, var b8 [8]byte),完全只读; bytes1 , ... , bytes32 ,允许值以步长1递增; byte默认表示bytes1,byte是类型,bytes是类型,bytes1是内置数组; bytes1只能存储1个字节,即8位的内容,bytes2最多只能存储2个字节,即16位的内容。以此类 推...;

特性:

长度可以读取 length; 长度不可以修改; 可以通过下标访问; 内容不可修改;

内置方法: length() ,返回数组长度