Solidity 值类型
本章节主要详细介绍solidity中值类型的属性以及注意点,包括: Boolean,Integer,Address,定长字节数组,Enums。
1. Boolean类型
bool: 可以取值 true和 false。
对应的运算符同 java 相同包括:!逻辑非,&&逻辑与,||逻辑或,==等于,!= 不等于,其中 &&,|| 为短路运算符。
2. Integer类型
int/uint: 有符号/无符号整型,支持从 uint8 到 uint256 及 int8 到 int256。int 和 uint 默认值为 int256 和 uint256。
注:
- 1.有符号:表示任何规定范围内的整数(例如:int8范围是-127-127)
- 2. 无符号:只能表示非负数(例如:uint8范围是0-255)
支持运算符操作
- 比较运算符: <= , < , == , != , >= , > 比较结果的返回值为bool类型
- 位运算符:& ,|,^(异或),~(非)
- 数学运算:+,-,,/,%(取余),*(次方) ,<<(左移) , >>(右移)
补充说明
(1)var声明:var类型表示第一次使用时所表示的类型
(2)除法截断:整数的除法会被截断(例如:1/4结果为0),但是使用字面量的方式不会被截断
pragma solidity ^0.4.0; contract IntegerTest{ function get() returns (int){ int a = 1; int b = 4; var c = 1 / 4 * 4;//未截断 return c; } }
3.Address 地址类型
表示一个账户的地址,在以太坊中地址的长度为20字节,一字节8位,一个 address 就是 160 位,所以 address 可以用 uint160 表示。
- 支持运算符:
>,<,==,>=,<=,!=
- 地址类型的成员:
属性:balance
函数:transfer(),send(),call(),callcode(),delegatecall()
(1).balance:它能得到以Wei为单位的地址类型的余额。
pragma solidity ^0.4.0; contract addressTest{ function getBalance(address addr) returns (uint){ return addr.balance; } }
(2) . transfer(uint256 amount):向地址类型发送数量为amount的Wei,失败时抛出异常,不可调节。
(3) .send(uint256 amount) returns (bool):向地址类型 发送数量为 amount 的 Wei,失败时返回 false,不可调节。
补充:send 与transfer对应,但send更底层。如果执行失败,transfer不会因异常停止,而send会返回false。send() 执行有一些风险:如果调用栈的深度超过1024或gas耗光,交易都会失败。因此,为了保证安全,必须检查send的返回值,如果交易失败,会回退以太币。如果用transfer会更好。
(4) .call(…) returns (bool):发出低级函数 CALL,失败时返回 false,发送所有可用 gas,可调节。
(5) .callcode(…) returns (bool):发出低级函数 CALLCODE,失败时返回 false,发送所有可用 gas,可调节。
(6) .delegatecall(…) returns (bool):发出低级函数 DELEGATECALL,失败时返回 false,发送所有可用 gas,可调节。
上面的这三个方法call(),callcode(),delegatecall()都是底层的消息传递调用,最好仅在万不得已才进行使用,因为他们破坏了Solidity的类型安全。
注:
(1).msg.sender:表示当前调用方法时的发起人,调用方法的人很多,如何判断合约的拥有者?在第一次部署的时候进行定义,即在构造函数中定义:
contract Test { address public _owner; function Test() { _owner = msg.sender; } }
(2).合约地址:合约部署后,会有一个合约地址,合约地址表示合约本身,可以用this表示
contract Test { address public _owner; function Test() { _owner = msg.sender; } function returnContractAddress() constant returns (address) { return this; } }
4.定长字节数组(固定大小字节数组)
定义方式bytesN,其中N可取1~32中的任意整数,bytes1代表只能存储一个字节。一旦声明,其内部的字节长度不可修改,内部字节不可修改
运算符
比较:<=,<,==,!=,>=,>,返回值为bool类型。
位运算符:&,|,^(异或),~非
支持序号的访问,与大多数语言一样,取值范围[0, n),其中n表示长度。
注:
可以通过 .length返回字节个数,可以通过索引读取对应索引的字节。
5.枚举(Enums)
枚举类型是在Solidity中的一种用户自定义类型。
enum ActionChoices { GoLeft, GoRight, GoStraight, SitStill }
ActionChoices 可以理解为一个自定义的整型,当枚举数量不够多时默认类型为uint8,此例子中可以理解成uint8,当枚举数量足够多时,他会自动变成uint16。
6.函数
- 可以将一个函数赋值给一个变量,一个函数类型的变量。
- 还可以将一个函数作为参数进行传递。
- 也可以在函数调用中返回一个函数。
注:函数调用方式有两种;internal和external。(这里的external是调用方式,不要访问权限中的那个混淆)
内部函数(internal) –默认是这种类型
因为不能在当前合约的上下文环境以外的地方执行,内部函数只能在当前合约内被使用。如在当前的代码块内,包括内部库函数,和继承的函数中。
外部函数(External)–调用此函数需要用this:这个this是指合约。
外部函数由地址和函数方法签名两部分组成。可作为外部函数调用的参数,或者由外部函数调用返回。
pragma solidity ^0.4.5; contract FuntionTest{ function internalFunc() internal{} function externalFunc() external{} function callFunc(){ //直接使用内部的方式调用 internalFunc(); //不能在内部调用一个外部函数,会报编译错误。 // externalFunc(); //不能通过`external`的方式调用一个`internal` //this.internalFunc(); //使用`this`以`external`的方式调用一个外部函数 this.externalFunc(); } } contract FunctionTest1{ function externalCall(FuntionTest ft){ //调用另一个合约的外部函数 ft.externalFunc(); //不能调用另一个合约的内部函数 //ft.internalFunc(); } }
补:回退函数 fallback:
每一个合约有且仅有一个没有名字的函数。这个函数无参数,也无返回值。当调用的函数找不到时,就会调用默认的 fallback 函数
pragma solidity ^0.4.0; contract SimpleFallback{ function(){ //fallback function } }
下一章:Solidity 值类型与引用类型
solidity是一个静态类型的语言,在编译时需要明确指定变量的类型,本章将介绍solidity中值类型与引用类型。1.值类型值类型包含: 布尔(Booleans)整形(Integer)浮点型( ...