本章节主要详细介绍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
}
}