solidity开发3-类型1

2022-05-06 15:52:39 浏览数 (2)

总述

代码语言:javascript复制
solidtiy是一种静态类型语言,所以任何变量在使用之前都应该声明其特定类型。
solidity任何类型都没有值为undefined或者null的情况。但是任何类型的数据在没有赋值之前,都会有一个该数据类型的对应的default value。

数据类型

Booleans
代码语言:javascript复制
bool修饰,值为true或者false
Integer
代码语言:javascript复制
int${n}/uint${n}: 有符号或者无符号的整数。其中n为8、16... 256(8的倍数,从8到256),表示整数的位数
int/uint: 则是int256/uint256的别名

另外对于整数x,可以通过type(x).min或者type(x).max来获取对应类型的最小或者最大值。
可以通过x**n来实现求x的n次方,此时直接用 x*x*x...(n次相乘)能实现更少的gas费
0**0在evm中固定为1.
Fixed Point Numbers
代码语言:javascript复制
固定小数位数的数据在solidity中并不完全支持,这种类型的数字可以被申明,但是不能被赋值或者计算得到。
fixed${M}x${N}/ufixed${M}x${N}:有符号或者无符号的浮点数据,其中M表示整个数字所占的最大bit数,N表示小数的位数。(注意这里M表示的字节数是整个数字去掉小数点之后能表示的最大):

MN的测试

代码语言:javascript复制
fixed8x1 num = 12.7;	// 必须一个小数,且最大为12.7
        fixed8x0 num2 = 127;	// 不能有小数且最大为127

M的取值范围为8的倍数且为:[8, 256], N的取值范围为:[0, 80]。 fixed/ufixed:则是fixed128x18/ufixed128x18

Address

一共有两种类型的地址:

  1. address: 保存20个字节的值,代表一个以太坊的地址。
  2. address payable:同address,不过包含transfer和send属性。 address payable可以直接隐式转换成address,而address要转换成payable address需要显示使用payable()来进行。 可以使用address来显示转换uint160,byte20为地址类型。但是只有address或者合约类型才能通过payable显示转换为payable address类型(合约必须是可以接收以太币(有receive方法或者payable修饰的方法))。
Address的属性
代码语言:javascript复制
可以使用balance属性来得到地址拥有的货币数量,可以通过transfer方法来转移货币。

Address members

代码语言:javascript复制
address payable x = payable(0xd9145CCE52D386f254917e481eB44e9943F39138);
address myAddress = address(this);
if (x.balance < 10 && myAddress.balance >= 10) x.transfer(10);	// 注意这里是转入到x账户

注意transfer当接收方拒绝接收或者发送方gas费不足的情况会抛出异常并终止合约。另一个send函数,则只会返回false,不会终止合约继续运行。

Contract Types
代码语言:javascript复制
类似于java中的类。合约类型的成员只的是external修饰的函数,可以使用type(c),来获取合约c的类型信息
Fixed-size byte arrays
代码语言:javascript复制
bytes${n}:表示最大n字节的字符变量,其中n范围为[1, 32]
byte:表示bytes1

可以通过下标来访问该变量对应字节的数值,且.length属性返回定义的大小而不是实际使用的大小。

Bytes test

代码语言:javascript复制
function getByteLen() external pure returns (uint) {
        bytes2 b = '1';
        return b.length; // 2
    } 

    function getByteValue() external pure returns (bytes1) {
        bytes2 b = '1';
        return b[1];        // 0x00
    } 

0 人点赞