三.solidity基础语法学习
solidity语言没有main()函数,只要部署在区块链上就会不停的运行.
1.状态变量
成员变量也称状态变量
定义在合约之内,但是在函数之外的变量,称为状态变量.这些变量会上传到区块链上保存下来.
2.整型
int(有符号整型,有正有负) uint(⽆无符号整型,⽆无负数) 以8位为区间,支持int8,int16,int24 至 int256,uint同理。
int默认为int256,uint默认为uint256
3.函数类型
函数本身也是一个特殊的变量,它可以当作变量赋值,当作函数参数传递,当作返回值.
函数声明: 关键字 函数名(参数类型)函数类型 返回值类型{}
4.重要的关键字
5.访问的可见性
- public ,private
修饰为public的状态变量量会默认生成一个同名的public函数 状态变量量默认是internal的(先理理解为private即可)
-payable
-
任何函数,只要修饰为payable,那么就可以在调用这个方法的时候,对value字段赋值,然后将 价值value的钱转给合约。
-
若这个函数没有指定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() ,返回数组长度