08.Solidity语法详解

01.Solidity是以太坊上编写智能合约的高级语言。运行在以太坊虚拟机EVM。

02.注释

  1. 单行注释用//符号。
  2. 多行注释
  3. 其他注释方法

03.整型

整型类型通过int/uint关键字定义。对于int和uint可以显示设置占用空间大小,空间大小从8开始并且以8位步递增,最大到256位。

  • int8
  • int16
  • int24
  • uint8
  • uint16
  • uint256

例如:

uint8 b;
int64 c;
uint248 e;
int/uint 默认表示的是uint256和int256,可以显示的声明256位整型。
int256 constant a=8

uint一般用来表示货币数据量(solidity中没有double和float)和日期(unix time),由于Solidity目前不支持double/float,如果是7/2会得到3,后面的小数会被截断。

货币
uint balance=1 ether;
时间
uint now = 1 hours;
不支持 double/float
uint x =7
uint y =2;
z等于3
var z = x/y
十六进制证书表示:
uint VERSION_ID = 0X123A1

整型常量需要通过constant修饰进行初始化的,常数一旦初始化就不可以修改了,这一点和其他的编程语言一样。

int constant a= 8

solidity中没有内置随机函数。可一通过合约实现随机数。

pragma solidity ^0.4.8
contract random{
 function rand(uint min,uint max) public returns(uint){
uint256 lastBlockNumber = block.number-1;
uint256 hashVal - uin256(block.blockhash(lastBlockNumber));
return hashVal%(min+max)-min;
      }
}

4.布尔类型

bool:可能的取值为常量true和fasle

bool b = true;
var b = true;//类型推断

5.地址

以太坊中的地址为160位,即20字节大小,所以可以用一个uint160表示。

address public owner;
  • 查看余额
    • owner.balance;
  • 发送以太币有两种方法:
    • tansfer从合约发起方向某个地址转入以太币。当地址无效或者发起方余额不足时,transfer将抛出异常。
      • addressA.transfer(1 ether);
      • addressA.transfer.gas(120000)(1 ether);
    • send是transfer的低级版本。当合约执行失败时候,send会返回false

6.字节数组

固定长字节数组

固定长度字节数组是以bytes加上数组后缀的方式定义。

如bytes2表示两个字节长度的字节数组。

数学后缀表示字节长度从1到32,以步长1递增。bytes1,bytes2,bytes3…bytes32 其中byte默认表示bytes1

byte a;//byte等同与bytes1

动态长度字节数组

动态长度字节数组分两种

  • bytes,动态长度字节数组。
    • bytes是一种特殊的数组。bytes类似bytes[],在外部函数作为参数时,会进行压缩打包以便节省空间,所以应该尽量用bytes
  • string动态长度字节串,字符串以UTF8形式编码
    • string 类似bytes,不提供长度和按索引的访问方式
      • string n=“hello” n.length n[0]//不支持按索引访问

07.类型转换

类型转换

如果运算应用于不同类型时,编译器将尝试将其中一个操作数隐式转换为其他类型(对赋值也是如此)。

  • uint8 可以转换为uint16
  • int128可以转换为int256

但是 int8不能转换成uint256(因为uint256不能拥有负数)

无符号证书可以转换为相同或者更大尺寸的字节类型。但是反过来则不可以转换。

任何可以转换为uint160类型的变量都可以转换为地址类型(address)

显示转换

如果编译器不允许隐式转化,但是知道你正在做什么。那么有时候可以使用显示类型转换。

如果一个类型被显式转换为较小的类型,则高阶位会被截断

08.类型推断

var在第一次赋值的时候会推断变量的类型,不可以用户函数的参数.使用小心,有时候var会推断出错误的类型

  • var a = true;
    var 可以用来把函数赋值给一个变量

09.时间单位

时间单位

seconds,minutes,hours,days,weeks,years可以均为后缀,并进行相互转换,默认为seconds为单位

默认规则如下:

  • 1==1 seconds
  • 1minutes ==60seconds
  • 1hours ==60minutes
  • 1days ==24hours
  • 1weeks =7days
  • 1years = 365days

用时间日期计算,需要小心。因为每年不是365天,且不是每天都有24小时,因为还有闰秒。

对这些时间处理最好不要等于,优先小于或者大于

时间后缀不能用于变量。如果你想在变量中使用时间单位。

  • uint a =1;
  • uint b = a*1 days;//a的值为86400
  • uint c =a*1 seconds //c的值为1

10.货币单位

可以使用后缀wei,finney,szao或者ether来在不同货币单位中转换。

不含任何后缀的默认单位是wei

默认规则:

  • 1 ether = 1000finney
  • 1 ether = 1000000szabo
  • 1 ether = 10 **18wei

11.数组

你可能感兴趣的:(以太坊)